diff --git a/.github/workflows/dev-cd.yml b/.github/workflows/dev-cd.yml new file mode 100644 index 0000000..1a5fa7e --- /dev/null +++ b/.github/workflows/dev-cd.yml @@ -0,0 +1,76 @@ +# .github/workflows/dev-cd.yml +name: CD for Dev + +on: + push: + branches: [ "dev" ] + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-22.04 + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + + - name: Gradle Caching + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Create application-dev.yml + run: | + mkdir -p ./src/main/resources + echo "${{ secrets.PROPERTIES_DEV }}" > ./src/main/resources/application-dev.yml + shell: bash + + - name: Create .p8 + run: | + echo "${{ secrets.APPLE_AUTH }}" > ./src/main/resources/AUTHKEY_JUINJAG.p8 + shell: bash + + - name: Build With Gradle + run: ./gradlew build -x test + + + - name: Login to Docker Hub + run: | + echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + file: ./Dockerfile-dev + push: true + tags: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO_DEV }} + + + - name: Deploy to Dev + uses: appleboy/ssh-action@v0.1.6 + with: + host: ${{ secrets.EC2_HOST_DEV }} + username: ${{ secrets.EC2_USERNAME_DEV }} + key: ${{ secrets.EC2_PRIVATE_KEY_DEV }} + port: 22 + script: | + sudo docker rm -f $(docker ps -qa) || true + sudo docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO_DEV }} + docker-compose up -d + docker image prune -f diff --git a/.github/workflows/dev-ci.yml b/.github/workflows/dev-ci.yml new file mode 100644 index 0000000..7eef917 --- /dev/null +++ b/.github/workflows/dev-ci.yml @@ -0,0 +1,36 @@ +# .github/workflows/dev-ci.yml +name: CI-Dev + +on: + pull_request: + branches: [ "dev" ] + + +jobs: + build: + runs-on: ubuntu-22.04 + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + + - name: Gradle Caching + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build With Gradle + run: ./gradlew build -x test diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml deleted file mode 100644 index 8951ea0..0000000 --- a/.github/workflows/gradle.yml +++ /dev/null @@ -1,93 +0,0 @@ -# github repository Actions 페이지에 나타낼 이름 -name: CI/CD - -# event trigger -on: - push: - branches: [ "main" ] - # pull_request: - # branches: [ "main" ] - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-22.04 - steps: - ## jdk setting - - uses: actions/checkout@v3 - - name: Set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'temurin' # https://github.com/actions/setup-java - - ## gradle caching - - name: Gradle Caching - uses: actions/cache@v3 - with: - path: | - ~/.gradle/caches - ~/.gradle/wrapper - key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} - restore-keys: | - ${{ runner.os }}-gradle- - - name: Grant execute permission for gradlew - run: - chmod +x gradlew - - - name: Build with Gradle - run: ./gradlew build -x test - shell: bash - - ## create application-prod.yml - - name: create application-prod.yml - if: contains(github.ref, 'main') - run: | - cd ./src/main - mkdir resources - cd ./resources - touch ./application.yml - ls * - echo "${{ secrets.PROPERTIES_PROD }}" > ./application.yml - shell: bash - - ## create .p8 - - name: create .p8 - if: contains(github.ref, 'main') - run: | - echo "${{ secrets.APPLE_AUTH }}" > src/main/resources/AUTHKEY_JUINJAG.p8 - shell: bash - - - - name: Build With Gradle - if: contains(github.ref, 'main') - run: ./gradlew build -x test - - ## docker build & push to production - - name: Docker build & push to prod - if: contains(github.ref, 'main') - run: | - echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin - docker build -f Dockerfile -t ${{ secrets.DOCKER_REPO }} . - docker push ${{ secrets.DOCKER_REPO }} - - - ## deploy to production - - name: Deploy to prod - uses: appleboy/ssh-action@v0.1.6 - id: deploy-prod - if: contains(github.ref, 'main') - with: - host: ${{ secrets.EC2_HOST_PROD }} - username: ${{ secrets.EC2_USERNAME }} - key: ${{ secrets.EC2_PRIVATE_KEY }} - port: 22 - envs: GITHUB_SHA - script: | - echo test1234 > test.txt - sudo docker rm -f $(docker ps -qa) - sudo docker pull ${{ secrets.DOCKER_REPO }} - docker-compose up -d - docker image prune -f diff --git a/.github/workflows/prod-cd.yml b/.github/workflows/prod-cd.yml new file mode 100644 index 0000000..384bf34 --- /dev/null +++ b/.github/workflows/prod-cd.yml @@ -0,0 +1,74 @@ +# .github/workflows/prod-cd.yml +name: CD for Prod + +on: + push: + branches: [ "prod" ] + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-22.04 + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + + - name: Gradle Caching + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Create application-prod.yml + run: | + mkdir -p ./src/main/resources + echo "${{ secrets.PROPERTIES_PROD }}" > ./src/main/resources/application-prod.yml + shell: bash + + - name: Create .p8 + run: | + echo "${{ secrets.APPLE_AUTH }}" > ./src/main/resources/AUTHKEY_JUINJAG.p8 + shell: bash + + - name: Build With Gradle + run: ./gradlew build -x test + + - name: Login to Docker Hub + run: | + echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin + + - name: Build and push + uses: docker/build-push-action@v4 + with: + context: . + file: ./Dockerfile-prod + push: true + tags: ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO_PROD }} + + - name: Deploy to Prod + uses: appleboy/ssh-action@v0.1.6 + with: + host: ${{ secrets.EC2_HOST_PROD }} + username: ${{ secrets.EC2_USERNAME_PROD }} + key: ${{ secrets.EC2_PRIVATE_KEY_PROD }} + script: | + sudo docker pull ${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_REPO_PROD }} + chmod 777 ./deploy.sh + ./deploy.sh + docker image prune -f + diff --git a/.github/workflows/prod-ci.yml b/.github/workflows/prod-ci.yml new file mode 100644 index 0000000..c1269cd --- /dev/null +++ b/.github/workflows/prod-ci.yml @@ -0,0 +1,38 @@ +# .github/workflows/prod-ci.yml +name: CI-Prod + +on: + pull_request: + branches: [ "prod" ] + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-22.04 + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + + - name: Gradle Caching + uses: actions/cache@v3 + with: + path: | + ~/.gradle/caches + ~/.gradle/wrapper + key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }} + restore-keys: | + ${{ runner.os }}-gradle- + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build With Gradle + run: ./gradlew build -x test diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 975ebec..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,29 +0,0 @@ -# github repository Actions 페이지에 나타낼 이름 -name: TEST - -# event trigger -on: - push: - branches: [ "main" ] - pull_request: - branches: [ "main" ] - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-22.04 - steps: - ## deploy to production - - name: Deploy to prod - uses: appleboy/ssh-action@v0.1.6 - id: deploy-prod - if: contains(github.ref, 'main') - with: - host: ${{ secrets.EC2_HOST_PROD }} - username: ${{ secrets.EC2_USERNAME }} - key: ${{ secrets.EC2_PRIVATE_KEY }} - port: 22 - envs: GITHUB_SHA - script: echo test > test.txt diff --git a/.gitignore b/.gitignore index 07911bd..e610285 100644 --- a/.gitignore +++ b/.gitignore @@ -38,9 +38,12 @@ out/ /application.properties /src/main/resources/application.properties +/src/main/resources/*.yml + + /application.yml -/src/main/resources/application.yml -/src/main/resources/local-application.yml -/src/main/resources/dev-application.yml +/src/main/resources/application-local.yml +/src/main/resources/application-dev.yml +/src/main/resources/application-prod.yml /src/main/generated/* \ No newline at end of file diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 1c1bc39..0000000 --- a/Dockerfile +++ /dev/null @@ -1,31 +0,0 @@ -# # ## Dockerfile-prod -# # ########## -# FROM openjdk:17-jdk -# #EXPOSE 8080 -# ARG JAR_FILE=build/libs/*.jar -# RUN pwd -# # RUN ls build* -# RUN ls *.jar -# COPY ./*.jar app.jar -# ENTRYPOINT ["java","-jar","./app.jar"] - -## Dockerfile-prod -########## -#FROM openjdk:17-jdk -# -#ARG JAR_FILE=build/libs/*.jar -#COPY ./*.jar app.jar -#ENTRYPOINT ["java", "-jar", "app.jar"] - - -# try~ -# Dockerfile-prod -######### -FROM openjdk:17-jdk - -ARG JAR_FILE=./build/libs/juinjang-0.0.1-SNAPSHOT.jar -COPY ${JAR_FILE} app.jar -ENTRYPOINT [ "java", "-jar", "/app.jar" ] - - - diff --git a/Dockerfile-dev b/Dockerfile-dev new file mode 100644 index 0000000..fd4f5a4 --- /dev/null +++ b/Dockerfile-dev @@ -0,0 +1,8 @@ +FROM openjdk:17-jdk + +ARG JAR_FILE=./build/libs/juinjang-0.0.1-SNAPSHOT.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT [ "java", "-jar", "-Dspring.profiles.active=dev", "/app.jar" ] + + + diff --git a/Dockerfile-prod b/Dockerfile-prod new file mode 100644 index 0000000..a0db723 --- /dev/null +++ b/Dockerfile-prod @@ -0,0 +1,8 @@ +FROM openjdk:17-jdk + +ARG JAR_FILE=./build/libs/juinjang-0.0.1-SNAPSHOT.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT [ "java", "-jar", "-Dspring.profiles.active=prod", "/app.jar" ] + + + diff --git a/build.gradle b/build.gradle index 0b59a55..db0342e 100644 --- a/build.gradle +++ b/build.gradle @@ -72,7 +72,6 @@ dependencies { annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor "jakarta.annotation:jakarta.annotation-api" annotationProcessor "jakarta.persistence:jakarta.persistence-api" - implementation 'com.github.gavlyukovskiy:p6spy-spring-boot-starter:1.9.0' // 쿼리 파라미터 로그 남기기 implementation 'commons-codec:commons-codec:1.16.0' // Base64 인코딩을 위한 의존성 diff --git a/src/main/java/umc/th/juinjang/apiPayload/code/status/ErrorStatus.java b/src/main/java/umc/th/juinjang/apiPayload/code/status/ErrorStatus.java index 99fbf3b..0a1d2c9 100644 --- a/src/main/java/umc/th/juinjang/apiPayload/code/status/ErrorStatus.java +++ b/src/main/java/umc/th/juinjang/apiPayload/code/status/ErrorStatus.java @@ -95,8 +95,10 @@ public enum ErrorStatus implements BaseErrorCode { RECORD_NOT_FOUND(HttpStatus.NOT_FOUND, "RECORD400", "record가 존재하지 않습니다"), //withdraw 에러 - WITHDRAW_REASON_NOT_FOUND(HttpStatus.NOT_FOUND, "WITHDRAW400", "해당 탈퇴 사유 enum 값이 존재하지 않습니다"); + WITHDRAW_REASON_NOT_FOUND(HttpStatus.NOT_FOUND, "WITHDRAW400", "해당 탈퇴 사유 enum 값이 존재하지 않습니다"), + // discord alert + DISCORD_ALERT_ERROR(HttpStatus.NOT_FOUND, "DISCORD400", "discord 알림 수신 중 오류가 발생했습니다."); private final HttpStatus httpStatus; private final String code; diff --git a/src/main/java/umc/th/juinjang/apiPayload/code/status/SuccessStatus.java b/src/main/java/umc/th/juinjang/apiPayload/code/status/SuccessStatus.java index e07fb09..ddd8b8e 100644 --- a/src/main/java/umc/th/juinjang/apiPayload/code/status/SuccessStatus.java +++ b/src/main/java/umc/th/juinjang/apiPayload/code/status/SuccessStatus.java @@ -29,7 +29,10 @@ public enum SuccessStatus implements BaseCode { IMAGE_DELETE(HttpStatus.OK, "IMAGE2001", "이미지 삭제 성공하였습니다."), // 탈퇴 관련 응답 - MEMBER_DELETE(HttpStatus.OK, "MEMBER2000", "회원 탈퇴를 성공하였습니다."); + MEMBER_DELETE(HttpStatus.OK, "MEMBER2000", "회원 탈퇴를 성공하였습니다."), + + // discord alert + DISCORD_ALERT_SIGN_IN(HttpStatus.OK, "DISCORD200", "주인장에 신규 유저가 생겼어요!"); private final HttpStatus httpStatus; private final String code; diff --git a/src/main/java/umc/th/juinjang/config/SecurityConfig.java b/src/main/java/umc/th/juinjang/config/SecurityConfig.java index 30a4a46..d542112 100644 --- a/src/main/java/umc/th/juinjang/config/SecurityConfig.java +++ b/src/main/java/umc/th/juinjang/config/SecurityConfig.java @@ -1,13 +1,12 @@ package umc.th.juinjang.config; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.Order; +import org.springframework.core.env.Environment; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.Customizer; -import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.authentication.configuration.AuthenticationConfiguration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; @@ -21,26 +20,38 @@ import umc.th.juinjang.jwt.JwtExceptionFilter; import umc.th.juinjang.service.JwtService; +import java.util.Arrays; + @Configuration @EnableWebSecurity @RequiredArgsConstructor public class SecurityConfig { private final AuthenticationConfiguration authenticationConfiguration; - @Autowired private final JwtService jwtService; - @Autowired private final JwtExceptionFilter jwtExceptionFilter; + private final Environment environment; @Bean @Order(0) public WebSecurityCustomizer webSecurityCustomizer(){ - return web -> web.ignoring() - .requestMatchers("/swagger-ui/**", "/swagger/**", "/swagger-resources/**", "/swagger-ui.html", "/test", - "/configuration/ui", "/v3/api-docs/**", "/h2-console/**", "/api/auth/regenerate-token", - "/api/auth/kakao/**", "/api/auth/apple/**", "/api/checklist/**", "/api/report/**"); - + String[] activeProfiles = environment.getActiveProfiles(); + boolean isProd = Arrays.asList(activeProfiles).contains("prod"); + + //prod아닐때 + if (!isProd) { + return web -> web.ignoring() + .requestMatchers("/swagger-ui/**", "/swagger/**", "/swagger-resources/**", "/swagger-ui.html", "/test", + "/configuration/ui", "/v3/api-docs/**", "/h2-console/**", "/api/auth/regenerate-token", + "/api/auth/kakao/**", "/api/auth/apple/**"); + } + else { + return web -> web.ignoring() + .requestMatchers("/h2-console/**", "/api/auth/regenerate-token", + "/api/auth/kakao/**", "/api/auth/apple/**" ); + } + } //선언 방식이 3.x에서 바뀜 @@ -54,7 +65,7 @@ protected SecurityFilterChain filterChain(HttpSecurity http) throws Exception { .csrf(AbstractHttpConfigurer::disable) .formLogin(Customizer.withDefaults()) .sessionManagement((sessionManagement) -> - sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS) + sessionManagement.sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 세션을 사용하지 않는다고 설정함 ) .addFilter(new JwtAuthenticationFilter(authenticationManager(authenticationConfiguration),jwtService)) diff --git a/src/main/java/umc/th/juinjang/controller/ImageController.java b/src/main/java/umc/th/juinjang/controller/ImageController.java index c13c687..eb9796e 100644 --- a/src/main/java/umc/th/juinjang/controller/ImageController.java +++ b/src/main/java/umc/th/juinjang/controller/ImageController.java @@ -1,43 +1,28 @@ package umc.th.juinjang.controller; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; -import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.Valid; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.http.MediaType; -import org.springframework.http.StreamingHttpOutputMessage.Body; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.Mapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import umc.th.juinjang.apiPayload.ApiResponse; import umc.th.juinjang.apiPayload.code.status.SuccessStatus; -import umc.th.juinjang.converter.limjang.LimjangPostConverter; import umc.th.juinjang.model.dto.image.ImageDeleteRequestDTO; import umc.th.juinjang.model.dto.image.ImageListResponseDTO; -import umc.th.juinjang.model.dto.image.ImageUploadRequestDTO; -import umc.th.juinjang.model.dto.image.ImageUploadRequestDTO.ImageDto; -import umc.th.juinjang.model.dto.image.ImageUploadResponseDTO; -import umc.th.juinjang.model.dto.limjang.LimjangPostRequestDTO; -import umc.th.juinjang.model.dto.limjang.LimjangPostResponseDTO; -import umc.th.juinjang.model.dto.limjang.LimjangPostResponseDTO.PostDTO; import umc.th.juinjang.service.ImageService.ImageCommandService; import umc.th.juinjang.service.ImageService.ImageQueryService; import umc.th.juinjang.service.LimjangService.LimjangCommandService; -import umc.th.juinjang.service.LimjangService.LimjangQueryService; @RestController @RequestMapping("/api/limjang/image") diff --git a/src/main/java/umc/th/juinjang/controller/LimjangController.java b/src/main/java/umc/th/juinjang/controller/LimjangController.java index 1a518e3..8165c8e 100644 --- a/src/main/java/umc/th/juinjang/controller/LimjangController.java +++ b/src/main/java/umc/th/juinjang/controller/LimjangController.java @@ -3,34 +3,34 @@ import io.swagger.v3.oas.annotations.Operation; import jakarta.validation.Valid; -import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.Mapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; import umc.th.juinjang.apiPayload.ApiResponse; - import umc.th.juinjang.apiPayload.code.status.SuccessStatus; -import umc.th.juinjang.converter.limjang.LimjangMainListConverter; import umc.th.juinjang.converter.limjang.LimjangPostConverter; -import umc.th.juinjang.model.dto.limjang.*; -import umc.th.juinjang.model.entity.Limjang; +import umc.th.juinjang.model.dto.limjang.enums.LimjangSortOptions; +import umc.th.juinjang.model.dto.limjang.request.LimjangDeleteRequestDTO; +import umc.th.juinjang.model.dto.limjang.request.LimjangPostRequestDTO; +import umc.th.juinjang.model.dto.limjang.request.LimjangUpdateRequestDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangDetailResponseDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangPostResponseDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangTotalListResponseDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangsGetResponse; +import umc.th.juinjang.model.dto.limjang.response.LimjangsMainGetResponse; import umc.th.juinjang.model.entity.Member; -import umc.th.juinjang.repository.record.RecordRepository; import umc.th.juinjang.service.LimjangService.LimjangCommandService; import umc.th.juinjang.service.LimjangService.LimjangQueryService; -import umc.th.juinjang.service.recordService.RecordService; @RestController @RequestMapping("/api/limjang") @@ -53,23 +53,18 @@ public ApiResponse postLimjang( @CrossOrigin @Operation(summary = "임장 전체 조회 API") - @GetMapping("") - public ApiResponse getLimjangTotalList( - @AuthenticationPrincipal Member member, - @RequestParam("sort") String sort - ){ - System.out.println("임장 전체 조회 API Controller"); + @GetMapping + public ApiResponse getLimjangTotalList(@AuthenticationPrincipal Member member, @RequestParam("sort") LimjangSortOptions sort){ return ApiResponse.onSuccess(limjangQueryService.getLimjangTotalList(member, sort)); } @CrossOrigin @Operation(summary = "임장 메인화면에서 최근 임장 조회 API", description = "가장 최근에 수정된 순으로 최대 5개까지 볼 수 있다.") @GetMapping("/main") - public ApiResponse getRecentUpdateList( + public ApiResponse getRecentUpdateList( @AuthenticationPrincipal Member member ){ - System.out.println("임장 메인화면 조회 API Controller"); - return ApiResponse.onSuccess(LimjangMainListConverter.toLimjangMainList(limjangQueryService.getLimjangMainList(member))); + return ApiResponse.onSuccess((limjangQueryService.getLimjangsMain(member))); } @CrossOrigin diff --git a/src/main/java/umc/th/juinjang/controller/RecordController.java b/src/main/java/umc/th/juinjang/controller/RecordController.java index 68ac0e6..017929c 100644 --- a/src/main/java/umc/th/juinjang/controller/RecordController.java +++ b/src/main/java/umc/th/juinjang/controller/RecordController.java @@ -1,17 +1,15 @@ package umc.th.juinjang.controller; import io.swagger.v3.oas.annotations.Operation; -import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.repository.query.Param; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import umc.th.juinjang.apiPayload.ApiResponse; -import umc.th.juinjang.model.dto.limjang.LimjangMemoResponseDTO; -import umc.th.juinjang.model.dto.limjang.LimjangUpdateRequestDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangMemoResponseDTO; +import umc.th.juinjang.model.dto.limjang.request.LimjangUpdateRequestDTO; import umc.th.juinjang.model.dto.record.RecordRequestDTO; import umc.th.juinjang.model.dto.record.RecordResponseDTO; import umc.th.juinjang.model.entity.Member; diff --git a/src/main/java/umc/th/juinjang/converter/checklist/ChecklistAnswerAndReportConverter.java b/src/main/java/umc/th/juinjang/converter/checklist/ChecklistAnswerAndReportConverter.java index a051952..41bdde2 100644 --- a/src/main/java/umc/th/juinjang/converter/checklist/ChecklistAnswerAndReportConverter.java +++ b/src/main/java/umc/th/juinjang/converter/checklist/ChecklistAnswerAndReportConverter.java @@ -4,7 +4,7 @@ import umc.th.juinjang.model.dto.checklist.ChecklistAnswerAndReportResponseDTO; import umc.th.juinjang.model.dto.checklist.ChecklistAnswerResponseDTO; import umc.th.juinjang.model.dto.checklist.ReportResponseDTO; -import umc.th.juinjang.model.dto.limjang.LimjangDetailResponseDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangDetailResponseDTO; import umc.th.juinjang.model.entity.ChecklistAnswer; import umc.th.juinjang.model.entity.Limjang; import umc.th.juinjang.model.entity.Report; diff --git a/src/main/java/umc/th/juinjang/converter/limjang/LimjangDetailConverter.java b/src/main/java/umc/th/juinjang/converter/limjang/LimjangDetailConverter.java index ff84279..4c3b8a1 100644 --- a/src/main/java/umc/th/juinjang/converter/limjang/LimjangDetailConverter.java +++ b/src/main/java/umc/th/juinjang/converter/limjang/LimjangDetailConverter.java @@ -4,7 +4,7 @@ import java.util.Comparator; import java.util.List; -import umc.th.juinjang.model.dto.limjang.LimjangDetailResponseDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangDetailResponseDTO; import umc.th.juinjang.model.dto.limjang.enums.LimjangCheckListVersionEnum; import umc.th.juinjang.model.entity.Image; import umc.th.juinjang.model.entity.Limjang; diff --git a/src/main/java/umc/th/juinjang/converter/limjang/LimjangMainListConverter.java b/src/main/java/umc/th/juinjang/converter/limjang/LimjangMainListConverter.java deleted file mode 100644 index 50dd97b..0000000 --- a/src/main/java/umc/th/juinjang/converter/limjang/LimjangMainListConverter.java +++ /dev/null @@ -1,48 +0,0 @@ -package umc.th.juinjang.converter.limjang; - -import static umc.th.juinjang.service.LimjangService.LimjangPriceBridge.makePriceList; - -import java.util.Comparator; -import java.util.List; -import java.util.Optional; -import umc.th.juinjang.model.dto.limjang.LimjangMainViewListResponsetDTO; -import umc.th.juinjang.model.entity.Image; -import umc.th.juinjang.model.entity.Limjang; -import umc.th.juinjang.model.entity.LimjangPrice; - -public class LimjangMainListConverter { - public static LimjangMainViewListResponsetDTO.RecentUpdatedDto toLimjangMainList( - List recentUpdatedList - ) { - - return LimjangMainViewListResponsetDTO.RecentUpdatedDto.builder() - .recentUpdatedList(recentUpdatedList) - .build(); - } - - public static LimjangMainViewListResponsetDTO.ListDto toLimjangList( - Limjang limjang, LimjangPrice limjangPrice) { - - Image imageList = limjang.getImageList().stream() - .min(Comparator.comparing(Image::getCreatedAt)).orElse(null); - - Integer purposeType = limjang.getPurpose().getValue(); - Integer priceType = limjang.getPriceType().getValue(); - List priceList = makePriceList(priceType, purposeType,limjangPrice); - - String price = (priceType == 2) ? priceList.get(1) : priceList.get(0); - - return LimjangMainViewListResponsetDTO.ListDto.builder() - .limjangId(limjang.getLimjangId()) - .image(Optional.ofNullable(imageList).map(Image::getImageUrl)) - .nickname(limjang.getNickname()) - .price(price) - .totalAverage( Optional.ofNullable(limjang.getReport()) - .flatMap(report -> Optional.ofNullable(report.getTotalRate()) - .map(Object::toString)) - .orElse(null)) - .address(limjang.getAddress()) - .build(); - } - -} diff --git a/src/main/java/umc/th/juinjang/converter/limjang/LimjangPostConverter.java b/src/main/java/umc/th/juinjang/converter/limjang/LimjangPostConverter.java index d4b629f..a19c2ad 100644 --- a/src/main/java/umc/th/juinjang/converter/limjang/LimjangPostConverter.java +++ b/src/main/java/umc/th/juinjang/converter/limjang/LimjangPostConverter.java @@ -4,9 +4,9 @@ import java.util.List; import umc.th.juinjang.apiPayload.code.status.ErrorStatus; -import umc.th.juinjang.model.dto.limjang.LimjangPostRequestDTO; -import umc.th.juinjang.model.dto.limjang.LimjangPostResponseDTO; -import umc.th.juinjang.model.dto.limjang.LimjangPostResponseDTO.PostDTO; +import umc.th.juinjang.model.dto.limjang.request.LimjangPostRequestDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangPostResponseDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangPostResponseDTO.PostDTO; import umc.th.juinjang.model.entity.Limjang; import umc.th.juinjang.model.entity.enums.LimjangPriceType; import umc.th.juinjang.model.entity.enums.LimjangPropertyType; diff --git a/src/main/java/umc/th/juinjang/converter/limjang/LimjangTotalListConverter.java b/src/main/java/umc/th/juinjang/converter/limjang/LimjangTotalListConverter.java index 544eef4..5f7adc0 100644 --- a/src/main/java/umc/th/juinjang/converter/limjang/LimjangTotalListConverter.java +++ b/src/main/java/umc/th/juinjang/converter/limjang/LimjangTotalListConverter.java @@ -1,18 +1,15 @@ package umc.th.juinjang.converter.limjang; -import static umc.th.juinjang.service.LimjangService.LimjangPriceBridge.makePriceList; import static umc.th.juinjang.service.LimjangService.LimjangPriceBridge.makePriceListVersion2; import java.util.Comparator; import java.util.List; import java.util.Optional; -import umc.th.juinjang.model.dto.limjang.LimjangTotalListResponseDTO; -import umc.th.juinjang.model.dto.limjang.LimjangTotalListResponseDTO.LimjangListDto; +import umc.th.juinjang.model.dto.limjang.response.LimjangTotalListResponseDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangTotalListResponseDTO.LimjangListDto; import umc.th.juinjang.model.entity.Image; import umc.th.juinjang.model.entity.Limjang; import umc.th.juinjang.model.entity.LimjangPrice; -import umc.th.juinjang.model.entity.enums.LimjangPriceType; -import umc.th.juinjang.model.entity.enums.LimjangPurpose; public class LimjangTotalListConverter { diff --git a/src/main/java/umc/th/juinjang/converter/limjang/LimjangUpdateConverter.java b/src/main/java/umc/th/juinjang/converter/limjang/LimjangUpdateConverter.java index f708a22..cbcce31 100644 --- a/src/main/java/umc/th/juinjang/converter/limjang/LimjangUpdateConverter.java +++ b/src/main/java/umc/th/juinjang/converter/limjang/LimjangUpdateConverter.java @@ -4,7 +4,7 @@ import java.util.List; import umc.th.juinjang.apiPayload.code.status.ErrorStatus; -import umc.th.juinjang.model.dto.limjang.LimjangUpdateRequestDTO; +import umc.th.juinjang.model.dto.limjang.request.LimjangUpdateRequestDTO; import umc.th.juinjang.model.entity.Limjang; import umc.th.juinjang.model.entity.enums.LimjangPriceType; diff --git a/src/main/java/umc/th/juinjang/converter/limjang/LimjangsGetResponseConverter.java b/src/main/java/umc/th/juinjang/converter/limjang/LimjangsGetResponseConverter.java new file mode 100644 index 0000000..9d16566 --- /dev/null +++ b/src/main/java/umc/th/juinjang/converter/limjang/LimjangsGetResponseConverter.java @@ -0,0 +1,40 @@ +package umc.th.juinjang.converter.limjang; + +import static umc.th.juinjang.service.LimjangService.LimjangPriceBridge.makePriceListVersion2; + +import java.util.Comparator; +import java.util.List; +import java.util.Optional; +import umc.th.juinjang.model.dto.limjang.response.LimjangsGetResponse; +import umc.th.juinjang.model.dto.limjang.response.LimjangsGetResponse.LimjangsResponse; +import umc.th.juinjang.model.entity.Image; +import umc.th.juinjang.model.entity.Limjang; +import umc.th.juinjang.model.entity.LimjangPrice; + +public class LimjangsGetResponseConverter { + + public static LimjangsGetResponse.LimjangsResponse convertToLimjangsResponse(Limjang limjang, LimjangPrice limjangPrice) { + return LimjangsResponse.builder() + .limjangId(limjang.getLimjangId()) + .images(getUrlListByScrap(limjang)) + .nickname(limjang.getNickname()) + .isScraped(limjang.getScrap() != null) + .purposeCode(limjang.getPurpose().getValue()) + .priceType(limjang.getPriceType().getValue()) + .priceList(makePriceListVersion2(limjang.getPriceType(), limjang.getPurpose(), limjangPrice)) + .totalAverage(Optional.ofNullable(limjang.getReport()) + .flatMap(report -> Optional.ofNullable(report.getTotalRate()) + .map(Object::toString)) + .orElse(null)) + .address(limjang.getAddress()) + .build(); + } + + private static List getUrlListByScrap(Limjang limjang) { + return limjang.getImageList().stream() + .sorted(Comparator.comparing(Image::getCreatedAt)) + .map(Image::getImageUrl) + .limit(limjang.getScrap() == null ? 1 : 3) + .toList(); + } +} \ No newline at end of file diff --git a/src/main/java/umc/th/juinjang/converter/limjang/LimjangsMainGetResponseConverter.java b/src/main/java/umc/th/juinjang/converter/limjang/LimjangsMainGetResponseConverter.java new file mode 100644 index 0000000..1c09e73 --- /dev/null +++ b/src/main/java/umc/th/juinjang/converter/limjang/LimjangsMainGetResponseConverter.java @@ -0,0 +1,31 @@ +package umc.th.juinjang.converter.limjang; + +import static umc.th.juinjang.service.LimjangService.LimjangPriceBridge.makePriceListVersion2; + +import java.util.List; +import java.util.Optional; +import umc.th.juinjang.model.dto.limjang.response.LimjangsMainGetResponse.LimjangMainResponse; +import umc.th.juinjang.model.entity.Image; +import umc.th.juinjang.model.entity.Limjang; +import umc.th.juinjang.model.entity.Report; + +public class LimjangsMainGetResponseConverter { + + public static LimjangMainResponse toLimjangMainResponse(final Limjang limjang) { + return new LimjangMainResponse( + limjang.getLimjangId(), + limjang.getImageList().stream().findFirst().map(Image::getImageUrl).orElse(null), + limjang.getNickname(), getPriceToString(limjang), + getTotalAverageOrElse(limjang), + limjang.getAddress()); + } + + private static String getPriceToString(final Limjang limjang) { + List priceList = makePriceListVersion2(limjang.getPriceType(),limjang.getPurpose(), limjang.getLimjangPrice()); + return (limjang.getPriceType().getValue() == 2) ? priceList.get(1) : priceList.get(0); + } + + private static String getTotalAverageOrElse(final Limjang limjang) { + return Optional.ofNullable(limjang.getReport()).map(Report::getTotalRate).map(Object::toString).orElse(null); + } +} \ No newline at end of file diff --git a/src/main/java/umc/th/juinjang/converter/record/LimjangMemoConverter.java b/src/main/java/umc/th/juinjang/converter/record/LimjangMemoConverter.java index 45bdabf..e529b50 100644 --- a/src/main/java/umc/th/juinjang/converter/record/LimjangMemoConverter.java +++ b/src/main/java/umc/th/juinjang/converter/record/LimjangMemoConverter.java @@ -1,10 +1,7 @@ package umc.th.juinjang.converter.record; -import umc.th.juinjang.model.dto.limjang.LimjangMemoResponseDTO; -import umc.th.juinjang.model.dto.record.RecordRequestDTO; -import umc.th.juinjang.model.dto.record.RecordResponseDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangMemoResponseDTO; import umc.th.juinjang.model.entity.Limjang; -import umc.th.juinjang.model.entity.Record; public class LimjangMemoConverter { diff --git a/src/main/java/umc/th/juinjang/external/discord/DiscordAlertProvider.java b/src/main/java/umc/th/juinjang/external/discord/DiscordAlertProvider.java new file mode 100644 index 0000000..ac38792 --- /dev/null +++ b/src/main/java/umc/th/juinjang/external/discord/DiscordAlertProvider.java @@ -0,0 +1,34 @@ +package umc.th.juinjang.external.discord; + +import feign.FeignException; +import java.util.Arrays; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; +import umc.th.juinjang.apiPayload.code.status.ErrorStatus; +import umc.th.juinjang.apiPayload.code.status.SuccessStatus; +import umc.th.juinjang.external.discord.dto.DiscordAlert; + +@RequiredArgsConstructor +@Component +@Slf4j +public class DiscordAlertProvider { + + private final DiscordFeignClient discordFeignClient; + private final Environment environment; + + public void sendAlert(SuccessStatus successStatus) { + if (Arrays.asList(environment.getActiveProfiles()).contains("prod")) { + sendAlertToDiscord(DiscordAlert.createAlert(successStatus.getMessage())); + } + } + + private void sendAlertToDiscord(DiscordAlert discordAlert) { + try { + discordFeignClient.sendAlert(discordAlert); + } catch (FeignException e) { + log.info(ErrorStatus.DISCORD_ALERT_ERROR.getMessage()+ " " +e.getMessage()); + } + } +} \ No newline at end of file diff --git a/src/main/java/umc/th/juinjang/external/discord/DiscordFeignClient.java b/src/main/java/umc/th/juinjang/external/discord/DiscordFeignClient.java new file mode 100644 index 0000000..4bc8ed7 --- /dev/null +++ b/src/main/java/umc/th/juinjang/external/discord/DiscordFeignClient.java @@ -0,0 +1,13 @@ +package umc.th.juinjang.external.discord; + +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import umc.th.juinjang.external.discord.dto.DiscordAlert; + +@FeignClient(name = "${discord.name}", url = "${discord.webhook-url}") +public interface DiscordFeignClient { + @PostMapping(produces = MediaType.APPLICATION_JSON_VALUE) + void sendAlert(@RequestBody DiscordAlert discordMessage); +} \ No newline at end of file diff --git a/src/main/java/umc/th/juinjang/external/discord/dto/DiscordAlert.java b/src/main/java/umc/th/juinjang/external/discord/dto/DiscordAlert.java new file mode 100644 index 0000000..11a07e2 --- /dev/null +++ b/src/main/java/umc/th/juinjang/external/discord/dto/DiscordAlert.java @@ -0,0 +1,10 @@ +package umc.th.juinjang.external.discord.dto; + +public record DiscordAlert( + String content +) { + + public static DiscordAlert createAlert(String message) { + return new DiscordAlert(message); + } +} \ No newline at end of file diff --git a/src/main/java/umc/th/juinjang/model/dto/checklist/ReportResponseDTO.java b/src/main/java/umc/th/juinjang/model/dto/checklist/ReportResponseDTO.java index 112c6e2..1446b09 100644 --- a/src/main/java/umc/th/juinjang/model/dto/checklist/ReportResponseDTO.java +++ b/src/main/java/umc/th/juinjang/model/dto/checklist/ReportResponseDTO.java @@ -1,9 +1,7 @@ package umc.th.juinjang.model.dto.checklist; import lombok.*; -import umc.th.juinjang.model.dto.limjang.LimjangDetailResponseDTO; - -import java.util.List; +import umc.th.juinjang.model.dto.limjang.response.LimjangDetailResponseDTO; @AllArgsConstructor @Getter diff --git a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangMainViewListResponsetDTO.java b/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangMainViewListResponsetDTO.java deleted file mode 100644 index 3809706..0000000 --- a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangMainViewListResponsetDTO.java +++ /dev/null @@ -1,33 +0,0 @@ -package umc.th.juinjang.model.dto.limjang; - -import java.util.List; -import java.util.Optional; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -public class LimjangMainViewListResponsetDTO { - @Builder - @Getter - @NoArgsConstructor - @AllArgsConstructor - public static class RecentUpdatedDto { - - private List recentUpdatedList; - - } - - @Builder - @Getter - @NoArgsConstructor - @AllArgsConstructor - public static class ListDto { - private Long limjangId; - private Optional image; - private String nickname; - private String price; - private String totalAverage; - private String address; - } -} diff --git a/src/main/java/umc/th/juinjang/model/entity/enums/LimjangSort.java b/src/main/java/umc/th/juinjang/model/dto/limjang/enums/LimjangSortOptions.java similarity index 61% rename from src/main/java/umc/th/juinjang/model/entity/enums/LimjangSort.java rename to src/main/java/umc/th/juinjang/model/dto/limjang/enums/LimjangSortOptions.java index f6feec5..bc356c3 100644 --- a/src/main/java/umc/th/juinjang/model/entity/enums/LimjangSort.java +++ b/src/main/java/umc/th/juinjang/model/dto/limjang/enums/LimjangSortOptions.java @@ -1,13 +1,13 @@ -package umc.th.juinjang.model.entity.enums; +package umc.th.juinjang.model.dto.limjang.enums; -public enum LimjangSort { +public enum LimjangSortOptions { UPDATED("UPDATED"), CREATED("CREATED"), STAR("STAR"); private final String value; - LimjangSort(String value) { + LimjangSortOptions(String value) { this.value = value; } diff --git a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangDeleteRequestDTO.java b/src/main/java/umc/th/juinjang/model/dto/limjang/request/LimjangDeleteRequestDTO.java similarity index 81% rename from src/main/java/umc/th/juinjang/model/dto/limjang/LimjangDeleteRequestDTO.java rename to src/main/java/umc/th/juinjang/model/dto/limjang/request/LimjangDeleteRequestDTO.java index b4e8271..cb4ff1a 100644 --- a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangDeleteRequestDTO.java +++ b/src/main/java/umc/th/juinjang/model/dto/limjang/request/LimjangDeleteRequestDTO.java @@ -1,4 +1,4 @@ -package umc.th.juinjang.model.dto.limjang; +package umc.th.juinjang.model.dto.limjang.request; import jakarta.validation.constraints.NotEmpty; import java.util.List; diff --git a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangPostRequestDTO.java b/src/main/java/umc/th/juinjang/model/dto/limjang/request/LimjangPostRequestDTO.java similarity index 92% rename from src/main/java/umc/th/juinjang/model/dto/limjang/LimjangPostRequestDTO.java rename to src/main/java/umc/th/juinjang/model/dto/limjang/request/LimjangPostRequestDTO.java index 5039788..d8bea39 100644 --- a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangPostRequestDTO.java +++ b/src/main/java/umc/th/juinjang/model/dto/limjang/request/LimjangPostRequestDTO.java @@ -1,4 +1,4 @@ -package umc.th.juinjang.model.dto.limjang; +package umc.th.juinjang.model.dto.limjang.request; import jakarta.validation.constraints.*; import java.util.List; diff --git a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangUpdateRequestDTO.java b/src/main/java/umc/th/juinjang/model/dto/limjang/request/LimjangUpdateRequestDTO.java similarity index 93% rename from src/main/java/umc/th/juinjang/model/dto/limjang/LimjangUpdateRequestDTO.java rename to src/main/java/umc/th/juinjang/model/dto/limjang/request/LimjangUpdateRequestDTO.java index c745226..2ec11c8 100644 --- a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangUpdateRequestDTO.java +++ b/src/main/java/umc/th/juinjang/model/dto/limjang/request/LimjangUpdateRequestDTO.java @@ -1,4 +1,4 @@ -package umc.th.juinjang.model.dto.limjang; +package umc.th.juinjang.model.dto.limjang.request; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; diff --git a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangDetailResponseDTO.java b/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangDetailResponseDTO.java similarity index 93% rename from src/main/java/umc/th/juinjang/model/dto/limjang/LimjangDetailResponseDTO.java rename to src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangDetailResponseDTO.java index 10d69d1..7863cf2 100644 --- a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangDetailResponseDTO.java +++ b/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangDetailResponseDTO.java @@ -1,4 +1,4 @@ -package umc.th.juinjang.model.dto.limjang; +package umc.th.juinjang.model.dto.limjang.response; import java.time.LocalDateTime; import java.util.List; diff --git a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangMemoResponseDTO.java b/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangMemoResponseDTO.java similarity index 89% rename from src/main/java/umc/th/juinjang/model/dto/limjang/LimjangMemoResponseDTO.java rename to src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangMemoResponseDTO.java index 64fcaf1..5ddf3df 100644 --- a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangMemoResponseDTO.java +++ b/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangMemoResponseDTO.java @@ -1,4 +1,4 @@ -package umc.th.juinjang.model.dto.limjang; +package umc.th.juinjang.model.dto.limjang.response; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangPostResponseDTO.java b/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangPostResponseDTO.java similarity index 89% rename from src/main/java/umc/th/juinjang/model/dto/limjang/LimjangPostResponseDTO.java rename to src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangPostResponseDTO.java index db72fc6..3780c46 100644 --- a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangPostResponseDTO.java +++ b/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangPostResponseDTO.java @@ -1,4 +1,4 @@ -package umc.th.juinjang.model.dto.limjang; +package umc.th.juinjang.model.dto.limjang.response; import java.time.LocalDateTime; import lombok.AllArgsConstructor; diff --git a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangTotalListResponseDTO.java b/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangTotalListResponseDTO.java similarity index 71% rename from src/main/java/umc/th/juinjang/model/dto/limjang/LimjangTotalListResponseDTO.java rename to src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangTotalListResponseDTO.java index 7886443..4264fc3 100644 --- a/src/main/java/umc/th/juinjang/model/dto/limjang/LimjangTotalListResponseDTO.java +++ b/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangTotalListResponseDTO.java @@ -1,12 +1,10 @@ -package umc.th.juinjang.model.dto.limjang; +package umc.th.juinjang.model.dto.limjang.response; -import java.time.LocalDateTime; import java.util.List; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import umc.th.juinjang.model.dto.limjang.LimjangMainViewListResponsetDTO.ListDto; public class LimjangTotalListResponseDTO { @@ -15,10 +13,7 @@ public class LimjangTotalListResponseDTO { @NoArgsConstructor @AllArgsConstructor public static class TotalListDto { - private List limjangList; -// private List notScrapedList; - } @Builder @@ -35,8 +30,5 @@ public static class LimjangListDto { private List priceList; private String totalAverage; private String address; -// private LocalDateTime createdAt; -// private LocalDateTime updatedAt; } - } diff --git a/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangsGetResponse.java b/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangsGetResponse.java new file mode 100644 index 0000000..e7934a9 --- /dev/null +++ b/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangsGetResponse.java @@ -0,0 +1,31 @@ +package umc.th.juinjang.model.dto.limjang.response; + +import java.util.List; +import lombok.Builder; +import umc.th.juinjang.converter.limjang.LimjangsGetResponseConverter; +import umc.th.juinjang.model.entity.Limjang; +import umc.th.juinjang.model.entity.LimjangPrice; + +public record LimjangsGetResponse( + List limjangList +) { + @Builder + public record LimjangsResponse( + long limjangId, + List images, + int purposeCode, + boolean isScraped, + String nickname, + int priceType, + List priceList, + String totalAverage, + String address) { + public static LimjangsResponse of(Limjang limjang, LimjangPrice limjangPrice) { + return LimjangsGetResponseConverter.convertToLimjangsResponse(limjang, limjangPrice); + } + } + + public static LimjangsGetResponse of(final List limjangList) { + return new LimjangsGetResponse(limjangList.stream().map(limjang -> LimjangsResponse.of(limjang, limjang.getLimjangPrice())).toList()); + } +} diff --git a/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangsMainGetResponse.java b/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangsMainGetResponse.java new file mode 100644 index 0000000..86e286e --- /dev/null +++ b/src/main/java/umc/th/juinjang/model/dto/limjang/response/LimjangsMainGetResponse.java @@ -0,0 +1,26 @@ +package umc.th.juinjang.model.dto.limjang.response; + +import java.util.List; +import umc.th.juinjang.converter.limjang.LimjangsMainGetResponseConverter; +import umc.th.juinjang.model.entity.Limjang; + +public record LimjangsMainGetResponse( + List recentUpdatedList +) { + public record LimjangMainResponse( + long limjangId, + String image, + String nickname, + String price, + String totalAverage, + String address + ) { + public static LimjangMainResponse of(final Limjang limjang) { + return LimjangsMainGetResponseConverter.toLimjangMainResponse(limjang); + } + } + + public static LimjangsMainGetResponse of(final List limjangs) { + return new LimjangsMainGetResponse(limjangs.stream().map(LimjangMainResponse::of).toList()); + } +} \ No newline at end of file diff --git a/src/main/java/umc/th/juinjang/model/entity/Report.java b/src/main/java/umc/th/juinjang/model/entity/Report.java index 84381a5..c1e5274 100644 --- a/src/main/java/umc/th/juinjang/model/entity/Report.java +++ b/src/main/java/umc/th/juinjang/model/entity/Report.java @@ -50,8 +50,4 @@ public class Report extends BaseEntity { @Column(nullable = false) private Float totalRate; - - // ================ 이거 점검해주세요 - - } diff --git a/src/main/java/umc/th/juinjang/model/entity/Scrap.java b/src/main/java/umc/th/juinjang/model/entity/Scrap.java index 4891bf2..3621a41 100644 --- a/src/main/java/umc/th/juinjang/model/entity/Scrap.java +++ b/src/main/java/umc/th/juinjang/model/entity/Scrap.java @@ -9,7 +9,6 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToOne; -import jakarta.validation.constraints.NotNull; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; diff --git a/src/main/java/umc/th/juinjang/repository/limjang/LimjangQueryDslRepository.java b/src/main/java/umc/th/juinjang/repository/limjang/LimjangQueryDslRepository.java index ceb30c2..6ece740 100644 --- a/src/main/java/umc/th/juinjang/repository/limjang/LimjangQueryDslRepository.java +++ b/src/main/java/umc/th/juinjang/repository/limjang/LimjangQueryDslRepository.java @@ -1,6 +1,8 @@ package umc.th.juinjang.repository.limjang; import java.util.List; +import org.springframework.data.domain.Pageable; +import umc.th.juinjang.model.dto.limjang.enums.LimjangSortOptions; import umc.th.juinjang.model.entity.Limjang; import umc.th.juinjang.model.entity.Member; @@ -15,4 +17,6 @@ public interface LimjangQueryDslRepository { Limjang findByIdWithLimjangPrice(long memberId, long limjangId); List findAllLimjangs(Member member); + + List findAllByMemberAndOrderByParam(Member member, LimjangSortOptions sort); } diff --git a/src/main/java/umc/th/juinjang/repository/limjang/LimjangQueryDslRepositoryImpl.java b/src/main/java/umc/th/juinjang/repository/limjang/LimjangQueryDslRepositoryImpl.java index e73693b..3b4d7b9 100644 --- a/src/main/java/umc/th/juinjang/repository/limjang/LimjangQueryDslRepositoryImpl.java +++ b/src/main/java/umc/th/juinjang/repository/limjang/LimjangQueryDslRepositoryImpl.java @@ -1,5 +1,6 @@ package umc.th.juinjang.repository.limjang; +import static com.querydsl.core.types.Order.DESC; import static umc.th.juinjang.model.entity.QImage.image; import static umc.th.juinjang.model.entity.QLimjang.limjang; import static umc.th.juinjang.model.entity.QLimjangPrice.limjangPrice; @@ -7,15 +8,21 @@ import static umc.th.juinjang.model.entity.QScrap.scrap; import static com.querydsl.core.group.GroupBy.list; +import com.querydsl.core.types.Order; +import com.querydsl.core.types.OrderSpecifier; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.Expressions; import com.querydsl.core.types.dsl.StringExpression; import com.querydsl.jpa.JPQLTemplates; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; +import java.util.ArrayList; import java.util.List; +import org.springframework.data.domain.Pageable; +import umc.th.juinjang.model.dto.limjang.enums.LimjangSortOptions; import umc.th.juinjang.model.entity.Limjang; import umc.th.juinjang.model.entity.Member; +import umc.th.juinjang.model.entity.QReport; public class LimjangQueryDslRepositoryImpl implements LimjangQueryDslRepository { private final JPAQueryFactory queryFactory; @@ -55,6 +62,31 @@ public Limjang findByIdWithLimjangPrice(long memberId, long limjangId) { .fetchOne(); } + public List findAllByMemberAndOrderByParam(Member member, LimjangSortOptions sort) { + return queryFactory + .selectFrom(limjang) + .join(limjang.limjangPrice, limjangPrice).fetchJoin() + .leftJoin(limjang.report, report).fetchJoin() + .leftJoin(limjang.scrap, scrap).fetchJoin() + .where(limjang.memberId.eq(member)) + .orderBy(getOrderByLimjangSortOptions(sort)) + .fetch(); + } + + private OrderSpecifier[] getOrderByLimjangSortOptions(LimjangSortOptions sort) { + List orders = new ArrayList<>(); + switch (sort) { + case UPDATED -> orders.add(new OrderSpecifier(DESC, limjang.updatedAt)); + case STAR -> { + orders.add(new OrderSpecifier<>(DESC, report.totalRate.coalesce(0f), OrderSpecifier.NullHandling.NullsLast)); + orders.add(new OrderSpecifier<>(DESC, limjang.createdAt)); + } + case CREATED -> new OrderSpecifier<>(DESC, limjang.createdAt); + } + + return orders.toArray(new OrderSpecifier[orders.size()]); + } + private BooleanExpression keywordOf(BooleanExpression... conditions) { BooleanExpression result = null; for (BooleanExpression condition : conditions) { @@ -69,13 +101,10 @@ private StringExpression removeBlank(StringExpression origin) { @Override public List findMainScreenContentsLimjang(Member member) { - return queryFactory .selectFrom(limjang) .leftJoin(limjang.report, report).fetchJoin() - .leftJoin(limjang.scrap, scrap).fetchJoin() - .leftJoin(limjang.limjangPrice, limjangPrice).fetchJoin() - .leftJoin(limjang.imageList, image).fetchJoin() + .join(limjang.limjangPrice, limjangPrice).fetchJoin() .where(limjang.memberId.eq(member)) .orderBy(limjang.updatedAt.desc()) .limit(5) diff --git a/src/main/java/umc/th/juinjang/service/ImageService/ImageQueryService.java b/src/main/java/umc/th/juinjang/service/ImageService/ImageQueryService.java index b20736d..2164c52 100644 --- a/src/main/java/umc/th/juinjang/service/ImageService/ImageQueryService.java +++ b/src/main/java/umc/th/juinjang/service/ImageService/ImageQueryService.java @@ -1,10 +1,6 @@ package umc.th.juinjang.service.ImageService; -import java.util.List; import umc.th.juinjang.model.dto.image.ImageListResponseDTO; -import umc.th.juinjang.model.dto.limjang.LimjangDetailResponseDTO; -import umc.th.juinjang.model.dto.limjang.LimjangMainViewListResponsetDTO; -import umc.th.juinjang.model.dto.limjang.LimjangTotalListResponseDTO; public interface ImageQueryService { ImageListResponseDTO.ImagesListDTO getImageList(Long limjangId); diff --git a/src/main/java/umc/th/juinjang/service/LimjangService/LimjangCommandService.java b/src/main/java/umc/th/juinjang/service/LimjangService/LimjangCommandService.java index de7aee3..013bd49 100644 --- a/src/main/java/umc/th/juinjang/service/LimjangService/LimjangCommandService.java +++ b/src/main/java/umc/th/juinjang/service/LimjangService/LimjangCommandService.java @@ -1,10 +1,8 @@ package umc.th.juinjang.service.LimjangService; -import java.util.List; -import umc.th.juinjang.model.dto.limjang.LimjangDeleteRequestDTO; -import umc.th.juinjang.model.dto.limjang.LimjangPostRequestDTO; -import umc.th.juinjang.model.dto.limjang.LimjangUpdateRequestDTO; -import umc.th.juinjang.model.dto.limjang.LimjangUpdateRequestDTO.UpdateDto; +import umc.th.juinjang.model.dto.limjang.request.LimjangDeleteRequestDTO; +import umc.th.juinjang.model.dto.limjang.request.LimjangPostRequestDTO; +import umc.th.juinjang.model.dto.limjang.request.LimjangUpdateRequestDTO; import umc.th.juinjang.model.entity.Limjang; import umc.th.juinjang.model.entity.Member; diff --git a/src/main/java/umc/th/juinjang/service/LimjangService/LimjangCommandServiceImpl.java b/src/main/java/umc/th/juinjang/service/LimjangService/LimjangCommandServiceImpl.java index a10626a..d5fd407 100644 --- a/src/main/java/umc/th/juinjang/service/LimjangService/LimjangCommandServiceImpl.java +++ b/src/main/java/umc/th/juinjang/service/LimjangService/LimjangCommandServiceImpl.java @@ -15,9 +15,9 @@ import umc.th.juinjang.apiPayload.exception.handler.MemberHandler; import umc.th.juinjang.converter.limjang.LimjangPostConverter; import umc.th.juinjang.converter.limjang.LimjangUpdateConverter; -import umc.th.juinjang.model.dto.limjang.LimjangDeleteRequestDTO; -import umc.th.juinjang.model.dto.limjang.LimjangPostRequestDTO.PostDto; -import umc.th.juinjang.model.dto.limjang.LimjangUpdateRequestDTO; +import umc.th.juinjang.model.dto.limjang.request.LimjangDeleteRequestDTO; +import umc.th.juinjang.model.dto.limjang.request.LimjangPostRequestDTO.PostDto; +import umc.th.juinjang.model.dto.limjang.request.LimjangUpdateRequestDTO; import umc.th.juinjang.model.entity.Limjang; import umc.th.juinjang.model.entity.LimjangPrice; import umc.th.juinjang.model.entity.Member; diff --git a/src/main/java/umc/th/juinjang/service/LimjangService/LimjangQueryService.java b/src/main/java/umc/th/juinjang/service/LimjangService/LimjangQueryService.java index 0355be0..d626823 100644 --- a/src/main/java/umc/th/juinjang/service/LimjangService/LimjangQueryService.java +++ b/src/main/java/umc/th/juinjang/service/LimjangService/LimjangQueryService.java @@ -1,17 +1,18 @@ package umc.th.juinjang.service.LimjangService; -import java.util.List; -import umc.th.juinjang.model.dto.limjang.LimjangDetailResponseDTO; -import umc.th.juinjang.model.dto.limjang.LimjangMainViewListResponsetDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangDetailResponseDTO; -import umc.th.juinjang.model.dto.limjang.LimjangTotalListResponseDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangTotalListResponseDTO; +import umc.th.juinjang.model.dto.limjang.enums.LimjangSortOptions; +import umc.th.juinjang.model.dto.limjang.response.LimjangsGetResponse; +import umc.th.juinjang.model.dto.limjang.response.LimjangsMainGetResponse; import umc.th.juinjang.model.entity.Member; public interface LimjangQueryService { - LimjangTotalListResponseDTO.TotalListDto getLimjangTotalList(Member member, String sort); + LimjangsGetResponse getLimjangTotalList(Member member, LimjangSortOptions sort); - List getLimjangMainList(Member member); + LimjangsMainGetResponse getLimjangsMain(Member member); LimjangTotalListResponseDTO.TotalListDto getLimjangSearchList(Member member, String keyword); diff --git a/src/main/java/umc/th/juinjang/service/LimjangService/LimjangQueryServiceImpl.java b/src/main/java/umc/th/juinjang/service/LimjangService/LimjangQueryServiceImpl.java index b8123c0..9ada514 100644 --- a/src/main/java/umc/th/juinjang/service/LimjangService/LimjangQueryServiceImpl.java +++ b/src/main/java/umc/th/juinjang/service/LimjangService/LimjangQueryServiceImpl.java @@ -1,7 +1,5 @@ package umc.th.juinjang.service.LimjangService; -import java.util.ArrayList; -import java.util.Comparator; import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -11,15 +9,14 @@ import umc.th.juinjang.apiPayload.exception.handler.LimjangHandler; import umc.th.juinjang.apiPayload.exception.handler.MemberHandler; import umc.th.juinjang.converter.limjang.LimjangDetailConverter; -import umc.th.juinjang.converter.limjang.LimjangMainListConverter; import umc.th.juinjang.converter.limjang.LimjangTotalListConverter; -import umc.th.juinjang.model.dto.limjang.LimjangDetailResponseDTO.DetailDto; -import umc.th.juinjang.model.dto.limjang.LimjangMainViewListResponsetDTO; -import umc.th.juinjang.model.dto.limjang.LimjangTotalListResponseDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangDetailResponseDTO.DetailDto; +import umc.th.juinjang.model.dto.limjang.response.LimjangTotalListResponseDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangsGetResponse; +import umc.th.juinjang.model.dto.limjang.response.LimjangsMainGetResponse; import umc.th.juinjang.model.entity.Limjang; import umc.th.juinjang.model.entity.Member; -import umc.th.juinjang.model.entity.enums.LimjangSort; -import umc.th.juinjang.repository.checklist.ReportRepository; +import umc.th.juinjang.model.dto.limjang.enums.LimjangSortOptions; import umc.th.juinjang.repository.limjang.LimjangRepository; import umc.th.juinjang.repository.limjang.MemberRepository; @@ -30,67 +27,17 @@ public class LimjangQueryServiceImpl implements LimjangQueryService{ private final LimjangRepository limjangRepository; private final MemberRepository memberRepository; - private final ReportRepository reportRepository; @Override @Transactional(readOnly = true) - public LimjangTotalListResponseDTO.TotalListDto getLimjangTotalList( - Member member, String sort) { - - - System.out.println("임장 전체 조회 API Service"); - - // 멤버 찾기 - Member findMember = memberRepository.findById(member.getMemberId()).orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); - System.out.println("찾은 멤버의 id: "+findMember.getMemberId()); - - LimjangSort requestSort; - try{ - requestSort = LimjangSort.valueOf(sort); - }catch (IllegalArgumentException e){ - System.out.println("지정되지 않은 정렬 유형."); - throw new LimjangHandler(ErrorStatus.LIMJANG_REQUEST_SORT_ERROR); - } - - // 멤버가 가지고있는 모든 글 - List findLimjangList = limjangRepository.findAllLimjangs(member); - - List sortedLimjangList = new ArrayList<>(); - switch (requestSort) { - case UPDATED: - sortedLimjangList = findLimjangList.stream() - .sorted(Comparator.comparing(Limjang::getUpdatedAt).reversed()).toList(); - break; - case CREATED: - sortedLimjangList = findLimjangList.stream() - .sorted(Comparator.comparing(Limjang::getCreatedAt).reversed()).toList(); - break; - case STAR : - sortedLimjangList = findLimjangList.stream() - .sorted(Comparator.comparing(limjang -> limjang.getReport() != null ? limjang.getReport().getTotalRate() : null, - Comparator.nullsLast(Comparator.reverseOrder()))) - .toList(); - break; - } - - return LimjangTotalListConverter.toLimjangTotalList(sortedLimjangList); + public LimjangsGetResponse getLimjangTotalList(Member member, LimjangSortOptions sort) { + return LimjangsGetResponse.of(limjangRepository.findAllByMemberAndOrderByParam(findMemberById(member), sort)); } @Override @Transactional(readOnly = true) - public List getLimjangMainList(Member member) { - System.out.println("임장 메인화면 조회 API Service, 첫번째 줄"); - // 멤버 찾기 - Member findMember = memberRepository.findById(member.getMemberId()) - .orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); - - // 임장 찾는다 - System.out.println("임장 메인화면 조회 API Service, 멤버 찾음" +findMember.getMemberId()); -// return limjangRepository.findTop5ByMemberIdOrderByUpdatedAtDesc(findMember) -// .stream().map(limjang -> LimjangMainListConverter.toLimjangList(limjang, limjang.getPriceId())).toList(); - - return limjangRepository.findMainScreenContentsLimjang(findMember) - .stream().map(limjang -> LimjangMainListConverter.toLimjangList(limjang, limjang.getLimjangPrice())).toList(); + public LimjangsMainGetResponse getLimjangsMain(final Member member) { + return LimjangsMainGetResponse.of(limjangRepository.findMainScreenContentsLimjang(findMemberById(member))); } @Override @@ -114,4 +61,8 @@ public DetailDto getLimjangDetail(Long limjangId) { return LimjangDetailConverter.toDetail(findLimjang, findLimjang.getLimjangPrice()); } + + private Member findMemberById(Member member) { + return memberRepository.findById(member.getMemberId()).orElseThrow(() -> new MemberHandler(ErrorStatus.MEMBER_NOT_FOUND)); + } } diff --git a/src/main/java/umc/th/juinjang/service/auth/OAuthService.java b/src/main/java/umc/th/juinjang/service/auth/OAuthService.java index f0e8926..4b74ec1 100644 --- a/src/main/java/umc/th/juinjang/service/auth/OAuthService.java +++ b/src/main/java/umc/th/juinjang/service/auth/OAuthService.java @@ -1,5 +1,5 @@ package umc.th.juinjang.service.auth; -import com.fasterxml.jackson.core.JsonProcessingException; + import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -8,9 +8,10 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.transaction.annotation.Transactional; import umc.th.juinjang.apiPayload.ExceptionHandler; -import umc.th.juinjang.apiPayload.code.status.ErrorStatus; +import umc.th.juinjang.apiPayload.code.status.SuccessStatus; import umc.th.juinjang.apiPayload.exception.handler.MemberHandler; import umc.th.juinjang.controller.KakaoUnlinkClient; +import umc.th.juinjang.external.discord.DiscordAlertProvider; import umc.th.juinjang.model.dto.auth.LoginResponseDto; import umc.th.juinjang.model.dto.auth.TokenDto; import umc.th.juinjang.model.dto.auth.apple.*; @@ -21,10 +22,6 @@ import umc.th.juinjang.repository.limjang.MemberRepository; import umc.th.juinjang.service.JwtService; -import javax.naming.AuthenticationException; -import java.io.IOException; -import java.security.NoSuchAlgorithmException; -import java.security.spec.InvalidKeySpecException; import java.time.LocalDateTime; import java.util.Optional; @@ -39,6 +36,7 @@ public class OAuthService { private final JwtService jwtService; private final AppleClientSecretGenerator appleClientSecretGenerator; private final AppleOAuthProvider appleOAuthProvider; + private final DiscordAlertProvider discordAlertProvider; @Autowired private KakaoUnlinkClient kakaoUnlinkClient; @@ -131,6 +129,7 @@ public LoginResponseDto kakaoSignUp (Long targetId, KakaoSignUpRequestDto kakaoS } // accessToken, refreshToken 발급 후 반환 + discordAlertProvider.sendAlert(SuccessStatus.DISCORD_ALERT_SIGN_IN); return createToken(member); } @@ -278,6 +277,8 @@ public LoginResponseDto appleSignUp(AppleSignUpRequestDto appleSignUpRequestDto) // accessToken, refreshToken 발급 if(member == null) throw new MemberHandler(FAILED_TO_LOGIN); + + discordAlertProvider.sendAlert(SuccessStatus.DISCORD_ALERT_SIGN_IN); return createToken(member); } diff --git a/src/main/java/umc/th/juinjang/service/recordService/RecordService.java b/src/main/java/umc/th/juinjang/service/recordService/RecordService.java index 119af4c..f1fc66a 100644 --- a/src/main/java/umc/th/juinjang/service/recordService/RecordService.java +++ b/src/main/java/umc/th/juinjang/service/recordService/RecordService.java @@ -3,7 +3,6 @@ import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.ObjectMetadata; import lombok.RequiredArgsConstructor; -import lombok.extern.java.Log; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -14,7 +13,7 @@ import umc.th.juinjang.apiPayload.exception.handler.LimjangHandler; import umc.th.juinjang.converter.record.LimjangMemoConverter; import umc.th.juinjang.converter.record.RecordConverter; -import umc.th.juinjang.model.dto.limjang.LimjangMemoResponseDTO; +import umc.th.juinjang.model.dto.limjang.response.LimjangMemoResponseDTO; import umc.th.juinjang.model.dto.record.RecordRequestDTO; import umc.th.juinjang.model.dto.record.RecordResponseDTO; import umc.th.juinjang.model.entity.Limjang; @@ -25,8 +24,6 @@ import java.io.FileNotFoundException; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.UUID; diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..eb6ceac --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,13 @@ +--- + +spring: + profiles: + active: dev + +--- + +spring: + profiles: + active: prod + +--- \ No newline at end of file