diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 0000000..6dee32d --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +*.java @gaaji/test diff --git a/.github/PR_TEMPLATE.md b/.github/PR_TEMPLATE.md new file mode 100644 index 0000000..846f690 --- /dev/null +++ b/.github/PR_TEMPLATE.md @@ -0,0 +1,30 @@ +# Issue# - Issue +## Description +> + +## PR Type +- [ ] Hotfix +- [ ] Feature +- [ ] Code style update +- [ ] Refactor (code, package, etc.) +- [ ] Build (gradle, spring, etc) +- [ ] Documentation content changes (api docs, etc.) +- [ ] Infra (cloud, security, etc.) +- [ ] Other... Please describe : + +## Related Issues +- + +## Issues + +### Test + +*** + +## Related Files +- `file` + +## Think About.. + +## Conclusion +> diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..ae342c3 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,78 @@ + + +name: Java CI with Gradle + +on: + pull_request: + + +permissions: + contents: read + +env: + DOCKER_IMAGE: ghcr.io/gaaji/auth-service + VERSION: ${{ github.sha }} + + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + - name: Create secret.yml + env: + SECRET_CODE: ${{ secrets.SECRET }} + SECRET_DIR: src/main/resources + SECRET_FILE_NAME: secret.yml + run: echo $SECRET_CODE | base64 --decode > $SECRET_DIR/$SECRET_FILE_NAME + + - name: Create oauth.yml + env: + SECRET_CODE: ${{ secrets.OAUTH }} + SECRET_DIR: src/main/resources + SECRET_FILE_NAME: oauth.yml + run: echo $SECRET_CODE | base64 --decode > $SECRET_DIR/$SECRET_FILE_NAME + - name: Create kafka.yml + env: + SECRET_CODE: ${{ secrets.KAFKA }} + SECRET_DIR: src/main/resources + SECRET_FILE_NAME: kafka.yml + run: echo $SECRET_CODE | base64 --decode > $SECRET_DIR/$SECRET_FILE_NAME + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + + - name: Build with Gradle + uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1 + with: + arguments: build + + - name: Set up docker buildx + id: buildx + uses: docker/setup-buildx-action@v1 + + - name: Login to ghcr + uses: docker/login-action@v1 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GHCR_TOKEN }} + + - name: show directory + run: ls + + - name: Build and push + id: docker_build + uses: docker/build-push-action@v2 + with: + context: . # dockerfile이 있는 위치랑 맞춰주자 + file: ./Dockerfile # 빌드할 Dockerfile이 있는 디렉토리 + push: true + tags: ${{ env.DOCKER_IMAGE }}:local diff --git a/.gitignore b/.gitignore index a063580..7337ccf 100644 --- a/.gitignore +++ b/.gitignore @@ -37,4 +37,7 @@ out/ .vscode/ ### security -/src/main/resources/application-oauth.yml \ No newline at end of file +/src/main/resources/oauth.yml +/src/main/resources/secret.yml +/src/main/resources/kafka.yml +/spy.log diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..dabadb0 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,5 @@ +FROM openjdk:17-alpine +VOLUME /tmp +COPY build/libs/auth-0.0.1-SNAPSHOT.jar api.jar +EXPOSE 8080 +ENTRYPOINT ["java","-jar","-Dspring.profiles.active=docker", "api.jar"] \ No newline at end of file diff --git a/build.gradle b/build.gradle index 5e49566..fa286d7 100644 --- a/build.gradle +++ b/build.gradle @@ -28,8 +28,13 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-redis' implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' implementation 'org.springframework.boot:spring-boot-starter-security' + implementation 'org.springframework.kafka:spring-kafka' + + + implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' + implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' + -// implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client' implementation("com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.8.0") implementation 'io.jsonwebtoken:jjwt:0.9.1' @@ -40,6 +45,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.security:spring-security-test' + testImplementation 'org.springframework.kafka:spring-kafka-test' } dependencyManagement { diff --git a/pull_request_template.md b/pull_request_template.md new file mode 100644 index 0000000..846f690 --- /dev/null +++ b/pull_request_template.md @@ -0,0 +1,30 @@ +# Issue# - Issue +## Description +> + +## PR Type +- [ ] Hotfix +- [ ] Feature +- [ ] Code style update +- [ ] Refactor (code, package, etc.) +- [ ] Build (gradle, spring, etc) +- [ ] Documentation content changes (api docs, etc.) +- [ ] Infra (cloud, security, etc.) +- [ ] Other... Please describe : + +## Related Issues +- + +## Issues + +### Test + +*** + +## Related Files +- `file` + +## Think About.. + +## Conclusion +> diff --git a/src/main/java/com/gaaji/auth/AuthApplication.java b/src/main/java/com/gaaji/auth/AuthApplication.java index 71b6938..af657c2 100644 --- a/src/main/java/com/gaaji/auth/AuthApplication.java +++ b/src/main/java/com/gaaji/auth/AuthApplication.java @@ -2,7 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.netflix.eureka.EnableEurekaClient; +@EnableEurekaClient @SpringBootApplication public class AuthApplication { diff --git a/src/main/java/com/gaaji/auth/adaptor/KafkaProducer.java b/src/main/java/com/gaaji/auth/adaptor/KafkaProducer.java new file mode 100644 index 0000000..5310711 --- /dev/null +++ b/src/main/java/com/gaaji/auth/adaptor/KafkaProducer.java @@ -0,0 +1,9 @@ +package com.gaaji.auth.adaptor; + +import com.gaaji.auth.event.NicknameChangedEvent; + +public interface KafkaProducer { + + void publishNicknameChangedEvent(NicknameChangedEvent event); + +} diff --git a/src/main/java/com/gaaji/auth/adaptor/KafkaProducerImpl.java b/src/main/java/com/gaaji/auth/adaptor/KafkaProducerImpl.java new file mode 100644 index 0000000..65cb987 --- /dev/null +++ b/src/main/java/com/gaaji/auth/adaptor/KafkaProducerImpl.java @@ -0,0 +1,28 @@ +package com.gaaji.auth.adaptor; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.gaaji.auth.event.NicknameChangedEvent; +import lombok.RequiredArgsConstructor; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class KafkaProducerImpl implements KafkaProducer { + + private final KafkaTemplate kafkaTemplate; + + @Override + public void publishNicknameChangedEvent(NicknameChangedEvent event) { + + String nicknameChangedEvent = null; + try { + nicknameChangedEvent = new ObjectMapper().writeValueAsString(event); + kafkaTemplate.send("nickname-changed",nicknameChangedEvent); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + + } +} diff --git a/src/main/java/com/gaaji/auth/adaptor/S3Uploader.java b/src/main/java/com/gaaji/auth/adaptor/S3Uploader.java new file mode 100644 index 0000000..e5b8c41 --- /dev/null +++ b/src/main/java/com/gaaji/auth/adaptor/S3Uploader.java @@ -0,0 +1,7 @@ +package com.gaaji.auth.adaptor; + +import org.springframework.web.multipart.MultipartFile; + +public interface S3Uploader { + String upload(MultipartFile multipartFile); +} diff --git a/src/main/java/com/gaaji/auth/adaptor/S3UploaderImpl.java b/src/main/java/com/gaaji/auth/adaptor/S3UploaderImpl.java new file mode 100644 index 0000000..831553b --- /dev/null +++ b/src/main/java/com/gaaji/auth/adaptor/S3UploaderImpl.java @@ -0,0 +1,87 @@ +package com.gaaji.auth.adaptor; + +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.model.CannedAccessControlList; +import com.amazonaws.services.s3.model.PutObjectRequest; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.Objects; +import java.util.Optional; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +@RequiredArgsConstructor +@Service +public class S3UploaderImpl implements S3Uploader { + + + private final AmazonS3Client amazonS3Client; + @Value("${cloud.aws.s3.bucket}") + private String bucket; + + @Override + public String upload(MultipartFile multipartFile) { + try { + validateIsClientSendImageFile(multipartFile); + return uploadFiles(multipartFile, "gaaji/profile"); + } catch (IOException e) { + throw new IllegalArgumentException(); + } + } + + private void validateIsClientSendImageFile(MultipartFile multipartFile) { + if (!Objects.requireNonNull(multipartFile.getContentType()).contains("image")) { + throw new RuntimeException(); // FileTypeNotImageFileException() + } + } + + private String uploadFiles(MultipartFile multipartFile, String dirName) throws IOException { + File uploadFile = convert(multipartFile) // 파일 변환할 수 없으면 에러 + .orElseThrow(() -> new IllegalArgumentException( + "error: MultipartFile -> File convert fail")); + return upload(uploadFile, dirName); + } + + private String upload(File uploadFile, String filePath) { + String fileName = + filePath + "/" + UUID.randomUUID() + uploadFile.getName(); // S3에 저장된 파일 이름 + String uploadImageUrl = putS3(uploadFile, fileName); // s3로 업로드 + removeNewFile(uploadFile); + return uploadImageUrl; + } + + // S3로 업로드 + private String putS3(File uploadFile, String fileName) { + amazonS3Client.putObject(new PutObjectRequest(bucket, fileName, uploadFile).withCannedAcl( + CannedAccessControlList.PublicRead)); + return amazonS3Client.getUrl(bucket, fileName).toString(); + } + + // 로컬에 저장된 이미지 지우기 + private void removeNewFile(File targetFile) { + if (targetFile.delete()) { + System.out.println("File delete success"); + return; + } + System.out.println("File delete fail"); + } + + // 로컬에 파일 업로드 하기 + private Optional convert(MultipartFile file) throws IOException { + File convertFile = new File( + System.getProperty("user.dir") + "/" + file.getOriginalFilename()); + if (convertFile.createNewFile()) { // 바로 위에서 지정한 경로에 File이 생성됨 (경로가 잘못되었다면 생성 불가능) + try (FileOutputStream fos = new FileOutputStream( + convertFile)) { // FileOutputStream 데이터를 파일에 바이트 스트림으로 저장하기 위함 + fos.write(file.getBytes()); + } + return Optional.of(convertFile); + } + return Optional.empty(); + } + +} diff --git a/src/main/java/com/gaaji/auth/adaptor/Sample.java b/src/main/java/com/gaaji/auth/adaptor/Sample.java deleted file mode 100644 index c1f1a3d..0000000 --- a/src/main/java/com/gaaji/auth/adaptor/Sample.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.gaaji.auth.adaptor; - -public class Sample { - -} diff --git a/src/main/java/com/gaaji/auth/applicationservice/AuthRetrieveService.java b/src/main/java/com/gaaji/auth/applicationservice/AuthRetrieveService.java new file mode 100644 index 0000000..332b080 --- /dev/null +++ b/src/main/java/com/gaaji/auth/applicationservice/AuthRetrieveService.java @@ -0,0 +1,8 @@ +package com.gaaji.auth.applicationservice; + +import com.gaaji.auth.controller.dto.RetrieveResponse; + +public interface AuthRetrieveService { + + RetrieveResponse retrieveAuth(String authId); +} diff --git a/src/main/java/com/gaaji/auth/applicationservice/AuthRetrieveServiceImpl.java b/src/main/java/com/gaaji/auth/applicationservice/AuthRetrieveServiceImpl.java new file mode 100644 index 0000000..a596f6a --- /dev/null +++ b/src/main/java/com/gaaji/auth/applicationservice/AuthRetrieveServiceImpl.java @@ -0,0 +1,26 @@ +package com.gaaji.auth.applicationservice; + +import com.gaaji.auth.controller.dto.RetrieveResponse; +import com.gaaji.auth.domain.Auth; +import com.gaaji.auth.domain.AuthId; +import com.gaaji.auth.exception.AuthIdNotFoundException; +import com.gaaji.auth.repository.AuthRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Transactional +@Service +public class AuthRetrieveServiceImpl implements + AuthRetrieveService { + + private final AuthRepository authRepository; + + @Override + public RetrieveResponse retrieveAuth(String authId) { + Auth auth = authRepository.findById(authId) + .orElseThrow(AuthIdNotFoundException::new); + return RetrieveResponse.of(authId, auth.getNickname(), auth.getMannerTemperature(), auth.getProfilePictureUrl()); + } +} diff --git a/src/main/java/com/gaaji/auth/applicationservice/MannerRetriveService.java b/src/main/java/com/gaaji/auth/applicationservice/MannerRetriveService.java new file mode 100644 index 0000000..5ac57af --- /dev/null +++ b/src/main/java/com/gaaji/auth/applicationservice/MannerRetriveService.java @@ -0,0 +1,14 @@ +package com.gaaji.auth.applicationservice; + +import java.util.List; + +import com.gaaji.auth.domain.BadManner; +import com.gaaji.auth.domain.GoodManner; + +public interface MannerRetriveService { + + List retriveGoodMannerList(); + + List retriveBadMannerList(); + +} diff --git a/src/main/java/com/gaaji/auth/applicationservice/MannerRetriveServiceImpl.java b/src/main/java/com/gaaji/auth/applicationservice/MannerRetriveServiceImpl.java new file mode 100644 index 0000000..417d226 --- /dev/null +++ b/src/main/java/com/gaaji/auth/applicationservice/MannerRetriveServiceImpl.java @@ -0,0 +1,31 @@ +package com.gaaji.auth.applicationservice; + +import java.util.Arrays; +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.gaaji.auth.domain.BadManner; +import com.gaaji.auth.domain.GoodManner; +import com.gaaji.auth.repository.AuthRepository; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Transactional +@Service +public class MannerRetriveServiceImpl implements MannerRetriveService { + + @Override + public List retriveGoodMannerList() { + return Arrays.asList(GoodManner.values()); + } + + @Override + public List retriveBadMannerList() { + return Arrays.asList(BadManner.values()); + + } + +} diff --git a/src/main/java/com/gaaji/auth/applicationservice/NicknameRegisterServiceImpl.java b/src/main/java/com/gaaji/auth/applicationservice/NicknameRegisterServiceImpl.java index ae8fb58..a2cb02b 100644 --- a/src/main/java/com/gaaji/auth/applicationservice/NicknameRegisterServiceImpl.java +++ b/src/main/java/com/gaaji/auth/applicationservice/NicknameRegisterServiceImpl.java @@ -1,5 +1,8 @@ package com.gaaji.auth.applicationservice; +import com.gaaji.auth.adaptor.KafkaProducer; +import com.gaaji.auth.event.Events; +import com.gaaji.auth.event.NicknameChangedEvent; import com.gaaji.auth.domain.Auth; import com.gaaji.auth.exception.AuthIdNotFoundException; import com.gaaji.auth.repository.AuthRepository; @@ -18,8 +21,9 @@ public class NicknameRegisterServiceImpl implements NicknameRegisterService{ public void registerNickname(String authId, String nickname){ Auth auth = authRepository .findById(authId) - .orElseThrow(AuthIdNotFoundException::new); // TODO Exception 추가 + .orElseThrow(AuthIdNotFoundException::new); auth.registerNickname(nickname); + Events.raise(new NicknameChangedEvent(authId, nickname)); } } diff --git a/src/main/java/com/gaaji/auth/applicationservice/ProfilePictureUploadService.java b/src/main/java/com/gaaji/auth/applicationservice/ProfilePictureUploadService.java new file mode 100644 index 0000000..9c41855 --- /dev/null +++ b/src/main/java/com/gaaji/auth/applicationservice/ProfilePictureUploadService.java @@ -0,0 +1,9 @@ +package com.gaaji.auth.applicationservice; + +import org.springframework.web.multipart.MultipartFile; + +public interface ProfilePictureUploadService { + + void uploadPicture(MultipartFile multipartFile, String authId); + +} diff --git a/src/main/java/com/gaaji/auth/applicationservice/ProfilePictureUploadServiceImpl.java b/src/main/java/com/gaaji/auth/applicationservice/ProfilePictureUploadServiceImpl.java new file mode 100644 index 0000000..12cafaa --- /dev/null +++ b/src/main/java/com/gaaji/auth/applicationservice/ProfilePictureUploadServiceImpl.java @@ -0,0 +1,35 @@ +package com.gaaji.auth.applicationservice; + +import com.gaaji.auth.adaptor.S3Uploader; +import com.gaaji.auth.domain.Auth; +import com.gaaji.auth.exception.AuthIdNotFoundException; +import com.gaaji.auth.repository.AuthRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +@RequiredArgsConstructor +@Transactional +@Service +public class ProfilePictureUploadServiceImpl implements + ProfilePictureUploadService { + + private final S3Uploader s3Uploader; + private final AuthRepository authRepository; + + @Override + public void uploadPicture(MultipartFile multipartFile, String authId) { + getMember(authId) + .registerProfilePicture(uploadImage(multipartFile)); + } + + private String uploadImage(MultipartFile multipartFile) { + return s3Uploader.upload(multipartFile); + } + + private Auth getMember(String authId) { + return authRepository.findById(authId) + .orElseThrow(AuthIdNotFoundException::new); + } +} diff --git a/src/main/java/com/gaaji/auth/applicationservice/ReviewCreateService.java b/src/main/java/com/gaaji/auth/applicationservice/ReviewCreateService.java new file mode 100644 index 0000000..faeeed1 --- /dev/null +++ b/src/main/java/com/gaaji/auth/applicationservice/ReviewCreateService.java @@ -0,0 +1,11 @@ +package com.gaaji.auth.applicationservice; + +import org.springframework.web.multipart.MultipartFile; + +import com.gaaji.auth.controller.dto.ReviewCreateRequest; + +public interface ReviewCreateService { + + void createReview(String authId, MultipartFile multipartFile, ReviewCreateRequest dto); + +} diff --git a/src/main/java/com/gaaji/auth/applicationservice/ReviewCreateServiceImpl.java b/src/main/java/com/gaaji/auth/applicationservice/ReviewCreateServiceImpl.java new file mode 100644 index 0000000..7f392a6 --- /dev/null +++ b/src/main/java/com/gaaji/auth/applicationservice/ReviewCreateServiceImpl.java @@ -0,0 +1,112 @@ +package com.gaaji.auth.applicationservice; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import com.gaaji.auth.adaptor.S3Uploader; +import com.gaaji.auth.controller.dto.ReviewCreateRequest; +import com.gaaji.auth.domain.AuthId; +import com.gaaji.auth.domain.BadManner; +import com.gaaji.auth.domain.Comment; +import com.gaaji.auth.domain.GoodManner; +import com.gaaji.auth.domain.PostId; +import com.gaaji.auth.domain.Review; +import com.gaaji.auth.domain.ReviewId; +import com.gaaji.auth.exception.EqualsSellerAndPurchaserException; +import com.gaaji.auth.exception.NoMatchIdException; +import com.gaaji.auth.exception.NoReviewException; +import com.gaaji.auth.exception.NoTownException; +import com.gaaji.auth.exception.NonexistentTargetException; +import com.gaaji.auth.repository.ReviewRepository; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Transactional +@Service +public class ReviewCreateServiceImpl implements ReviewCreateService { + + private final ReviewRepository reviewRepository; + private final S3Uploader s3Uploader; + + @Override + public void createReview(String authId, MultipartFile multipartFile,ReviewCreateRequest dto) { + saveEntity(createReviewEntity(dto, multipartFile, authId)); + } + + private void saveEntity(Review review) { + this.reviewRepository.save(review); + } + + private Review createReviewEntity(ReviewCreateRequest dto, MultipartFile multipartFile, String authId) { + if(dto.getTown() == null) { + throw new NoTownException(); + } + + if((dto.getPurchaserId() == null) || dto.getSellerId() == null) { + throw new NonexistentTargetException(); + } + + if((dto.getContents() == null) && (dto.getGoodManners().size() == 0) && (dto.getBadManners().size() == 0)) { + throw new NoReviewException(); + } + + if(dto.getSellerId().equals(dto.getPurchaserId())) { + throw new EqualsSellerAndPurchaserException(); + } + + String pictureUrl = uploadImage(multipartFile); + List goodManners = getGoodManners(dto.getGoodManners()); + List badManners = getBaddManners(dto.getBadManners()); + if (dto.getPurchaserId().equals(authId)) { + return Review.of(ReviewId.of(this.reviewRepository.nextId()), PostId.of(dto.getPostId()), AuthId.of(authId), + AuthId.of(dto.getSellerId()), goodManners, badManners, + Comment.of(pictureUrl, dto.getContents(), dto.getTown(), true)); + + } else if (dto.getSellerId().equals(authId)) { + return Review.of(ReviewId.of(this.reviewRepository.nextId()), PostId.of(dto.getPostId()), AuthId.of(authId), + AuthId.of(dto.getPurchaserId()), goodManners, badManners, + Comment.of(pictureUrl, dto.getContents(), dto.getTown(), false)); + } else { + throw new NoMatchIdException(); + } + } + + private List getBaddManners(List badManners) { + if (badManners.size() == 0) { + return null; + } + + List badMannerList = new ArrayList(); + + for (String badManner : badManners) { + badMannerList.add(BadManner.valueOf(badManner)); + } + return badMannerList; + } + + private List getGoodManners(List goodManners) { + if (goodManners.size() == 0) { + return null; + } + + List goodMannerList = new ArrayList(); + + for (String goodManner : goodManners) { + goodMannerList.add(GoodManner.valueOf(goodManner)); + } + return goodMannerList; + } + + private String uploadImage(MultipartFile multipartFile) { + if(multipartFile == null) { + return null; + } + return s3Uploader.upload(multipartFile); + } + +} diff --git a/src/main/java/com/gaaji/auth/applicationservice/ReviewRetriveService.java b/src/main/java/com/gaaji/auth/applicationservice/ReviewRetriveService.java new file mode 100644 index 0000000..60e077e --- /dev/null +++ b/src/main/java/com/gaaji/auth/applicationservice/ReviewRetriveService.java @@ -0,0 +1,20 @@ +package com.gaaji.auth.applicationservice; + +import java.util.List; + +import com.gaaji.auth.controller.dto.CommentRetrieveResponse; +import com.gaaji.auth.controller.dto.MannerRetrieveResponse; +import com.gaaji.auth.controller.dto.PreviewReviewRetrieveResponse; +import com.gaaji.auth.controller.dto.ReviewRetrieveResponse; + +public interface ReviewRetriveService { + + ReviewRetrieveResponse retriveMyReview(String authId, String postId); + + List retriveComment(String userId); + + MannerRetrieveResponse retriveManner(String authId, String userId); + + PreviewReviewRetrieveResponse retriveReview(String userId); + +} diff --git a/src/main/java/com/gaaji/auth/applicationservice/ReviewRetriveServiceImpl.java b/src/main/java/com/gaaji/auth/applicationservice/ReviewRetriveServiceImpl.java new file mode 100644 index 0000000..6141c2d --- /dev/null +++ b/src/main/java/com/gaaji/auth/applicationservice/ReviewRetriveServiceImpl.java @@ -0,0 +1,148 @@ +package com.gaaji.auth.applicationservice; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.gaaji.auth.controller.dto.BadMannerCount; +import com.gaaji.auth.controller.dto.CommentInfo; +import com.gaaji.auth.controller.dto.CommentRetrieveResponse; +import com.gaaji.auth.controller.dto.GoodMannerCount; +import com.gaaji.auth.controller.dto.MannerRetrieveResponse; +import com.gaaji.auth.controller.dto.PreviewReviewRetrieveResponse; +import com.gaaji.auth.controller.dto.ReviewRetrieveResponse; +import com.gaaji.auth.domain.Auth; +import com.gaaji.auth.domain.AuthId; +import com.gaaji.auth.domain.BadManner; +import com.gaaji.auth.domain.GoodManner; +import com.gaaji.auth.domain.PostId; +import com.gaaji.auth.domain.Review; +import com.gaaji.auth.exception.NoSearchReviewException; +import com.gaaji.auth.repository.AuthRepository; +import com.gaaji.auth.repository.ReviewRepository; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Transactional +@Service +public class ReviewRetriveServiceImpl implements ReviewRetriveService{ + + private final ReviewRepository reviewRepository; + private final AuthRepository authRepository; + + @Override + public ReviewRetrieveResponse retriveMyReview(String authId, String postId) { + Review review = this.reviewRepository.findByPostIdAndSenderId(PostId.of(postId), AuthId.of(authId)).orElseThrow(NoSearchReviewException::new); + return ReviewRetrieveResponse.of(review.getReviewId().getId(), review.getComment().getContents(), review.getComment().getPictureUrl(), review.getGoodManners(), review.getBadManners()); + } + + @Override + public List retriveComment(String userId) { + List reviewList = this.reviewRepository.findByReceiverIdAndComment_ContentsIsNotNullOrderByComment_CreatedAtDesc(AuthId.of(userId)); + List commentList = new ArrayList(); + for(Review review : reviewList) { + + Auth auth = this.authRepository.findById(review.getSenderId().getId()).orElse(Auth.signUp(null, null, null)); + if(auth.getAuthIdForToken()==null) { + auth.registerNickname(null); + } + commentList.add(CommentRetrieveResponse.of(review.getSenderId().getId(), auth.getNickname(), auth.getProfilePictureUrl(), review.getComment().getTown(), review.getComment().getContents(), review.getComment().getPictureUrl(), review.getComment().isIspurchaser(), review.getComment().getCreatedAt())); + + } + + return commentList; + } + + @Override + public MannerRetrieveResponse retriveManner(String authId, String userId) { + MannerRetrieveResponse response = new MannerRetrieveResponse(); + + if(authId.equals(userId)) { + return MannerRetrieveResponse.of(getGoodMannerCount(userId), getBadMannerCount(userId)); + } else { + return MannerRetrieveResponse.of(getGoodMannerCount(userId), null); + } + } + + private List getGoodMannerCount(String userId) { + + List goodManners = new ArrayList(); + List goodMannerList = Arrays.asList(GoodManner.values()); + List reviewList = this.reviewRepository.findDistinctByReceiverIdAndGoodMannersNotNull(AuthId.of(userId)); + List goodMannerCountList = new ArrayList(); + + if(reviewList.size() == 0) { + return null; + } + + for(Review review : reviewList) { + goodManners.addAll(review.getGoodManners()); + } + + for(GoodManner goodManner : goodMannerList) { + int count = Collections.frequency(goodManners, goodManner); + if(count != 0) { + goodMannerCountList.add(GoodMannerCount.of(goodManner, count)); + } + } + goodMannerCountList.sort(Comparator.comparing(GoodMannerCount::getCount).reversed()); + return goodMannerCountList; + } + + private List getBadMannerCount(String userId) { + List badManners = new ArrayList(); + List badMannerList = Arrays.asList(BadManner.values()); + List reviewList = this.reviewRepository.findDistinctByReceiverIdAndBadMannersNotNull(AuthId.of(userId)); + List badMannerCountList = new ArrayList(); + + if(reviewList.size() == 0) { + return null; + } + + for(Review review : reviewList) { + badManners.addAll(review.getBadManners()); + } + + for(BadManner badManner : badMannerList) { + int count = Collections.frequency(badManners, badManner); + if(count != 0) { + badMannerCountList.add(BadMannerCount.of(badManner, count)); + } + } + badMannerCountList.sort(Comparator.comparing(BadMannerCount::getCount).reversed()); + + return badMannerCountList; + } + + @Override + public PreviewReviewRetrieveResponse retriveReview(String userId) { + + List reviewList = this.reviewRepository.findTop3ByReceiverIdAndComment_ContentsIsNotNullOrderByComment_CreatedAtDesc(AuthId.of(userId)); + List commentInfoList = new ArrayList(); + for(Review review : reviewList) { + + Auth auth = this.authRepository.findById(review.getSenderId().getId()).orElse(Auth.signUp(null, null, null)); + if(auth.getAuthIdForToken()==null) { + auth.registerNickname(null); + } + commentInfoList.add(CommentInfo.of(review.getSenderId().getId(), auth.getNickname(), auth.getProfilePictureUrl(), review.getComment().getTown(), review.getComment().getContents(), review.getComment().getPictureUrl(), review.getComment().isIspurchaser(), review.getComment().getCreatedAt())); + + } + List goodMannerCount= getGoodMannerCount(userId); + if(goodMannerCount.size() > 3) { + goodMannerCount.subList(3, goodMannerCount.size()).clear(); + } + + + return PreviewReviewRetrieveResponse.of(commentInfoList, goodMannerCount); + } + + +} diff --git a/src/main/java/com/gaaji/auth/applicationservice/ReviewUpdateService.java b/src/main/java/com/gaaji/auth/applicationservice/ReviewUpdateService.java new file mode 100644 index 0000000..0775d2a --- /dev/null +++ b/src/main/java/com/gaaji/auth/applicationservice/ReviewUpdateService.java @@ -0,0 +1,11 @@ +package com.gaaji.auth.applicationservice; + +import org.springframework.web.multipart.MultipartFile; + +import com.gaaji.auth.controller.dto.ReviewUpdateRequest; + +public interface ReviewUpdateService { + + void updateReview(String authId, MultipartFile multipartFile, ReviewUpdateRequest dto); + +} diff --git a/src/main/java/com/gaaji/auth/applicationservice/ReviewUpdateServiceImpl.java b/src/main/java/com/gaaji/auth/applicationservice/ReviewUpdateServiceImpl.java new file mode 100644 index 0000000..42b1647 --- /dev/null +++ b/src/main/java/com/gaaji/auth/applicationservice/ReviewUpdateServiceImpl.java @@ -0,0 +1,82 @@ +package com.gaaji.auth.applicationservice; + +import java.util.ArrayList; +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; + +import com.gaaji.auth.adaptor.S3Uploader; +import com.gaaji.auth.controller.dto.ReviewUpdateRequest; +import com.gaaji.auth.domain.BadManner; +import com.gaaji.auth.domain.GoodManner; +import com.gaaji.auth.domain.Review; +import com.gaaji.auth.domain.ReviewId; +import com.gaaji.auth.exception.NoMatchSenderException; +import com.gaaji.auth.exception.NoSearchReviewException; +import com.gaaji.auth.repository.ReviewRepository; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Transactional +@Service +public class ReviewUpdateServiceImpl implements ReviewUpdateService{ + + private final ReviewRepository reviewRepository; + private final S3Uploader s3Uploader; + + @Override + public void updateReview(String authId, MultipartFile multipartFile, ReviewUpdateRequest dto) { + Review review = this.reviewRepository.findById(ReviewId.of(dto.getReviewId())).orElseThrow(NoSearchReviewException::new); + + if(!review.getSenderId().getId().equals(authId)) { + throw new NoMatchSenderException(); + } + + String pictureUrl; + List goodManners = getGoodManners(dto.getGoodManners()); + List badManners = getBaddManners(dto.getBadManners()); + if(dto.isPictureChanged()) { + pictureUrl = uploadImage(multipartFile); + } else { + pictureUrl = review.getComment().getPictureUrl(); + } + + + review.modify(pictureUrl, goodManners, badManners, dto.getContents()); + } + + private List getBaddManners(List badManners) { + if (badManners.size() == 0) { + return null; + } + + List badMannerList = new ArrayList(); + + for (String badManner : badManners) { + badMannerList.add(BadManner.valueOf(badManner)); + } + return badMannerList; + } + + private List getGoodManners(List goodManners) { + if (goodManners.size() == 0) { + return null; + } + + List goodMannerList = new ArrayList(); + + for (String goodManner : goodManners) { + goodMannerList.add(GoodManner.valueOf(goodManner)); + } + return goodMannerList; + } + + private String uploadImage(MultipartFile multipartFile) { + if(multipartFile == null) { + return null; + } + return s3Uploader.upload(multipartFile); + } +} diff --git a/src/main/java/com/gaaji/auth/applicationservice/Sample.java b/src/main/java/com/gaaji/auth/applicationservice/Sample.java deleted file mode 100644 index adb60ff..0000000 --- a/src/main/java/com/gaaji/auth/applicationservice/Sample.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.gaaji.auth.applicationservice; - -public class Sample { - -} diff --git a/src/main/java/com/gaaji/auth/applicationservice/TokenServiceImpl.java b/src/main/java/com/gaaji/auth/applicationservice/TokenServiceImpl.java index c435f35..dfde9a2 100644 --- a/src/main/java/com/gaaji/auth/applicationservice/TokenServiceImpl.java +++ b/src/main/java/com/gaaji/auth/applicationservice/TokenServiceImpl.java @@ -1,8 +1,10 @@ package com.gaaji.auth.applicationservice; import com.gaaji.auth.controller.dto.TokenResponse; +import com.gaaji.auth.exception.AuthIdNotFoundException; import com.gaaji.auth.jwt.JwtProvider; import com.gaaji.auth.repository.AuthRepository; +import io.jsonwebtoken.Claims; import java.util.concurrent.TimeUnit; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.StringRedisTemplate; @@ -30,13 +32,13 @@ public TokenResponse createTokens(String authId){ public String refresh(String refreshToken){ // refreshToken 유효성 검증 (시간) - jwtProvider.validateToken(refreshToken); // error - + jwtProvider.validateToken(refreshToken);// error ValueOperations ops = stringRedisTemplate.opsForValue(); String authId = ops.get(refreshToken); - authRepository.findById(authId); + authRepository.findById(authId) + .orElseThrow(AuthIdNotFoundException::new); return jwtProvider.createAccessToken(authId); } diff --git a/src/main/java/com/gaaji/auth/config/RedisConfig.java b/src/main/java/com/gaaji/auth/config/RedisConfig.java index 9ca40bc..ea785aa 100644 --- a/src/main/java/com/gaaji/auth/config/RedisConfig.java +++ b/src/main/java/com/gaaji/auth/config/RedisConfig.java @@ -1,5 +1,6 @@ package com.gaaji.auth.config; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; @@ -11,10 +12,15 @@ @Configuration public class RedisConfig { + @Value("${spring.redis.host}") + private String host; + + @Value("${spring.redis.port}") + private int port; + @Bean public RedisConnectionFactory redisConnectionFactory() { - LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory(); - return lettuceConnectionFactory; + return new LettuceConnectionFactory(host,port); } @Bean diff --git a/src/main/java/com/gaaji/auth/config/S3Config.java b/src/main/java/com/gaaji/auth/config/S3Config.java new file mode 100644 index 0000000..80b7301 --- /dev/null +++ b/src/main/java/com/gaaji/auth/config/S3Config.java @@ -0,0 +1,28 @@ +package com.gaaji.auth.config; + +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class S3Config { + @Value("${cloud.aws.credentials.access-key}") + private String accessKey; + @Value("${cloud.aws.credentials.secret-key}") + private String secretKey; + @Value("${cloud.aws.region.static}") + private String region; + + @Bean + public AmazonS3Client amazonS3Client() { + BasicAWSCredentials awsCreds = new BasicAWSCredentials(accessKey,secretKey); + return (AmazonS3Client) AmazonS3ClientBuilder.standard() + .withRegion(region) + .withCredentials(new AWSStaticCredentialsProvider(awsCreds)) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/gaaji/auth/controller/AuthRetrieveController.java b/src/main/java/com/gaaji/auth/controller/AuthRetrieveController.java new file mode 100644 index 0000000..f16ea50 --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/AuthRetrieveController.java @@ -0,0 +1,25 @@ +package com.gaaji.auth.controller; + + +import com.gaaji.auth.applicationservice.AuthRetrieveService; +import com.gaaji.auth.controller.dto.RetrieveResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +@RequiredArgsConstructor +@RestController +public class AuthRetrieveController { + + private final AuthRetrieveService authRetrieveService; + + @GetMapping("/auth/{authId}") + public ResponseEntity retrieveAuth(@PathVariable("authId") String authId){ + + RetrieveResponse dto = authRetrieveService.retrieveAuth(authId); + return ResponseEntity.ok(dto); + } + +} diff --git a/src/main/java/com/gaaji/auth/controller/CallbackController.java b/src/main/java/com/gaaji/auth/controller/CallbackController.java index 8ba1bc6..82bd4e8 100644 --- a/src/main/java/com/gaaji/auth/controller/CallbackController.java +++ b/src/main/java/com/gaaji/auth/controller/CallbackController.java @@ -2,8 +2,14 @@ import com.gaaji.auth.controller.dto.TokenResponse; import com.gaaji.auth.oauth.CustomOAuth2UserService; +import java.io.IOException; +import java.net.URI; +import javax.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.core.env.Environment; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -11,31 +17,42 @@ @Slf4j @RestController -@RequiredArgsConstructor + public class CallbackController { private final CustomOAuth2UserService customOAuth2UserService; + private final Environment env; + + private final String REDIRECT_URL; + public CallbackController(CustomOAuth2UserService customOAuth2UserService, Environment env) { + this.customOAuth2UserService = customOAuth2UserService; + this.env = env; + REDIRECT_URL = env.getProperty("oauth.redirect"); + } @GetMapping("/login/naverlogin") public ResponseEntity redirectUriProcessor(@RequestParam String code, - @RequestParam String state) { + @RequestParam String state, HttpServletResponse response) throws IOException { + log.info("[NAVER] : CALLBACK!!!"); TokenResponse tokens = customOAuth2UserService.naverLogin(code, state); - return ResponseEntity.ok() - .header("access-token",tokens.getAccessToken()) - .header("refresh-token",tokens.getRefreshToken()) - .build(); + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setLocation(URI.create(REDIRECT_URL+"access="+tokens.getAccessToken()+"&refresh="+tokens.getRefreshToken())); + + + return new ResponseEntity<>(httpHeaders, HttpStatus.MOVED_PERMANENTLY); } @GetMapping("login/kakao") public ResponseEntity redirectKakao(@RequestParam String code) { TokenResponse tokens = customOAuth2UserService.kakaoLogin(code); - return ResponseEntity.ok() - .header("access-token",tokens.getAccessToken()) - .header("refresh-token",tokens.getRefreshToken()) - .build(); + + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.setLocation(URI.create(REDIRECT_URL + "access="+tokens.getAccessToken()+"&refresh="+tokens.getRefreshToken())); + + return new ResponseEntity<>(httpHeaders, HttpStatus.MOVED_PERMANENTLY); } } diff --git a/src/main/java/com/gaaji/auth/controller/MannerRetriveController.java b/src/main/java/com/gaaji/auth/controller/MannerRetriveController.java new file mode 100644 index 0000000..62240bc --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/MannerRetriveController.java @@ -0,0 +1,33 @@ +package com.gaaji.auth.controller; + +import java.util.List; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.gaaji.auth.applicationservice.MannerRetriveService; +import com.gaaji.auth.domain.BadManner; +import com.gaaji.auth.domain.GoodManner; +import lombok.RequiredArgsConstructor; + +@RequestMapping("/manner") +@RequiredArgsConstructor +@RestController +public class MannerRetriveController { + + private final MannerRetriveService mannerRetriveService; + + @GetMapping("/good") + private ResponseEntity> retriveGoodMannerList() { + List goodMannerList = this.mannerRetriveService.retriveGoodMannerList(); + return ResponseEntity.ok(goodMannerList); + } + + @GetMapping("/bad") + private ResponseEntity> retriveBadMannerList() { + List badMannerList = this.mannerRetriveService.retriveBadMannerList(); + return ResponseEntity.ok(badMannerList); + } +} diff --git a/src/main/java/com/gaaji/auth/controller/NicknameRegisterController.java b/src/main/java/com/gaaji/auth/controller/NicknameRegisterController.java index 4f26164..c71d2f1 100644 --- a/src/main/java/com/gaaji/auth/controller/NicknameRegisterController.java +++ b/src/main/java/com/gaaji/auth/controller/NicknameRegisterController.java @@ -3,6 +3,7 @@ import com.gaaji.auth.applicationservice.NicknameRegisterService; import com.gaaji.auth.controller.dto.NicknameRegisterRequest; import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -16,14 +17,14 @@ public class NicknameRegisterController { private final NicknameRegisterService nicknameRegisterService; @PatchMapping("/auth/nickname") - public ResponseEntity registerNickname(@RequestHeader("AUTH-ID") String authId, @RequestBody NicknameRegisterRequest dto){ + public ResponseEntity registerNickname(@RequestHeader(HttpHeaders.AUTHORIZATION) String authId, @RequestBody NicknameRegisterRequest dto){ // body nicknameRegisterService.registerNickname(authId, dto.getNickname()); return ResponseEntity.ok().build(); } @PatchMapping("/profile/nickname") - public ResponseEntity registerProfileNickname(@RequestHeader("AUTH-ID") String authId, @RequestBody NicknameRegisterRequest dto){ + public ResponseEntity registerProfileNickname(@RequestHeader("X-AUTH-ID") String authId, @RequestBody NicknameRegisterRequest dto){ // body nicknameRegisterService.registerNickname(authId, dto.getNickname()); return ResponseEntity.ok().build(); diff --git a/src/main/java/com/gaaji/auth/controller/ProfilePictureUploadController.java b/src/main/java/com/gaaji/auth/controller/ProfilePictureUploadController.java new file mode 100644 index 0000000..21e9c9b --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/ProfilePictureUploadController.java @@ -0,0 +1,28 @@ +package com.gaaji.auth.controller; + + +import com.gaaji.auth.applicationservice.ProfilePictureUploadService; +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +@RequiredArgsConstructor +@RestController +public class ProfilePictureUploadController { + + private final ProfilePictureUploadService profilePictureUploadService; + + + @PostMapping("/auth/picture") + public ResponseEntity uploadProfilePicture(@RequestPart("file")MultipartFile multipartFile, + @RequestHeader(HttpHeaders.AUTHORIZATION) String authId){ + profilePictureUploadService.uploadPicture(multipartFile,authId); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } +} diff --git a/src/main/java/com/gaaji/auth/controller/ReviewCreateController.java b/src/main/java/com/gaaji/auth/controller/ReviewCreateController.java new file mode 100644 index 0000000..285922a --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/ReviewCreateController.java @@ -0,0 +1,30 @@ +package com.gaaji.auth.controller; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.gaaji.auth.applicationservice.ReviewCreateService; +import com.gaaji.auth.controller.dto.ReviewCreateRequest; +import lombok.RequiredArgsConstructor; + +@RequestMapping("/review") +@RequiredArgsConstructor +@RestController +public class ReviewCreateController { + + private final ReviewCreateService reviewCreateService; + + @PostMapping + private ResponseEntity createReview(@RequestHeader(HttpHeaders.AUTHORIZATION) String authId, @RequestPart("reviewCreateRequest") ReviewCreateRequest dto, @RequestPart("file")MultipartFile multipartFile) { + this.reviewCreateService.createReview(authId, multipartFile, dto); + return ResponseEntity.status(HttpStatus.CREATED).build(); + } +} diff --git a/src/main/java/com/gaaji/auth/controller/ReviewRetriveController.java b/src/main/java/com/gaaji/auth/controller/ReviewRetriveController.java new file mode 100644 index 0000000..cc916ba --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/ReviewRetriveController.java @@ -0,0 +1,52 @@ +package com.gaaji.auth.controller; + +import java.util.List; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import com.gaaji.auth.applicationservice.ReviewRetriveService; +import com.gaaji.auth.controller.dto.CommentRetrieveResponse; +import com.gaaji.auth.controller.dto.MannerRetrieveResponse; +import com.gaaji.auth.controller.dto.PreviewReviewRetrieveResponse; +import com.gaaji.auth.controller.dto.ReviewRetrieveResponse; +import com.gaaji.auth.domain.Review; + +import lombok.RequiredArgsConstructor; + +@RequestMapping("/review") +@RequiredArgsConstructor +@RestController +public class ReviewRetriveController { + + private final ReviewRetriveService reviewRetriveService; + + @GetMapping("/my") + private ResponseEntity retriveMyReview(@RequestHeader(HttpHeaders.AUTHORIZATION) String authId, @RequestBody String postId) { + ReviewRetrieveResponse dto = this.reviewRetriveService.retriveMyReview(authId, postId); + return ResponseEntity.ok(dto); + } + + @GetMapping("/comment") + private ResponseEntity> retriveComments(@RequestHeader(HttpHeaders.AUTHORIZATION) String authId, @RequestBody String userId) { + List dto = this.reviewRetriveService.retriveComment(userId); + return ResponseEntity.ok(dto); + } + + @GetMapping("/manner") + private ResponseEntity retriveManner(@RequestHeader(HttpHeaders.AUTHORIZATION) String authId, @RequestBody String userId) { + MannerRetrieveResponse dto = this.reviewRetriveService.retriveManner(authId, userId); + return ResponseEntity.ok(dto); + } + + @GetMapping + private ResponseEntity retriveReview(@RequestHeader(HttpHeaders.AUTHORIZATION) String authId, @RequestBody String userId) { + PreviewReviewRetrieveResponse dto = this.reviewRetriveService.retriveReview(userId); + return ResponseEntity.ok(dto); + } +} diff --git a/src/main/java/com/gaaji/auth/controller/ReviewUpdateController.java b/src/main/java/com/gaaji/auth/controller/ReviewUpdateController.java new file mode 100644 index 0000000..7b186b2 --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/ReviewUpdateController.java @@ -0,0 +1,30 @@ +package com.gaaji.auth.controller; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import com.gaaji.auth.applicationservice.ReviewUpdateService; +import com.gaaji.auth.controller.dto.ReviewUpdateRequest; + +import lombok.RequiredArgsConstructor; + +@RequestMapping("/review") +@RequiredArgsConstructor +@RestController +public class ReviewUpdateController { + + private final ReviewUpdateService reviewUpdateService; + + @PatchMapping + private ResponseEntity updateReview(@RequestHeader(HttpHeaders.AUTHORIZATION) String authId, @RequestPart("reviewCreateRequest") ReviewUpdateRequest dto, @RequestPart("file")MultipartFile multipartFile) { + this.reviewUpdateService.updateReview(authId, multipartFile, dto); + + return ResponseEntity.ok().build(); + } +} diff --git a/src/main/java/com/gaaji/auth/controller/dto/BadMannerCount.java b/src/main/java/com/gaaji/auth/controller/dto/BadMannerCount.java new file mode 100644 index 0000000..cca1ce2 --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/dto/BadMannerCount.java @@ -0,0 +1,20 @@ +package com.gaaji.auth.controller.dto; + +import com.gaaji.auth.domain.AuthId; +import com.gaaji.auth.domain.BadManner; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +public class BadMannerCount { + private BadManner badManner; + private int count; + + public static BadMannerCount of(BadManner badManner, int counter) { + return new BadMannerCount(badManner, counter); + } +} diff --git a/src/main/java/com/gaaji/auth/controller/dto/CommentInfo.java b/src/main/java/com/gaaji/auth/controller/dto/CommentInfo.java new file mode 100644 index 0000000..be73f83 --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/dto/CommentInfo.java @@ -0,0 +1,27 @@ +package com.gaaji.auth.controller.dto; + +import java.time.LocalDateTime; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor +public class CommentInfo { + + private String senderId; + private String nickname; + private String profilePictureUrl; + private String town; + private String contents; + private String pictureUrl; + private boolean ispurchaser; + private LocalDateTime createdAt; + + public static CommentInfo of(String senderId, String nickname, String profilePictureUrl, String town, String contents, String pictureUrl, boolean ispurchaser, LocalDateTime createdAt) { + return new CommentInfo(senderId, nickname, profilePictureUrl, town, contents, pictureUrl, ispurchaser, createdAt); + } +} diff --git a/src/main/java/com/gaaji/auth/controller/dto/CommentRetrieveResponse.java b/src/main/java/com/gaaji/auth/controller/dto/CommentRetrieveResponse.java new file mode 100644 index 0000000..fbcec33 --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/dto/CommentRetrieveResponse.java @@ -0,0 +1,28 @@ +package com.gaaji.auth.controller.dto; + +import java.time.LocalDateTime; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor +public class CommentRetrieveResponse { + + private String senderId; + private String nickname; + private String profilePictureUrl; + private String town; + private String contents; + private String pictureUrl; + private boolean ispurchaser; + private LocalDateTime createdAt; + + public static CommentRetrieveResponse of(String senderId, String nickname, String profilePictureUrl, String town, String contents, String pictureUrl, boolean ispurchaser, LocalDateTime createdAt) { + return new CommentRetrieveResponse(senderId, nickname, profilePictureUrl, town, contents, pictureUrl, ispurchaser, createdAt); + } + +} diff --git a/src/main/java/com/gaaji/auth/controller/dto/GoodMannerCount.java b/src/main/java/com/gaaji/auth/controller/dto/GoodMannerCount.java new file mode 100644 index 0000000..c42bf0c --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/dto/GoodMannerCount.java @@ -0,0 +1,24 @@ +package com.gaaji.auth.controller.dto; + +import java.time.LocalDateTime; +import java.util.List; + +import com.gaaji.auth.domain.AuthId; +import com.gaaji.auth.domain.GoodManner; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +public class GoodMannerCount { + private GoodManner goodManners; + private int count; + + public static GoodMannerCount of(GoodManner goodManners, int count) { + return new GoodMannerCount(goodManners, count); + } + +} diff --git a/src/main/java/com/gaaji/auth/controller/dto/MannerRetrieveResponse.java b/src/main/java/com/gaaji/auth/controller/dto/MannerRetrieveResponse.java new file mode 100644 index 0000000..fbf5f36 --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/dto/MannerRetrieveResponse.java @@ -0,0 +1,21 @@ +package com.gaaji.auth.controller.dto; + +import java.util.List; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +public class MannerRetrieveResponse { + private List goodMannerCount; + private List badMannerCount; + + + public static MannerRetrieveResponse of(List goodMannerCount, + List badMannerCount) { + return new MannerRetrieveResponse(goodMannerCount, badMannerCount); + } +} diff --git a/src/main/java/com/gaaji/auth/controller/dto/PreviewReviewRetrieveResponse.java b/src/main/java/com/gaaji/auth/controller/dto/PreviewReviewRetrieveResponse.java new file mode 100644 index 0000000..1ec8954 --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/dto/PreviewReviewRetrieveResponse.java @@ -0,0 +1,23 @@ +package com.gaaji.auth.controller.dto; + +import java.util.List; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor +public class PreviewReviewRetrieveResponse { + + private List commentInfo; + private List goodMannerCount; + + public static PreviewReviewRetrieveResponse of(List commentInfo, + List goodMannerCount) { + return new PreviewReviewRetrieveResponse(commentInfo, goodMannerCount); + } + +} diff --git a/src/main/java/com/gaaji/auth/controller/dto/RetrieveResponse.java b/src/main/java/com/gaaji/auth/controller/dto/RetrieveResponse.java new file mode 100644 index 0000000..3743b1c --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/dto/RetrieveResponse.java @@ -0,0 +1,26 @@ +package com.gaaji.auth.controller.dto; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor +public class RetrieveResponse { + + private String authId; + private String nickname; + private String pictureUrl; + private double mannerTemperature; + + + public static RetrieveResponse of(String authId, String nickname, double mannerTemperature, String url) { + return new RetrieveResponse(authId, validateNickname(nickname), url, mannerTemperature); + } + + private static String validateNickname(String nickname){ + return nickname == null ? "익명" : nickname; + } +} diff --git a/src/main/java/com/gaaji/auth/controller/dto/ReviewCreateRequest.java b/src/main/java/com/gaaji/auth/controller/dto/ReviewCreateRequest.java new file mode 100644 index 0000000..11c6134 --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/dto/ReviewCreateRequest.java @@ -0,0 +1,24 @@ +package com.gaaji.auth.controller.dto; + +import java.util.List; + +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +public class ReviewCreateRequest { + + private String postId; + private String sellerId; + private String purchaserId; + private String town; + private List goodManners; + private List badManners; + private String contents; +} diff --git a/src/main/java/com/gaaji/auth/controller/dto/ReviewRetrieveResponse.java b/src/main/java/com/gaaji/auth/controller/dto/ReviewRetrieveResponse.java new file mode 100644 index 0000000..0ea1d32 --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/dto/ReviewRetrieveResponse.java @@ -0,0 +1,28 @@ +package com.gaaji.auth.controller.dto; + +import java.util.List; + +import com.gaaji.auth.domain.BadManner; +import com.gaaji.auth.domain.GoodManner; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor +@Getter +public class ReviewRetrieveResponse { + + private String reviewId; + private String contents; + private String pictureUrl; + private List goodManners; + private List badManners; + + public static ReviewRetrieveResponse of(String reviewId, String contents, String pictureUrl, List goodManners, List badManners) { + return new ReviewRetrieveResponse(reviewId, contents, pictureUrl, goodManners, badManners); + } + +} diff --git a/src/main/java/com/gaaji/auth/controller/dto/ReviewUpdateRequest.java b/src/main/java/com/gaaji/auth/controller/dto/ReviewUpdateRequest.java new file mode 100644 index 0000000..b051458 --- /dev/null +++ b/src/main/java/com/gaaji/auth/controller/dto/ReviewUpdateRequest.java @@ -0,0 +1,22 @@ +package com.gaaji.auth.controller.dto; + +import java.util.List; + +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Getter +public class ReviewUpdateRequest { + + private String reviewId; + private List goodManners; + private List badManners; + private String contents; + private boolean pictureChanged; +} diff --git a/src/main/java/com/gaaji/auth/domain/Auth.java b/src/main/java/com/gaaji/auth/domain/Auth.java index 2f759a7..3ec435f 100644 --- a/src/main/java/com/gaaji/auth/domain/Auth.java +++ b/src/main/java/com/gaaji/auth/domain/Auth.java @@ -15,21 +15,22 @@ public class Auth { private AuthId id; private String nickname; + private String profilePictureUrl; @Embedded private PlatformInfo platformInfo; @Embedded - private MannerTemparature mannerTemparature; + private MannerTemperature mannerTemperature; @Builder private Auth(AuthId id, String nickname, PlatformInfo platformInfo, - MannerTemparature mannerTemparature) { + MannerTemperature mannerTemperature) { this.id = id; this.nickname = nickname; this.platformInfo = platformInfo; - this.mannerTemparature = mannerTemparature; + this.mannerTemperature = mannerTemperature; } public static Auth signUp(String id, PlatformType type, String email){ @@ -37,13 +38,26 @@ public static Auth signUp(String id, PlatformType type, String email){ .id(AuthId.of(id)) .nickname("익명") .platformInfo(PlatformInfo.of(type,email)) - .mannerTemparature(MannerTemparature.of(36.5)) + .mannerTemperature(MannerTemperature.of(36.5)) .build(); } public void registerNickname(String nickname){ this.nickname = nickname; } + public void registerProfilePicture(String profilePictureUrl){ + this.profilePictureUrl = profilePictureUrl; + } public String getAuthIdForToken(){ return id.getId(); } + public String getNickname(){ + return nickname; + } + public double getMannerTemperature(){ + return mannerTemperature.getTemperature(); + } + + public String getProfilePictureUrl() { + return this.profilePictureUrl; + } } diff --git a/src/main/java/com/gaaji/auth/domain/BadManner.java b/src/main/java/com/gaaji/auth/domain/BadManner.java new file mode 100644 index 0000000..0dd0ab7 --- /dev/null +++ b/src/main/java/com/gaaji/auth/domain/BadManner.java @@ -0,0 +1,25 @@ +package com.gaaji.auth.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; + +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum BadManner { + + bm1("반말을 사용해요"), + bm2("불친절해요"), + bm3("무조건 택배거래만 하려고 해요"), + bm4("채팅 메시지를 보내도 답이 없어요"), + bm5("차에서 내리지도 않고 창문만 열고 거래하려고 해요"), + bm6("무리하게 가격을 깎아요"), + ; + + private String mannerContents; + + BadManner(String mannerContents) { + this.mannerContents = mannerContents; + } + + public String getMannerContents() { + return mannerContents; + } +} diff --git a/src/main/java/com/gaaji/auth/domain/Comment.java b/src/main/java/com/gaaji/auth/domain/Comment.java new file mode 100644 index 0000000..8cc5c20 --- /dev/null +++ b/src/main/java/com/gaaji/auth/domain/Comment.java @@ -0,0 +1,35 @@ +package com.gaaji.auth.domain; + +import java.time.LocalDateTime; + +import javax.persistence.Embeddable; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Embeddable +@Getter +public class Comment { + + private String pictureUrl; + private String contents; + private String town; + private boolean ispurchaser; + private LocalDateTime createdAt; + + public Comment(String pictureUrl, String contents, String town, boolean ispurchaser) { + this.pictureUrl = pictureUrl; + this.contents = contents; + this.ispurchaser = ispurchaser; + this.town = town; + this.createdAt = LocalDateTime.now(); + } + + public static Comment of(String pictureUrl, String contents, String town, boolean ispurchaser) { + return new Comment(pictureUrl, contents, town, ispurchaser); + + } + +} diff --git a/src/main/java/com/gaaji/auth/domain/GoodManner.java b/src/main/java/com/gaaji/auth/domain/GoodManner.java new file mode 100644 index 0000000..83f38f7 --- /dev/null +++ b/src/main/java/com/gaaji/auth/domain/GoodManner.java @@ -0,0 +1,26 @@ +package com.gaaji.auth.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; + +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum GoodManner { + gm1("무료로 나눠주셨어요"), + gm2("상품상태가 설명한 것과 같아요"), + gm3("상품설명이 자세해요"), + gm4("좋은 상품을 저렴하게 판매해요"), + gm5("시간 약속을 잘 지켜요"), + gm6("응답이 빨라요"), + gm7("친절하고 매너가 좋아요"), + ; + + private String mannerContents; + + GoodManner(String mannerContents) { + this.mannerContents = mannerContents; + } + + public String getMannerContents() { + return mannerContents; + } + +} diff --git a/src/main/java/com/gaaji/auth/domain/MannerTemparature.java b/src/main/java/com/gaaji/auth/domain/MannerTemparature.java deleted file mode 100644 index 24787f6..0000000 --- a/src/main/java/com/gaaji/auth/domain/MannerTemparature.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.gaaji.auth.domain; - -import javax.persistence.Embeddable; -import lombok.NoArgsConstructor; - -@Embeddable @NoArgsConstructor -public class MannerTemparature { - - private double temparature; - - private MannerTemparature(double temparature) { - this.temparature = temparature; - } - public static MannerTemparature of(double temparature){ - return new MannerTemparature(temparature); - } -} diff --git a/src/main/java/com/gaaji/auth/domain/MannerTemperature.java b/src/main/java/com/gaaji/auth/domain/MannerTemperature.java new file mode 100644 index 0000000..61ce5f4 --- /dev/null +++ b/src/main/java/com/gaaji/auth/domain/MannerTemperature.java @@ -0,0 +1,24 @@ +package com.gaaji.auth.domain; + +import javax.persistence.Access; +import javax.persistence.AccessType; +import javax.persistence.Embeddable; +import lombok.NoArgsConstructor; + +@Access(AccessType.FIELD) +@Embeddable @NoArgsConstructor +public class MannerTemperature { + + private double temperature; + + private MannerTemperature(double temperature) { + this.temperature = temperature; + } + public static MannerTemperature of(double temperature){ + return new MannerTemperature(temperature); + } + + public double getTemperature() { + return temperature; + } +} diff --git a/src/main/java/com/gaaji/auth/domain/PostId.java b/src/main/java/com/gaaji/auth/domain/PostId.java new file mode 100644 index 0000000..3af0d58 --- /dev/null +++ b/src/main/java/com/gaaji/auth/domain/PostId.java @@ -0,0 +1,49 @@ +package com.gaaji.auth.domain; + +import java.util.Objects; + +import javax.persistence.Embeddable; + +import org.springframework.util.StringUtils; + +import com.gaaji.auth.exception.InputNullDataOnPostIdException; +import com.gaaji.auth.exception.InputNullDataOnReviewIdException; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Embeddable +public class PostId { + + private String id; + + public static PostId of(String id) { + if(!StringUtils.hasText(id)) throw new InputNullDataOnPostIdException(); + return new PostId(id); + } + + public String getId() { + return id; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + PostId postId = (PostId) o; + return Objects.equals(id, postId.getId()); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + +} diff --git a/src/main/java/com/gaaji/auth/domain/Review.java b/src/main/java/com/gaaji/auth/domain/Review.java new file mode 100644 index 0000000..fba9137 --- /dev/null +++ b/src/main/java/com/gaaji/auth/domain/Review.java @@ -0,0 +1,71 @@ +package com.gaaji.auth.domain; + +import java.util.List; + +import javax.persistence.AttributeOverride; +import javax.persistence.CascadeType; +import javax.persistence.CollectionTable; +import javax.persistence.Column; +import javax.persistence.ElementCollection; +import javax.persistence.Embedded; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; + +import com.gaaji.auth.controller.dto.ReviewUpdateRequest; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +@Getter +public class Review { + + @EmbeddedId + private ReviewId reviewId; + + @Embedded + @AttributeOverride(name = "id", column = @Column(name = "post_Id")) + private PostId postId; + + @Embedded + @AttributeOverride(name = "id", column = @Column(name = "sender_Id")) + private AuthId senderId; + + @Embedded + @AttributeOverride(name = "id", column = @Column(name = "receiver_Id")) + private AuthId receiverId; + + @ElementCollection + @CollectionTable(name = "goodManners", + joinColumns = @JoinColumn(name = "reviewId")) + private List goodManners; + + @ElementCollection + @CollectionTable(name = "badManners", + joinColumns = @JoinColumn(name = "reviewId")) + private List badManners; + + @Embedded + private Comment comment; + + public static Review of(ReviewId reviewId, PostId postId, AuthId senderId, AuthId receiverId, List goodManners, List badManners, Comment comment) { + return new Review(reviewId, postId, senderId, receiverId, goodManners, badManners, comment); + } + + public void modify(String pictureUrl, List goodManners, List badManners, String contents) { + this.goodManners = goodManners; + this.badManners = badManners; + this.comment = Comment.of(pictureUrl, contents, this.comment.getTown(), this.comment.isIspurchaser()); + } + + + + +} diff --git a/src/main/java/com/gaaji/auth/domain/ReviewId.java b/src/main/java/com/gaaji/auth/domain/ReviewId.java new file mode 100644 index 0000000..aed7d44 --- /dev/null +++ b/src/main/java/com/gaaji/auth/domain/ReviewId.java @@ -0,0 +1,46 @@ +package com.gaaji.auth.domain; + +import java.io.Serializable; +import java.util.Objects; + +import javax.persistence.Embeddable; + +import org.springframework.util.StringUtils; + +import com.gaaji.auth.exception.InputNullDataOnReviewIdException; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Embeddable +public class ReviewId implements Serializable { + + private String id; + + public static ReviewId of(String id) { + if(!StringUtils.hasText(id)) throw new InputNullDataOnReviewIdException(); + return new ReviewId(id); + } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + ReviewId that = (ReviewId) o; + return Objects.equals(id, that.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + public String getId() { + return id; + } + +} diff --git a/src/main/java/com/gaaji/auth/event/Event.java b/src/main/java/com/gaaji/auth/event/Event.java new file mode 100644 index 0000000..4cfd462 --- /dev/null +++ b/src/main/java/com/gaaji/auth/event/Event.java @@ -0,0 +1,5 @@ +package com.gaaji.auth.event; + +public class Event { + +} diff --git a/src/main/java/com/gaaji/auth/event/EventConfig.java b/src/main/java/com/gaaji/auth/event/EventConfig.java new file mode 100644 index 0000000..01a24f7 --- /dev/null +++ b/src/main/java/com/gaaji/auth/event/EventConfig.java @@ -0,0 +1,26 @@ +package com.gaaji.auth.event; + + +import com.netflix.discovery.converters.Auto; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class EventConfig { + + + @Autowired + ApplicationContext applicationContext; + + + @Bean + public InitializingBean initializingBean(){ + return () -> Events.setApplicationEventPublisher(applicationContext); + + } + +} diff --git a/src/main/java/com/gaaji/auth/event/Events.java b/src/main/java/com/gaaji/auth/event/Events.java new file mode 100644 index 0000000..1fdfb36 --- /dev/null +++ b/src/main/java/com/gaaji/auth/event/Events.java @@ -0,0 +1,18 @@ +package com.gaaji.auth.event; + +import org.springframework.context.ApplicationEventPublisher; + +public class Events { + + private static ApplicationEventPublisher applicationEventPublisher; + + static void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) { + Events.applicationEventPublisher = applicationEventPublisher; + } + + public static void raise(Event event){ + if(applicationEventPublisher != null) + applicationEventPublisher.publishEvent(event); + } + +} diff --git a/src/main/java/com/gaaji/auth/event/NicknameChangedEvent.java b/src/main/java/com/gaaji/auth/event/NicknameChangedEvent.java new file mode 100644 index 0000000..66d7a39 --- /dev/null +++ b/src/main/java/com/gaaji/auth/event/NicknameChangedEvent.java @@ -0,0 +1,15 @@ +package com.gaaji.auth.event; + +import lombok.Data; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + + +@Getter +@RequiredArgsConstructor +public class NicknameChangedEvent extends Event{ + + private final String userId; + private final String nickname; + +} diff --git a/src/main/java/com/gaaji/auth/event/NicknameChangedEventHandler.java b/src/main/java/com/gaaji/auth/event/NicknameChangedEventHandler.java new file mode 100644 index 0000000..8843b61 --- /dev/null +++ b/src/main/java/com/gaaji/auth/event/NicknameChangedEventHandler.java @@ -0,0 +1,18 @@ +package com.gaaji.auth.event; + +import com.gaaji.auth.adaptor.KafkaProducer; +import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Transactional +@Service +public class NicknameChangedEventHandler { + private final KafkaProducer kafkaProducer; + @EventListener + public void handleNicknameChangedEvent(NicknameChangedEvent event) { + kafkaProducer.publishNicknameChangedEvent(event); + } +} diff --git a/src/main/java/com/gaaji/auth/exception/AuthErrorCode.java b/src/main/java/com/gaaji/auth/exception/AuthErrorCode.java index 8abc46c..d7109fd 100644 --- a/src/main/java/com/gaaji/auth/exception/AuthErrorCode.java +++ b/src/main/java/com/gaaji/auth/exception/AuthErrorCode.java @@ -10,7 +10,15 @@ public enum AuthErrorCode implements ErrorCode{ AUTH_ID_NOT_FOUND(HttpStatus.UNAUTHORIZED,"A-0001", "등록되지 않은 계정입니다."), // v - + Input_Null_Data_On_Review_Id(HttpStatus.INTERNAL_SERVER_ERROR, "r-0001","후기 생성 과정에서 ReviewId에 Null이 입력되었습니다."), + Input_Null_Data_On_Post_Id(HttpStatus.INTERNAL_SERVER_ERROR, "r-0002","후기 생성 과정에서 PostId에 Null이 입력되었습니다."), + No_match_Id(HttpStatus.BAD_REQUEST, "r-0003","후기 등록자의 Id와 일치하는 판매자 또는 구매자의 Id가 없습니다."), + Nonexistent_Target(HttpStatus.BAD_REQUEST, "r-0004","판매자 또는 구매자의 Id가 없습니다."), + No_Review(HttpStatus.BAD_REQUEST, "r-0005","후기가 없습니다."), + Equals_Seller_And_Purchaser(HttpStatus.BAD_REQUEST, "r-0006","판매자와 구매자가 동일합니다."), + No_Search_Review(HttpStatus.BAD_REQUEST, "r-0007","해당 후기를 찾지 못했습니다."), + No_Match_Sender(HttpStatus.BAD_REQUEST, "r-0008","해당 후기 작성자와 정보가 맞지 않습니다."), + No_Town(HttpStatus.BAD_REQUEST, "r-0009","해당 지역을 알 수 없습니다."), ; private final HttpStatus httpStatus; diff --git a/src/main/java/com/gaaji/auth/exception/EqualsSellerAndPurchaserException.java b/src/main/java/com/gaaji/auth/exception/EqualsSellerAndPurchaserException.java new file mode 100644 index 0000000..9713db8 --- /dev/null +++ b/src/main/java/com/gaaji/auth/exception/EqualsSellerAndPurchaserException.java @@ -0,0 +1,10 @@ +package com.gaaji.auth.exception; + +import static com.gaaji.auth.exception.AuthErrorCode.Equals_Seller_And_Purchaser; + +public class EqualsSellerAndPurchaserException extends AbstractApiException{ + + public EqualsSellerAndPurchaserException() { + super(Equals_Seller_And_Purchaser); + } +} diff --git a/src/main/java/com/gaaji/auth/exception/InputNullDataOnPostIdException.java b/src/main/java/com/gaaji/auth/exception/InputNullDataOnPostIdException.java new file mode 100644 index 0000000..421688a --- /dev/null +++ b/src/main/java/com/gaaji/auth/exception/InputNullDataOnPostIdException.java @@ -0,0 +1,11 @@ +package com.gaaji.auth.exception; + +import static com.gaaji.auth.exception.AuthErrorCode.Input_Null_Data_On_Post_Id; + +public class InputNullDataOnPostIdException extends AbstractApiException { + + public InputNullDataOnPostIdException() { + super(Input_Null_Data_On_Post_Id); + } + +} \ No newline at end of file diff --git a/src/main/java/com/gaaji/auth/exception/InputNullDataOnReviewIdException.java b/src/main/java/com/gaaji/auth/exception/InputNullDataOnReviewIdException.java new file mode 100644 index 0000000..aeb36be --- /dev/null +++ b/src/main/java/com/gaaji/auth/exception/InputNullDataOnReviewIdException.java @@ -0,0 +1,11 @@ +package com.gaaji.auth.exception; + +import static com.gaaji.auth.exception.AuthErrorCode.Input_Null_Data_On_Review_Id; + +public class InputNullDataOnReviewIdException extends AbstractApiException { + + public InputNullDataOnReviewIdException() { + super(Input_Null_Data_On_Review_Id); + } + +} diff --git a/src/main/java/com/gaaji/auth/exception/NoMatchIdException.java b/src/main/java/com/gaaji/auth/exception/NoMatchIdException.java new file mode 100644 index 0000000..ca4af9f --- /dev/null +++ b/src/main/java/com/gaaji/auth/exception/NoMatchIdException.java @@ -0,0 +1,11 @@ +package com.gaaji.auth.exception; + +import static com.gaaji.auth.exception.AuthErrorCode.No_match_Id; + +public class NoMatchIdException extends AbstractApiException { + + public NoMatchIdException() { + super(No_match_Id); + } + +} diff --git a/src/main/java/com/gaaji/auth/exception/NoMatchSenderException.java b/src/main/java/com/gaaji/auth/exception/NoMatchSenderException.java new file mode 100644 index 0000000..2b24ba4 --- /dev/null +++ b/src/main/java/com/gaaji/auth/exception/NoMatchSenderException.java @@ -0,0 +1,11 @@ +package com.gaaji.auth.exception; + +import static com.gaaji.auth.exception.AuthErrorCode.No_Match_Sender; + +public class NoMatchSenderException extends AbstractApiException { + + public NoMatchSenderException() { + super(No_Match_Sender); + } + +} \ No newline at end of file diff --git a/src/main/java/com/gaaji/auth/exception/NoReviewException.java b/src/main/java/com/gaaji/auth/exception/NoReviewException.java new file mode 100644 index 0000000..7ccce1e --- /dev/null +++ b/src/main/java/com/gaaji/auth/exception/NoReviewException.java @@ -0,0 +1,11 @@ +package com.gaaji.auth.exception; + +import static com.gaaji.auth.exception.AuthErrorCode.No_Review; + +public class NoReviewException extends AbstractApiException { + + public NoReviewException() { + super(No_Review); + } + +} \ No newline at end of file diff --git a/src/main/java/com/gaaji/auth/exception/NoSearchReviewException.java b/src/main/java/com/gaaji/auth/exception/NoSearchReviewException.java new file mode 100644 index 0000000..9e43968 --- /dev/null +++ b/src/main/java/com/gaaji/auth/exception/NoSearchReviewException.java @@ -0,0 +1,11 @@ +package com.gaaji.auth.exception; + +import static com.gaaji.auth.exception.AuthErrorCode.No_Search_Review; + +public class NoSearchReviewException extends AbstractApiException { + + public NoSearchReviewException() { + super(No_Search_Review); + } + +} \ No newline at end of file diff --git a/src/main/java/com/gaaji/auth/exception/NoTownException.java b/src/main/java/com/gaaji/auth/exception/NoTownException.java new file mode 100644 index 0000000..faa2f5f --- /dev/null +++ b/src/main/java/com/gaaji/auth/exception/NoTownException.java @@ -0,0 +1,11 @@ +package com.gaaji.auth.exception; + +import static com.gaaji.auth.exception.AuthErrorCode.No_Town; + +public class NoTownException extends AbstractApiException { + + public NoTownException() { + super(No_Town); + } + +} \ No newline at end of file diff --git a/src/main/java/com/gaaji/auth/exception/NonexistentTargetException.java b/src/main/java/com/gaaji/auth/exception/NonexistentTargetException.java new file mode 100644 index 0000000..c64e6c6 --- /dev/null +++ b/src/main/java/com/gaaji/auth/exception/NonexistentTargetException.java @@ -0,0 +1,11 @@ +package com.gaaji.auth.exception; + +import static com.gaaji.auth.exception.AuthErrorCode.Nonexistent_Target; + +public class NonexistentTargetException extends AbstractApiException { + + public NonexistentTargetException() { + super(Nonexistent_Target); + } + +} \ No newline at end of file diff --git a/src/main/java/com/gaaji/auth/exception/Sample.java b/src/main/java/com/gaaji/auth/exception/Sample.java deleted file mode 100644 index 99a8675..0000000 --- a/src/main/java/com/gaaji/auth/exception/Sample.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.gaaji.auth.exception; - -public class Sample { - -} diff --git a/src/main/java/com/gaaji/auth/oauth/CustomOAuth2UserServiceImpl.java b/src/main/java/com/gaaji/auth/oauth/CustomOAuth2UserServiceImpl.java index fdb5037..218b2b7 100644 --- a/src/main/java/com/gaaji/auth/oauth/CustomOAuth2UserServiceImpl.java +++ b/src/main/java/com/gaaji/auth/oauth/CustomOAuth2UserServiceImpl.java @@ -106,7 +106,7 @@ public TokenResponse naverLogin(String code, String state) { HashMap body = restTemplate.getForEntity(url, HashMap.class).getBody(); String responseCode = "response"; String email = getEmailFromServiceProvider(body.get("access_token"), last, responseCode); - Auth auth = saveOrFind(PlatformType.KAKAO, email); + Auth auth = saveOrFind(PlatformType.NAVER, email); return tokenService.createTokens(auth.getAuthIdForToken()); } diff --git a/src/main/java/com/gaaji/auth/repository/JpaReviewRepository.java b/src/main/java/com/gaaji/auth/repository/JpaReviewRepository.java new file mode 100644 index 0000000..9e2c479 --- /dev/null +++ b/src/main/java/com/gaaji/auth/repository/JpaReviewRepository.java @@ -0,0 +1,31 @@ +package com.gaaji.auth.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import com.gaaji.auth.controller.dto.GoodMannerCount; +import com.gaaji.auth.domain.AuthId; +import com.gaaji.auth.domain.GoodManner; +import com.gaaji.auth.domain.PostId; +import com.gaaji.auth.domain.Review; +import com.gaaji.auth.domain.ReviewId; + +public interface JpaReviewRepository extends JpaRepository{ + + Optional findByPostIdAndSenderId(PostId postId, AuthId senderId); + + List findByReceiverIdAndComment_ContentsIsNotNullOrderByComment_CreatedAtDesc(AuthId receiverId); + + List findByReceiverId(String receiverId); + + List findDistinctByReceiverIdAndGoodMannersNotNull(AuthId receiverId); + + List findDistinctByReceiverIdAndBadMannersNotNull(AuthId receiverId); + + List findTop3ByReceiverIdAndComment_ContentsIsNotNullOrderByComment_CreatedAtDesc(AuthId receiverId); + +} diff --git a/src/main/java/com/gaaji/auth/repository/ReviewRepository.java b/src/main/java/com/gaaji/auth/repository/ReviewRepository.java new file mode 100644 index 0000000..2981882 --- /dev/null +++ b/src/main/java/com/gaaji/auth/repository/ReviewRepository.java @@ -0,0 +1,36 @@ +package com.gaaji.auth.repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import com.gaaji.auth.controller.dto.GoodMannerCount; +import com.gaaji.auth.domain.AuthId; +import com.gaaji.auth.domain.GoodManner; +import com.gaaji.auth.domain.PostId; +import com.gaaji.auth.domain.Review; +import com.gaaji.auth.domain.ReviewId; + +public interface ReviewRepository { + + default String nextId(){ + return UUID.randomUUID().toString(); + } + + void save(Review review); + + Optional findById(ReviewId of); + + Optional findByPostIdAndSenderId(PostId postId, AuthId senderId); + + List findByReceiverIdAndComment_ContentsIsNotNullOrderByComment_CreatedAtDesc(AuthId receiverId); + + List findByReceiverId(String receiverId); + + List findDistinctByReceiverIdAndGoodMannersNotNull(AuthId receiverId); + + List findDistinctByReceiverIdAndBadMannersNotNull(AuthId receiverId); + + List findTop3ByReceiverIdAndComment_ContentsIsNotNullOrderByComment_CreatedAtDesc(AuthId receiverId); + +} diff --git a/src/main/java/com/gaaji/auth/repository/ReviewRepositoryImpl.java b/src/main/java/com/gaaji/auth/repository/ReviewRepositoryImpl.java new file mode 100644 index 0000000..4bc8094 --- /dev/null +++ b/src/main/java/com/gaaji/auth/repository/ReviewRepositoryImpl.java @@ -0,0 +1,66 @@ +package com.gaaji.auth.repository; + +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Repository; + +import com.gaaji.auth.controller.dto.GoodMannerCount; +import com.gaaji.auth.domain.AuthId; +import com.gaaji.auth.domain.GoodManner; +import com.gaaji.auth.domain.PostId; +import com.gaaji.auth.domain.Review; +import com.gaaji.auth.domain.ReviewId; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Repository +public class ReviewRepositoryImpl implements ReviewRepository { + + private final JpaReviewRepository jpaReviewRepository; + + @Override + public void save(Review review) { + this.jpaReviewRepository.save(review); + } + + @Override + public Optional findById(ReviewId reviewId) { + return this.jpaReviewRepository.findById(reviewId); + } + + @Override + public Optional findByPostIdAndSenderId(PostId postId, AuthId senderId) { + return this.jpaReviewRepository.findByPostIdAndSenderId(postId, senderId); + } + + @Override + public List findByReceiverIdAndComment_ContentsIsNotNullOrderByComment_CreatedAtDesc(AuthId receiverId) { + return this.jpaReviewRepository.findByReceiverIdAndComment_ContentsIsNotNullOrderByComment_CreatedAtDesc(receiverId); + } + + @Override + public List findByReceiverId(String receiverId) { + return this.jpaReviewRepository.findByReceiverId(receiverId); + } + + @Override + public List findDistinctByReceiverIdAndGoodMannersNotNull(AuthId receiverId) { + return this.jpaReviewRepository.findDistinctByReceiverIdAndGoodMannersNotNull(receiverId); + } + + @Override + public List findDistinctByReceiverIdAndBadMannersNotNull(AuthId receiverId) { + return this.jpaReviewRepository.findDistinctByReceiverIdAndBadMannersNotNull(receiverId); + } + + @Override + public List findTop3ByReceiverIdAndComment_ContentsIsNotNullOrderByComment_CreatedAtDesc( + AuthId receiverId) { + return this.jpaReviewRepository.findTop3ByReceiverIdAndComment_ContentsIsNotNullOrderByComment_CreatedAtDesc(receiverId); + } + + + +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml deleted file mode 100644 index c051d61..0000000 --- a/src/main/resources/application-dev.yml +++ /dev/null @@ -1,24 +0,0 @@ -spring: - config: - activate: - on-profile: "dev" - h2: - console: - enabled: true - settings: - web-allow-others: true - jpa: - hibernate: - ddl-auto: create-drop - show-sql: true - generate-ddl: true - defer-datasource-initialization: true - redis: - host: localhost - password: - port: 6379 - pool: - max-idle: 8 - min-idle: 0 - max-active: 8 - max-wait: -1 \ No newline at end of file diff --git a/src/main/resources/application-docker.yml b/src/main/resources/application-docker.yml new file mode 100644 index 0000000..3237a09 --- /dev/null +++ b/src/main/resources/application-docker.yml @@ -0,0 +1,11 @@ +spring: + config: + activate: + on-profile: "docker" + +eureka: + client: + fetch-registry: true + register-with-eureka: true + service-url: + defaultZone : http://eureka:8761/eureka \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml new file mode 100644 index 0000000..60d98b9 --- /dev/null +++ b/src/main/resources/application-local.yml @@ -0,0 +1,10 @@ +eureka: + client: + fetch-registry: true + register-with-eureka: true + service-url: + defaultZone : http://localhost:8761/eureka +spring: + config: + activate: + on-profile: local \ No newline at end of file diff --git a/src/main/resources/application-single.yml b/src/main/resources/application-single.yml new file mode 100644 index 0000000..f9875d5 --- /dev/null +++ b/src/main/resources/application-single.yml @@ -0,0 +1,10 @@ +eureka: + client: + fetch-registry: false + register-with-eureka: false + service-url: + defaultZone : http://localhost:8761/eureka +spring: + config: + activate: + on-profile: single diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 452fe13..4306e92 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -2,6 +2,25 @@ spring: profiles: group: "default": - - "dev" - - "oauth" - + - "single" + "single": + - "single" + - "redis-local" + "local": + - "local" + "docker": + - "docker" + "prod" : + application: + name: auth-service + config: + import: + - secret.yml + - oauth.yml + - kafka.yml + - redis.yml + h2: + console: + enabled: true + settings: + web-allow-others: true \ No newline at end of file diff --git a/src/main/resources/redis.yml b/src/main/resources/redis.yml new file mode 100644 index 0000000..51ec466 --- /dev/null +++ b/src/main/resources/redis.yml @@ -0,0 +1,28 @@ +spring: + config: + activate: + on-profile: "redis-docker" + redis: + host: redis + password: + port: 6379 + pool: + max-idle: 8 + min-idle: 0 + max-active: 8 + max-wait: -1 + +--- +spring: + config: + activate: + on-profile: "redis-local" + redis: + host: localhost + password: + port: 6379 + pool: + max-idle: 8 + min-idle: 0 + max-active: 8 + max-wait: -1 \ No newline at end of file diff --git a/src/test/java/com/gaaji/auth/repository/ReviewCreateJpaTest.java b/src/test/java/com/gaaji/auth/repository/ReviewCreateJpaTest.java new file mode 100644 index 0000000..dd86a71 --- /dev/null +++ b/src/test/java/com/gaaji/auth/repository/ReviewCreateJpaTest.java @@ -0,0 +1,58 @@ +package com.gaaji.auth.repository; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import com.gaaji.auth.domain.AuthId; +import com.gaaji.auth.domain.BadManner; +import com.gaaji.auth.domain.Comment; +import com.gaaji.auth.domain.GoodManner; +import com.gaaji.auth.domain.PostId; +import com.gaaji.auth.domain.Review; +import com.gaaji.auth.domain.ReviewId; + +@DataJpaTest +public class ReviewCreateJpaTest { + + @Autowired + JpaReviewRepository jpaReviewRepository; + + @AfterEach + void afterEach() { + this.jpaReviewRepository.deleteAll(); + } + + @Test + void 추가테스트() { + List good = new ArrayList(); + good.add(GoodManner.gm1); + List bad = new ArrayList(); + bad.add(BadManner.bm2); + Review review = Review.of(ReviewId.of("review"), PostId.of("post"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", "내용", "남가좌동", true)); + + this.jpaReviewRepository.save(review); + + Review newReview = this.jpaReviewRepository.findById(ReviewId.of("review")).orElseThrow(null); + assertThat(newReview.getReviewId().getId()).isEqualTo("review"); + assertThat(newReview.getPostId().getId()).isEqualTo("post"); + + assertThat(newReview.getSenderId().getId()).isEqualTo("sender"); + assertThat(newReview.getReceiverId().getId()).isEqualTo("receiver"); + assertThat(newReview.getGoodManners().get(0)).isEqualTo(GoodManner.gm1); + assertThat(newReview.getBadManners().get(0)).isEqualTo(BadManner.bm2); + + assertThat(newReview.getComment().getPictureUrl()).isEqualTo("사진"); + assertThat(newReview.getComment().getContents()).isEqualTo("내용"); + assertThat(newReview.getComment().getTown()).isEqualTo("남가좌동"); + assertThat(newReview.getComment().isIspurchaser()).isEqualTo(true); + + } +} diff --git a/src/test/java/com/gaaji/auth/repository/ReviewRetriveJpaTest.java b/src/test/java/com/gaaji/auth/repository/ReviewRetriveJpaTest.java new file mode 100644 index 0000000..672f0d7 --- /dev/null +++ b/src/test/java/com/gaaji/auth/repository/ReviewRetriveJpaTest.java @@ -0,0 +1,150 @@ +package com.gaaji.auth.repository; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; + +import com.gaaji.auth.domain.AuthId; +import com.gaaji.auth.domain.BadManner; +import com.gaaji.auth.domain.Comment; +import com.gaaji.auth.domain.GoodManner; +import com.gaaji.auth.domain.PostId; +import com.gaaji.auth.domain.Review; +import com.gaaji.auth.domain.ReviewId; +import com.gaaji.auth.exception.NoSearchReviewException; + +@DataJpaTest +public class ReviewRetriveJpaTest { + + @Autowired + JpaReviewRepository jpaReviewRepository; + + @AfterEach + void afterEach() { + this.jpaReviewRepository.deleteAll(); + } + + @Test + void 내조회테스트() { + List good = new ArrayList(); + good.add(GoodManner.gm1); + List bad = new ArrayList(); + bad.add(BadManner.bm2); + Review review = Review.of(ReviewId.of("review"), PostId.of("post"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", "내용", "남가좌동", true)); + + this.jpaReviewRepository.save(review); + + Review newReview = this.jpaReviewRepository.findByPostIdAndSenderId(PostId.of("post"), AuthId.of("sender")).orElseThrow(NoSearchReviewException::new); + assertThat(newReview.getReviewId().getId()).isEqualTo("review"); + assertThat(newReview.getPostId().getId()).isEqualTo("post"); + + assertThat(newReview.getSenderId().getId()).isEqualTo("sender"); + assertThat(newReview.getReceiverId().getId()).isEqualTo("receiver"); + assertThat(newReview.getGoodManners().get(0)).isEqualTo(GoodManner.gm1); + assertThat(newReview.getBadManners().get(0)).isEqualTo(BadManner.bm2); + + assertThat(newReview.getComment().getPictureUrl()).isEqualTo("사진"); + assertThat(newReview.getComment().getContents()).isEqualTo("내용"); + assertThat(newReview.getComment().getTown()).isEqualTo("남가좌동"); + assertThat(newReview.getComment().isIspurchaser()).isEqualTo(true); + + } + + @Test + void 후기조회테스트() { + List good = new ArrayList(); + good.add(GoodManner.gm1); + List bad = new ArrayList(); + bad.add(BadManner.bm2); + Review review = Review.of(ReviewId.of("review"), PostId.of("post"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", "내용", "남가좌동", true)); + Review review1 = Review.of(ReviewId.of("review1"), PostId.of("post1"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", null, "남가좌동", true)); + + this.jpaReviewRepository.save(review); + this.jpaReviewRepository.save(review1); + + List reviewList = this.jpaReviewRepository.findByReceiverIdAndComment_ContentsIsNotNullOrderByComment_CreatedAtDesc(AuthId.of("receiver")); + + assertThat(reviewList.size()).isEqualTo(1); + Review newReview = reviewList.get(0); + assertThat(newReview.getReviewId().getId()).isEqualTo("review"); + assertThat(newReview.getPostId().getId()).isEqualTo("post"); + + assertThat(newReview.getSenderId().getId()).isEqualTo("sender"); + assertThat(newReview.getReceiverId().getId()).isEqualTo("receiver"); + assertThat(newReview.getGoodManners().get(0)).isEqualTo(GoodManner.gm1); + assertThat(newReview.getBadManners().get(0)).isEqualTo(BadManner.bm2); + + assertThat(newReview.getComment().getPictureUrl()).isEqualTo("사진"); + assertThat(newReview.getComment().getContents()).isEqualTo("내용"); + assertThat(newReview.getComment().getTown()).isEqualTo("남가좌동"); + assertThat(newReview.getComment().isIspurchaser()).isEqualTo(true); + + } + + @Test + void 매너조회테스트() { + List good = new ArrayList(); + good.add(GoodManner.gm1); + List bad = new ArrayList(); + bad.add(BadManner.bm2); + + List notGood = new ArrayList(); + List notBad = new ArrayList(); + Review review = Review.of(ReviewId.of("review"), PostId.of("post"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", "내용", "남가좌동", true)); + Review review1 = Review.of(ReviewId.of("review1"), PostId.of("post1"), AuthId.of("sender"), AuthId.of("receiver"), notGood, notBad, Comment.of("사진", null, "남가좌동", true)); + + this.jpaReviewRepository.save(review); + this.jpaReviewRepository.save(review1); + + List reviewList = this.jpaReviewRepository.findDistinctByReceiverIdAndGoodMannersNotNull(AuthId.of("receiver")); + + assertThat(reviewList.size()).isEqualTo(1); + Review newReview = reviewList.get(0); + assertThat(newReview.getReviewId().getId()).isEqualTo("review"); + assertThat(newReview.getPostId().getId()).isEqualTo("post"); + + assertThat(newReview.getSenderId().getId()).isEqualTo("sender"); + assertThat(newReview.getReceiverId().getId()).isEqualTo("receiver"); + assertThat(newReview.getGoodManners().get(0)).isEqualTo(GoodManner.gm1); + assertThat(newReview.getBadManners().get(0)).isEqualTo(BadManner.bm2); + + assertThat(newReview.getComment().getPictureUrl()).isEqualTo("사진"); + assertThat(newReview.getComment().getContents()).isEqualTo("내용"); + assertThat(newReview.getComment().getTown()).isEqualTo("남가좌동"); + assertThat(newReview.getComment().isIspurchaser()).isEqualTo(true); + + + } + + @Test + void 후기3개조회테스트() { + List good = new ArrayList(); + good.add(GoodManner.gm1); + List bad = new ArrayList(); + bad.add(BadManner.bm2); + Review review1 = Review.of(ReviewId.of("review"), PostId.of("post"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", "내용", "남가좌동", true)); + + Review review2 = Review.of(ReviewId.of("review1"), PostId.of("post2"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진1", "내용2", "남가좌동", true)); + Review review3 = Review.of(ReviewId.of("review2"), PostId.of("post3"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진2", "내용3", "남가좌동", true)); + + Review review = Review.of(ReviewId.of("review3"), PostId.of("post1"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진3", "내용1", "남가좌동", true)); + + this.jpaReviewRepository.save(review); + this.jpaReviewRepository.save(review1); + this.jpaReviewRepository.save(review2); + this.jpaReviewRepository.save(review3); + + List reviewList = this.jpaReviewRepository.findTop3ByReceiverIdAndComment_ContentsIsNotNullOrderByComment_CreatedAtDesc(AuthId.of("receiver")); + + assertThat(reviewList.size()).isEqualTo(3); + + } + +} diff --git a/src/test/java/com/gaaji/auth/service/MannerRetriveServiceTest.java b/src/test/java/com/gaaji/auth/service/MannerRetriveServiceTest.java new file mode 100644 index 0000000..a2a4c55 --- /dev/null +++ b/src/test/java/com/gaaji/auth/service/MannerRetriveServiceTest.java @@ -0,0 +1,40 @@ +package com.gaaji.auth.service; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + +import org.junit.jupiter.api.Test; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; + +import com.gaaji.auth.applicationservice.MannerRetriveService; +import com.gaaji.auth.applicationservice.MannerRetriveServiceImpl; +import com.gaaji.auth.domain.BadManner; +import com.gaaji.auth.domain.GoodManner; + +public class MannerRetriveServiceTest { + + @Test + void 매너리스트테스트() { + MannerRetriveService mannerRetriveService = new MannerRetriveServiceImpl(); + + //good + List goodMannerList = mannerRetriveService.retriveGoodMannerList(); + int i= 1; + for(GoodManner goodManner: goodMannerList) { + assertThat(goodManner.name()).isEqualTo("gm"+i); + assertThat(goodManner.getMannerContents()).isEqualTo(GoodManner.valueOf("gm"+i).getMannerContents()); + i++; + } + //bad + + List badMannerList = mannerRetriveService.retriveBadMannerList(); + i= 1; + for(BadManner badManner: badMannerList) { + assertThat(badManner.name()).isEqualTo("bm"+i); + assertThat(badManner.getMannerContents()).isEqualTo(BadManner.valueOf("bm"+i).getMannerContents()); + i++; + } + } +} diff --git a/src/test/java/com/gaaji/auth/service/ReviewCreateServiceTest.java b/src/test/java/com/gaaji/auth/service/ReviewCreateServiceTest.java new file mode 100644 index 0000000..ba1da4b --- /dev/null +++ b/src/test/java/com/gaaji/auth/service/ReviewCreateServiceTest.java @@ -0,0 +1,131 @@ +package com.gaaji.auth.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import com.gaaji.auth.applicationservice.ReviewCreateService; +import com.gaaji.auth.controller.dto.ReviewCreateRequest; +import com.gaaji.auth.domain.AuthId; +import com.gaaji.auth.domain.BadManner; +import com.gaaji.auth.domain.Comment; +import com.gaaji.auth.domain.GoodManner; +import com.gaaji.auth.domain.PostId; +import com.gaaji.auth.domain.Review; +import com.gaaji.auth.domain.ReviewId; +import com.gaaji.auth.exception.EqualsSellerAndPurchaserException; +import com.gaaji.auth.exception.NoMatchIdException; +import com.gaaji.auth.exception.NoReviewException; +import com.gaaji.auth.exception.NoSearchReviewException; +import com.gaaji.auth.exception.NoTownException; +import com.gaaji.auth.exception.NonexistentTargetException; +import com.gaaji.auth.repository.JpaReviewRepository; + +@Transactional +@SpringBootTest +public class ReviewCreateServiceTest { + + @Autowired + ReviewCreateService reviewCreateService; + + @Autowired + JpaReviewRepository jpaReviewRepository; + + @AfterEach + void afterEach() { + this.jpaReviewRepository.deleteAll(); + } + + @Test + void 추가서비스 (){ + List no = new ArrayList(); + List good = new ArrayList(); + List bad = new ArrayList(); + good.add("gm1"); + good.add("gm5"); + bad.add("bm3"); + bad.add("bm4"); + + ReviewCreateRequest dto1 = new ReviewCreateRequest("post", "aaa", "purchaser", "남가좌동", no, no, "빨라요"); + ReviewCreateRequest dto2 = new ReviewCreateRequest("post1", "seller", "aaa", "남가좌동", good, bad, null); + + + reviewCreateService.createReview("aaa", null, dto1); + reviewCreateService.createReview("aaa", null, dto2); + + + + Review newReview = this.jpaReviewRepository.findByPostIdAndSenderId(PostId.of("post"), AuthId.of("aaa")).orElseThrow(NoSearchReviewException::new); + assertThat(newReview.getPostId().getId()).isEqualTo("post"); + + assertThat(newReview.getSenderId().getId()).isEqualTo("aaa"); + assertThat(newReview.getReceiverId().getId()).isEqualTo("purchaser"); + assertThat(newReview.getGoodManners()).isEqualTo(null); + assertThat(newReview.getBadManners()).isEqualTo(null); + + assertThat(newReview.getComment().getPictureUrl()).isEqualTo(null); + assertThat(newReview.getComment().getContents()).isEqualTo("빨라요"); + assertThat(newReview.getComment().getTown()).isEqualTo("남가좌동"); + assertThat(newReview.getComment().isIspurchaser()).isEqualTo(false); + + Review newReview1 = this.jpaReviewRepository.findByPostIdAndSenderId(PostId.of("post1"), AuthId.of("aaa")).orElseThrow(NoSearchReviewException::new); + assertThat(newReview1.getPostId().getId()).isEqualTo("post1"); + + assertThat(newReview1.getSenderId().getId()).isEqualTo("aaa"); + assertThat(newReview1.getReceiverId().getId()).isEqualTo("seller"); + assertThat(newReview1.getGoodManners().get(0)).isEqualTo(GoodManner.gm1); + assertThat(newReview1.getGoodManners().get(1)).isEqualTo(GoodManner.gm5); + assertThat(newReview1.getBadManners().get(0)).isEqualTo(BadManner.bm3); + assertThat(newReview1.getBadManners().get(1)).isEqualTo(BadManner.bm4); + assertThat(newReview1.getComment().getPictureUrl()).isEqualTo(null); + assertThat(newReview1.getComment().getContents()).isEqualTo(null); + assertThat(newReview.getComment().getTown()).isEqualTo("남가좌동"); + assertThat(newReview1.getComment().isIspurchaser()).isEqualTo(true); + } + + @Test + void 추가서비스에러케이스5타운이없는경우 (){ + List no = new ArrayList(); + ReviewCreateRequest dto = new ReviewCreateRequest("post", "purchaser", "purchaser", null, no, no, "123"); + assertThatThrownBy(()->reviewCreateService.createReview("aaa", null, dto)).isInstanceOf(NoTownException.class); + } + + @Test + void 추가서비스에러케이스4판매자와구매자가같은경우 (){ + List no = new ArrayList(); + ReviewCreateRequest dto = new ReviewCreateRequest("post", "purchaser", "purchaser", "남가좌동", no, no, "123"); + assertThatThrownBy(()->reviewCreateService.createReview("aaa", null, dto)).isInstanceOf(EqualsSellerAndPurchaserException.class); + } + + @Test + void 추가서비스에러케이스3후기작성자가구매자와판매자가아닌경우 (){ + List no = new ArrayList(); + ReviewCreateRequest dto = new ReviewCreateRequest("post", "seller", "purchaser", "남가좌동", no, no, "123"); + + assertThatThrownBy(()->reviewCreateService.createReview("aaa", null, dto)).isInstanceOf(NoMatchIdException.class); + } + + @Test + void 추가서비스에러케이스2후기가없는경우 (){ + List no = new ArrayList(); + ReviewCreateRequest dto = new ReviewCreateRequest("post", "aaa", "purchaser", "남가좌동", no, no, null); + + assertThatThrownBy(()->reviewCreateService.createReview("aaa", null, dto)).isInstanceOf(NoReviewException.class); + } + + @Test + void 추가서비스에러케이스1글과관련된아이디없는경우 (){ + List no = new ArrayList(); + ReviewCreateRequest dto = new ReviewCreateRequest("aaa", null, null, "남가좌동", no, no, "123"); + + assertThatThrownBy(()->reviewCreateService.createReview("aaa", null, dto)).isInstanceOf(NonexistentTargetException.class); + } +} diff --git a/src/test/java/com/gaaji/auth/service/ReviewRetriveServiceTest.java b/src/test/java/com/gaaji/auth/service/ReviewRetriveServiceTest.java new file mode 100644 index 0000000..e354a5a --- /dev/null +++ b/src/test/java/com/gaaji/auth/service/ReviewRetriveServiceTest.java @@ -0,0 +1,213 @@ +package com.gaaji.auth.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import com.gaaji.auth.applicationservice.ReviewRetriveService; +import com.gaaji.auth.applicationservice.ReviewUpdateService; +import com.gaaji.auth.controller.dto.BadMannerCount; +import com.gaaji.auth.controller.dto.CommentRetrieveResponse; +import com.gaaji.auth.controller.dto.GoodMannerCount; +import com.gaaji.auth.controller.dto.MannerRetrieveResponse; +import com.gaaji.auth.controller.dto.PreviewReviewRetrieveResponse; +import com.gaaji.auth.controller.dto.ReviewRetrieveResponse; +import com.gaaji.auth.controller.dto.ReviewUpdateRequest; +import com.gaaji.auth.domain.Auth; +import com.gaaji.auth.domain.AuthId; +import com.gaaji.auth.domain.BadManner; +import com.gaaji.auth.domain.Comment; +import com.gaaji.auth.domain.GoodManner; +import com.gaaji.auth.domain.PlatformType; +import com.gaaji.auth.domain.PostId; +import com.gaaji.auth.domain.Review; +import com.gaaji.auth.domain.ReviewId; +import com.gaaji.auth.exception.EqualsSellerAndPurchaserException; +import com.gaaji.auth.exception.NoMatchSenderException; +import com.gaaji.auth.exception.NoSearchReviewException; +import com.gaaji.auth.repository.JpaAuthRepository; +import com.gaaji.auth.repository.JpaReviewRepository; + +@Transactional +@SpringBootTest +public class ReviewRetriveServiceTest { + + @Autowired + ReviewRetriveService reviewRetriveService; + + @Autowired + JpaReviewRepository jpaReviewRepository; + + @Autowired + JpaAuthRepository jpaAuthRepository; + + @AfterEach + void afterEach() { + this.jpaReviewRepository.deleteAll(); + } + + @Test + void 내조회서비스 (){ + List good = new ArrayList(); + good.add(GoodManner.gm1); + List bad = new ArrayList(); + bad.add(BadManner.bm2); + Review review = Review.of(ReviewId.of("review"), PostId.of("post"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", "내용", "남가좌동", true)); + + this.jpaReviewRepository.save(review); + + ReviewRetrieveResponse newReview = this.reviewRetriveService.retriveMyReview("sender","post"); + + assertThat(newReview.getReviewId()).isEqualTo("review"); + + assertThat(newReview.getContents()).isEqualTo("내용"); + assertThat(newReview.getPictureUrl()).isEqualTo("사진"); + assertThat(newReview.getGoodManners().get(0)).isEqualTo(GoodManner.gm1); + assertThat(newReview.getBadManners().get(0)).isEqualTo(BadManner.bm2); + + } + + @Test + void 수정서비스예외1 (){ + + assertThatThrownBy(()->this.reviewRetriveService.retriveMyReview("sender", "nope")).isInstanceOf(NoSearchReviewException.class); + + } + + @Test + void 후기조회서비스 (){ + List good = new ArrayList(); + good.add(GoodManner.gm1); + List bad = new ArrayList(); + bad.add(BadManner.bm2); + Review review = Review.of(ReviewId.of("review"), PostId.of("post"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", "내용", "남가좌동", true)); + this.jpaReviewRepository.save(review); + Review review1 = Review.of(ReviewId.of("review1"), PostId.of("post1"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", null, "남가좌동", true)); + this.jpaReviewRepository.save(review1); + Review review2 = Review.of(ReviewId.of("review2"), PostId.of("post2"), AuthId.of("sender1"), AuthId.of("receiver"), good, bad, Comment.of("사진", "내용1", "남가좌동", false)); + this.jpaReviewRepository.save(review2); + jpaAuthRepository.save(Auth.signUp("sender", PlatformType.NAVER, "test@naver.com")); + + + + + + List reviewList = this.reviewRetriveService.retriveComment("receiver"); + assertThat(reviewList.size()).isEqualTo(2); + CommentRetrieveResponse newReview1 = reviewList.get(0); + assertThat(newReview1.getSenderId()).isEqualTo("sender1"); + assertThat(newReview1.getNickname()).isEqualTo(null); + assertThat(newReview1.getProfilePictureUrl()).isEqualTo(null); + assertThat(newReview1.getTown()).isEqualTo("남가좌동"); + assertThat(newReview1.getContents()).isEqualTo("내용1"); + assertThat(newReview1.getPictureUrl()).isEqualTo("사진"); + assertThat(newReview1.isIspurchaser()).isEqualTo(false); + + + CommentRetrieveResponse newReview = reviewList.get(1); + assertThat(newReview.getSenderId()).isEqualTo("sender"); + assertThat(newReview.getNickname()).isEqualTo("익명"); + assertThat(newReview.getProfilePictureUrl()).isEqualTo(null); + assertThat(newReview.getTown()).isEqualTo("남가좌동"); + assertThat(newReview.getContents()).isEqualTo("내용"); + assertThat(newReview.getPictureUrl()).isEqualTo("사진"); + assertThat(newReview.isIspurchaser()).isEqualTo(true); + + } + + @Test + void 매너조회서비스 (){ + List good = new ArrayList(); + good.add(GoodManner.gm1); + good.add(GoodManner.gm2); + + List bad = new ArrayList(); + bad.add(BadManner.bm2); + bad.add(BadManner.bm5); + + List good1 = new ArrayList(); + good1.add(GoodManner.gm1); + good1.add(GoodManner.gm3); + + List bad1 = new ArrayList(); + bad1.add(BadManner.bm2); + bad1.add(BadManner.bm3); + bad1.add(BadManner.bm5); + + Review review = Review.of(ReviewId.of("review"), PostId.of("post"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", "내용", "남가좌동", true)); + Review review1 = Review.of(ReviewId.of("review1"), PostId.of("post1"), AuthId.of("sender"), AuthId.of("receiver"), good, bad1, Comment.of("사진", null, "남가좌동", true)); + Review review2 = Review.of(ReviewId.of("review2"), PostId.of("post2"), AuthId.of("sender1"), AuthId.of("receiver"), good1, bad, Comment.of("사진", "내용1", "남가좌동", false)); + + this.jpaReviewRepository.save(review); + this.jpaReviewRepository.save(review1); + this.jpaReviewRepository.save(review2); + + + MannerRetrieveResponse reviewList = this.reviewRetriveService.retriveManner("receiver", "receiver"); + + + List goodMannerCount = reviewList.getGoodMannerCount(); + assertThat(goodMannerCount.get(0).getGoodManners()).isEqualTo(GoodManner.gm1); + assertThat(goodMannerCount.get(0).getCount()).isEqualTo(3); + assertThat(goodMannerCount.get(1).getGoodManners()).isEqualTo(GoodManner.gm2); + assertThat(goodMannerCount.get(1).getCount()).isEqualTo(2); + assertThat(goodMannerCount.get(2).getGoodManners()).isEqualTo(GoodManner.gm3); + assertThat(goodMannerCount.get(2).getCount()).isEqualTo(1); + + List badMannerCount = reviewList.getBadMannerCount(); + assertThat(badMannerCount.get(0).getBadManner()).isEqualTo(BadManner.bm2); + assertThat(badMannerCount.get(0).getCount()).isEqualTo(3); + assertThat(badMannerCount.get(1).getBadManner()).isEqualTo(BadManner.bm5); + assertThat(badMannerCount.get(1).getCount()).isEqualTo(3); + assertThat(badMannerCount.get(2).getBadManner()).isEqualTo(BadManner.bm3); + assertThat(badMannerCount.get(2).getCount()).isEqualTo(1); + } + + @Test + void 후기3개조회서비스 (){ + List good = new ArrayList(); + good.add(GoodManner.gm1); + good.add(GoodManner.gm2); + + List bad = new ArrayList(); + bad.add(BadManner.bm2); + bad.add(BadManner.bm5); + + List good1 = new ArrayList(); + good1.add(GoodManner.gm1); + good1.add(GoodManner.gm3); + good1.add(GoodManner.gm4); + + + List bad1 = new ArrayList(); + bad1.add(BadManner.bm2); + bad1.add(BadManner.bm3); + bad1.add(BadManner.bm5); + + Review review = Review.of(ReviewId.of("review"), PostId.of("post"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", "내용", "남가좌동", true)); + Review review1 = Review.of(ReviewId.of("review1"), PostId.of("post1"), AuthId.of("sender"), AuthId.of("receiver"), good, bad1, Comment.of("사진", null, "남가좌동", true)); + Review review2 = Review.of(ReviewId.of("review2"), PostId.of("post2"), AuthId.of("sender1"), AuthId.of("receiver"), good1, bad, Comment.of("사진", "내용1", "남가좌동", false)); + + this.jpaReviewRepository.save(review); + this.jpaReviewRepository.save(review1); + this.jpaReviewRepository.save(review2); + + + PreviewReviewRetrieveResponse reviewList = this.reviewRetriveService.retriveReview("receiver"); + + assertThat(reviewList.getGoodMannerCount().size()).isEqualTo(3); + assertThat(reviewList.getCommentInfo().size()).isEqualTo(2); + + + + + } +} diff --git a/src/test/java/com/gaaji/auth/service/ReviewUpdateServiceTest.java b/src/test/java/com/gaaji/auth/service/ReviewUpdateServiceTest.java new file mode 100644 index 0000000..3820e11 --- /dev/null +++ b/src/test/java/com/gaaji/auth/service/ReviewUpdateServiceTest.java @@ -0,0 +1,123 @@ +package com.gaaji.auth.service; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; + +import com.gaaji.auth.applicationservice.ReviewUpdateService; +import com.gaaji.auth.controller.dto.ReviewUpdateRequest; +import com.gaaji.auth.domain.AuthId; +import com.gaaji.auth.domain.BadManner; +import com.gaaji.auth.domain.Comment; +import com.gaaji.auth.domain.GoodManner; +import com.gaaji.auth.domain.PostId; +import com.gaaji.auth.domain.Review; +import com.gaaji.auth.domain.ReviewId; +import com.gaaji.auth.exception.EqualsSellerAndPurchaserException; +import com.gaaji.auth.exception.NoMatchSenderException; +import com.gaaji.auth.exception.NoSearchReviewException; +import com.gaaji.auth.repository.JpaReviewRepository; + +@Transactional +@SpringBootTest +public class ReviewUpdateServiceTest { + + @Autowired + ReviewUpdateService reviewUpdateService; + + @Autowired + JpaReviewRepository jpaReviewRepository; + + @AfterEach + void afterEach() { + this.jpaReviewRepository.deleteAll(); + } + + @Test + void 수정서비스 (){ + List good = new ArrayList(); + good.add(GoodManner.gm1); + List bad = new ArrayList(); + bad.add(BadManner.bm2); + Review review = Review.of(ReviewId.of("review"), PostId.of("post"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", "내용", "남가좌동", true)); + + this.jpaReviewRepository.save(review); + + List goodEdit = new ArrayList(); + goodEdit.add("gm3"); + List badEdit = new ArrayList(); + badEdit.add("bm3"); + + + List goodCheck = new ArrayList(); + goodCheck.add(GoodManner.gm3); + List badCheck = new ArrayList(); + badCheck.add(BadManner.bm3); + ReviewUpdateRequest reviewUpdateRequest = new ReviewUpdateRequest("review", goodEdit, badEdit, "수정", false); + this.reviewUpdateService.updateReview("sender", null, reviewUpdateRequest); + + Review newReview = this.jpaReviewRepository.findByPostIdAndSenderId(PostId.of("post"), AuthId.of("sender")).orElseThrow(NoSearchReviewException::new); + assertThat(newReview.getPostId().getId()).isEqualTo("post"); + + assertThat(newReview.getSenderId().getId()).isEqualTo("sender"); + assertThat(newReview.getReceiverId().getId()).isEqualTo("receiver"); + assertThat(newReview.getGoodManners().get(0)).isEqualTo(goodCheck.get(0)); + assertThat(newReview.getBadManners().get(0)).isEqualTo(badCheck.get(0)); + + assertThat(newReview.getComment().getPictureUrl()).isEqualTo("사진"); + assertThat(newReview.getComment().getContents()).isEqualTo("수정"); + assertThat(newReview.getComment().getTown()).isEqualTo("남가좌동"); + assertThat(newReview.getComment().isIspurchaser()).isEqualTo(true); + + } + + @Test + void 수정서비스예외1 (){ + List good = new ArrayList(); + good.add(GoodManner.gm1); + List bad = new ArrayList(); + bad.add(BadManner.bm2); + Review review = Review.of(ReviewId.of("review"), PostId.of("post"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", "내용", "남가좌동", true)); + + this.jpaReviewRepository.save(review); + + List goodEdit = new ArrayList(); + goodEdit.add("gm3"); + List badEdit = new ArrayList(); + badEdit.add("bm3"); + + ReviewUpdateRequest reviewUpdateRequest = new ReviewUpdateRequest("review123", goodEdit, badEdit, "수정", false); + assertThatThrownBy(()->this.reviewUpdateService.updateReview("sender", null, reviewUpdateRequest)).isInstanceOf(NoSearchReviewException.class); + + } + + @Test + void 수정서비스예외2 (){ + List good = new ArrayList(); + good.add(GoodManner.gm1); + List bad = new ArrayList(); + bad.add(BadManner.bm2); + Review review = Review.of(ReviewId.of("review"), PostId.of("post"), AuthId.of("sender"), AuthId.of("receiver"), good, bad, Comment.of("사진", "내용", "남가좌동", true)); + + this.jpaReviewRepository.save(review); + + List goodEdit = new ArrayList(); + goodEdit.add("gm3"); + List badEdit = new ArrayList(); + badEdit.add("bm3"); + + ReviewUpdateRequest reviewUpdateRequest = new ReviewUpdateRequest("review", goodEdit, badEdit, "수정", false); + assertThatThrownBy(()->this.reviewUpdateService.updateReview("aaa", null, reviewUpdateRequest)).isInstanceOf(NoMatchSenderException.class); + + + } + +}