From 683d49217826f089036f36167e882f68bd9b76b8 Mon Sep 17 00:00:00 2001 From: Fagorym Date: Wed, 22 May 2024 23:03:53 +0700 Subject: [PATCH] Make review creation more clear --- .../dto/request/ReviewCreationDto.java | 5 +++++ .../exception/EnumNotFoundException.java | 7 +++++++ .../userservice/facade/ReviewFacadeImpl.java | 6 ++++-- .../service/EstablishmentServiceImpl.java | 6 +++++- .../userservice/utils/EnumUtils.java | 19 +++++++++++++++++++ 5 files changed, 40 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ru/nsu/fit/directors/userservice/exception/EnumNotFoundException.java create mode 100644 src/main/java/ru/nsu/fit/directors/userservice/utils/EnumUtils.java diff --git a/src/main/java/ru/nsu/fit/directors/userservice/dto/request/ReviewCreationDto.java b/src/main/java/ru/nsu/fit/directors/userservice/dto/request/ReviewCreationDto.java index a76ea89..60778c0 100644 --- a/src/main/java/ru/nsu/fit/directors/userservice/dto/request/ReviewCreationDto.java +++ b/src/main/java/ru/nsu/fit/directors/userservice/dto/request/ReviewCreationDto.java @@ -1,5 +1,6 @@ package ru.nsu.fit.directors.userservice.dto.request; +import jakarta.annotation.Nonnull; import jakarta.validation.constraints.NotNull; public record ReviewCreationDto( @@ -12,4 +13,8 @@ public record ReviewCreationDto( @NotNull(message = "Оценка не может быть не задана.") Integer score ) { + @Nonnull + public ReviewCreationDto withUsername(String newUsername) { + return new ReviewCreationDto(newUsername, establishmentId, text, score); + } } diff --git a/src/main/java/ru/nsu/fit/directors/userservice/exception/EnumNotFoundException.java b/src/main/java/ru/nsu/fit/directors/userservice/exception/EnumNotFoundException.java new file mode 100644 index 0000000..815ebd3 --- /dev/null +++ b/src/main/java/ru/nsu/fit/directors/userservice/exception/EnumNotFoundException.java @@ -0,0 +1,7 @@ +package ru.nsu.fit.directors.userservice.exception; + +public class EnumNotFoundException extends BaseException { + public EnumNotFoundException(Class enumClass, String name) { + super("Отсутствует константа %s с названием %s".formatted(enumClass.getSimpleName(), name), "NO_CONSTANT"); + } +} diff --git a/src/main/java/ru/nsu/fit/directors/userservice/facade/ReviewFacadeImpl.java b/src/main/java/ru/nsu/fit/directors/userservice/facade/ReviewFacadeImpl.java index d77c6b8..515b1b3 100644 --- a/src/main/java/ru/nsu/fit/directors/userservice/facade/ReviewFacadeImpl.java +++ b/src/main/java/ru/nsu/fit/directors/userservice/facade/ReviewFacadeImpl.java @@ -9,6 +9,7 @@ import org.springframework.stereotype.Service; import ru.nsu.fit.directors.userservice.dto.request.ReviewCreationDto; import ru.nsu.fit.directors.userservice.dto.response.ResponseReviewDto; +import ru.nsu.fit.directors.userservice.model.User; import ru.nsu.fit.directors.userservice.model.UserReview; import ru.nsu.fit.directors.userservice.service.EstablishmentService; import ru.nsu.fit.directors.userservice.service.ReviewService; @@ -24,8 +25,9 @@ public class ReviewFacadeImpl implements ReviewFacade { @Override public void createReview(ReviewCreationDto reviewCreationDto) { - Long externalId = establishmentService.createReview(reviewCreationDto); - reviewService.save(new UserReview().setUser(securityService.getLoggedInUser()).setExternalId(externalId)); + User user = securityService.getLoggedInUser(); + Long externalId = establishmentService.createReview(reviewCreationDto.withUsername(user.getUsername())); + reviewService.save(new UserReview().setUser(user).setExternalId(externalId)); } @Nonnull diff --git a/src/main/java/ru/nsu/fit/directors/userservice/service/EstablishmentServiceImpl.java b/src/main/java/ru/nsu/fit/directors/userservice/service/EstablishmentServiceImpl.java index 1fee2f1..d125190 100644 --- a/src/main/java/ru/nsu/fit/directors/userservice/service/EstablishmentServiceImpl.java +++ b/src/main/java/ru/nsu/fit/directors/userservice/service/EstablishmentServiceImpl.java @@ -9,6 +9,8 @@ import ru.nsu.fit.directors.userservice.dto.response.BaseResponse; import ru.nsu.fit.directors.userservice.dto.response.EstablishmentListDto; import ru.nsu.fit.directors.userservice.dto.response.ResponseReviewDto; +import ru.nsu.fit.directors.userservice.enums.EntityType; +import ru.nsu.fit.directors.userservice.exception.EntityNotFoundException; import javax.annotation.Nonnull; import javax.annotation.ParametersAreNonnullByDefault; @@ -61,6 +63,8 @@ public List getReviewsByExternalIds(List externalIds) { @Nonnull @Override public Long createReview(ReviewCreationDto reviewCreationDto) { - return establishmentClient.createReview(reviewCreationDto).getBody().getResult(); + return Optional.ofNullable(establishmentClient.createReview(reviewCreationDto).getBody()) + .map(BaseResponse::getResult) + .orElseThrow(() -> new EntityNotFoundException(EntityType.COMPANY, reviewCreationDto.establishmentId())); } } diff --git a/src/main/java/ru/nsu/fit/directors/userservice/utils/EnumUtils.java b/src/main/java/ru/nsu/fit/directors/userservice/utils/EnumUtils.java new file mode 100644 index 0000000..64e09d1 --- /dev/null +++ b/src/main/java/ru/nsu/fit/directors/userservice/utils/EnumUtils.java @@ -0,0 +1,19 @@ +package ru.nsu.fit.directors.userservice.utils; + +import java.util.Arrays; + +import javax.annotation.Nonnull; + +import lombok.experimental.UtilityClass; +import ru.nsu.fit.directors.userservice.exception.EnumNotFoundException; + +@UtilityClass +public class EnumUtils { + @Nonnull + public > E findEnum(String name, Class enumClass) { + return Arrays.stream(enumClass.getEnumConstants()) + .filter(parseableEnum -> parseableEnum.name().equalsIgnoreCase(name)) + .findFirst() + .orElseThrow(() -> new EnumNotFoundException(enumClass, name)); + } +}