FORMAT: 1A
HOST: http://api.qnips.com:8080/Bosch/
# Bosch API
### Mehrsprachigkeit
Über den HTTP-Header `Accept-Language` kann die Nutzersprache mitgegeben werden. Das Backend wird dann versuchen alle übersetzbaren Einträge (wie Produktnamen, Beschreibungen, …) in der entsprechenden Nutzersprache zurückzugeben. Ist eine Übersetzung für einen Eintrag nicht eingetragen, so wird als Fallback die deutsche Version zurückgegeben.
### Komprimierung
Über den HTTP-Header `Accept-Encoding: gzip` kann eine GZIP-komprimierte Response angefragt werden.
## Neuen API-Key anlegen [/NewIdentity?deviceType={deviceType}]
Bevor Speisepläne oder Umfragen abgerufen werden können, muss beim Backend ein neuer API-Key angelegt werden mit dem die folgenden Requests beim Backend authorisiert werden.
Die `ApiKey`-Property der Response wird dazu bei den folgenden Requests als `Authorization`-Header hinzugefügt.
### Neuen API-Key anlegen [GET]
+ Parameters
+ deviceType (required, String, `Android 6.0`) ... Gerätetyp
+ Response 200 (application/json)
+ Body
{
"ApiKey": "03ec1431b94b9552ce713114be9c0a950",
"UserId": "1"
}
## Verfügbare Speisepläne abrufen [/Menus]
Bevor der Nutzer sich die Details eines Speiseplans anschauen kann, sollte ihm (einmalig) eine Speiseplan-Auswahl angezeigt werden. Mit folgenden Request werden alle verfügbaren Speisepläne mit den Grundinformationen des zugehörenden Standortes ausgeliefert.
Hat sich der Nutzer für einen bestimmten Speiseplan entschieden, sollte die `Id`-Property abgespeichert werden. Diese Property wird beim folgenden Request zum Abrufen der Speiseplan-Details als Query-Parameter `menuCardId` mitgegeben.
### Verfügbare Speisepläne abrufen [GET]
+ Request
+ Headers
Accept: application/json
Accept-Language: de-DE
Authorization: 03ec1431b94b9552ce713114be9c0a950
+ Response 200 (application/json)
+ Body
[
{
"Id": 1,
"Name": "Speiseplan Kasino",
"StoreName": "Kasino",
"StorePictureUrl": "http://…",
"StoreLat": 52.38411,
"StoreLng": 9.73001
}
]
## Speiseplan-Details abrufen [/Menu?menuCardId={menuCardId}&date={date}]
Um unnötige Datenlast zu vermeiden unstützt diese Resource ein HTTP-konformes Caching mittels dem `ETag` Header bei der Response und dem `If-None-Match` Header bei dem Request. Genaueres hierzu lässt sich u.a. [hier](https://de.wikipedia.org/wiki/HTTP_ETag) nachlesen.
### Speiseplan-Details abrufen [GET]
| Property | Beschreibung |
| --- | --- |
| `Type` | Gibt den Typ des Speiseplans an: `0` (Tagesaktuell), `1` (Zeitraum), `2` (Unbegrenzt). Für tagesaktuelle Speisepläne soll eine Tagesauswahl für die nächsten `WeeksToPreview` Wochen die Tage `WeekDays` angezeigt werden. Bei Speiseplänen mit einem bestimmten Zeitraum definieren `ValidFrom` und `ValidTill` die Eckdaten. |
| `DisplayOptions` | Diese Bitmaske definiert die Darstellung des Speiseplans in der App. |
| `Date` | Sofern der Query-Parameter `date` nicht angegeben wird, gibt das Backend den Tag zurück, der angezeigt werden soll. Das muss nicht immer der aktuelle Tag sein, wenn z.B. ab 14 Uhr der Speiseplan vom Folgetag angezeigt werden soll. Für Speisekarten vom Type `1` oder `2` ist dieses Feld nicht gesetzt, da die Daten dieser Typen für mehr als einen Tag verwendet werden können. |
| `DailyAllergensTime` | Gibt die Uhrzeit an, ab wann *Tagesaktuelle Allergene* angezeigt werden sollen. Ist dieses Feld `null` so ist dieses Feature nicht aktiv und die Allergene können immer angezeigt werden. |
| `EmptyMessage` | Gibt den Text für den EmptyScreen an. Ist dieses Feld `null` so soll ein in der App hinterlegter Fallback-Text verwendet werden. |
| `EmptyCategoryMessage` | Gibt den Text für den EmptyScreen einer Kategorie und die Darstellung einer leeren Katerogie in der *SectionHeader* Version an. Ist dieses Feld `null` so soll ein in der App hinterlegter Fallback-Text verwendet werden. |
| `Prices` | Diese Liste enthält alle Preise vom Produkt. Es bietet sich an in der Listenansicht die `Label` Property und auf der Detailseite die `Name` Property zu verwenden. |
| `CustomTags` | Diese Liste enthält alle Produktkennzeichnungen. |
| `Allergens`, `Traces` | Diese Listen enthalten die Indizes der enthaltenen Allergene bzw. Spuren. Ist dieses Feld `null` so soll dieser Abschnitt übersprungen werden – auch wenn die `DisplayOptions` sie sonst erlauben würden. |
| `SubAllergens*`, `SubTraces*` | Diese Listen enthalten die Indizes der enthaltenen Unterallergene. |
| `Additives` eines Produktes | Diese Liste enthält die IDs der enthaltenen Zusatzstoffe. Ist dieses Feld `null` so soll dieser Abschnitt übersprungen werden – auch wenn die `DisplayOptions` sie sonst erlauben würden. |
| `Additives` auf oberer Obene | Diese Liste enthält alle Zusatzstoffe, die über das Dashboard angelegt wurden. Dieses Feld ist nur beim ersten Request ohne gesetzten Query-Parameter `date` vorhanden und ansonsten `null` – es muss also in die Datenstruktur der folgenden Requests auf Clientseite übernommen werden. |
#### DisplayOptions
| Bit | Beschreibung |
| --- | --- |
| `0` | Kategorien in eigener View anzeigen. Wenn ungesetzt: Kategorien als SectionHeader anzeigen. |
| `1` | *Veraltet* |
| `2` | Bilder in der Liste anzeigen. |
| `3` | Bilder bei den Produktdetails anzeigen. |
| `4` | Allergene & Zusatzstoffe bei den Produktdetails anzeigen. |
| `5` | Spuren bei den Produktdetails anzeigen. |
| `6` | Rezeptur bei den Produktdetails anzeigen. |
| `7` | Nährwerte bei den Produktdetails anzeigen. |
| `8` | Allergene in der Liste anzeigen. |
| `9` | Produktkennzeichnungen in der Liste anzeigen. |
| `10` | Preise in der Liste anzeigen. |
| `11` | Produktdetails anzeigen. |
| `12` | Produktbewertung anzeigen. (Momentan noch nicht im Dashboard einstellbar) |
##### Beispiel
`DisplayOptions = 285 (dezimal) = 0000100011101 (binär)`
Es sind also die Bits `0`, `2`, `3`, `4`, `5` und `9`. Dies bedeutet folgendes;
* Auf oberster Ebene sollen nur die Kategorien (Bit `0`) angezeigt werden
* Auf den Unterseiten sollen die Produkte mit Bildern (Bit `2`) und Produktkennzeichnungen (Bit `9`) angezeigt werden
* Auf der Produktdetailseite sollen Bilder (Bit `3`), Allergene & Zusatzstoffe (Bit `4`) und Spuren (Bit `5`) angezeigt werden
#### Allergene & Spuren
- Glutenhaltiges Getreide
- Krebstiere und Krebstiererzeugnisse
- Eier und Eiererzeugnisse
- Fisch und Fischerzeugnisse
- Erdnüsse und Erdnusserzeugnisse
- Soja und Sojaerzeugnisse
- Milch und Milcherzeugnisse (Laktose)
- Schalenfrüchte und Schalenfrüchteerzeugnisse
- Sellerie und Sellerieerzeugnisse
- Senf und Senferzeugnisse
- Sesam und Sesamerzeugnisse
- Schwefeldioxid und Sulfite
- Lupinen und Lupinenerzeugnisse
- Weichtiere und Weichtiererzeugnisse
- Weizen und Weizenerzeugnisse (wie Dinkel und Khoransan-Weizen)
- Roggen und Roggenerzeugnisse
- Gerste und Gersteerzeugnisse
- Hafer und Hafererzeugnisse
- Mandeln und Mandelerzeugnisse
- Haselnüsse und Haselnusserzeugnisse
- Walnüsse und Walnusserzeugnisse
- Kaschunüsse und Kaschunusserzeugnisse
- Pecanüsse und Pecanusserzeugnisse
- Paranüsse und Paranusserzeugnisse
- Pistazien und Pistazienerzeugnisse
- Macadamia- oder Queenslandnüsse und daraus gewonnene Erzeugnisse
+ Parameters
+ menuCardId (required, long, `1`) ... Interne Datenbank-Id
+ date (optional, Date, `2015-12-08`) ... Datum vom Speiseplan
+ Request
+ Headers
Accept: application/json
Accept-Language: de-DE
Authorization: 03ec1431b94b9552ce713114be9c0a950
If-None-Match: "95009e0970f1fc7632cf9755e9aa2c57"
+ Response 200 (application/json)
+ Headers
Cache-Control: public
ETag: "95009e0970f1fc7632cf9755e9aa2c57"
+ Body
{
"MenuCardId": 1,
"StoreId": 1,
"Name": "Speiseplan Kasino",
"Date": "2015-12-09T00:00:00Z",
"DisplayOptions": 31
"Type": 0,
"ValidFrom": null,
"ValidTill": null,
"WeeksToPreview": 4,
"WeekDays": [0,1,2,3,4],
"DailyAllergensTime": "2015-08-10T14:00:00Z",
"EmptyMessage": "Für diesen Tag liegen keine Daten vor.",
"EmptyCategoryMessage": "Heute leider kein Angebot.",
"Preorder": {
"From": "2015-08-10T15:00:00Z",
"Till": "2015-08-10T10:00:00Z",
"CategoryIds": [],
"BaseUrl": "http://my.qnips.com/public/menuorder/"
},
"Categories": [{
"Id": 1,
"Name": "Hauptspeisen",
"PictureUrl": "http://www.…",
"Products": [{
"Id": 1,
"Name": "Pizza Salami",
"Description": "Simple Pizza mit Salami",
"PictureUrl": "http://www.…",
"Prices": [{
"Id": 1,
"Tag": "Studenten",
"Price": 3.45,
"Label": "ST"
}],
"Allergens": [],
"SubAllergens0": [],
"SubAllergens7": [],
"Traces": [],
"SubTraces0": [],
"SubTraces7": [],
"Additives": [],
"CustomTags": [{
"Name": "Scharf",
"IconUrl": "http://www.…"
}],
"Ingredients": "Zutat 1; Zutat 2; Zutat 3",
"CoverUrls": ["http://www.…"],
"WeightInGrams": 12.34,
"VolumeInMilliliters": null
}]
}],
"Additives": [{
"Id": 1,
"Name": "enthält Sulfite",
"IconUrl": "http://www.…"
}]
}
+ Response 304
+ Response 404
// Speiseplan konnte nicht gefunden werden