{"id":16955792,"url":"https://github.com/yoannfleurydev/notif-cosmo-ei-server","last_synced_at":"2026-04-16T19:13:14.016Z","repository":{"id":79530610,"uuid":"75162408","full_name":"yoannfleurydev/notif-cosmo-ei-server","owner":"yoannfleurydev","description":"Java Web University Project","archived":false,"fork":false,"pushed_at":"2017-01-19T17:38:38.000Z","size":620,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-08-07T00:46:43.672Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yoannfleurydev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-11-30T07:25:37.000Z","updated_at":"2016-12-08T13:15:38.000Z","dependencies_parsed_at":"2023-02-27T16:32:16.327Z","dependency_job_id":null,"html_url":"https://github.com/yoannfleurydev/notif-cosmo-ei-server","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/yoannfleurydev/notif-cosmo-ei-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoannfleurydev%2Fnotif-cosmo-ei-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoannfleurydev%2Fnotif-cosmo-ei-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoannfleurydev%2Fnotif-cosmo-ei-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoannfleurydev%2Fnotif-cosmo-ei-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yoannfleurydev","download_url":"https://codeload.github.com/yoannfleurydev/notif-cosmo-ei-server/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yoannfleurydev%2Fnotif-cosmo-ei-server/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":269181020,"owners_count":24373846,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-06T02:00:09.910Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-13T22:13:19.365Z","updated_at":"2026-04-16T19:13:13.969Z","avatar_url":"https://github.com/yoannfleurydev.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Notification d'effets indésirables sur produits cosmétiques Web Service\n\n## Installation\n\n### Étape 1, cloner le dépôt\n\n```sh\ngit clone git@github.com:yoannfleurydev/notif-cosmo-ei-server.git # via ssh\ngit clone https://github.com/yoannfleurydev/notif-cosmo-ei-server.git # via http\n\ncd notif-cosmo-ei-server\n```\n\n### Étape 2, créer la base de données\n\n```sql\nCREATE DATABASE notifcosmoei\n```\n\nN'oubliez pas de créer un utilisateur et lui donner les droits suffisant sur cette base \nde données. Les données seront à fournir par la suite dans le fichier de configuration\nde l'application.\n\n### Étape 3, configurer l'application\n\n```sh\ncp src/main/resources/application.properties.dist src/main/resources/application.properties\nvim src/main/resources/application.properties\n```\n\nChangez les paramètres en fonction de votre besoin. Changez le paramètre \n`notif-cosmo-ei.api-check.check-region-code` à `false` si vous n'avez pas \najouté le certificat SSL nécessaire pour contacter l'API du gouvernement \nfrançais. Dans le cas où vous souhaitez tout de même vérifier le code des \nrégions, [la documentation](#validité-des-données) pour installer le \ncertificat est disponible un peu plus bas.\n\n### Étape 4, lancer le serveur\n\n```sh\n./mvnw spring-boot:run # sous GNU/Linux\nmvnw.cmd spring-boot:run # sous Windows\n```\n\n## Technologies\n\nUtilisation des technologies suivantes :\n\n* Java 8 (utilisation de lambda, donc impossible en dessous)\n* Spring Boot\n* Angular (nouvelle version, utilisation de web component, utilisez Chrome, \nFirefox dans leurs dernières versions)\n\n## API\n\n* https://geo.api.gouv.fr\n\n## Routes\n\n### Inscription et connexion\n\n**POST /user/signup**\n\n```json\n{\n    \"userName\" : \"yoannfleurydev\",\n    \"email\" : \"yoann.fleury@example.com\",\n    \"firstName\" : \"Yoann\",\n    \"lastName\" : \"Fleury\",\n    \"password\" : \"azerty\",\n    \"role\" : \"USER\"\n}\n```\n\n**POST /user/login**\n```json\n{\n    \"name\" : \"yoannfleurydev\",\n    \"password\" : \"azerty\"\n}\n```\n\n**NOTE :** Ces routes renvoient un token qui permet d'identifier l'utilisateur \nen cours. Ce token est à envoyer pour les requêtes en `POST` dans le *header* \nHTTP `Authorization` avec comme valeur `Bearer le_token`. Ceci permet au web \nservice de reconnaitre l'utilisateur. C'est ce qu'on appelle un JSON Web Token\nou JWT.\n\n### Produits\n\n**GET /products** : retourne tous les produits disponible en base de données.\n\n**GET /products/{id}** : retourne l'élément d'index `id`.\n\n**POST /products** : crée un produit en base de données et le retourne si tout \nse passe bien. Il est possible de passer en même temps des index d'ingrédients \nexistant déjà en base de données. Si un index d'ingrédient n'existe pas, l'ajout\ndu produit sera annulé.\n\n```json\n{\n\t\"name\" : \"Name\",\n\t\"ingredients\" : [\n\t\t1\n\t]\n}\n```\n**PUT /products/{id}** : met à jour le produit d'index `id` et le retourne si \ntout se passe bien.\n\n```json\n{\n\t\"name\": \"Name\"\n}\n```\n\n**DELETE /products/{id}** : supprime le produit d'index `id`.\n\n**GET /products/{id}/effects** ou **GET /products/{id}/notifications** : \nretourne tous les effets et notifications en rapport avec le produit d'index \n`id`.\n\n```json\n{\n\t\"product\": {\n\t\t\"id\": 1,\n\t\t\"name\": \"Shampoing\",\n\t\t\"ingredients\": [\n\t\t\t2,\n\t\t\t3\n\t\t]\n\t},\n\t\"effects\": [\n\t\t{\n\t\t\t\"id\": 1,\n\t\t\t\"description\": \"Gratte\",\n\t\t\t\"level\": \"UNKNOWN\"\n\t\t}\n\t],\n\t\"notifications\": [\n\t\t{\n\t\t\t\"id\": 2,\n\t\t\t\"user\": 1,\n\t\t\t\"code\": \"28\",\n\t\t\t\"date\": 1484054514000,\n\t\t\t\"effects\": [\n\t\t\t\t1\n\t\t\t],\n\t\t\t\"products\": [\n\t\t\t\t1\n\t\t\t]\n\t\t}\n\t]\n}\n```\n\n### Ingrédients\n\n**GET /ingredients** : retourne tous les ingrédients stockés en base de données.\n\n**GET /ingredients/{id}** : retourne l'ingrédients d'index `id`.\n\n**POST /ingredients** : crée un ingrédient en base de données et le retoune si \ntout se passe bien. \n\n```json\n{\n    \"name\": \"Aqua\"\n}\n```\n\n**PUT /ingredients/{id}** : met à jour l'ingrédient d'index `id` et le retourne\nsi tout se passe bien.\n\n```json\n{\n    \"name\": \"Aqua\"\n}\n```\n\n**DELETE /ingredients/{id}** : supprime l'ingrédient d'index `id`.\n\n### Effets\n\n**GET /effects** : retourne tous les effets stockés en base de données.\n\n**GET /effects/{id}** : retourne l'effet d'index `id`.\n\n**GET /effects/most\\_reported** : retourne tous les effets par nombre de \ndéclarations.\n\n```json\n[\n\t{\n\t\t\"id\": 2,\n\t\t\"description\": \"Ca gratte\",\n\t\t\"level\": \"UNKNOWN\",\n\t\t\"nbNotifications\": 9\n\t},\n\t{\n\t\t\"id\": 1,\n\t\t\"description\": \"Ouille\",\n\t\t\"level\": \"UNKNOWN\",\n\t\t\"nbNotifications\": 5\n\t}\n]\n```\n\n**GET /effects/heaviest** : retourne tous les effets, classé par poids selon \nle rôle de l'utilisateur pour chaque déclaration.\n\nL'exemple ci-dessous reprend celui juste au-dessus avec une déclaration de \nmédecin en plus pour l'effet **Ouille**, ce qui ajoute un poids de 5 et passe \ndonc au dessus de l'effet **Ca gratte**.\n\n```json\n[\n\t{\n\t\t\"id\": 1,\n\t\t\"description\": \"Ouille\",\n\t\t\"level\": \"UNKNOWN\",\n\t\t\"nbNotifications\": 6\n\t},\n\t{\n\t\t\"id\": 2,\n\t\t\"description\": \"Ca gratte\",\n\t\t\"level\": \"UNKNOWN\",\n\t\t\"nbNotifications\": 9\n\t}\n]\n```\n\n**POST /effects** : crée un effet en base de données et le retourne si tout se \npasse bien.\n\n**PUT /effects/{id}** : met à jour l'effet d'index `id` et le retourne si tout \nse passe bien.\n\n**DELETE /effects/{id}** : supprime l'effet d'index `id`.\n\n### Notifications\n\n**GET /notifications** : retourne toutes les notifications stockées en base de données.\n\n**GET /notifications/myself** : retourne toutes les notifications déposées par moi.\n\n**GET /notifications/{id}** : permet de récupérer la notification correspendante à \nl'index passé en paramètre\n\n**POST /notifications** : permet de poster une notification\n\n**PUT /notifications/{id}** : permet de mettre à jour la notification d'index `id`\n\n**DELETE /notifications/{id}** : permet de supprimer la notification d'index `id`\n\n### Recherche\n\nIl est possible de rechercher des termes sur des champs précis des objets. \nLes recherches sont insensibles à la casse. En voici la liste :\n\n\u003e `recherche` étant le terme à rechercher.\n\n* Recherche sur le **nom** d'un ingrédient : `GET /ingredients/search?value=recherche`,\n* Recherche sur le **nom** d'un produit : `GET /products/search?value=recherche`\n* Recherche sur la **description** d'un effet : `GET /effect/search?value=recherche`\n\n## Pagination\n\nIl est possible de paginer sur les routes de type `GET` sur `/entities`.\nLes paramètres sont les suivants :\n\n* **page** `int` (défaut=0) : la page que l'on souhaite\n* **limit** `int` (défaut=20) : le nombre d'entité par page\n* **direction** `string` (défaut=ASC, valeurs=ASC|DESC) : le sens du tri\n* **property** `string` (défaut=id) : la propriété à trier\n\nUn exemple de pagination peut être : `/ingredients?page=2\u0026limit=10\u0026property=name`\n\n## Architecture logique\n\nNotre architecture se veut plus complexe qu'un simple Web Service avec Spring.\nNotre code est plus vaste qu'un simple projet, mais permet d'avoir le contrôle \nsur les données que renvoie notre Web Service grâce à l'abstraction \nsupplémentaire des **DTO** (Data Transfer Object). Grâce à cette abstraction, \nnous choisissons ce qui est envoyé ou non par notre API. Les `Mappers` \npermettent de mapper les champs entre l'entité et le `DTO`. Utiliser un \nframework c'est bien pour la vitesse de développement, mais en avoir le contrôle\nest encore mieux, même si il faut perdre un peu de temps pour ça.\n\nNotre Web Service est protégé par une authentification par JWT (Json Web Token)\nqui assure l'intégrité de la connexion et qui permet de garder un Web Service\nsans état.\n\n### Diagrammes de l'architecture logicielle\n\n**Package principal:**\n\n![Package principal](doc/yoannfleury_package.png)\n\n**Contrôleurs :**\n\n![Contrôleurs](doc/controller_package.png)\n\n**DTO :**\n\n![DTO](doc/dto_package.png)\n\n**Entité :**\n\n![Entité](doc/entity_package.png)\n\n**Exception :**\n\n![Exceptions](doc/exception_package.png)\n\n**Mapper :**\n\n![Mapper](doc/mapper_package.png)\n\n**Propriétés de l'application :**\n\n![Proprétés de l'application](doc/property_package.png)\n\n**Repository :**\n\n![Repository](doc/repository_package.png)\n\n**Sécurité :**\n\n![Sécurité](doc/security_package.png)\n\n**Service :**\n![Service](doc/service_package.png)\n\n### Base de données\n\nSchema de la base de données \n\n![Schema de la base de données](doc/database_schema.png)\n\n## Validité des données\n\nAfin de garantir un maximum la validité des données, nous faisons appel au web \nservice du gouvernement permettant de récupérer les régions françaises.\n\nPour pouvoir contacter cette API depuis le serveur, il faut que le certificat \nSSL de l'API en question soit dans les certificats connus par Java. Ce \n[lien](http://magicmonster.com/kb/prg/java/ssl/pkix_path_building_failed.html) \ncontient la démarche.\n\nIl est possible de désactiver cette fonctionnalité grâce à l'option \n`notif-cosmo-ei.api-check.check-region-code` qui est un booléen. A `false`, le \ncode de l'application ne vérifira pas le code des régions. \n\nLa vérification du code des régions prends également du temps. Dans le cas ou \nla communication entre le serveur et le client est longue, nous conseillons la \ndésactivation de cette option.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoannfleurydev%2Fnotif-cosmo-ei-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyoannfleurydev%2Fnotif-cosmo-ei-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoannfleurydev%2Fnotif-cosmo-ei-server/lists"}