comme Jembe ne gère pas les codes HTTP les WS renvoient toujours un code 200 (même en cas d'erreur) avec un objet JSON : { status : 200, // le code http message : "", // un message data: {} // les données } Authentification WSSE ===================== header = X-WSSE : UsernameToken Username="USERNAME", PasswordDigest="DIGEST", Nonce="NONCE", Created="DATE" avec : USERNAME = le username de l'utilisateur NONCE = Base64 (random string) (doit être différent pour chaque requête) CREATED = date au format 2013-03-12T14:43:07Z PASSWORDDIGEST = Base64 (SHA1 (Nonce + Created + Token)) (Attention c'est le SHA1 en binaire, pas en hexa) User salt --------- GET /{locale}/api/v1//user/salt/{username}/{fmt} (default : fmt = plain) Liste des WS ============ GET /{locale}/api/v1/config renvoit le même JSON que butagaz-config.json (avec l'image et lien actu + la liste des produits) authentification = aucune POST /{locale}/api/v1/signup inscription d'un utilisateur authentification = aucune champs : 'user': { 'gender': '', // mr, mme, mlle 'save_payment' : true|false, 'geolocalize' : true|false, 'favorite_pdv': "", // facultatif 'firstname': "", 'lastname': "", 'address': "", 'postalcode': "", 'city': "", 'country': "", // obligatoirement le code du pays (par ex. FR, BE, US, ...) 'locale': "", // obligatoirement "en" ou "fr" (on pourra en mettre d'autres ou en enlever plus tard) 'email': "", 'tel': "", 'password': "", // obligatoire 'token_app': "", // Token APP (facultatif) 'device_model': "", // (facultatif) 'device_platform': "", // (facultatif) 'device_platform_version': "", // (facultatif) 'device_uuid': "", // (facultatif) 'device_notification_registration_id': "", // (facultatif) } GET /{locale}/api/v1/user/get/{username} récuperation d'un utilisateur authentification = ROLE_USER si user = {username} sinon ROLE_ADMIN retour = JSON avec tous les champs de l'utilisateur POST /{locale}/api/v1/user/update/{username} mise a jour d'un utilisateur authentification = ROLE_USER si user = {username} sinon ROLE_ADMIN champs : 'user': { 'gender': '', // mr, mme, mlle 'save_payment' : true|false, 'geolocalize' : true|false, 'favorite_pdv': "", // facultatif 'firstname': "", 'lastname': "", 'address': "", 'postalcode': "", 'city': "", 'country': "", // obligatoirement le code du pays (par ex. FR, BE, US, ...) 'locale': "", // obligatoirement "en" ou "fr" 'email': "", 'tel': "", 'password': "", // facultatif : si vide ou non renseigné le mot de passe n'est pas modifié 'token_app': "", // Token APP (facultatif) 'device_model': "", // (facultatif) 'device_platform': "", // (facultatif) 'device_platform_version': "", // (facultatif) 'device_uuid': "", // (facultatif) 'device_notification_registration_id': "", // (facultatif) } POST /{locale}/api/v1/user/delete/{username} suppression d'un utilisateur authentification = ROLE_USER si user = {username} sinon ROLE_ADMIN champs : aucun GET api/v1/point_de_vente/find/{latitude}/{longitude}/{rayon}/{limit} retourne max {limit} points de vente, du plus proche au plus éloigné par rapport à ({latitude}, {longitude}), dans un rayon de {rayon} km. authentification = AUCUNE retour = JSON avec le detail des points de vente + la distance (km) GET /{locale}/api/v1/point_de_vente/get/{code} récuperation d'un point de vente authentification = ROLE_USER GET /{locale}/api/v1/point_de_vente/adresse/{query} recherche d'un point de vente en fonction du code postal et de la ville authentification = ROLE_USER GET /{locale}/api/v1/point_de_vente/get/{code}/disponibilite retourne un tableau de tous les casiers disponbibles à la commande pour le point de vente {code} authentification = ROLE_USER GET /{locale}/api/v1/point_de_vente/get/{code}/disponibilite/total retourne un tableau avec le total de casiers disponibles pour chaque type de bouteille pour le point de vente {code} authentification = ROLE_USER POST /{locale}/api/v1/point_de_vente/create création d'un point de vente authentification = ROLE_ADMIN champs : 'point_de_vente': { 'code': '', // IdVendeur 'nom': '', 'adresse': '', 'ville': '', 'code_postal': '', 'telephone': '', 'latitude': '', 'longitude': '', 'horaires': '', 'livraison': true|false } Tous les champs sont obligatoires sauf horaires POST /{locale}/api/v1/presentoir/create création d'un presentoir authentification = ROLE_ADMIN champs : 'presentoir': { 'code': '', // le code du presentoir. Doit etre unique 'format': { 'x': 6, // nombre de colonnes. min = 1 'y': 4, // nombre de lignes. min = 1 'z': 2 // nombre de cotés. min = 1 et max = 2 }, 'point_de_vente': '' // le code du point de vente } Tous les champs sont obligatoires POST /{locale}/api/v1/presentoir/chauffeur/update/{code}/{type_bouteille} mise à jour d'un présentoir pour tous les casiers de type {type_bouteille} du présentoir {code} authentification = ROLE_CHAUFFEUR champs : 'form': { 'date': "2015-11-05 12:15:00" 'LPL': 4, 'RPL': 0, 'RDF': 0, 'RVD': 4, 'photos': [ // tableau de photos en base64 (le tableau peut-etre vide) '/9j/4AAQSkZJRgABAQ...', '/9j/4AAQSkZJRgABAQ...' ] } GET /{locale}/api/v1/casier/get/{code} récuperation d'un casier authentification = ROLE_USER POST /{locale}/api/v1/casier/update/{code} mise a jour d'un casier authentification = ROLE_USER {code} = code du casier champs : 'casier': { 'stock': 1, // 0 ou 1 'anomalie': 0, // 0 ou 1 } Tous les champs sont obligatoires POST /{locale}/api/v1/casier/chauffeur/update/{code} mise a jour d'un casier ou creation si il n'existait pas authentification = ROLE_CHAUFFEUR {code} = code du casier champs : 'casier': { 'numero': A1, // numero du casier 'position_x': 1, // colonne 'position_y': 1, // ligne 'position_z': 1, // coté 'stock': 1, // 0 ou 1 'anomalie': 0, // 0 ou 1 'clefs': ['secret1', 'secret2', ...], // clefs du casier 'presentoir': '' // code du presentoir 'type_bouteille': 'CB' // type de bouteille, doit être un Produit/code existant } Tous les champs sont obligatoires POST /{locale}/api/v1/casier/clef/updated/{code}/{clef} WS a appeler lorsque l'app a mis la clef du casier à jour le tableau de clefs du casier est vidé et on ne garde que la dernière clef authentification = ROLE_USER {code} = code du casier {clef} = la clef la plus récente du casier POST /{locale}/api/v1/casier/firmware_log/new/{code} enregistre un log firmware pour le casier {code} authentification = ROLE_USER {code} = code du casier champs : 'log': { 'data': "01010201020102" } POST /{locale}/api/v1/casier/batterie/update mise à jour du champ batterie des casiers authentification = ROLE_USER champs : 'casiers': [ { 'code': '1234', // code du casier 'batterie': 1 // niveau de la batterie }, ... ] POST /{locale}/api/v1/commande/create création d'une commande authentification = ROLE_USER champs : 'commande': { 'point_de_vente': 'Z737599941', // code du point de vente 'articles': [ // panier { 'produit': 'viseo', // code du produit 'consigne': 1 // consigne : si consigne champ present sinon pas de champ consigne }, { 'produit': 'viseo' // pas de consigne }, { 'produit': 'cubeB', 'consigne' }, { ... } ] } Tous les champs sont obligatoires GET /{locale}/api/v1/commande/get/{id} récuperation d'une commande les clefs des casiers ne sont retournées que si la commande est payée et non livrée cb_etat : etat du dernier paiement, valeurs possibles = - idle : aucun - new : à l'ouverture de la page /payment/new (page avec le bouton payer qui envoie vers le site de la banque) - cancel : à l'ouverture de la page /payment/retour = l'utilisateur a cliqué sur "retour boutique" avant de faire un paiement - error : à l'ouverture de la page /payment/retour/err = l'utilisateur a cliqué sur "retour boutique" après un paiement échoué - success : à l'ouverture de la page /payment/retour/ok = l'utilisateur a cliqué sur "retour boutique" après un paiement réussi cb_date : la date de la derniere modification du champ cb_etat authentification = ROLE_USER GET /{locale}/api/v1/commande/all/{paye}/{livre}/{annule}/{limit} retourne les {limit} dernières commandes du user les clefs des casiers ne sont retournées que si la commande est payée et non livrée paye = 1|0 (defaut = 1) livre = 1|0 (defaut = 0) annule = 1|0 (defaut = 0) limit = nombre de résultats (defaut = 5) authentification = ROLE_USER POST /{locale}/api/v1/commande/annule annulation d'une commande et remboursement des paiements authentification = ROLE_USER POST /{locale}/api/v1/commande/livre passer une commande en livre = true authentification = ROLE_USER POST /{locale}/api/v1/log/create/presentoir/{presentoir_code} création d'un log pour le presentoir {presentoir_code} authentification = ROLE_USER champs : data: { 'log': { 'quoi': 'le présentoir a été bla bla bla', // champ texte libre 'data': { // tableau de valeurs 'champ1': 'valeur1', 'champ2': 'valeur2', ... } } } POST /{locale}/api/v1/log/create/casier/{casier_code} création d'un log pour le casier {casier_code} authentification = ROLE_USER champs : data: { 'log': { 'quoi': 'le casier a été bla bla bla', // champ texte libre 'data': { // tableau de valeurs 'champ1': 'valeur1', 'champ2': 'valeur2', ... } } }, GET /{locale}/api/v1/casier/programmation/get/{id} retourne le casier id = {id} authentification = ROLE_PROGRAMMATION GET /{locale}/api/v1/casier/programmation/{code_presentoir}/{valide}/{limit} retourne les {limit} casiers avec valide = {valide} code_presentoir = code du presentoir ou "all" pour ne pas filtrer valide = all|yes|no limit = nombre de résultats (defaut = 10) authentification = ROLE_PROGRAMMATION POST /{locale}/api/v1/casier/programmation/validate/{id} validate le casier {id} authentification = ROLE_PROGRAMMATION POST /{locale}/api/v1/casier/programmation/unvalidate/{id} unvalidate le casier {id} authentification = ROLE_PROGRAMMATION