Waistline API

API de synchronisation avec l'application mobile Waistline

Dashboard Grafana - Waistline APIPage de connexion - Waistline APIDashboard - Waistline API
  • PHP
  • Symfony
  • PostgreSQL
  • MongoDB
  • Docker

Documentation - Code source

Introduction

J'utilise manière quotidienne l'application Waistline qui me permet de suivre mes apports nutritionnels sur la journée. Le fonctionnement est le même que pour l'application MyFitnessPal sauf que Waistline est une application open source qui me permet de disposer de mes données comme je le souhaite.

L'application permet de partager ses données avec un service externe sauf que le développement du service externe initialement prévu n'a jamais abouti.
J'ai donc décidé de développer mon propre service dans le but de pouvoir collecter mes données et de les visualiser facilement.

Aperçu du projet

L'objectif est d'avoir une API qui reçoit les données de l'application, les stocke et les expose pour pouvoir les consulter facilement.
Je souhaitais pouvoir les afficher dans un dashboard Grafana.

Il était important pour moi que ce projet soit open source, qu'il soit facilement utilisable et auto-hébergable par n'importe qui.

Choix technique

Pour le développement de l'application, j'ai choisi d'utiliser PHP en combinaison avec Symfony, c'est une stack technique avec laquelle j'ai l'habitude de travailler et l'utilisation d'un framework comme Symfony est un vrai gain de temps.

Concernant la base de données, j'ai fait le choix d'utiliser PostgreSQL et MongoDB. L'utilisation de deux bases de données est un choix assez peu conventionnel mais je souhaitais pouvoir gérer les données de manière différente.
Ne maitrisant pas la structure des données provenant de l'application Waistline et partant du principe que celles-ci pourraient être amenées à évoluer, j'ai préféré mettre le moins de contrainte possible au niveau des données venant de l'application. C'est pourquoi j'ai choisi d'utiliser MongoDB pour le stockage de ces données.

Cependant, j'ai décidé d'utiliser PostgreSQL comme base de données "principale", elle sert notamment pour gestion d'accès et d'identité. Bien que j'aurais pu utiliser MongoDB pour cette partie, je voulais utiliser une base de données relationnelles qui me permettrait éventuellement de remplacer MongoDB dans le futur du projet lorsqu'il sera plus mature et qu'il faudra rajouter plus de contraintes sur les données.

Pour le déploiement de l'application, j'ai choisi de me concentrer uniquement sur Docker, bien que l'application puisse être utilisée dans un environnement web classique. L'intérêt est que la conteneurisation de l'application permet d'uniformiser le déploiement de celle-ci pour faciliter son déploiement sur n'importe quelle plateforme.

Fonctionnalités

Dashboard

Le dashboard est la partie de l'application qui permet à un utilisateur de créer un compte et de se connecter. Une fois connecté cette interface permet d'avoir accès à sa clé d'API ainsi qu'aux instructions permettant de synchroniser son application mobile avec l'API, ainsi que de visualiser l'utilisation du quota journalier de l'API.

API

L'API possède 3 endpoints : Sync, Journal et Stats, ils permettent de synchroniser les données ainsi que d'y avoir accès facilement.

Sync: L'endpoint "sync" est utilisé pour synchroniser l’application mobile Waistline avec l’API. Cet endpoint est appelé lorsque l’application partage les données du journal.

Journal: L'endpoint "journal" de l’API, permet de rechercher toutes les informations sur un jour spécifique du journal. Il permet de voir les données de façons détaillées, d'une manière plus "brut".

Stats: L'endpoint "stats" est utilisé pour obtenir des données nutritionnelles à partir d’un ou plusieurs jours du journal. C'est cet endpoint qui est utilisé par le dashboard Grafana pour visualiser les données facilement.

Conclusion

Je viens tout juste de faire la première release de ce projet et je suis très content de la version finale de celui-ci. Ce fût un projet assez court mais très intéressant aussi bien dans sa conception que dans sa réalisation.
J'utilise aujourd'hui ce projet quotidiennement et j'espère qu'il pourra servir à d'autres personnes pour s'émanciper d'application propriétaire comme MyFitnessPal qui malheureusement contrôlent nos données de manière opaque.

N'hésitez pas à jeter à coup d'oeil à Waistline si vous souhaitez suivre vos apports nutritionnels en gardant la main sur vos données personnelles.