From 4011ff18c62278120ef349681d77301697f746f3 Mon Sep 17 00:00:00 2001 From: Emre Date: Sun, 23 Apr 2023 20:26:28 +0200 Subject: [PATCH] Put and post methods work with error handling :hammer: --- .../main/java/org/acme/Api/DTO/GameDto.java | 4 +- .../java/org/acme/Api/DTO/ParticipeDto.java | 4 +- .../main/java/org/acme/Api/DTO/UserDTO.java | 4 +- .../java/org/acme/Api/DTO/UserStatsDTO.java | 6 +- .../java/org/acme/Api/DTO/UserTinyDTO.java | 14 ++- .../org/acme/Api/Manager/GameManager.java | 10 +- .../org/acme/Api/Mappeur/TrhowMappeur.java | 5 - .../org/acme/Api/Mappeur/UserMappeur.java | 18 --- .../acme/Api/controllers/UserController.java | 105 ++++++++++++------ .../Api/{Mappeur => mapper}/Extensions.java | 6 +- .../GameMapper.java} | 4 +- .../ParticipeMapper.java} | 6 +- .../RoundMapper.java} | 4 +- .../java/org/acme/Api/mapper/TrhowMapper.java | 5 + .../java/org/acme/Api/mapper/UserMapper.java | 38 +++++++ .../org/acme/Api/service/UserRepository.java | 44 ++++++-- .../acme/Hibernates/entities/UserEntity.java | 28 ++++- .../API/Quarkus/src/main/resources/import.sql | 8 +- 18 files changed, 213 insertions(+), 100 deletions(-) delete mode 100644 Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/TrhowMappeur.java delete mode 100644 Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/UserMappeur.java rename Sources/API/Quarkus/src/main/java/org/acme/Api/{Mappeur => mapper}/Extensions.java (90%) rename Sources/API/Quarkus/src/main/java/org/acme/Api/{Mappeur/GameMappeur.java => mapper/GameMapper.java} (95%) rename Sources/API/Quarkus/src/main/java/org/acme/Api/{Mappeur/ParticipeMappeur.java => mapper/ParticipeMapper.java} (54%) rename Sources/API/Quarkus/src/main/java/org/acme/Api/{Mappeur/RoundMappeur.java => mapper/RoundMapper.java} (91%) create mode 100644 Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/TrhowMapper.java create mode 100644 Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/UserMapper.java diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/GameDto.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/GameDto.java index 475830c..52250c5 100644 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/GameDto.java +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/GameDto.java @@ -57,7 +57,7 @@ public class GameDto { public Long hostID; @JsonProperty("winner") - public UserTinyDTO winner; + public UserTinyDto winner; @JsonIgnore @JsonProperty("rounds") @@ -72,7 +72,7 @@ public class GameDto { Uni> players, LocalDate time, Long ownerGame, - UserTinyDTO winner, + UserTinyDto winner, Uni> rounds) { this.players = players; this.date = time; diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/ParticipeDto.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/ParticipeDto.java index 361319b..e9889ca 100644 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/ParticipeDto.java +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/ParticipeDto.java @@ -15,9 +15,9 @@ public class ParticipeDto { public int totalPoints; @Schema(description = "The User entity that this Participe belongs to") - public UserDTO user; + public UserDto user; - public ParticipeDto(Long idUser, UserDTO user, Integer totalPoints, String guestName) { + public ParticipeDto(Long idUser, UserDto user, Integer totalPoints, String guestName) { this.idUser = idUser; this.guestName = guestName; diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/UserDTO.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/UserDTO.java index 0bbb565..8b2f8bd 100644 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/UserDTO.java +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/UserDTO.java @@ -5,7 +5,7 @@ import org.eclipse.microprofile.openapi.annotations.media.Schema; @RegisterForReflection @Schema(description = "A DTO for transferring user details") -public class UserDTO { +public class UserDto { public Long id; public String name; @@ -13,7 +13,7 @@ public class UserDTO { public String mail; //public UserStatsDTO stats; - public UserDTO(Long id, String name, String image, String mail) { + public UserDto(Long id, String name, String image, String mail) { this.id = id; this.name = name; this.image = image; diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/UserStatsDTO.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/UserStatsDTO.java index b23617c..05f6113 100644 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/UserStatsDTO.java +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/UserStatsDTO.java @@ -5,7 +5,7 @@ import org.eclipse.microprofile.openapi.annotations.media.Schema; @RegisterForReflection @Schema(description = "A DTO describing the stats of a User") -public class UserStatsDTO { +public class UserStatsDto { public Long nbVictories; public Long nbGames; public Long highscore; @@ -14,8 +14,8 @@ public class UserStatsDTO { public Double avgScore; public Double avgPinsPerRound; - public UserStatsDTO(Long nbVictories, Long nbGames, Long highscore, Long nbStrikes, Long nbSpares, Double avgScore, - Double avgPinsPerRound) { + public UserStatsDto(Long nbVictories, Long nbGames, Long highscore, Long nbStrikes, Long nbSpares, Double avgScore, + Double avgPinsPerRound) { this.nbVictories = nbVictories; this.nbGames = nbGames; this.highscore = highscore; diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/UserTinyDTO.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/UserTinyDTO.java index ec6ab99..0b59cc1 100644 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/UserTinyDTO.java +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/DTO/UserTinyDTO.java @@ -1,16 +1,20 @@ package org.acme.api.dto; -import io.quarkus.hibernate.reactive.panache.common.ProjectedFieldName; import io.quarkus.runtime.annotations.RegisterForReflection; import org.eclipse.microprofile.openapi.annotations.media.Schema; @RegisterForReflection @Schema(description = "A minimal DTO for transferring user information") -public class UserTinyDTO { - public Long id; +public class UserTinyDto { + public String name; - public UserTinyDTO(Long id, String name) { - this.id = id; + public String image; + public String mail; + public String password; + public UserTinyDto(String name, String image, String mail, String password) { this.name = name; + this.image = image; + this.mail = mail; + this.password = password; } } \ No newline at end of file diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/Manager/GameManager.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/Manager/GameManager.java index c318323..1e7a017 100644 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/Manager/GameManager.java +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/Manager/GameManager.java @@ -6,7 +6,7 @@ import java.util.stream.Collectors; import javax.ws.rs.NotFoundException; import org.acme.api.dto.GameDto; -import org.acme.api.mappeur.GameMappeur; +import org.acme.api.mapper.GameMapper; import io.smallrye.mutiny.Uni; @@ -19,20 +19,20 @@ public class GameManager { } public Uni saveGame(GameDto game) { - return dbManager.dbContext.gameRepository.persist(GameMappeur.toEntity(game, dbManager.dbContext)) - .onItem().transform(gameEntity -> GameMappeur.toDto(gameEntity, dbManager.dbContext)); + return dbManager.dbContext.gameRepository.persist(GameMapper.toEntity(game, dbManager.dbContext)) + .onItem().transform(gameEntity -> GameMapper.toDto(gameEntity, dbManager.dbContext)); } public Uni getDetailsGameById(Long gameId) { return dbManager.dbContext.gameRepository.findById(gameId) .onItem().ifNull().failWith(new NotFoundException("Game not found")) - .onItem().transform(gameEntity -> GameMappeur.toDto(gameEntity, dbManager.dbContext)); + .onItem().transform(gameEntity -> GameMapper.toDto(gameEntity, dbManager.dbContext)); } public Uni> getAllGames() { return dbManager.dbContext.gameRepository.findAll().list() .onItem().transform(games -> games.stream() - .map(gameEntity -> GameMappeur.toDto(gameEntity, dbManager.dbContext)) + .map(gameEntity -> GameMapper.toDto(gameEntity, dbManager.dbContext)) .collect(Collectors.toList())) .onFailure().invoke(throwable -> { // Log the error or perform any other error handling here diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/TrhowMappeur.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/TrhowMappeur.java deleted file mode 100644 index 5f157c7..0000000 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/TrhowMappeur.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.acme.api.mappeur; - -public class TrhowMappeur { - -} diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/UserMappeur.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/UserMappeur.java deleted file mode 100644 index 1baff6d..0000000 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/UserMappeur.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.acme.api.mappeur; - -import org.acme.api.dto.UserDTO; -import org.acme.api.dto.UserTinyDTO; -import org.acme.hibernates.entities.UserEntity; - -public class UserMappeur { - public static UserDTO toUserDto(UserEntity entity) { - /*return new UserDTO(entity.id, entity.name, entity.stats.getNbVictories(), entity.stats.getNbGames(), - entity.stats.getHighscore(), entity.stats.getNbStrikes(), entity.stats.getNbSpares(), - entity.stats.getAvgScore(), entity.stats.getAvgPinsPerRound());*/ - return new UserDTO((long)2, "f","fd","fd"); - } - - public static UserTinyDTO toUserTinyDTO(UserEntity entity) { - return new UserTinyDTO(entity.id, entity.getName()); - } -} diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/controllers/UserController.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/controllers/UserController.java index 824859a..0eb20db 100644 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/controllers/UserController.java +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/controllers/UserController.java @@ -1,26 +1,19 @@ package org.acme.api.controllers; -import java.net.URI; import java.util.List; +import java.util.stream.Collectors; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; +import javax.ws.rs.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.acme.api.BowlDbContext; -import org.acme.api.dto.UserDTO; -import org.acme.hibernates.entities.UserEntity; +import org.acme.api.dto.UserDto; +import org.acme.api.dto.UserTinyDto; +import org.acme.api.mapper.UserMapper; import org.eclipse.microprofile.openapi.annotations.Operation; import org.eclipse.microprofile.openapi.annotations.responses.APIResponse; import org.jboss.logging.Logger; @@ -42,9 +35,10 @@ public class UserController { @GET @Operation(summary = "Get all users") @Produces(MediaType.APPLICATION_JSON) - public Uni> getUsers() { + public Uni> getUsers() { LOGGER.info("Get all users"); - return service.userRepository.findAll().project(UserDTO.class).list(); + return service.userRepository.findAll().list() + .map(entities -> entities.stream().map(UserMapper::toDto).collect(Collectors.toList())); } @GET @@ -66,9 +60,17 @@ public class UserController { @Path("/name/{name}") public Uni getUserByName(@PathParam("name") String name) { LOGGER.info("Get user with name : " + name); - return service.userRepository.findwithName(name) - .map(user -> user == null ? Response.status(Status.NOT_FOUND) : Response.ok(user).status(200)) - .map(Response.ResponseBuilder::build); + + return service.userRepository.verifiedName(name) + .flatMap(exist -> { + if (exist) { + return service.userRepository.findWithName(name) + .map(user -> Response.ok(user).build()); + } else { + throw new NotFoundException("User not found"); + } + }); + } @GET @@ -78,9 +80,16 @@ public class UserController { @Path("/mail/{mail}") public Uni getUserByMail(@PathParam("mail") String mail) { LOGGER.info("Get user with mail : " + mail); - return service.userRepository.findwithMail(mail) - .map(user -> user == null ? Response.status(Status.NOT_FOUND) : Response.ok(user).status(200)) - .map(Response.ResponseBuilder::build); + + return service.userRepository.verifiedMail(mail) + .flatMap(exist -> { + if (exist) { + return service.userRepository.findWithMail(mail) + .map(user -> Response.ok(user).build()); + } else { + throw new NotFoundException("User not found"); + } + }); } @POST @@ -88,35 +97,67 @@ public class UserController { @APIResponse(responseCode = "201", description = "User successfully created") @APIResponse(responseCode = "422", description = "User invalidly set on request") @ReactiveTransactional - public Uni createUser(UserEntity user) { + public Uni createUser(UserTinyDto user) { if (user == null) { throw new WebApplicationException("user was invalidly set on request.", 422); } - LOGGER.info("creating user: " + user.getName()); - return service.userRepository.persist(user) - .map(persistedUser -> Response - .created(URI.create("/users/" + user.id)) - .entity(persistedUser) - .build()) + LOGGER.info("creating user: " + user); + return Uni.combine().all().unis( + service.userRepository.verifiedName(user.name), + service.userRepository.verifiedMail(user.mail)) + .asTuple() + .flatMap(tuple -> { + boolean nameExists = tuple.getItem1(); + boolean mailExists = tuple.getItem2(); + if (nameExists) { + throw new WebApplicationException("Name already exists", Status.BAD_REQUEST); + } + if (mailExists) { + throw new WebApplicationException("Mail already exists", Status.BAD_REQUEST); + } + return service.userRepository.addUser(user) + .map(createdUser -> Response.status(Response.Status.CREATED).entity(createdUser).build()); + }) .onFailure().recoverWithItem(Response.status(Status.BAD_REQUEST).build()); } + @PUT @Operation(summary = "Update a user") @APIResponse(responseCode = "200", description = "OK") + @APIResponse(responseCode = "400", description = "Bad Request") @APIResponse(responseCode = "404", description = "User not found") @Path("/{id}") @ReactiveTransactional - public Uni updateUser(@PathParam("id") Long id, UserEntity newUser) { + public Uni updateUser(@PathParam("id") Long id, UserTinyDto newUser) { LOGGER.info("Update user with id : " + id); return service.userRepository.findById(id) .onItem().ifNull().failWith(() -> new WebApplicationException("User not found", Status.NOT_FOUND)) - .onItem().ifNotNull().invoke(oldUser -> { - oldUser.setName(newUser.getName()); - }) - .onItem().ifNotNull().transform(entity -> Response.ok(entity).build()); + .onItem().ifNotNull().transformToUni(oldUser -> + Uni.combine().all().unis( + service.userRepository.verifiedName(newUser.name), + service.userRepository.verifiedMail(newUser.mail)) + .asTuple() + .flatMap(tuple -> { + boolean nameExists = tuple.getItem1(); + boolean mailExists = tuple.getItem2(); + if (nameExists && !oldUser.getName().equalsIgnoreCase(newUser.name)) { + throw new WebApplicationException("Name already exists", Status.BAD_REQUEST); + } + if (mailExists && !oldUser.getMail().equalsIgnoreCase(newUser.mail)) { + throw new WebApplicationException("Mail already exists", Status.BAD_REQUEST); + } + oldUser.setName(newUser.name); + oldUser.setMail(newUser.mail); + oldUser.setImage(newUser.image); + return service.userRepository.persistAndFlush(oldUser) + .map(entity -> Response.ok(UserMapper.toDto(entity)).build()); + }) + ); } + + @DELETE @Operation(summary = "Delete a user") @APIResponse(responseCode = "204") diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/Extensions.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/Extensions.java similarity index 90% rename from Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/Extensions.java rename to Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/Extensions.java index 093af1c..020680e 100644 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/Extensions.java +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/Extensions.java @@ -1,4 +1,4 @@ -package org.acme.api.mappeur; +package org.acme.api.mapper; import java.time.LocalDate; import java.time.ZoneId; @@ -17,7 +17,7 @@ import io.smallrye.mutiny.Uni; public class Extensions { public static Uni> toRoundDtoList(Uni> uni) { return uni.map(roundEntities -> roundEntities.stream() - .map(RoundMappeur::toDto) + .map(RoundMapper::toDto) .collect(Collectors.toList())); } @@ -26,7 +26,7 @@ public class Extensions { .onItem().transformToUni(participes -> { List dtos = new ArrayList<>(); for (ParticipeEntity entity : participes) { - dtos.add(ParticipeMappeur.toDto(entity)); + dtos.add(ParticipeMapper.toDto(entity)); } return Uni.createFrom().item(dtos); }) diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/GameMappeur.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/GameMapper.java similarity index 95% rename from Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/GameMappeur.java rename to Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/GameMapper.java index eb4ed5a..38f68ba 100644 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/GameMappeur.java +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/GameMapper.java @@ -1,10 +1,10 @@ -package org.acme.api.mappeur; +package org.acme.api.mapper; import org.acme.api.BowlDbContext; import org.acme.api.dto.GameDto; import org.acme.hibernates.entities.GameEntity; -public class GameMappeur { +public class GameMapper { public static GameDto toDto(GameEntity entity, BowlDbContext dbContext) { GameDto dto = new GameDto(); diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/ParticipeMappeur.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/ParticipeMapper.java similarity index 54% rename from Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/ParticipeMappeur.java rename to Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/ParticipeMapper.java index 597797a..d1f1b06 100644 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/ParticipeMappeur.java +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/ParticipeMapper.java @@ -1,11 +1,11 @@ -package org.acme.api.mappeur; +package org.acme.api.mapper; import org.acme.api.dto.ParticipeDto; import org.acme.hibernates.entities.ParticipeEntity; -public class ParticipeMappeur { +public class ParticipeMapper { public static ParticipeDto toDto(ParticipeEntity entity) { - return new ParticipeDto(entity.user.id, UserMappeur.toUserDto(entity.user), entity.totalPoints, + return new ParticipeDto(entity.user.id, UserMapper.toDto(entity.user), entity.totalPoints, entity.guestName); } diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/RoundMappeur.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/RoundMapper.java similarity index 91% rename from Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/RoundMappeur.java rename to Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/RoundMapper.java index bbd7e8e..80cdb53 100644 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/Mappeur/RoundMappeur.java +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/RoundMapper.java @@ -1,4 +1,4 @@ -package org.acme.api.mappeur; +package org.acme.api.mapper; import java.util.List; @@ -6,7 +6,7 @@ import org.acme.api.dto.RoundDto; import org.acme.hibernates.entities.RoundEntity; import org.acme.hibernates.entities.ThrowEntity; -public class RoundMappeur { +public class RoundMapper { public static RoundDto toDto(RoundEntity entity) { List throwsGame = entity.throwsGame; diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/TrhowMapper.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/TrhowMapper.java new file mode 100644 index 0000000..488d97d --- /dev/null +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/TrhowMapper.java @@ -0,0 +1,5 @@ +package org.acme.api.mapper; + +public class TrhowMapper { + +} diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/UserMapper.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/UserMapper.java new file mode 100644 index 0000000..6e1172e --- /dev/null +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/mapper/UserMapper.java @@ -0,0 +1,38 @@ +package org.acme.api.mapper; + +import org.acme.api.dto.UserDto; +import org.acme.api.dto.UserTinyDto; +import org.acme.hibernates.entities.UserEntity; +import java.security.MessageDigest; + +public class UserMapper { + + private static final String HASH_ALGORITHM = "SHA-256"; + + public static UserDto toDto(UserEntity user) { + return new UserDto(user.id, user.getName(), user.getImage(), user.getMail()); + } + + public static UserEntity toEntity(UserTinyDto user) { + try { + MessageDigest digest = MessageDigest.getInstance(HASH_ALGORITHM); + byte[] hashedBytes = digest.digest(user.password.getBytes("UTF-8")); + String hashedPassword = bytesToHex(hashedBytes); + return new UserEntity(user.name.toLowerCase(), user.image, user.mail.toLowerCase(), hashedPassword); + } catch (Exception ex) { + throw new RuntimeException("Error hashing password", ex); + } + } + + private static String bytesToHex(byte[] bytes) { + StringBuilder hexString = new StringBuilder(); + for (byte b : bytes) { + String hex = Integer.toHexString(0xFF & b); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } +} diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Api/service/UserRepository.java b/Sources/API/Quarkus/src/main/java/org/acme/Api/service/UserRepository.java index c405c88..841d894 100644 --- a/Sources/API/Quarkus/src/main/java/org/acme/Api/service/UserRepository.java +++ b/Sources/API/Quarkus/src/main/java/org/acme/Api/service/UserRepository.java @@ -2,29 +2,53 @@ package org.acme.api.service; import javax.enterprise.context.ApplicationScoped; -import org.acme.api.dto.UserDTO; +import org.acme.api.dto.UserDto; +import org.acme.api.dto.UserTinyDto; +import org.acme.api.mapper.UserMapper; import org.acme.hibernates.entities.UserEntity; import io.quarkus.hibernate.reactive.panache.PanacheRepository; import io.smallrye.mutiny.Uni; +import java.util.Objects; + @ApplicationScoped public class UserRepository implements PanacheRepository { - // public Uni getUserByName(String name) { - // return UserEntity.find("name", name).firstResult(); - // } + public Uni addUser(UserTinyDto user) { + UserEntity userEntity = UserMapper.toEntity(user); + return persistAndFlush(userEntity) + .map(ignore -> UserMapper.toDto(userEntity)); + } + + public Uni findWithName(String name) { + return find("name", name.toLowerCase()) + .firstResult() + .map(UserMapper::toDto); + } + + public Uni verifiedName(String name) { + return find("name", name.toLowerCase()) + .firstResult() + .map(Objects::nonNull); + } - public Uni findwithName(String name) { - return find("name", name.toLowerCase()).project(UserDTO.class).firstResult(); + public Uni verifiedMail(String mail) { + return find("mail", mail.toLowerCase()) + .firstResult() + .map(Objects::nonNull); } - public Uni findwithMail(String mail) { - return find("mail", mail.toLowerCase()).project(UserDTO.class).firstResult(); + public Uni findWithMail(String mail) { + return find("mail", mail.toLowerCase()) + .firstResult() + .map(UserMapper::toDto); } - public Uni getUserById(Long id) { - return find("id", id).project(UserDTO.class).firstResult(); + public Uni getUserById(Long id) { + return find("id", id) + .firstResult() + .map(UserMapper::toDto); } } diff --git a/Sources/API/Quarkus/src/main/java/org/acme/Hibernates/entities/UserEntity.java b/Sources/API/Quarkus/src/main/java/org/acme/Hibernates/entities/UserEntity.java index 33c0ba5..15aa85e 100644 --- a/Sources/API/Quarkus/src/main/java/org/acme/Hibernates/entities/UserEntity.java +++ b/Sources/API/Quarkus/src/main/java/org/acme/Hibernates/entities/UserEntity.java @@ -29,9 +29,17 @@ public class UserEntity { //this.stats = new UserStatsEntity(this); } + public UserEntity(String name, String image, String mail, String password) { + this.name = name; + this.image = image; + this.mail = mail; + this.password = password; + //this.stats = new UserStatsEntity(this); + } + // return name as uppercase in the model public String getName() { - return name.toUpperCase(); + return name.substring(0, 1).toUpperCase() + name.substring(1); } // store all names in lowercase in the DB @@ -44,7 +52,23 @@ public class UserEntity { } public void setPassword(String password) { - this.password = password.toLowerCase(); + this.password = password; + } + + public String getImage() { + return image; + } + + public void setImage(String image) { + this.image = image; + } + + public String getMail() { + return mail; + } + + public void setMail(String mail) { + this.mail = mail.toLowerCase(); } } diff --git a/Sources/API/Quarkus/src/main/resources/import.sql b/Sources/API/Quarkus/src/main/resources/import.sql index 1df69b6..59b215b 100644 --- a/Sources/API/Quarkus/src/main/resources/import.sql +++ b/Sources/API/Quarkus/src/main/resources/import.sql @@ -1,9 +1,9 @@ -INSERT INTO +INSERT INTO Users (name, password, image, mail) VALUES - ('david', 'password123','','david.d_almeida@etu.uca.fr'), - ('emre', 'password2','','emre.kartal@etu.uca.fr'), - ('arthur', 'password3','','arthur.valin@etu.uca.fr'); +('david', '38762cf7f55934b34d179ae6a4c80cadccbb7f0a2c2a5b4c4a1cb595d8dadb31','','david.d_almeida@etu.uca.fr'), +('emre', 'af7c70f8789d9e0fde5b5f18b61c5e5dc5d5c5f5e7e5c4f4be7b2cb5d57ef52c','','emre.kartal@etu.uca.fr'), +('arthur', '0cc175b9c0f1b6a831c399e269772661','','arthur.valin@etu.uca.fr'); /*INSERT INTO games (isFinished, nbPoints, time, winner, host_id) VALUES (false, 0, CURRENT_TIMESTAMP, 0, 1); INSERT INTO participe (idGame, position, guestname, totalpoints, iduser) VALUES (1, 1, 'Alice', 0, 1);