An open API service indexing awesome lists of open source software.

https://github.com/theprincelle/lp1-project-api

Yep, you're read that correctly. A simple API, in Java.
https://github.com/theprincelle/lp1-project-api

api-server hibernate java jee jwt maven school-project spring

Last synced: about 2 months ago
JSON representation

Yep, you're read that correctly. A simple API, in Java.

Awesome Lists containing this project

README

          

# LP1 Project - API

Oui, vous avez bien lu. Une simple API, en Java.

Créé par : [Maxime Princelle](https://princelle.org)

[Lien vers le sujet](https://docs.google.com/document/d/1O9Cfxe6QZ-yc6G4GovpEqzZk6cyP_nfo3nQCdmnhhQA/edit)

__Sommaire__
- Comment y accéder ?
- Configuration
- Lancement
- Docker
- Routes
- Technologies utilisées

## Comment y accéder ?

L'API est accessible via ce lien :

[https://lp1.princelle.org/api/](https://lp1.princelle.org/api/)

Pour plus d'informations sur les routes, je vous invite à vous rendre ici.

## Configuration

Une fois la base de données renseignée et l'application lancée, cette dernière, via Hibernate, va générer tout ce qui est nécessaire à son fonctionnement.

Pour la configuration, deux options s'offrent à vous.

1) Vous souhaitez tout faire sur Docker (recommandé) :

Dans ce cas, veuillez suivre la partie sur [Docker](#docker).

2) Vous possédez déjà une base de données :

Dans ce cas, veuillez commencer par copier le fichier `.env.example` et le renommer en `.env`.

Une fois ouvert, vous obtiendrez le fichier suivant :

```sh
# Application
DATABASE_URL=mysql://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}
DATABASE_NAME=lp1Project
DATABASE_USER=#__db_user__#
DATABASE_PASS=#__db_pass__#
DATABASE_HOST=db
DATABASE_PORT=3306

# MySQL
MYSQL_DATABASE=${DATABASE_NAME}
MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_USER=${DATABASE_USER}
MYSQL_PASSWORD=${DATABASE_PASS}

# S3
S3_ENDPOINT=https://s3.princelle.org
ACCESS_KEY=AKIAIOSXXXXX7XXAXPAX
SECRET_KEY=wJalrXUtnFEMI/K7MDEXXXXXxRfiCYXXAXLPXKEX

# JWT
JWT_SECRET=QhEEDgVhHpnehgVcypQNCyJYTTeTkPoncwHPBcJJFPWnJ3Pt76M49vZQioit
```

Pour changer les identifiants de connexion à la base de données, vous pouvez changer les champs suivants :

- DATABASE_USER : `#__db_user__#`
- DATABASE_PASS : `#__db_pass__#`
- DATABASE_NAME : `lp1Project` (le nom de votre base, __créée au préalable (si locale)__ !)
- DATABASE_HOST : `db` (si votre base est locale, mettez `localhost`)
- DATABASE_PORT : `3306`

Pour finir la configuration, enregistrez votre fichier `.env` à la racine du projet.

## Lancement

Passons maintenant au lancement de l'application.

Deux options s'offrent à vous :

- Depuis la racine du projet, lancer cette commande :

```bash
mvn spring-boot:run
```

- Depuis votre environnement de développement, lancer la méthode suivante :

```java
Lp1ProjectApplication.main()
```

En tant que méthode lancée en "Standalone", qui va lancer le serveur intégré Tomcat sur le port 8080.

--

Après cela, il suffira de vous rendre à l'aide de votre client Web sur l'url suivante :

[http://localhost:8080/api/](http://localhost:8080/api/)

```/api``` correspond à la route sur laquelle l'API est publiée.

Pour voir toutes les routes de l'application, cliquez-ici.

### Docker

#### Configuration de l'environnement

Si vous souhaitez démarrer cette application, ainsi que la base de données nécessaire à son fonctionnement, en une seule fois, un fichier docker-compose est mis à disposition.

Avec cette base de données vous est également fourni un environnement phpMyAdmin afin de faciliter la gestion de cette dernière.

Pour commencer, veuillez copier le fichier `.env.example` et le renommer en `.env`.

Une fois ouvert, vous obtiendrez le fichier suivant :

```sh
# Application
DATABASE_URL=mysql://${DATABASE_HOST}:${DATABASE_PORT}/${DATABASE_NAME}
DATABASE_NAME=lp1Project
DATABASE_USER=#__db_user__#
DATABASE_PASS=#__db_pass__#
DATABASE_HOST=db
DATABASE_PORT=3306

# MySQL
MYSQL_DATABASE=${DATABASE_NAME}
MYSQL_RANDOM_ROOT_PASSWORD=yes
MYSQL_USER=${DATABASE_USER}
MYSQL_PASSWORD=${DATABASE_PASS}

# S3
S3_ENDPOINT=https://s3.princelle.org
ACCESS_KEY=AKIAIOSXXXXX7XXAXPAX
SECRET_KEY=wJalrXUtnFEMI/K7MDEXXXXXxRfiCYXXAXLPXKEX

# JWT
JWT_SECRET=QhEEDgVhHpnehgVcypQNCyJYTTeTkPonxxxxxcJJFPWnJ3Pt76M49vZQioit
```

Pour changer les identifiants de connexion à la base de données, vous pouvez changer les deux champs "DATABASE_USER" et "DATABASE_PASS" :

- `#__db_user__#`
- `#__db_pass__#`

Pour finir, enregistrez votre fichier `.env` à la racine du projet.

#### Lancement de l'environnement

Afin de lancer l'environnement, exécutez la commande suivante :

```docker-compose up -d```

##### API

Une fois fait, l'API sera déployée à l'adresse :

[http://localhost:8080/api/](http://localhost:8080/api/)

```/api``` correspond à la route sur laquelle l'API est publiée.

Pour voir toutes les routes de l'application, cliquez-ici.

##### phpMyAdmin

Pour accéder à phpMyAdmin, ce dernier se trouve sur le port 8084, vous pouvez y accédez via le lien suivant :

[http://localhost:8084/](http://localhost:8084/)

## Routes

Comme dit précédemment, ```/api``` correspond à la route sur laquelle l'API est publiée.

Voici l'arborescence de l'application :

- GET ```/``` : Hello World !

- Users
- GET ```/users``` : Liste tous les utilisateurs et leurs informations.

- GET ```/users/{id}``` : Affiche les informations d'un utilisateur en fonction de son ID.

- GET ```/users/pseudo/{pseudo}``` : Affiche les informations d'un utilisateur en fonction de son Pseudo.

- GET ```/users/nocoloc``` : Affiche les utilisateurs qui n'ont pas de Colocation.

- POST ```/signup``` : Ajoute un utilisateur.

__Réponse__ (JSON) : Renvoie l'utilisateur ajouté.

__Requête__ (JSON) : Attends les paramètres suivants (non optionnels) :
```json
{
"firstName": "Maxime", //Obligatoire
"lastName": "Princelle", //Obligatoire
"emailId": "contact@princelle.org", //Obligatoire et unique
"password": "test1", //Obligatoire
"pseudo": "ThePrince" //Obligatoire et unique.
}
```

- PUT ```/users/{id}``` : Modifie les informations d'un utilisateur en fonction de son ID.

__Réponse__ (JSON) : Renvoie l'utilisateur modifié.

__Requête__ (JSON) : Attends un ou plusieurs des paramètres suivants :
```json
{
"firstName": "Maxime", //Optionnel
"lastName": "Princelle", //Optionnel
"emailId": "contact-maxime@princelle.org", //Optionnel
"password": "test2", //Optionnel
"pseudo": "TheKing" //Optionnel
}
```

- DELETE ```/users/{id}``` : Supprime un utilisateur en fonction de son ID.

__Réponse__ (JSON) : Renvoie un boolean confirmant sa suppression.
```json
{
"deleted": true
}
```

- Colocations
- GET ```/colocs``` : Liste toutes les colocations et leurs informations.

- GET ```/colocs/{id}``` : Affiche les informations d'une colocation en fonction de son ID.

- GET ```/colocs/{id}/members``` : Affiche les membres d'une colocation en fonction de son ID.

- POST ```/colocs``` : Ajoute une colocation.

__Réponse__ (JSON) : Renvoie la colocation ajoutée.

__Requête__ (JSON) : Attends les paramètres suivants (non optionnels) :
```json
{
"name": "L'équipeDe@W.", //Obligatoire
}
```

- POST ```/colocs/{id}/members/{userID}``` :
Ajoute l'utilisateur avec son ID (```userID```) (si il existe)
à la Colocation déterminée elle aussi par son ID.

__Réponse__ (JSON) : Renvoie la liste des membres de la Colocation.

- PUT ```/colocs/{id}``` : Modifie les informations d'une colocation en fonction de son ID.

__Réponse__ (JSON) : Renvoie la colocation modifiée.

__Requête__ (JSON) : Attends un ou plusieurs des paramètres suivants :
```json
{
"name": "L'équipeDe@H.", //Optionnel
}
```

- DELETE ```/colocs/{id}/members/{userID}``` :
Retire l'utilisateur de la Colocation déterminé par son ID
avec l'ID de l'Utilisateur (```userID```) (si il existe et s'il est bien membre).

__Réponse__ (JSON) : Renvoie la liste des membres de la Colocation.

- DELETE ```/colocs/{id}``` : Supprime une colocation en fonction de son ID.

__Réponse__ (JSON) : Renvoie un boolean confirmant sa suppression.
```json
{
"deleted": true
}
```

- Tasks
- GET ```/tasks``` : Liste toutes les taches et leurs informations.

- GET ```/tasks/{id}``` : Affiche les informations d'une tache en fonction de son ID.

- GET ```/tasks/coloc/{colocId}``` :

Affiche les taches liées à une Colocation (déterminée par son ID).

- GET ```/tasks/not_attributed``` : Affiche les taches non attribuées.

- GET ```/tasks/coloc/{colocId}/not_attributed``` :

Affiche les taches non attribuées liées à une Colocation (déterminée par ```colocId```).

- GET ```/tasks/pending``` : Affiche les taches en attente.

- GET ```/tasks/coloc/{colocId}/pending``` :

Affiche les taches en attente liées à une Colocation (déterminée par ```colocId```).

- GET ```/tasks/users/to/{userId}/pending``` :

Affiche les taches en attente, liées à un 'User' (déterminé par ```userId```).

- GET ```/tasks/users/from/{userId}/pending``` :

Affiche les taches en attente, déposées par un 'User' (déterminé par ```userId```).

- GET ```/tasks/proposed``` : Affiche les taches proposées.

- GET ```/tasks/coloc/{colocId}/proposed``` :

Affiche les taches proposées liées à une Colocation (déterminée par ```colocId```).

- GET ```/tasks/users/to/{userId}/proposed``` :

Affiche les taches proposées à un 'User' (déterminé par ```userId```).

- GET ```/tasks/users/from/{userId}/proposed``` :

Affiche les taches proposées par un 'User' (déterminé par ```userId```).

- GET ```/tasks/users/to/{userId}``` :

Affiche les taches liées à un 'User' (déterminé par ```userId```).

- GET ```/tasks/users/from/{userId}``` :

Affiche les taches créées par un 'User' (déterminé par ```userId```).

- POST ```/tasks``` : Ajoute une tache.

__Réponse__ (JSON) : Renvoie la tache ajoutée.

__Requête__ (JSON) : Attends les paramètres suivants :
```json
{
"title": "Faire des pâtes", //Obligatoire
"description": "Ne pas oublier l'eau...", //Obligatoire
"cost": 5, //Type: Entier //Obligatoire
"proposed": false, //Type: Booléen //Obligatoire
"coloc": {
"id": 1
}, //Obligatoire
"fromPerson": {
"id": 1
},
"toPerson": {
"id": 2
}
}
```

- PUT ```/tasks/{id}``` : Modifie une tache, en fonction de son ID et de son état.

__Réponse__ (JSON) : Renvoie la tache modifiée.

__Requête__ (JSON) : Attends les paramètres suivants (optionnels) :
```json
{
"title": "Faire du riz",
"description": "Parce que c'est la vie...",
"cost": 5, //Type: Entier
"proposed": false, //Type: Booléen
"coloc": {
"id": 1
},
"fromPerson": {
"id": 1
},
"toPerson": {
"id": 2
},
"picture": "https://tenor.com/SXcQ.gif" //Type: URL directe vers Image
}
```

NB : Si la tache a déjà été effectué (présence d'une "finishDate"), seule l'image est modifiable.

- PUT ```/tasks/{id}/valid/to``` :

Marque la tache comme validée du côté de la personne
à qui elle l'a été attribuée.

Attribue également à la tache la date et l'heure du jour.

__Réponse__ (JSON) : Renvoie la tache modifiée.

- PUT ```/tasks/{id}/valid/from``` :

Marque la tache comme validée du côté de la personne
qui l'a attribuée.

Attribue également à l'utilisateur à qui la tache été dédié (s'il y en a un, et qu'il l'a validée avant de son côté), les points eux sont ajoutés automatiquement.

__Réponse__ (JSON) : Renvoie la tache modifiée.

- PUT ```/tasks/{id}/valid/to/rev``` :

Annule le marquage de la tache comme validée du côté de la personne
à qui elle l'a été attribuée.

Si la tâche a été validée par la personne qui l'a créée, il ne sera plus possible de faire cette requête

__Réponse__ (JSON) : Renvoie la tache modifiée.

- PUT ```/tasks/{id}/valid/from/rev``` :

Annule le marquage de la tache comme validée du côté de la personne
qui l'a attribuée.

Les points sont retirés automatiquement s'ils ont été attribués à un utilisateur. La date et le statut de la tache du côté de la personne a qui elle est attribuée, sont supprimés.

__Réponse__ (JSON) : Renvoie la tache modifiée.

- DELETE ```/tasks/{id}``` : Supprime la tache en fonction de son ID.

__Réponse__ (JSON) : Renvoie un boolean confirmant sa suppression.
```json
{
"deleted": true
}
```

NB : Les points sont retirés automatiquement du score de l'utilisateur s'ils ont été attribués auparavant.

## Technologies utilisées

Ce projet Maven est basé sur :
- Apache Tomcat
- Spring
- JPA / Hibernate avec MySQL Connector
- Jersey

----

[Remonter en haut](#lp1-project---api)