Commit eea7e3f9 authored by Julien SADAOUI's avatar Julien SADAOUI
Browse files

feat: spring-reactor wording

parent 0526bdc6
/*
* This file was generated by the Gradle 'init' task.
*
* This generated file contains a sample Java project to get you started.
* For more details take a look at the Java Quickstart chapter in the Gradle
* user guide available at https://docs.gradle.org/5.0/userguide/tutorial_java_projects.html
*/
subprojects {
version = "1.0"
}
rootProject.name = 'reactive'
/*
* This file was generated by the Gradle 'init' task.
*
* The settings file is used to specify which projects to include in your build.
*
* Detailed information about configuring a multi-project build in Gradle can be found
* in the user guide at https://docs.gradle.org/5.0/userguide/multi_project_builds.html
*/
rootProject.name = "reactive-programming"
include("spring-reactor")
include("rxjava")
# spring-reactor # Coding Dojo : Reactor et Spring WebFlux
This is a sample demonstrating Spring 5 Webflux framework. It uses Spring Data Mongo’s support for reactive libraries to provide an end to end reactive flow. =========================================
Bienvenue dans ce **Coding Dojo** ciblé sur l'usage de la programmation réactive, en utilisant le projet Reactor et le module Spring WebFlux.
Le but de cet exercice est d'être capable de construire une application avec un flux réactif de bout en bout, c'est-à-dire en partant par l'entrée de l'API REST jusqu'à la base de données.
Le framework Spring 5 permet de fournir des flux réactifs de bout en bout avec les nouveaux modules Spring WebFlux, Spring Data Mongo Reactive et Spring Security.
## 1. Cas d'utilisation
L'application que nous développons dans ce **Coding Dojo** permet de gérer des comptes d'un établissement bancaire. La modélisation de l'application est très simpliste, nous concentrons sur l'utilisation de la programmation réactive avec Reactor et Spring WebFLux.
- **User** : représente un utilisateur connecté à l'application.
- **Account** : représente un compte bancaire associé à un client particulier
- **Transaction** : représente une opération de débit ou crédit sur un compte particulier. Cette opération affecte le montant du compte bancaire.
Notre application recherchera des données dans une base de données MongoDB pour renseigner notre compte et renvoyer ces informations. Les URI suivants devront fonctionner:
- GET (app IP)/account/ : affiche chaque compte de la base de données
- GET (app IP)/account/{number} : affiche les informations d'un compte particulier en base de données
- POST (app IP)/account : crée un nouveau compte dans la base de données
- DELETE (app IP)/account : supprime un compte particulier de la base de données
- GET (app IP)/account/{number}/transaction : affiche chaque transaction d'un compte particulier en base de données
- GET (app IP)/account/{number}/transaction/credit : crédite un compte particulier en base de données
- GET (app IP)/account/{number}/transaction/debit : débite un compte particulier en base de données
La base MongoDB est embarquée dans l'application et déjà opérationnelle. Vous n'aurez pas besoin de ces informations car le pilote Mongo est déjà implémenté et n'est pas l'objet de ce **Coding Dojo**.
## 2. Frameworks
Les frameworks utilisés pour ce coding dojo sont nombreux. Ci-dessous une liste des principaux :
* Java 11
* JUnit 5
* Lombok 1.18.4
* Reactor 3.2.3
* Spring Boot 2.1.1
* Spring WebFlux 5.1.3
* Spring Security 5.1.2
* Netty 4.1.31
* MongoDB
* Mongobee
* Etc.
## 3. Enoncé
Passons maintenant au développement ce **Coding Dojo**, vous trouverez dessous les instructions pour compléter cet exercice. L'applicatio est déjà codée, l'idée est de se concentrer sur les parties utilisant la programmation réactive avec le projet **Reactor**.
### A. Configuration de la sécurité HTTP
- Dans la classe **SecurityConfiguration**, activez la sécurité pour les applications réactives dans Spring
- Toujours dans la classe **SecurityConfiguration**, ajoutez la gestion des annotations de sécurité
- Afin de récupérer les informations de l'utilisateur, ajoutez un Bean UserDetailsService.
- Utilisez l'implémentation **MongoReactiveUserDetailsService** permettant de récupérer l'utilisateur dans la base MongoDB
Vous devez maintenant être capables de vous authentifier dans l'application en mode réactif avec l'un des utilisateurs
créés par le Bean InitialSetupMigration (par exemple: customer@email.org / Pa$$word1)
### B. Développement de la gestion des comptes
Nous allons coder la couche service de l'application. Elle permet de gérer les différents comptes bancaires et les opérations associées à ces comptes.
- Implémentez la méthode **getCurrentUser** de la classe **UserServiceImp** pour retourner l'utilisateur connecté
- La classe helper **ReactiveSecurityContextHolder** fournit le nom de l'utilisateur connecté
- Implémentez les méthodes accessibles par un employé de la banque dans la classe **AccountServiceImpl**
- Ouverture d'un compte bancaire associé à un client particulier
- Fermeture d'un compte compte bancaire
- Lister l'ensemble des comptes de la banque
- Afficher les informations d'un compte particulier
- Implémentez les méthodes accessibles par un client de la banque dans la classe **AccountServiceImpl**
- Création d'une opération de type débit sur un compte particulier
- Création d'une opération de type débit sur un compte particulier
- Lister les transactions d'un compte particulier
### C. Développement l'API REST
- Implémentez l'API REST permettant de gérer un compte dans la classe **AccountResource**
| HTTP method | URI | Description | HTTP codes |
| ------------- | ----------------- | ------------------------------------ | ----------- |
| POST | /account/ | Ouverture d'un compte | 201 |
| DELETE | /account/{number} | Fermeture d'un compte | 204 |
| GET | /account/ | Affiche l'ensemble des comptes | 200 |
| GET | /account/{number} | Affiche les informations d'un compte | 200, 204 |
- Implémentez l'API REST permettant de gérer les transactions d'un compte dans la classe **TransactionResource**
- Note: Ces ressources sont accessibles par un client, l'utilisateur connecté
| HTTP method | URI | Description | HTTP codes |
| ------------- | ------------------------------------ | -------------------------------------- | ---------- |
| POST | /account/{number}/transaction/credit | Crédite un compte | 201 |
| POST | /account/{number}/transaction/debit | Débit un compte | 201 |
| GET | /account/{number}/transaction | Affiche chaque transaction d'un compte | 202 |
### D. Création des tests d'intégration
Nous allons maintenant réaliser les tests d'intégration sur les classes **AccountResource** et **TransactionResource**.
On exploite l'utilitaire **WebTestClient** pour tester les ressources REST ; l'API permet d'effectuer des traitements en mode asynchrone.
Elle offre en outre toute une panoplie d'outils permettant de vérifier les réponses obtenues.
- Configurez l'utilitaire **WebTestClient**
- Utilisez l'utilitaire **WebTestClient** pour réaliser des opérations asynchrones sur les ressources **REST**
- Utilisez l'utilitaire **StepVerifier** pour vérifier les flux de données.
\ No newline at end of file
repositories { repositories {
mavenCentral() mavenCentral()
jcenter()
} }
plugins { plugins {
...@@ -23,11 +24,11 @@ defaultTasks("bootRun") ...@@ -23,11 +24,11 @@ defaultTasks("bootRun")
dependencies { dependencies {
implementation("org.springframework.boot:spring-boot-starter-webflux") implementation("org.springframework.boot:spring-boot-starter-webflux")
implementation("org.springframework.boot:spring-boot-starter-validation") implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.boot:spring-boot-starter-data-mongodb-reactive")
implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-data-mongodb-reactive")
implementation("com.github.mongobee:mongobee:0.13") implementation("com.github.mongobee:mongobee:0.13")
runtimeOnly("de.flapdoodle.embed:de.flapdoodle.embed.mongo") runtimeOnly("de.flapdoodle.embed:de.flapdoodle.embed.mongo")
compileOnly("org.projectlombok:lombok") implementation("org.projectlombok:lombok")
annotationProcessor("org.projectlombok:lombok") annotationProcessor("org.projectlombok:lombok")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment