Ce projet a été réalisé dans le cadre de ma formation chez Simplon afin de comprendre et maitriser une API.
1 - Vous devez maquetter les premiers screens de l'application et définir les scénarios.
2 - Vous allez concevoir la BDD (SQL || noSQL || autre) => Modélisation, schema, etc...
3 - Vous allez créer les premières tables ou documents
4 - développer avec un code défensif
5 - Afficher les infos requêtées sur le front
6 - Documenter l'API
7 - Déployer en ligne
8 - Mettre en place les outils de gestion de projet.
9 - Pensez que l'application sera portée sur Mobile et Desktop !
-
Java - projet java maven
-
Spring Boot - Creér l'API
-
Hibernate - Connecter à la Base de donneées
-
MySQL - la Base de donneées
-
POSTMAN - Veérifier URLs (API)
-
GitHub - Déployer le projet le côté Git
-
HEROKU - Déployer sur le server
GET getUsers()
https://api-swing.herokuapp.com/api/users
| KEY | VALUE |
|---|---|
| Content-Type | application/json |
EX. Success Response
[
{
"id": 1,
"username": "Sarah5",
"firstname": "Zahra",
"lastname": "Sadeghi",
"mail": "bhr.sdgioiki@gmail.com",
"password": "$2a$10$7Z2Hj23t8YiQUz71m0kiaeZSo9.PaC/awtbjapy7YXvbUccgNWQBq",
"objects": []
},
{
"id": 2,
"username": "Sarah",
"firstname": "Zahra",
"lastname": "Sadeghi",
"mail": "bhr.sdg@gmail.com",
"password": "$2a$10$aAYXdTo1ImDyrSTsl8zDCerrLq9q9J8fncJeu/VWjA177BbH2QCt.",
"objects": []
}
]Ex. NOT_FOUND response
{
"timestamp": "02-06-2021 03:31:40",
"status": "NOT_FOUND",
"message": "Resource Not Found",
"errors": [
"User list is empty."
]
}GET getObjects()
https://api-swing.herokuapp.com/objects/all
| KEY | VALUE |
|---|---|
| Content-Type | application/json |
EX. Success Response
[
{
"id": 1,
"status": "BOOK",
"title": "Le petit prince",
"description": null,
"ageMin": 2,
"ageMax": 5
}
]Ex. NOT_FOUND response
{
"timestamp": "02-06-2021 08:08:23",
"status": "NOT_FOUND",
"message": "Resource Not Found",
"errors": [
"Object list is empty."
]
}GET getUserById()
https://api-swing.herokuapp.com/api/user/{1}
| KEY | VALUE |
|---|---|
| Content-Type | application/json |
EX. Success Response
{
"id": 1,
"username": "Sarah132",
"firstname": "Baharyy",
"lastname": "Merian",
"mail": "bhr.dubqyyy@gmail.com",
"password": "$2a$10$ttjiHMLb0VaymIOPbvOEv.uyZtc5jw1dN4rBD8wgiid7UXuOiFZ.G",
"objects": []
}Si "id" de USER n'est pas dans la BDD, nous verrons la réponse suivante :
EX. NOT_FOUND Response
PUT updateUserById()
https://api-swing.herokuapp.com/api/update/{1}
| KEY | VALUE |
|---|---|
| Content-Type | application/json |
{
"username": "Sarah132",
"firstname": "Baharyy",
"lastname": "Merian",
"mail": "bhr.dubqyyy@gmail.com",
"password": "$2a$10$ttjiHMLb0VaymIOPbvOEv.uyZtc5jw1dN4rBD8wgiid7UXuOiFZ.G",
"objects": []
}EX. Success Response
{
"id": 1,
"username": "Sarah202",
"firstname": "Bahar",
"lastname": "Dubeau",
"mail": "bhr.waren@gmail.com",
"password": "$2a$10$lhEWkZqCvVyRjVHeUDqf7e3rllMZD0txdPTrOnmhnxRizvF6FSE56",
"objects": []
} DELETE deleteUserById()
https://api-swing.herokuapp.com/api/user/{1}
EX. Success Response
User with ID : 1 is deleted
Aussi toujours la réponse d' "id" qui n'existe pas dans la BDD est :
EX. NOT_FOUND Response
"User with ID [?] Not Found!"
POST saveUser()
https://api-swing.herokuapp.com/api/registration
J'ai défini différentes expressions régulières ("paterns") dans model afin de respecter le forme demandée pour chaque entrée.
Exemple :
-
Username (type = string) : regexp = "^[A-Za-z0-9]{4,15}", message = "length must be between 4 - 15 letters."
-
Password (type = string) : regexp = "^(?=.\d)(?=.[A-Z])(?=.[a-z])(?=.[^\\w\\d\\s:])([^\\s]){6,200}$", message = "length must be minimum 6, use Upper, Lower, letter and special characters"
J'ai égaement sécuriser les données du coté de la Base de Donnée (BDD) : c'est-a-dire valeur unique, not null.
En plus, j'ai creer un package exceptions ou j'ai customise les exceptions renvoyés lorsque des erreurs surviennent.
| KEY | VALUE |
|---|---|
| Content-Type | application/json |
{
"username": "Sarah12",
"firstname": "Zahra",
"lastname": "Sadeghi",
"mail": "bhr.sdgi@gmail.com",
"password": "Zahra@23"
}EX. Success Response
{
"id": 3,
"username": "Sarah12",
"firstname": "Zahra",
"lastname": "Sadeghi",
"mail": "bhr.sdgi@gmail.com",
"password": "$2a$10$jRYn4EnpsoOLDIQREe0oDeGBPlP1nS7lOcR4HgjMcB/O/mMMGGNGW",
"objects": null
}{
"username": "Sarah12",
"firstname": "Zahra",
"lastname": "Sadeghi",
"mail": "bhr.sdgi@gmail.com",
"password": "Zahra@23"
}EX. DuplicateKeyException - Double
Username et Mail sont UNIQUE dans la table (Sécurisé côté BDD)
{
"timestamp": "02-06-2021 08:44:51",
"status": "CONFLICT",
"message": "Unique value for USERNAME and EMAIL",
"errors": [
"Username: [Sarah12] and Email: [bhr.sdgi@gmail.com] already exists !"
]
}Si seulement Username est en double, la reponse sera
[
"Username: [***] already exists !"
]
Si seulement MAIL est en double, la reponse sera
[
"Email: [***] already exists !"
]
POST saveUser()
https://api-swing.herokuapp.com/api/registration
| KEY | VALUE |
|---|---|
| Content-Type | application/json |
{
"status": "BOOK",
"title": "Le petit prince",
"description": "Le Petit Prince est une œuvre de langue française,
la plus connue d'Antoine de Saint-Exupéry. Publié en 1943 à New York
simultanément à sa traduction anglaise1, c'est une œuvre poétique et
philosophique sous l'apparence d'un conte pour enfants.",
"ageMin": 2,
"ageMax": 100
}EX. Success Response
{
"id": 1,
"status": "BOOK",
"title": "Le petit prince",
"description": "Le Petit Prince est une œuvre de langue française,
la plus connue d'Antoine de Saint-Exupéry. Publié en 1943 à New York
simultanément à sa traduction anglaise1, c'est une œuvre poétique et
philosophique sous l'apparence d'un conte pour enfants.",
"ageMin": 2,
"ageMax": 100
}Il y aura les mêmes requêtes pour
UPDATEetDELETEpour un objet (A cause de manque de temps cette partie n'est pas codé)
. Java 15.0.2
. Spring Boot 2.5.0
. MySQL 8.0.22
-
Créer le projet sur
GitHub(Ce projet est privé) -
Ajouter Spring Boot au projet (dans mon cas, comme j'utilise
java EE, j'ai pu creer directement le projet Maven Spring Boot guide), sinon il faut aller spring initilizr et créer un projet Maven et ajouter les dependants nécessaires et en suite appuyer sur le bouttonGENERATE. -
Déplacer le dossier telecharge où vous souhaitez vous codez. Ensuite importer dossier dans le projet maven existant.
Mon projet contient les differents packages (couches)
-
Model (User, Objects)
-
Repository (DAO le coœur de projet)
-
Business (le cerveau de projet)
-
Controller (la première couche où on communique avec l'interface (ici POSTMAN)
-
JWT (authentification)
-
Exceptions (exceptions customisées)
-
Configuration (configurer l'authentification) , aussi on configure les parameteres de Spring Boot dans
applications.properties.
et la partie qui nous permet de lancer le projet et au meme niveau que les autres packages est la classe SwingApplication.java
Tous les dependants MAVEN se trouve dans pom.xml.
Il est obligatoire de mettre a jour le projet apres ajout d'un dependant.
- menu eclipse > Run Configuration > Maven Build > Click on Skip Tests > apply and Close
- Right click > Maven > Update Project ...
Après avoir déployé le projet sur GitHub, j'ai configuré mon projet pour pouvoir déployer égalemet sur Heroku. Pour cela :
J'ai crée une APP dans mon compte Heroku "api-swing".
Ajouté Procfile(Dyno), .env, app.json, system.properties
Ajouté JawsDB MySQL(Add-ons) dans Heroku (Malheureusement Heroku n'a pas MySQL Add-ons default)
Récupéré les parameters de connexion de JawsDB et créé une nouvelle connexion sur MySQl Workbench
Configurer applications.properties
spring.datasource.url= ${JDBC_DATABASE_URL}
spring.datasource.username=${JDBC_DATABASE_USERNAME}
spring.datasource.password=${JDBC_DATABASE_PASSWORD}
En plus
Et afin sur Heroku,
Deploy > Deployment method > GitHub connectnous allons choisir Authomatic connection + branche main (Il y a la possibilité de créer plusieurs piplines pour plusieures branches)
A partir de ce moment, à chaque fois que nous mergeons la branche de travail avec la branche main, le projet va se dépoyer authomatiquement sur heroku.
| Plugin | README |
|---|---|
| GitHub | https://github.com/ZDubeau/ApiSwing#readme |
| Google Drive | plugins/googledrive/README.md |

