Skip to content

Commit e5aabe0

Browse files
authored
Merge pull request #18
3-create-new-language
2 parents 848851c + 37dd11b commit e5aabe0

File tree

7 files changed

+175
-0
lines changed

7 files changed

+175
-0
lines changed
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package dev.mikablondo.hibernate_reactive_test.controller;
2+
3+
import dev.mikablondo.hibernate_reactive_test.dto.Language;
4+
import dev.mikablondo.hibernate_reactive_test.services.LanguageService;
5+
import io.smallrye.mutiny.Multi;
6+
import io.smallrye.mutiny.Uni;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.http.HttpStatus;
9+
import org.springframework.http.ResponseEntity;
10+
import org.springframework.web.bind.annotation.*;
11+
12+
/**
13+
* This class is a REST controller for managing Language entities.
14+
* It provides an endpoint to retrieve all languages from the database.
15+
* The controller is annotated with @RestController to indicate that it is a Spring MVC controller.
16+
*/
17+
@RestController
18+
@RequestMapping("/api/v1/languages")
19+
@RequiredArgsConstructor
20+
public class LanguageController {
21+
22+
private final LanguageService languageService;
23+
24+
@GetMapping
25+
public Multi<Language> getAllLanguages() {
26+
return languageService.getAllLanguages();
27+
}
28+
29+
@PostMapping
30+
public Uni<ResponseEntity<Void>> createLanguage(@RequestBody Language language) {
31+
return languageService.createLanguage(language)
32+
.map(v -> ResponseEntity.status(HttpStatus.CREATED).build());
33+
}
34+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package dev.mikablondo.hibernate_reactive_test.dto;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
7+
import java.util.Set;
8+
import java.util.UUID;
9+
10+
/**
11+
* This class represents a Language DTO (Data Transfer Object).
12+
* It contains fields for the language's ID, name, and a set of associated User entities.
13+
* The class is annotated with @Builder to enable the builder pattern for object creation.
14+
* It is also annotated with @Data to generate getters, setters, equals, hashCode, and toString methods.
15+
*/
16+
@Builder
17+
@Data
18+
@AllArgsConstructor
19+
public class Language {
20+
private UUID id;
21+
private String nom;
22+
private Set<User> utilisateurs;
23+
}

src/main/java/dev/mikablondo/hibernate_reactive_test/entity/LanguageEntity.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package dev.mikablondo.hibernate_reactive_test.entity;
22

33
import jakarta.persistence.*;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import lombok.NoArgsConstructor;
48

59
import java.util.HashSet;
610
import java.util.Set;
@@ -13,6 +17,10 @@
1317
* It is also annotated with @Table to specify the table name in the database.
1418
*/
1519
@Entity
20+
@Builder
21+
@Getter
22+
@NoArgsConstructor
23+
@AllArgsConstructor
1624
@Table(name = "langage")
1725
public class LanguageEntity {
1826
@Id

src/main/java/dev/mikablondo/hibernate_reactive_test/entity/UserLanguageEntity.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package dev.mikablondo.hibernate_reactive_test.entity;
22

33
import jakarta.persistence.*;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
47

58
/**
69
* This class represents a UserLanguage entity in the database.
@@ -9,6 +12,9 @@
912
* It is also annotated with @Table to specify the table name in the database.
1013
*/
1114
@Entity
15+
@Getter
16+
@NoArgsConstructor
17+
@AllArgsConstructor
1218
@Table(name = "utilisateur_langage")
1319
@IdClass(UserLanguageId.class)
1420
public class UserLanguageEntity {
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package dev.mikablondo.hibernate_reactive_test.repository;
2+
3+
import dev.mikablondo.hibernate_reactive_test.entity.LanguageEntity;
4+
import io.smallrye.mutiny.Multi;
5+
import io.smallrye.mutiny.Uni;
6+
import lombok.RequiredArgsConstructor;
7+
import org.hibernate.reactive.mutiny.Mutiny;
8+
import org.springframework.stereotype.Repository;
9+
10+
@Repository
11+
@RequiredArgsConstructor
12+
public class LanguageRepository {
13+
14+
private final Mutiny.SessionFactory sessionFactory;
15+
16+
/**
17+
* This method creates a new language in the database.
18+
*
19+
* @param entity the LanguageEntity object to be created
20+
* @return a Uni<Void> indicating the completion of the operation
21+
*/
22+
public Uni<Void> createLanguage(LanguageEntity entity) {
23+
return sessionFactory.withTransaction((session, tx) ->
24+
session.persist(entity)
25+
.onItem().invoke(() -> System.out.println("Language created: " + entity))
26+
.onFailure().invoke((Throwable t) -> System.err.println("Failed to create language: " + t.getMessage()))
27+
);
28+
}
29+
30+
/**
31+
* This method retrieves all languages from the database.
32+
*
33+
* @return a Multi stream of LanguageEntity objects
34+
*/
35+
public Multi<LanguageEntity> getAllLanguages() {
36+
return sessionFactory.withSession(session ->
37+
session.createQuery("FROM LanguageEntity", LanguageEntity.class)
38+
.getResultList()
39+
.onItem().transformToMulti(Multi.createFrom()::iterable)
40+
.onItem().call(language -> session.fetch(language.getUtilisateurs()))
41+
.collect().asList()
42+
).onItem().transformToMulti(Multi.createFrom()::iterable);
43+
}
44+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package dev.mikablondo.hibernate_reactive_test.services;
2+
3+
import dev.mikablondo.hibernate_reactive_test.dto.Language;
4+
import dev.mikablondo.hibernate_reactive_test.dto.User;
5+
import dev.mikablondo.hibernate_reactive_test.entity.LanguageEntity;
6+
import dev.mikablondo.hibernate_reactive_test.repository.LanguageRepository;
7+
import io.smallrye.mutiny.Multi;
8+
import io.smallrye.mutiny.Uni;
9+
import lombok.RequiredArgsConstructor;
10+
import org.springframework.stereotype.Service;
11+
12+
import java.util.UUID;
13+
import java.util.stream.Collectors;
14+
15+
/**
16+
* This class is a service for managing Language entities.
17+
* It provides methods to interact with the Language repository.
18+
* The service is annotated with @Service to indicate that it is a Spring service.
19+
*/
20+
@Service
21+
@RequiredArgsConstructor
22+
public class LanguageService {
23+
24+
private final LanguageRepository languageRepository;
25+
26+
/**
27+
* This method creates a new language in the database.
28+
*
29+
* @param language the Language DTO object to be created
30+
* @return a Uni<Void> indicating the completion of the operation
31+
*/
32+
public Uni<Void> createLanguage(Language language) {
33+
return languageRepository.createLanguage(LanguageEntity.builder()
34+
.id(UUID.randomUUID())
35+
.nom(language.getNom())
36+
.build());
37+
}
38+
39+
/**
40+
* This method retrieves all languages from the database.
41+
*
42+
* @return a Multi<Language> containing all languages
43+
*/
44+
public Multi<Language> getAllLanguages() {
45+
return languageRepository.getAllLanguages()
46+
.onItem().transform(languageEntity -> Language.builder()
47+
.id(languageEntity.getId())
48+
.nom(languageEntity.getNom())
49+
.utilisateurs(languageEntity.getUtilisateurs()
50+
.stream()
51+
.map(userLanguage -> User.builder()
52+
.id(userLanguage.getUtilisateur().getId())
53+
.nom(userLanguage.getUtilisateur().getNom())
54+
.age(userLanguage.getUtilisateur().getAge())
55+
.build())
56+
.collect(Collectors.toSet()))
57+
.build());
58+
}
59+
}

src/main/resources/application.properties

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
spring.application.name=hibernate-reactive-test
2+
spring.webflux.base-path=/hibernate-reactive-test
23

34
spring.jpa.database-platform=none
45
spring.jpa.hibernate.ddl-auto=none

0 commit comments

Comments
 (0)