From 0595a7497aaf09e542ad099695a5cb79f89a2d82 Mon Sep 17 00:00:00 2001 From: min9805 <56664567+min9805@users.noreply.github.com> Date: Mon, 19 Aug 2024 18:42:04 +0900 Subject: [PATCH] Release/v1.1.0 (#171) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * Release/v1.0.3 commit 34bb96bb73bffe6165f59579142bcf862144be3a Author: min9805 Date: Fri Aug 9 11:36:13 2024 +0900 feat: cors 와이드카드 설정 commit 21fc9a590a5fbe90a65f22c03cf8ca48682f776b Author: min9805 Date: Fri Aug 9 11:36:02 2024 +0900 feat: build 시 test active 설정 commit 7cc569ed5a23fd857bbe06814eae035be4f66529 Merge: 7b3bf77 44b068c Author: min9805 Date: Fri Aug 9 11:29:34 2024 +0900 Merge branch 'master' into release/v1.0.3 # Conflicts: # gradle.properties # src/test/java/com/hyundai/softeer/backend/domain/expectation/repository/ExpectationRepositoryTest.java # src/test/resources/sql/integration.sql commit 7b3bf77a8d9337d8392f614061e6512e3086d141 Author: min9805 Date: Fri Aug 9 11:24:40 2024 +0900 feat: API Path 수정 commit 1346467f6f0af906cec8f04553e7d1fb7a1ad336 Author: min9805 Date: Fri Aug 9 11:22:23 2024 +0900 feat: Log Permission Error commit 7f02308d5408a200e5b766d17b881223911e36ff Merge: 5db777b 1771b59 Author: mjmj Date: Fri Aug 9 10:10:02 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 1771b5960e96d7e3a529328ebb42242e058929cf Author: mjmj Date: Fri Aug 9 10:09:48 2024 +0900 fix: 테스트 yml 추가 commit 5db777b8bb8d822299fc12e9fa627b3446057e6c Merge: 913af8e b5564cc Author: mjmj Date: Fri Aug 9 02:04:36 2024 +0900 Merge branch 'release/v1.0.3' into dev commit b5564cc72e29d5da6e660761451bea197cf85676 Author: mjmj Date: Fri Aug 9 02:03:59 2024 +0900 fix: base64 적용 해제 commit 913af8e12a1ecba585293c762ce48156fd63ec42 Merge: 8f40eb0 4afe625 Author: mjmj Date: Fri Aug 9 02:01:11 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 4afe625b9a1604ed5935cbdb0043a0ffe801b50f Author: mjmj Date: Fri Aug 9 02:00:40 2024 +0900 fix: base64 적용 commit 8f40eb01508eb70bf568258f8e229af7226cadc0 Merge: cf2a476 9839ded Author: mjmj Date: Fri Aug 9 01:08:27 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 9839dedd91e6b84cff1a74f60fc0052cf569df67 Author: mjmj Date: Fri Aug 9 01:08:12 2024 +0900 feat: cicd에서 테스트 파일을 읽도록 수정 commit cf2a476229cd11d83f3d2bd4c5d9cb5bf2934a36 Merge: cfb648f 907bd62 Author: mjmj Date: Fri Aug 9 00:54:34 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 907bd62e9e13fa34819d3ea8b599db9906593a8c Author: mjmj Date: Fri Aug 9 00:54:12 2024 +0900 chore: 버전 1.0.3 설정 commit 43f9bc77734d8d442af9f29cb51a99d4964b4282 Author: mjmj Date: Fri Aug 9 00:52:42 2024 +0900 fix: shared_url unique key 위반 해결 commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * 드로잉 게임 정보 API 생성했습니다. (#115) * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * fix: repositoryTest 삭제 * feat: drawing 엔티티 변경 (#93) * feat: 드로잉 게임을 위한 이미지 반환 타입 지정 (#93) * test: Drawing Repository 테스트 작성 및 SQL 문 최신화 (#93) * test: 드로잉 게임 정보 조회 Service 테스트 코드 작성 (#93) * feat: 게임 정보 조회 API 생성 및 문서화 (#93) * feat: 반환값 변경으로 인한 DTO 변경 (#93) * feat: 데이터 요청사항 변경으로 Dto 변경 (#93) * feat: integration-h2.sql 문 최신화 (#93) --------- Co-authored-by: mjmj * Fix/#114 v1.0.3 bugs (#116) * feat: JWT UserNot Found 시 예외 처리 (#114) * feat: 로그인 처리에서 JwtException 으로 처리 (#114) * feat: Email or Phone 으로 조회하는 메서드 추가 (#114) * test: Email, Phone 조회 테스트 코드 작성 (#114) * feat: 이메일, 전화번호 확인 로직 추가 (#114) * feat: firstcome 오타 수정 (#114) * feat: quiz 엔티티 이름 drawing 과 통일 (#114) * feat: 랜딩 페이지 별도 분리 및 화이트리스트 적용 (#114) * feat: Controller 단 Valid, event_id 설정 및 DTO 전달 (#114) * feat: import 정리 (#114) * Release v1.0.4 commit 92b5f1797b485d74c492536443e1793c97d9cd39 Author: min9805 Date: Fri Aug 9 20:44:40 2024 +0900 test: Test 코드 변경 commit d4d692b2ca862b3497482dcfc782a39ddacf989e Author: min9805 Date: Fri Aug 9 20:37:07 2024 +0900 feat: 이름 변경 commit 6dd36d023903103b875cc1627a42a68b74556acb Merge: 2db0aa7 679277e Author: min9805 Date: Fri Aug 9 20:35:45 2024 +0900 Merge branch 'master' into release/v1.0.4 # Conflicts: # .github/workflows/gradle-publish.yml # gradle.properties # src/main/java/com/hyundai/softeer/backend/domain/event/dto/ApiKeyRequest.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/controller/SharedUrlController.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/service/EventUserService.java # src/main/java/com/hyundai/softeer/backend/domain/expectation/controller/ExpectationController.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/controller/QuizFirstComeController.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizRequest.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeService.java # src/main/java/com/hyundai/softeer/backend/domain/firstcomeevent/quiz/dto/QuizSubmitRequest.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/controller/DrawingLotteryController.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryService.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/service/LotteryService.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/controller/SubEventController.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/dto/SubEventRequest.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/service/SubEventService.java # src/main/java/com/hyundai/softeer/backend/global/filter/JwtAuthorizationFilter.java # src/test/java/com/hyundai/softeer/backend/domain/eventuser/repository/EventUserRepositoryTest.java # src/test/java/com/hyundai/softeer/backend/domain/expectation/repository/ExpectationRepositoryTest.java # src/test/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryServiceTest.java # src/test/java/com/hyundai/softeer/backend/domain/subevent/service/SubEventServiceTest.java # src/test/resources/sql/integration-h2.sql # src/test/resources/sql/integration.sql commit 2db0aa7852007040626351b3083ec4c0947437c9 Author: min9805 Date: Fri Aug 9 20:31:51 2024 +0900 feat: v1.0.4 commit 679277edd7a9a747c910cb8d91972c390c564e33 Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Fri Aug 9 11:39:51 2024 +0900 Release/v1.0.3 (#113) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * fix: shared_url unique key 위반 해결 * chore: 버전 1.0.3 설정 * feat: cicd에서 테스트 파일을 읽도록 수정 * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * feat: Log Permission Error * feat: API Path 수정 * feat: build 시 test active 설정 * feat: cors 와이드카드 설정 --------- Co-authored-by: mjmj <108040422+violet-mj@users.noreply.github.com> Co-authored-by: mjmj commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * 메인 랜딩페이지 api 작성 (#121) * feat: 메인 랜딩 페이지 이미지 url을 저장하는 컬럼 추가 * feat: 메인 랜딩 페이지 이미지 url을 저장하는 컬럼 추가 * feat: 메인 랜딩 페이지 화이트리스트 추가 * feat: 메인 랜딩 페이지 api 추가 * chore: 메인 랜딩 페이지 테스트 작성 * feat: 메인 랜딩 페이지 서비스 레이어 작성 * refactor: 도메인이 main인 것은 너무 추상적이다. main을 event 도메인으로 이동 * fix: @Value와 @NotNull과 같이 쓰는 것은 의미가 없음 * fix: any(Long.class)를 anyLong()으로 변경 * fix: Event의 event_registered_at은 created_at과 중복됨 * 드로잉 이벤트 채점 로직 추가합니다. (#125) * feat: 드로잉 추첨 이벤트 게임 제출 및 채점 API (#124) * feat: 정답 json 파싱을 위한 의존성 주입과 util 메서드 생성 (#124) * feat: 파싱 및 채점 후 반환 메서드 생성 (#124) * feat: 유클리드 거리 계산을 통한 점수 채점 (#124) * test: 점수 측정 테스트 코드 작성 (#124) * feat: 코사인 유사도를 통한 채점 로직 구현 (#124) * feat: 유클리드 점수 측정 범위 0~100 으로 제한 (#124) * test: 고득점과 저득점 테스트케이스 분리 (#124) * feat: example 설정 및 controller 연결 (#124) * feat: 프론트엔드 요청 사항으로 blur 이미지 함께 반환 (#124) * feat: n_차 게임 점수 저장 로직 추가 (#124) * test: 저장로직 추가로 인한 테스트 코드 변경 (#124) * feat: 총 점 계산 로직 (#124) * feat: ScoreCalculator 분리 (#124) * test: ScoreCalculator Spy 객체 주입 (#124) * feat: get 사용 로직 메서드 분리 (#124) * 드로잉 게임 시 횟수를 차감합니다. (#127) * feat: default 값, lastChargeAt 추가 및 updateLastVisitedAtAndLastChargeAt 메서드 추가 (#124) * feat: 로그인 사용자만 API 허용 (#124) * feat: 기회 차감 로직 생성 및 NoChanceUser 예외 처리 (#124) * test: 게임 Info 요청 시 게임 가능 횟수에 대한 테스트 코드 (#124) * test: 첫 참여 유저에 대한 테스트코드 작성 (#124) * feat: 플레이 타입에 따른 횟수 차감을 위한 Enum 생성 (#126) * feat: 이벤트 타입을 받기 위한 Dto 변경 (#126) * feat: UserDetailService Exception BaseException 으로 변경 (#126) * feat: 플레이 타입에 따른 update 분기 처리 (#126) * test: 플레이 타입에 따른 테스트코드 작성 (#126) * 중복 당첨자 검사할 수 있는 로직 추가 (#129) * fix: 중복 당첨자 검사 기능 추가 * fix: 중복 검사가 있을 때 Dto 템플릿 추가 * feat: 디버그 레벨에서 request(url, method) 기록 저장 * feat: findByUserIdAndSubEventId 추가 * 메인 랜딩 페이지 퀴즈 시작 시간 정보 제공 (#135) * feat: subEvent가 시작되었는지 여부를 나타내는 메서드 * fix: 퀴즈 시작 시간과 시작 여부를 알려주는 List 변수 작성 * fix: MainLandDto 수정에 따른 로직 수정 * feat: 시작 시간이 잘 응답하는지 확인 * feat: 시작 시간과 시작 여부를 담고 잇는 Dto 작성 * fix: 불필요한 코드 삭제 * fix: swagger example이 부적절하게 나와있는 것을 확인하고 수정 * v1.0.4 의 각종 버그들 정리했습니다. (#133) * #feat: Spring.log 파일 gitignore 추가 (#128) * feat: 공유 url 접근 시 공유 점수 추가 (#128) * feat: Tag 생성 및 컨트롤러 태그 삽입 (#128) * feat: 로그 파일 위치 변경 및 ignore 최신화 (#128) * feat: 설명과 상이한 부분 변경 (#128) * feat: 실제 당첨 이미지를 위한 엔티티 필드 추가 및 반환 값 변경 (#128) * feat: 랜딩 페이지 조회 시 subEvent 반환되도록 DTO 변경 (#128) * feat: deault 값 설정 (#128) * feat: 요구사항 변경으로 엔티티 및 DTO 변경 (#128) * feat: SQL 문 최신화 (#128) * Release v1.0.5 commit 32b991cebe0e49d54993f946fb87d9865dc51386 Merge: a5bddd7 99e81a2 Author: Mingyu Date: Wed Aug 14 17:32:39 2024 +0900 Merge branch 'master' into release/v1.0.5 # Conflicts: # build.gradle # gradle.properties # src/main/java/com/hyundai/softeer/backend/domain/event/entity/Event.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/controller/SharedUrlController.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/entity/EventUser.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/service/EventUserService.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/controller/QuizFirstComeController.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizFirstComeSubmitResponseDto.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeService.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/controller/DrawingLotteryController.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/dto/DrawingGameInfoDto.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/dto/DrawingInfoDtos.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/dto/PositionDto.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/entity/DrawingLotteryEvent.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/repository/DrawingLotteryRepository.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryService.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/controller/SubEventController.java # src/main/java/com/hyundai/softeer/backend/domain/winner/repository/WinnerRepository.java # src/main/java/com/hyundai/softeer/backend/global/config/SwaggerConfig.java # src/main/java/com/hyundai/softeer/backend/global/exception/error/JwtException.java # src/main/java/com/hyundai/softeer/backend/global/filter/JwtAuthorizationFilter.java # src/main/java/com/hyundai/softeer/backend/global/jwt/UserDetailService.java # src/main/java/com/hyundai/softeer/backend/global/utils/ParseUtil.java # src/main/resources/logback-spring.xml # src/main/resources/sql/integration.sql # src/test/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryServiceTest.java # src/test/java/com/hyundai/softeer/backend/global/utils/ParseUtilTest.java # src/test/resources/sql/integration-h2.sql # src/test/resources/sql/integration.sql commit a5bddd7b0a4a68148932ba7fa49bef2779736a50 Author: Mingyu Date: Wed Aug 14 17:29:44 2024 +0900 feat: versioning commit 99e81a2714978a7556a187f761bffb716411fedd Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Fri Aug 9 20:46:32 2024 +0900 Release/v1.0.4 (#119) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * Release/v1.0.3 commit 34bb96bb73bffe6165f59579142bcf862144be3a Author: min9805 Date: Fri Aug 9 11:36:13 2024 +0900 feat: cors 와이드카드 설정 commit 21fc9a590a5fbe90a65f22c03cf8ca48682f776b Author: min9805 Date: Fri Aug 9 11:36:02 2024 +0900 feat: build 시 test active 설정 commit 7cc569ed5a23fd857bbe06814eae035be4f66529 Merge: 7b3bf77 44b068c Author: min9805 Date: Fri Aug 9 11:29:34 2024 +0900 Merge branch 'master' into release/v1.0.3 # Conflicts: # gradle.properties # src/test/java/com/hyundai/softeer/backend/domain/expectation/repository/ExpectationRepositoryTest.java # src/test/resources/sql/integration.sql commit 7b3bf77a8d9337d8392f614061e6512e3086d141 Author: min9805 Date: Fri Aug 9 11:24:40 2024 +0900 feat: API Path 수정 commit 1346467f6f0af906cec8f04553e7d1fb7a1ad336 Author: min9805 Date: Fri Aug 9 11:22:23 2024 +0900 feat: Log Permission Error commit 7f02308d5408a200e5b766d17b881223911e36ff Merge: 5db777b 1771b59 Author: mjmj Date: Fri Aug 9 10:10:02 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 1771b5960e96d7e3a529328ebb42242e058929cf Author: mjmj Date: Fri Aug 9 10:09:48 2024 +0900 fix: 테스트 yml 추가 commit 5db777b8bb8d822299fc12e9fa627b3446057e6c Merge: 913af8e b5564cc Author: mjmj Date: Fri Aug 9 02:04:36 2024 +0900 Merge branch 'release/v1.0.3' into dev commit b5564cc72e29d5da6e660761451bea197cf85676 Author: mjmj Date: Fri Aug 9 02:03:59 2024 +0900 fix: base64 적용 해제 commit 913af8e12a1ecba585293c762ce48156fd63ec42 Merge: 8f40eb0 4afe625 Author: mjmj Date: Fri Aug 9 02:01:11 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 4afe625b9a1604ed5935cbdb0043a0ffe801b50f Author: mjmj Date: Fri Aug 9 02:00:40 2024 +0900 fix: base64 적용 commit 8f40eb01508eb70bf568258f8e229af7226cadc0 Merge: cf2a476 9839ded Author: mjmj Date: Fri Aug 9 01:08:27 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 9839dedd91e6b84cff1a74f60fc0052cf569df67 Author: mjmj Date: Fri Aug 9 01:08:12 2024 +0900 feat: cicd에서 테스트 파일을 읽도록 수정 commit cf2a476229cd11d83f3d2bd4c5d9cb5bf2934a36 Merge: cfb648f 907bd62 Author: mjmj Date: Fri Aug 9 00:54:34 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 907bd62e9e13fa34819d3ea8b599db9906593a8c Author: mjmj Date: Fri Aug 9 00:54:12 2024 +0900 chore: 버전 1.0.3 설정 commit 43f9bc77734d8d442af9f29cb51a99d4964b4282 Author: mjmj Date: Fri Aug 9 00:52:42 2024 +0900 fix: shared_url unique key 위반 해결 commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * 드로잉 게임 정보 API 생성했습니다. (#115) * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * fix: repositoryTest 삭제 * feat: drawing 엔티티 변경 (#93) * feat: 드로잉 게임을 위한 이미지 반환 타입 지정 (#93) * test: Drawing Repository 테스트 작성 및 SQL 문 최신화 (#93) * test: 드로잉 게임 정보 조회 Service 테스트 코드 작성 (#93) * feat: 게임 정보 조회 API 생성 및 문서화 (#93) * feat: 반환값 변경으로 인한 DTO 변경 (#93) * feat: 데이터 요청사항 변경으로 Dto 변경 (#93) * feat: integration-h2.sql 문 최신화 (#93) --------- Co-authored-by: mjmj * Fix/#114 v1.0.3 bugs (#116) * feat: JWT UserNot Found 시 예외 처리 (#114) * feat: 로그인 처리에서 JwtException 으로 처리 (#114) * feat: Email or Phone 으로 조회하는 메서드 추가 (#114) * test: Email, Phone 조회 테스트 코드 작성 (#114) * feat: 이메일, 전화번호 확인 로직 추가 (#114) * feat: firstcome 오타 수정 (#114) * feat: quiz 엔티티 이름 drawing 과 통일 (#114) * feat: 랜딩 페이지 별도 분리 및 화이트리스트 적용 (#114) * feat: Controller 단 Valid, event_id 설정 및 DTO 전달 (#114) * feat: import 정리 (#114) * feat: v1.0.4 * feat: 이름 변경 * test: Test 코드 변경 --------- Co-authored-by: mjmj <108040422+violet-mj@users.noreply.github.com> Co-authored-by: mjmj commit 679277edd7a9a747c910cb8d91972c390c564e33 Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Fri Aug 9 11:39:51 2024 +0900 Release/v1.0.3 (#113) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * fix: shared_url unique key 위반 해결 * chore: 버전 1.0.3 설정 * feat: cicd에서 테스트 파일을 읽도록 수정 * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * feat: Log Permission Error * feat: API Path 수정 * feat: build 시 test active 설정 * feat: cors 와이드카드 설정 --------- Co-authored-by: mjmj <108040422+violet-mj@users.noreply.github.com> Co-authored-by: mjmj commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * Hotfix/v1.0.5 commit b23278ef1e1b1a4b4fa4dd527f5c57524ac3eef4 Author: Mingyu Date: Wed Aug 14 18:33:00 2024 +0900 feat: 화이트리스트 최신화 commit 156d191b7715aedad6eb92a54a6fb0b02cfc5b93 Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Wed Aug 14 17:34:34 2024 +0900 Release/v1.0.5 (#138) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * Release/v1.0.3 commit 34bb96bb73bffe6165f59579142bcf862144be3a Author: min9805 Date: Fri Aug 9 11:36:13 2024 +0900 feat: cors 와이드카드 설정 commit 21fc9a590a5fbe90a65f22c03cf8ca48682f776b Author: min9805 Date: Fri Aug 9 11:36:02 2024 +0900 feat: build 시 test active 설정 commit 7cc569ed5a23fd857bbe06814eae035be4f66529 Merge: 7b3bf77 44b068c Author: min9805 Date: Fri Aug 9 11:29:34 2024 +0900 Merge branch 'master' into release/v1.0.3 # Conflicts: # gradle.properties # src/test/java/com/hyundai/softeer/backend/domain/expectation/repository/ExpectationRepositoryTest.java # src/test/resources/sql/integration.sql commit 7b3bf77a8d9337d8392f614061e6512e3086d141 Author: min9805 Date: Fri Aug 9 11:24:40 2024 +0900 feat: API Path 수정 commit 1346467f6f0af906cec8f04553e7d1fb7a1ad336 Author: min9805 Date: Fri Aug 9 11:22:23 2024 +0900 feat: Log Permission Error commit 7f02308d5408a200e5b766d17b881223911e36ff Merge: 5db777b 1771b59 Author: mjmj Date: Fri Aug 9 10:10:02 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 1771b5960e96d7e3a529328ebb42242e058929cf Author: mjmj Date: Fri Aug 9 10:09:48 2024 +0900 fix: 테스트 yml 추가 commit 5db777b8bb8d822299fc12e9fa627b3446057e6c Merge: 913af8e b5564cc Author: mjmj Date: Fri Aug 9 02:04:36 2024 +0900 Merge branch 'release/v1.0.3' into dev commit b5564cc72e29d5da6e660761451bea197cf85676 Author: mjmj Date: Fri Aug 9 02:03:59 2024 +0900 fix: base64 적용 해제 commit 913af8e12a1ecba585293c762ce48156fd63ec42 Merge: 8f40eb0 4afe625 Author: mjmj Date: Fri Aug 9 02:01:11 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 4afe625b9a1604ed5935cbdb0043a0ffe801b50f Author: mjmj Date: Fri Aug 9 02:00:40 2024 +0900 fix: base64 적용 commit 8f40eb01508eb70bf568258f8e229af7226cadc0 Merge: cf2a476 9839ded Author: mjmj Date: Fri Aug 9 01:08:27 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 9839dedd91e6b84cff1a74f60fc0052cf569df67 Author: mjmj Date: Fri Aug 9 01:08:12 2024 +0900 feat: cicd에서 테스트 파일을 읽도록 수정 commit cf2a476229cd11d83f3d2bd4c5d9cb5bf2934a36 Merge: cfb648f 907bd62 Author: mjmj Date: Fri Aug 9 00:54:34 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 907bd62e9e13fa34819d3ea8b599db9906593a8c Author: mjmj Date: Fri Aug 9 00:54:12 2024 +0900 chore: 버전 1.0.3 설정 commit 43f9bc77734d8d442af9f29cb51a99d4964b4282 Author: mjmj Date: Fri Aug 9 00:52:42 2024 +0900 fix: shared_url unique key 위반 해결 commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * 드로잉 게임 정보 API 생성했습니다. (#115) * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * fix: repositoryTest 삭제 * feat: drawing 엔티티 변경 (#93) * feat: 드로잉 게임을 위한 이미지 반환 타입 지정 (#93) * test: Drawing Repository 테스트 작성 및 SQL 문 최신화 (#93) * test: 드로잉 게임 정보 조회 Service 테스트 코드 작성 (#93) * feat: 게임 정보 조회 API 생성 및 문서화 (#93) * feat: 반환값 변경으로 인한 DTO 변경 (#93) * feat: 데이터 요청사항 변경으로 Dto 변경 (#93) * feat: integration-h2.sql 문 최신화 (#93) --------- Co-authored-by: mjmj * Fix/#114 v1.0.3 bugs (#116) * feat: JWT UserNot Found 시 예외 처리 (#114) * feat: 로그인 처리에서 JwtException 으로 처리 (#114) * feat: Email or Phone 으로 조회하는 메서드 추가 (#114) * test: Email, Phone 조회 테스트 코드 작성 (#114) * feat: 이메일, 전화번호 확인 로직 추가 (#114) * feat: firstcome 오타 수정 (#114) * feat: quiz 엔티티 이름 drawing 과 통일 (#114) * feat: 랜딩 페이지 별도 분리 및 화이트리스트 적용 (#114) * feat: Controller 단 Valid, event_id 설정 및 DTO 전달 (#114) * feat: import 정리 (#114) * Release v1.0.4 commit 92b5f1797b485d74c492536443e1793c97d9cd39 Author: min9805 Date: Fri Aug 9 20:44:40 2024 +0900 test: Test 코드 변경 commit d4d692b2ca862b3497482dcfc782a39ddacf989e Author: min9805 Date: Fri Aug 9 20:37:07 2024 +0900 feat: 이름 변경 commit 6dd36d023903103b875cc1627a42a68b74556acb Merge: 2db0aa7 679277e Author: min9805 Date: Fri Aug 9 20:35:45 2024 +0900 Merge branch 'master' into release/v1.0.4 # Conflicts: # .github/workflows/gradle-publish.yml # gradle.properties # src/main/java/com/hyundai/softeer/backend/domain/event/dto/ApiKeyRequest.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/controller/SharedUrlController.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/service/EventUserService.java # src/main/java/com/hyundai/softeer/backend/domain/expectation/controller/ExpectationController.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/controller/QuizFirstComeController.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizRequest.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeService.java # src/main/java/com/hyundai/softeer/backend/domain/firstcomeevent/quiz/dto/QuizSubmitRequest.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/controller/DrawingLotteryController.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryService.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/service/LotteryService.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/controller/SubEventController.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/dto/SubEventRequest.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/service/SubEventService.java # src/main/java/com/hyundai/softeer/backend/global/filter/JwtAuthorizationFilter.java # src/test/java/com/hyundai/softeer/backend/domain/eventuser/repository/EventUserRepositoryTest.java # src/test/java/com/hyundai/softeer/backend/domain/expectation/repository/ExpectationRepositoryTest.java # src/test/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryServiceTest.java # src/test/java/com/hyundai/softeer/backend/domain/subevent/service/SubEventServiceTest.java # src/test/resources/sql/integration-h2.sql # src/test/resources/sql/integration.sql commit 2db0aa7852007040626351b3083ec4c0947437c9 Author: min9805 Date: Fri Aug 9 20:31:51 2024 +0900 feat: v1.0.4 commit 679277edd7a9a747c910cb8d91972c390c564e33 Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Fri Aug 9 11:39:51 2024 +0900 Release/v1.0.3 (#113) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * fix: shared_url unique key 위반 해결 * chore: 버전 1.0.3 설정 * feat: cicd에서 테스트 파일을 읽도록 수정 * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * feat: Log Permission Error * feat: API Path 수정 * feat: build 시 test active 설정 * feat: cors 와이드카드 설정 --------- Co-authored-by: mjmj <108040422+violet-mj@users.noreply.github.com> Co-authored-by: mjmj commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * 메인 랜딩페이지 api 작성 (#121) * feat: 메인 랜딩 페이지 이미지 url을 저장하는 컬럼 추가 * feat: 메인 랜딩 페이지 이미지 url을 저장하는 컬럼 추가 * feat: 메인 랜딩 페이지 화이트리스트 추가 * feat: 메인 랜딩 페이지 api 추가 * chore: 메인 랜딩 페이지 테스트 작성 * feat: 메인 랜딩 페이지 서비스 레이어 작성 * refactor: 도메인이 main인 것은 너무 추상적이다. main을 event 도메인으로 이동 * fix: @Value와 @NotNull과 같이 쓰는 것은 의미가 없음 * fix: any(Long.class)를 anyLong()으로 변경 * fix: Event의 event_registered_at은 created_at과 중복됨 * 드로잉 이벤트 채점 로직 추가합니다. (#125) * feat: 드로잉 추첨 이벤트 게임 제출 및 채점 API (#124) * feat: 정답 json 파싱을 위한 의존성 주입과 util 메서드 생성 (#124) * feat: 파싱 및 채점 후 반환 메서드 생성 (#124) * feat: 유클리드 거리 계산을 통한 점수 채점 (#124) * test: 점수 측정 테스트 코드 작성 (#124) * feat: 코사인 유사도를 통한 채점 로직 구현 (#124) * feat: 유클리드 점수 측정 범위 0~100 으로 제한 (#124) * test: 고득점과 저득점 테스트케이스 분리 (#124) * feat: example 설정 및 controller 연결 (#124) * feat: 프론트엔드 요청 사항으로 blur 이미지 함께 반환 (#124) * feat: n_차 게임 점수 저장 로직 추가 (#124) * test: 저장로직 추가로 인한 테스트 코드 변경 (#124) * feat: 총 점 계산 로직 (#124) * feat: ScoreCalculator 분리 (#124) * test: ScoreCalculator Spy 객체 주입 (#124) * feat: get 사용 로직 메서드 분리 (#124) * 드로잉 게임 시 횟수를 차감합니다. (#127) * feat: default 값, lastChargeAt 추가 및 updateLastVisitedAtAndLastChargeAt 메서드 추가 (#124) * feat: 로그인 사용자만 API 허용 (#124) * feat: 기회 차감 로직 생성 및 NoChanceUser 예외 처리 (#124) * test: 게임 Info 요청 시 게임 가능 횟수에 대한 테스트 코드 (#124) * test: 첫 참여 유저에 대한 테스트코드 작성 (#124) * feat: 플레이 타입에 따른 횟수 차감을 위한 Enum 생성 (#126) * feat: 이벤트 타입을 받기 위한 Dto 변경 (#126) * feat: UserDetailService Exception BaseException 으로 변경 (#126) * feat: 플레이 타입에 따른 update 분기 처리 (#126) * test: 플레이 타입에 따른 테스트코드 작성 (#126) * 중복 당첨자 검사할 수 있는 로직 추가 (#129) * fix: 중복 당첨자 검사 기능 추가 * fix: 중복 검사가 있을 때 Dto 템플릿 추가 * feat: 디버그 레벨에서 request(url, method) 기록 저장 * feat: findByUserIdAndSubEventId 추가 * 메인 랜딩 페이지 퀴즈 시작 시간 정보 제공 (#135) * feat: subEvent가 시작되었는지 여부를 나타내는 메서드 * fix: 퀴즈 시작 시간과 시작 여부를 알려주는 List 변수 작성 * fix: MainLandDto 수정에 따른 로직 수정 * feat: 시작 시간이 잘 응답하는지 확인 * feat: 시작 시간과 시작 여부를 담고 잇는 Dto 작성 * fix: 불필요한 코드 삭제 * fix: swagger example이 부적절하게 나와있는 것을 확인하고 수정 * v1.0.4 의 각종 버그들 정리했습니다. (#133) * #feat: Spring.log 파일 gitignore 추가 (#128) * feat: 공유 url 접근 시 공유 점수 추가 (#128) * feat: Tag 생성 및 컨트롤러 태그 삽입 (#128) * feat: 로그 파일 위치 변경 및 ignore 최신화 (#128) * feat: 설명과 상이한 부분 변경 (#128) * feat: 실제 당첨 이미지를 위한 엔티티 필드 추가 및 반환 값 변경 (#128) * feat: 랜딩 페이지 조회 시 subEvent 반환되도록 DTO 변경 (#128) * feat: deault 값 설정 (#128) * feat: 요구사항 변경으로 엔티티 및 DTO 변경 (#128) * feat: SQL 문 최신화 (#128) * feat: versioning --------- Co-authored-by: mjmj <108040422+violet-mj@users.noreply.github.com> Co-authored-by: mjmj commit 99e81a2714978a7556a187f761bffb716411fedd Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Fri Aug 9 20:46:32 2024 +0900 Release/v1.0.4 (#119) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * Release/v1.0.3 commit 34bb96bb73bffe6165f59579142bcf862144be3a Author: min9805 Date: Fri Aug 9 11:36:13 2024 +0900 feat: cors 와이드카드 설정 commit 21fc9a590a5fbe90a65f22c03cf8ca48682f776b Author: min9805 Date: Fri Aug 9 11:36:02 2024 +0900 feat: build 시 test active 설정 commit 7cc569ed5a23fd857bbe06814eae035be4f66529 Merge: 7b3bf77 44b068c Author: min9805 Date: Fri Aug 9 11:29:34 2024 +0900 Merge branch 'master' into release/v1.0.3 # Conflicts: # gradle.properties # src/test/java/com/hyundai/softeer/backend/domain/expectation/repository/ExpectationRepositoryTest.java # src/test/resources/sql/integration.sql commit 7b3bf77a8d9337d8392f614061e6512e3086d141 Author: min9805 Date: Fri Aug 9 11:24:40 2024 +0900 feat: API Path 수정 commit 1346467f6f0af906cec8f04553e7d1fb7a1ad336 Author: min9805 Date: Fri Aug 9 11:22:23 2024 +0900 feat: Log Permission Error commit 7f02308d5408a200e5b766d17b881223911e36ff Merge: 5db777b 1771b59 Author: mjmj Date: Fri Aug 9 10:10:02 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 1771b5960e96d7e3a529328ebb42242e058929cf Author: mjmj Date: Fri Aug 9 10:09:48 2024 +0900 fix: 테스트 yml 추가 commit 5db777b8bb8d822299fc12e9fa627b3446057e6c Merge: 913af8e b5564cc Author: mjmj Date: Fri Aug 9 02:04:36 2024 +0900 Merge branch 'release/v1.0.3' into dev commit b5564cc72e29d5da6e660761451bea197cf85676 Author: mjmj Date: Fri Aug 9 02:03:59 2024 +0900 fix: base64 적용 해제 commit 913af8e12a1ecba585293c762ce48156fd63ec42 Merge: 8f40eb0 4afe625 Author: mjmj Date: Fri Aug 9 02:01:11 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 4afe625b9a1604ed5935cbdb0043a0ffe801b50f Author: mjmj Date: Fri Aug 9 02:00:40 2024 +0900 fix: base64 적용 commit 8f40eb01508eb70bf568258f8e229af7226cadc0 Merge: cf2a476 9839ded Author: mjmj Date: Fri Aug 9 01:08:27 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 9839dedd91e6b84cff1a74f60fc0052cf569df67 Author: mjmj Date: Fri Aug 9 01:08:12 2024 +0900 feat: cicd에서 테스트 파일을 읽도록 수정 commit cf2a476229cd11d83f3d2bd4c5d9cb5bf2934a36 Merge: cfb648f 907bd62 Author: mjmj Date: Fri Aug 9 00:54:34 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 907bd62e9e13fa34819d3ea8b599db9906593a8c Author: mjmj Date: Fri Aug 9 00:54:12 2024 +0900 chore: 버전 1.0.3 설정 commit 43f9bc77734d8d442af9f29cb51a99d4964b4282 Author: mjmj Date: Fri Aug 9 00:52:42 2024 +0900 fix: shared_url unique key 위반 해결 commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * 드로잉 게임 정보 API 생성했습니다. (#115) * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * fix: repositoryTest 삭제 * feat: drawing 엔티티 변경 (#93) * feat: 드로잉 게임을 위한 이미지 반환 타입 지정 (#93) * test: Drawing Repository 테스트 작성 및 SQL 문 최신화 (#93) * test: 드로잉 게임 정보 조회 Service 테스트 코드 작성 (#93) * feat: 게임 정보 조회 API 생성 및 문서화 (#93) * feat: 반환값 변경으로 인한 DTO 변경 (#93) * feat: 데이터 요청사항 변경으로 Dto 변경 (#93) * feat: integration-h2.sql 문 최신화 (#93) --------- Co-authored-by: mjmj * Fix/#114 v1.0.3 bugs (#116) * feat: JWT UserNot Found 시 예외 처리 (#114) * feat: 로그인 처리에서 JwtException 으로 처리 (#114) * feat: Email or Phone 으로 조회하는 메서드 추가 (#114) * test: Email, Phone 조회 테스트 코드 작성 (#114) * feat: 이메일, 전화번호 확인 로직 추가 (#114) * feat: firstcome 오타 수정 (#114) * feat: quiz 엔티티 이름 drawing 과 통일 (#114) * feat: 랜딩 페이지 별도 분리 및 화이트리스트 적용 (#114) * feat: Controller 단 Valid, event_id 설정 및 DTO 전달 (#114) * feat: import 정리 (#114) * feat: v1.0.4 * feat: 이름 변경 * test: Test 코드 변경 --------- Co-authored-by: mjmj <108040422+violet-mj@users.noreply.github.com> Co-authored-by: mjmj commit 679277edd7a9a747c910cb8d91972c390c564e33 Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Fri Aug 9 11:39:51 2024 +0900 Release/v1.0.3 (#113) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * fix: shared_url unique key 위반 해결 * chore: 버전 1.0.3 설정 * feat: cicd에서 테스트 파일을 읽도록 수정 * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * feat: Log Permission Error * feat: API Path 수정 * feat: build 시 test active 설정 * feat: cors 와이드카드 설정 --------- Co-authored-by: mjmj <108040422+violet-mj@users.noreply.github.com> Co-authored-by: mjmj commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * hotfix/v1.0.5-release2 commit d7c5a0833ac3ec3d86fb651a73326111f4a233c2 Author: Mingyu Date: Thu Aug 15 14:58:31 2024 +0900 feat: JWT 토큰 만료기한 일주일로 연장 * [FE] 어드민 프론트엔드 서버 구축합니다. (#146) * feat: 어드민 프론트엔드 서버 구축 및 기초 작업 (#145) * feat: 백엔드 서버에서 이벤트 조회 후 페이지네이션 구현 (#145) * fix: preflight 요청 화이트리스트 추가 (#149) * 이벤트 조회 API 생성합니다. (#154) * feat: 리스트 생성을 위한 EventSimpleDto 생성 (#144) * feat: Event 페이지네이션 조회 API (#144) * 퀴즈 조회, 삭제, 생성 api를 작성합니다. * fix: event sql 추가 * feat: 이벤트가 존재하지 않을 때 발생하는 예외 * fix: @Tag로 Admin 명시 * feat: 퀴즈가 이미 존재할 때 발생하는 예외 * feat: 현재까지의 당첨자 컬럼의 기본 값을 설정함 * feat: 퀴즈 정보 반환, 생성, 삭제 api 구현 * feat: 퀴즈 삭제 요청 dto * feat: 퀴즈 정보 반환 api * feat: 퀴즈 등록 요청 dto * feat: 퀴즈 삭제 dao 작성 * feat: 퀴즈 조회, 생성, 삭제 api 작성 * feat: 퀴즈의 기본적인 dto를 작성함 * feat: 등록하고자 하는 퀴즈가 3개가 아닌 경우 예외 * feat: 기본적인 SubEvent 값을 담고 있는 dto * feat: 서브이벤트 삭제 메서드 작성 * [BE] 이벤트 유저 조회 api 작성 (#155) * fix: preflight 처리 버그 * feat: 이벤트 참가 참가 유저 조회 api 작성 * feat: 최대 페이지가 넘었을 때 발생하는 예외 처리 * feat: DB에서 데이터를 받기 위한 projection 작성 * feat: 이벤트 유저 요청 dto * feat: 이벤트 유저 페이지 응답 dto * feat: 이벤트 유저 페이지페이션 조회 구현 * feat: 이벤트 유저 페이지페이션 테스트 * feat: eventUser 비즈니스 로직 구현 * feat: 서브이벤트가 없을 때 예외 * feat: 당첨자 여부가 있는 유저 정보 dto 작성 * v1.0.5 버그 수정했습니다. (#160) * fix: shared_url default 값 제거 * fix: 모든 테이블 명을 소문자로 변경 * fix: GenerativeValue로 인해 사용자가 직접 id를 수정할 수 없음 * feat: 기대평 작성 시 보너스 기회 제공 (#158) * feat: 총 점수 반환 시 기대평 및 공유 기회 제출 (#158) * feat: 최종 게임 스코어 저장 (#158) * feat: Dto 추가 (#158) * test: 기대평 작성 시 로직 변경으로 테스트 코드 변경 (#158) --------- Co-authored-by: min9805 * 선착순 로직 추상화 및 동기화했습니다. (#161) * fix: 임시 수정 * feat: 선착순 로직 추상화 및 분리 * feat: 선착순 로직 관심사 분리 및 추상화 * fix: 여러 값이 나올 수 있으므로 Optional이 아닌 List로 수정 * feat: 퀴즈 정보 api 요청 dto * fix: 당첨자 수 증가 후 바로 데이터 베이스에 flush * fix: WinnerDraw QuizFirstcomeRepository 의존성 추가 * fix: @Synchronized 어노테이션 대신 synchronized 예약어 사용 * fix: 당첨자 선정 로직이 아니라 api 전체 로직을 동기화 * fix: @Transaction과 synchronized를 같이 쓸 수 없는 문제 때문에 synchronized 삭제 * fix: 당첨자 수를 QuizFirstCome에서 가져오지 않고 직접 세는 방식으로 변경 * feat: 당첨자 수를 세는 쿼리 작성 * feat: 당첨자 수를 세는 쿼리 테스트 * Release/v1.0.6 (#164) commit 9cc8171d5ba6500b48ca2154ac0c5bce84953099 Author: min9805 Date: Mon Aug 19 11:16:26 2024 +0900 feat: versioning commit b59397603cbdaffc2cb1a732159d060c0d99adff Merge: 64cb8cc 40cf919 Author: min9805 Date: Mon Aug 19 11:15:00 2024 +0900 Merge branch 'master' into release/v1.0.6 # Conflicts: # src/main/java/com/hyundai/softeer/backend/domain/event/service/EventService.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/controller/EventUserController.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/entity/EventUser.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/repository/EventUserRepository.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/service/EventUserService.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/controller/QuizFirstComeController.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/entity/QuizFirstCome.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/repository/QuizFirstComeRepository.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeService.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/dto/DrawingTotalScoreDto.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryService.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/repository/SubEventRepository.java # src/main/java/com/hyundai/softeer/backend/domain/winner/repository/WinnerRepository.java # src/main/resources/sql/integration.sql # src/test/java/com/hyundai/softeer/backend/domain/eventuser/repository/EventUserRepositoryTest.java # src/test/java/com/hyundai/softeer/backend/domain/expectation/service/ExpectationServiceTest.java # src/test/resources/sql/integration-h2.sql # src/test/resources/sql/integration.sql commit 40cf919e36bbc2817fe79e352b8847e4f439c107 Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Thu Aug 15 14:59:48 2024 +0900 Hotfix/v1.0.5 release2 (#143) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * Release/v1.0.3 commit 34bb96bb73bffe6165f59579142bcf862144be3a Author: min9805 Date: Fri Aug 9 11:36:13 2024 +0900 feat: cors 와이드카드 설정 commit 21fc9a590a5fbe90a65f22c03cf8ca48682f776b Author: min9805 Date: Fri Aug 9 11:36:02 2024 +0900 feat: build 시 test active 설정 commit 7cc569ed5a23fd857bbe06814eae035be4f66529 Merge: 7b3bf77 44b068c Author: min9805 Date: Fri Aug 9 11:29:34 2024 +0900 Merge branch 'master' into release/v1.0.3 # Conflicts: # gradle.properties # src/test/java/com/hyundai/softeer/backend/domain/expectation/repository/ExpectationRepositoryTest.java # src/test/resources/sql/integration.sql commit 7b3bf77a8d9337d8392f614061e6512e3086d141 Author: min9805 Date: Fri Aug 9 11:24:40 2024 +0900 feat: API Path 수정 commit 1346467f6f0af906cec8f04553e7d1fb7a1ad336 Author: min9805 Date: Fri Aug 9 11:22:23 2024 +0900 feat: Log Permission Error commit 7f02308d5408a200e5b766d17b881223911e36ff Merge: 5db777b 1771b59 Author: mjmj Date: Fri Aug 9 10:10:02 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 1771b5960e96d7e3a529328ebb42242e058929cf Author: mjmj Date: Fri Aug 9 10:09:48 2024 +0900 fix: 테스트 yml 추가 commit 5db777b8bb8d822299fc12e9fa627b3446057e6c Merge: 913af8e b5564cc Author: mjmj Date: Fri Aug 9 02:04:36 2024 +0900 Merge branch 'release/v1.0.3' into dev commit b5564cc72e29d5da6e660761451bea197cf85676 Author: mjmj Date: Fri Aug 9 02:03:59 2024 +0900 fix: base64 적용 해제 commit 913af8e12a1ecba585293c762ce48156fd63ec42 Merge: 8f40eb0 4afe625 Author: mjmj Date: Fri Aug 9 02:01:11 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 4afe625b9a1604ed5935cbdb0043a0ffe801b50f Author: mjmj Date: Fri Aug 9 02:00:40 2024 +0900 fix: base64 적용 commit 8f40eb01508eb70bf568258f8e229af7226cadc0 Merge: cf2a476 9839ded Author: mjmj Date: Fri Aug 9 01:08:27 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 9839dedd91e6b84cff1a74f60fc0052cf569df67 Author: mjmj Date: Fri Aug 9 01:08:12 2024 +0900 feat: cicd에서 테스트 파일을 읽도록 수정 commit cf2a476229cd11d83f3d2bd4c5d9cb5bf2934a36 Merge: cfb648f 907bd62 Author: mjmj Date: Fri Aug 9 00:54:34 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 907bd62e9e13fa34819d3ea8b599db9906593a8c Author: mjmj Date: Fri Aug 9 00:54:12 2024 +0900 chore: 버전 1.0.3 설정 commit 43f9bc77734d8d442af9f29cb51a99d4964b4282 Author: mjmj Date: Fri Aug 9 00:52:42 2024 +0900 fix: shared_url unique key 위반 해결 commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * 드로잉 게임 정보 API 생성했습니다. (#115) * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * fix: repositoryTest 삭제 * feat: drawing 엔티티 변경 (#93) * feat: 드로잉 게임을 위한 이미지 반환 타입 지정 (#93) * test: Drawing Repository 테스트 작성 및 SQL 문 최신화 (#93) * test: 드로잉 게임 정보 조회 Service 테스트 코드 작성 (#93) * feat: 게임 정보 조회 API 생성 및 문서화 (#93) * feat: 반환값 변경으로 인한 DTO 변경 (#93) * feat: 데이터 요청사항 변경으로 Dto 변경 (#93) * feat: integration-h2.sql 문 최신화 (#93) --------- Co-authored-by: mjmj * Fix/#114 v1.0.3 bugs (#116) * feat: JWT UserNot Found 시 예외 처리 (#114) * feat: 로그인 처리에서 JwtException 으로 처리 (#114) * feat: Email or Phone 으로 조회하는 메서드 추가 (#114) * test: Email, Phone 조회 테스트 코드 작성 (#114) * feat: 이메일, 전화번호 확인 로직 추가 (#114) * feat: firstcome 오타 수정 (#114) * feat: quiz 엔티티 이름 drawing 과 통일 (#114) * feat: 랜딩 페이지 별도 분리 및 화이트리스트 적용 (#114) * feat: Controller 단 Valid, event_id 설정 및 DTO 전달 (#114) * feat: import 정리 (#114) * Release v1.0.4 commit 92b5f1797b485d74c492536443e1793c97d9cd39 Author: min9805 Date: Fri Aug 9 20:44:40 2024 +0900 test: Test 코드 변경 commit d4d692b2ca862b3497482dcfc782a39ddacf989e Author: min9805 Date: Fri Aug 9 20:37:07 2024 +0900 feat: 이름 변경 commit 6dd36d023903103b875cc1627a42a68b74556acb Merge: 2db0aa7 679277e Author: min9805 Date: Fri Aug 9 20:35:45 2024 +0900 Merge branch 'master' into release/v1.0.4 # Conflicts: # .github/workflows/gradle-publish.yml # gradle.properties # src/main/java/com/hyundai/softeer/backend/domain/event/dto/ApiKeyRequest.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/controller/SharedUrlController.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/service/EventUserService.java # src/main/java/com/hyundai/softeer/backend/domain/expectation/controller/ExpectationController.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/controller/QuizFirstComeController.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizRequest.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeService.java # src/main/java/com/hyundai/softeer/backend/domain/firstcomeevent/quiz/dto/QuizSubmitRequest.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/controller/DrawingLotteryController.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryService.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/service/LotteryService.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/controller/SubEventController.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/dto/SubEventRequest.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/service/SubEventService.java # src/main/java/com/hyundai/softeer/backend/global/filter/JwtAuthorizationFilter.java # src/test/java/com/hyundai/softeer/backend/domain/eventuser/repository/EventUserRepositoryTest.java # src/test/java/com/hyundai/softeer/backend/domain/expectation/repository/ExpectationRepositoryTest.java # src/test/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryServiceTest.java # src/test/java/com/hyundai/softeer/backend/domain/subevent/service/SubEventServiceTest.java # src/test/resources/sql/integration-h2.sql # src/test/resources/sql/integration.sql commit 2db0aa7852007040626351b3083ec4c0947437c9 Author: min9805 Date: Fri Aug 9 20:31:51 2024 +0900 feat: v1.0.4 commit 679277edd7a9a747c910cb8d91972c390c564e33 Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Fri Aug 9 11:39:51 2024 +0900 Release/v1.0.3 (#113) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * fix: shared_url unique key 위반 해결 * chore: 버전 1.0.3 설정 * feat: cicd에서 테스트 파일을 읽도록 수정 * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * feat: Log Permission Error * feat: API Path 수정 * feat: build 시 test active 설정 * feat: cors 와이드카드 설정 --------- Co-authored-by: mjmj <108040422+violet-mj@users.noreply.github.com> Co-authored-by: mjmj commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * 메인 랜딩페이지 api 작성 (#121) * feat: 메인 랜딩 페이지 이미지 url을 저장하는 컬럼 추가 * feat: 메인 랜딩 페이지 이미지 url을 저장하는 컬럼 추가 * feat: 메인 랜딩 페이지 화이트리스트 추가 * feat: 메인 랜딩 페이지 api 추가 * chore: 메인 랜딩 페이지 테스트 작성 * feat: 메인 랜딩 페이지 서비스 레이어 작성 * refactor: 도메인이 main인 것은 너무 추상적이다. main을 event 도메인으로 이동 * fix: @Value와 @NotNull과 같이 쓰는 것은 의미가 없음 * fix: any(Long.class)를 anyLong()으로 변경 * fix: Event의 event_registered_at은 created_at과 중복됨 * 드로잉 이벤트 채점 로직 추가합니다. (#125) * feat: 드로잉 추첨 이벤트 게임 제출 및 채점 API (#124) * feat: 정답 json 파싱을 위한 의존성 주입과 util 메서드 생성 (#124) * feat: 파싱 및 채점 후 반환 메서드 생성 (#124) * feat: 유클리드 거리 계산을 통한 점수 채점 (#124) * test: 점수 측정 테스트 코드 작성 (#124) * feat: 코사인 유사도를 통한 채점 로직 구현 (#124) * feat: 유클리드 점수 측정 범위 0~100 으로 제한 (#124) * test: 고득점과 저득점 테스트케이스 분리 (#124) * feat: example 설정 및 controller 연결 (#124) * feat: 프론트엔드 요청 사항으로 blur 이미지 함께 반환 (#124) * feat: n_차 게임 점수 저장 로직 추가 (#124) * test: 저장로직 추가로 인한 테스트 코드 변경 (#124) * feat: 총 점 계산 로직 (#124) * feat: ScoreCalculator 분리 (#124) * test: ScoreCalculator Spy 객체 주입 (#124) * feat: get 사용 로직 메서드 분리 (#124) * 드로잉 게임 시 횟수를 차감합니다. (#127) * feat: default 값, lastChargeAt 추가 및 updateLastVisitedAtAndLastChargeAt 메서드 추가 (#124) * feat: 로그인 사용자만 API 허용 (#124) * feat: 기회 차감 로직 생성 및 NoChanceUser 예외 처리 (#124) * test: 게임 Info 요청 시 게임 가능 횟수에 대한 테스트 코드 (#124) * test: 첫 참여 유저에 대한 테스트코드 작성 (#124) * feat: 플레이 타입에 따른 횟수 차감을 위한 Enum 생성 (#126) * feat: 이벤트 타입을 받기 위한 Dto 변경 (#126) * feat: UserDetailService Exception BaseException 으로 변경 (#126) * feat: 플레이 타입에 따른 update 분기 처리 (#126) * test: 플레이 타입에 따른 테스트코드 작성 (#126) * 중복 당첨자 검사할 수 있는 로직 추가 (#129) * fix: 중복 당첨자 검사 기능 추가 * fix: 중복 검사가 있을 때 Dto 템플릿 추가 * feat: 디버그 레벨에서 request(url, method) 기록 저장 * feat: findByUserIdAndSubEventId 추가 * 메인 랜딩 페이지 퀴즈 시작 시간 정보 제공 (#135) * feat: subEvent가 시작되었는지 여부를 나타내는 메서드 * fix: 퀴즈 시작 시간과 시작 여부를 알려주는 List 변수 작성 * fix: MainLandDto 수정에 따른 로직 수정 * feat: 시작 시간이 잘 응답하는지 확인 * feat: 시작 시간과 시작 여부를 담고 잇는 Dto 작성 * fix: 불필요한 코드 삭제 * fix: swagger example이 부적절하게 나와있는 것을 확인하고 수정 * v1.0.4 의 각종 버그들 정리했습니다. (#133) * #feat: Spring.log 파일 gitignore 추가 (#128) * feat: 공유 url 접근 시 공유 점수 추가 (#128) * feat: Tag 생성 및 컨트롤러 태그 삽입 (#128) * feat: 로그 파일 위치 변경 및 ignore 최신화 (#128) * feat: 설명과 상이한 부분 변경 (#128) * feat: 실제 당첨 이미지를 위한 엔티티 필드 추가 및 반환 값 변경 (#128) * feat: 랜딩 페이지 조회 시 subEvent 반환되도록 DTO 변경 (#128) * feat: deault 값 설정 (#128) * feat: 요구사항 변경으로 엔티티 및 DTO 변경 (#128) * feat: SQL 문 최신화 (#128) * Release v1.0.5 commit 32b991cebe0e49d54993f946fb87d9865dc51386 Merge: a5bddd7 99e81a2 Author: Mingyu Date: Wed Aug 14 17:32:39 2024 +0900 Merge branch 'master' into release/v1.0.5 # Conflicts: # build.gradle # gradle.properties # src/main/java/com/hyundai/softeer/backend/domain/event/entity/Event.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/controller/SharedUrlController.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/entity/EventUser.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/service/EventUserService.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/controller/QuizFirstComeController.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizFirstComeSubmitResponseDto.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeService.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/controller/DrawingLotteryController.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/dto/DrawingGameInfoDto.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/dto/DrawingInfoDtos.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/dto/PositionDto.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/entity/DrawingLotteryEvent.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/repository/DrawingLotteryRepository.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryService.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/controller/SubEventController.java # src/main/java/com/hyundai/softeer/backend/domain/winner/repository/WinnerRepository.java # src/main/java/com/hyundai/softeer/backend/global/config/SwaggerConfig.java # src/main/java/com/hyundai/softeer/backend/global/exception/error/JwtException.java # src/main/java/com/hyundai/softeer/backend/global/filter/JwtAuthorizationFilter.java # src/main/java/com/hyundai/softeer/backend/global/jwt/UserDetailService.java # src/main/java/com/hyundai/softeer/backend/global/utils/ParseUtil.java # src/main/resources/logback-spring.xml # src/main/resources/sql/integration.sql # src/test/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryServiceTest.java # src/test/java/com/hyundai/softeer/backend/global/utils/ParseUtilTest.java # src/test/resources/sql/integration-h2.sql # src/test/resources/sql/integration.sql commit a5bddd7b0a4a68148932ba7fa49bef2779736a50 Author: Mingyu Date: Wed Aug 14 17:29:44 2024 +0900 feat: versioning commit 99e81a2714978a7556a187f761bffb716411fedd Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Fri Aug 9 20:46:32 2024 +0900 Release/v1.0.4 (#119) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * Release/v1.0.3 commit 34bb96bb73bffe6165f59579142bcf862144be3a Author: min9805 Date: Fri Aug 9 11:36:13 2024 +0900 feat: cors 와이드카드 설정 commit 21fc9a590a5fbe90a65f22c03cf8ca48682f776b Author: min9805 Date: Fri Aug 9 11:36:02 2024 +0900 feat: build 시 test active 설정 commit 7cc569ed5a23fd857bbe06814eae035be4f66529 Merge: 7b3bf77 44b068c Author: min9805 Date: Fri Aug 9 11:29:34 2024 +0900 Merge branch 'master' into release/v1.0.3 # Conflicts: # gradle.properties # src/test/java/com/hyundai/softeer/backend/domain/expectation/repository/ExpectationRepositoryTest.java # src/test/resources/sql/integration.sql commit 7b3bf77a8d9337d8392f614061e6512e3086d141 Author: min9805 Date: Fri Aug 9 11:24:40 2024 +0900 feat: API Path 수정 commit 1346467f6f0af906cec8f04553e7d1fb7a1ad336 Author: min9805 Date: Fri Aug 9 11:22:23 2024 +0900 feat: Log Permission Error commit 7f02308d5408a200e5b766d17b881223911e36ff Merge: 5db777b 1771b59 Author: mjmj Date: Fri Aug 9 10:10:02 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 1771b5960e96d7e3a529328ebb42242e058929cf Author: mjmj Date: Fri Aug 9 10:09:48 2024 +0900 fix: 테스트 yml 추가 commit 5db777b8bb8d822299fc12e9fa627b3446057e6c Merge: 913af8e b5564cc Author: mjmj Date: Fri Aug 9 02:04:36 2024 +0900 Merge branch 'release/v1.0.3' into dev commit b5564cc72e29d5da6e660761451bea197cf85676 Author: mjmj Date: Fri Aug 9 02:03:59 2024 +0900 fix: base64 적용 해제 commit 913af8e12a1ecba585293c762ce48156fd63ec42 Merge: 8f40eb0 4afe625 Author: mjmj Date: Fri Aug 9 02:01:11 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 4afe625b9a1604ed5935cbdb0043a0ffe801b50f Author: mjmj Date: Fri Aug 9 02:00:40 2024 +0900 fix: base64 적용 commit 8f40eb01508eb70bf568258f8e229af7226cadc0 Merge: cf2a476 9839ded Author: mjmj Date: Fri Aug 9 01:08:27 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 9839dedd91e6b84cff1a74f60fc0052cf569df67 Author: mjmj Date: Fri Aug 9 01:08:12 2024 +0900 feat: cicd에서 테스트 파일을 읽도록 수정 commit cf2a476229cd11d83f3d2bd4c5d9cb5bf2934a36 Merge: cfb648f 907bd62 Author: mjmj Date: Fri Aug 9 00:54:34 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 907bd62e9e13fa34819d3ea8b599db9906593a8c Author: mjmj Date: Fri Aug 9 00:54:12 2024 +0900 chore: 버전 1.0.3 설정 commit 43f9bc77734d8d442af9f29cb51a99d4964b4282 Author: mjmj Date: Fri Aug 9 00:52:42 2024 +0900 fix: shared_url unique key 위반 해결 commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * 드로잉 게임 정보 API 생성했습니다. (#115) * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * fix: repositoryTest 삭제 * feat: drawing 엔티티 변경 (#93) * feat: 드로잉 게임을 위한 이미지 반환 타입 지정 (#93) * test: Drawing Repository 테스트 작성 및 SQL 문 최신화 (#93) * test: 드로잉 게임 정보 조회 Service 테스트 코드 작성 (#93) * feat: 게임 정보 조회 API 생성 및 문서화 (#93) * feat: 반환값 변경으로 인한 DTO 변경 (#93) * feat: 데이터 요청사항 변경으로 Dto 변경 (#93) * feat: integration-h2.sql 문 최신화 (#93) --------- Co-authored-by: mjmj * Fix/#114 v1.0.3 bugs (#116) * feat: JWT UserNot Found 시 예외 처리 (#114) * feat: 로그인 처리에서 JwtException 으로 처리 (#114) * feat: Email or Phone 으로 조회하는 메서드 추가 (#114) * test: Email, Phone 조회 테스트 코드 작성 (#114) * feat: 이메일, 전화번호 확인 로직 추가 (#114) * feat: firstcome 오타 수정 (#114) * feat: quiz 엔티티 이름 drawing 과 통일 (#114) * feat: 랜딩 페이지 별도 분리 및 화이트리스트 적용 (#114) * feat: Controller 단 Valid, event_id 설정 및 DTO 전달 (#114) * feat: import 정리 (#114) * feat: v1.0.4 * feat: 이름 변경 * test: Test 코드 변경 --------- Co-authored-by: mjmj <108040422+violet-mj@users.noreply.github.com> Co-authored-by: mjmj commit 679277edd7a9a747c910cb8d91972c390c564e33 Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Fri Aug 9 11:39:51 2024 +0900 Release/v1.0.3 (#113) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * fix: shared_url unique key 위반 해결 * chore: 버전 1.0.3 설정 * feat: cicd에서 테스트 파일을 읽도록 수정 * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * feat: Log Permission Error * feat: API Path 수정 * feat: build 시 test active 설정 * feat: cors 와이드카드 설정 --------- Co-authored-by: mjmj <108040422+violet-mj@users.noreply.github.com> Co-authored-by: mjmj commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * Hotfix/v1.0.5 commit b23278ef1e1b1a4b4fa4dd527f5c57524ac3eef4 Author: Mingyu Date: Wed Aug 14 18:33:00 2024 +0900 feat: 화이트리스트 최신화 commit 156d191b7715aedad6eb92a54a6fb0b02cfc5b93 Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Wed Aug 14 17:34:34 2024 +0900 Release/v1.0.5 (#138) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * Release/v1.0.3 commit 34bb96bb73bffe6165f59579142bcf862144be3a Author: min9805 Date: Fri Aug 9 11:36:13 2024 +0900 feat: cors 와이드카드 설정 commit 21fc9a590a5fbe90a65f22c03cf8ca48682f776b Author: min9805 Date: Fri Aug 9 11:36:02 2024 +0900 feat: build 시 test active 설정 commit 7cc569ed5a23fd857bbe06814eae035be4f66529 Merge: 7b3bf77 44b068c Author: min9805 Date: Fri Aug 9 11:29:34 2024 +0900 Merge branch 'master' into release/v1.0.3 # Conflicts: # gradle.properties # src/test/java/com/hyundai/softeer/backend/domain/expectation/repository/ExpectationRepositoryTest.java # src/test/resources/sql/integration.sql commit 7b3bf77a8d9337d8392f614061e6512e3086d141 Author: min9805 Date: Fri Aug 9 11:24:40 2024 +0900 feat: API Path 수정 commit 1346467f6f0af906cec8f04553e7d1fb7a1ad336 Author: min9805 Date: Fri Aug 9 11:22:23 2024 +0900 feat: Log Permission Error commit 7f02308d5408a200e5b766d17b881223911e36ff Merge: 5db777b 1771b59 Author: mjmj Date: Fri Aug 9 10:10:02 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 1771b5960e96d7e3a529328ebb42242e058929cf Author: mjmj Date: Fri Aug 9 10:09:48 2024 +0900 fix: 테스트 yml 추가 commit 5db777b8bb8d822299fc12e9fa627b3446057e6c Merge: 913af8e b5564cc Author: mjmj Date: Fri Aug 9 02:04:36 2024 +0900 Merge branch 'release/v1.0.3' into dev commit b5564cc72e29d5da6e660761451bea197cf85676 Author: mjmj Date: Fri Aug 9 02:03:59 2024 +0900 fix: base64 적용 해제 commit 913af8e12a1ecba585293c762ce48156fd63ec42 Merge: 8f40eb0 4afe625 Author: mjmj Date: Fri Aug 9 02:01:11 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 4afe625b9a1604ed5935cbdb0043a0ffe801b50f Author: mjmj Date: Fri Aug 9 02:00:40 2024 +0900 fix: base64 적용 commit 8f40eb01508eb70bf568258f8e229af7226cadc0 Merge: cf2a476 9839ded Author: mjmj Date: Fri Aug 9 01:08:27 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 9839dedd91e6b84cff1a74f60fc0052cf569df67 Author: mjmj Date: Fri Aug 9 01:08:12 2024 +0900 feat: cicd에서 테스트 파일을 읽도록 수정 commit cf2a476229cd11d83f3d2bd4c5d9cb5bf2934a36 Merge: cfb648f 907bd62 Author: mjmj Date: Fri Aug 9 00:54:34 2024 +0900 Merge branch 'release/v1.0.3' into dev commit 907bd62e9e13fa34819d3ea8b599db9906593a8c Author: mjmj Date: Fri Aug 9 00:54:12 2024 +0900 chore: 버전 1.0.3 설정 commit 43f9bc77734d8d442af9f29cb51a99d4964b4282 Author: mjmj Date: Fri Aug 9 00:52:42 2024 +0900 fix: shared_url unique key 위반 해결 commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * 드로잉 게임 정보 API 생성했습니다. (#115) * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * fix: repositoryTest 삭제 * feat: drawing 엔티티 변경 (#93) * feat: 드로잉 게임을 위한 이미지 반환 타입 지정 (#93) * test: Drawing Repository 테스트 작성 및 SQL 문 최신화 (#93) * test: 드로잉 게임 정보 조회 Service 테스트 코드 작성 (#93) * feat: 게임 정보 조회 API 생성 및 문서화 (#93) * feat: 반환값 변경으로 인한 DTO 변경 (#93) * feat: 데이터 요청사항 변경으로 Dto 변경 (#93) * feat: integration-h2.sql 문 최신화 (#93) --------- Co-authored-by: mjmj * Fix/#114 v1.0.3 bugs (#116) * feat: JWT UserNot Found 시 예외 처리 (#114) * feat: 로그인 처리에서 JwtException 으로 처리 (#114) * feat: Email or Phone 으로 조회하는 메서드 추가 (#114) * test: Email, Phone 조회 테스트 코드 작성 (#114) * feat: 이메일, 전화번호 확인 로직 추가 (#114) * feat: firstcome 오타 수정 (#114) * feat: quiz 엔티티 이름 drawing 과 통일 (#114) * feat: 랜딩 페이지 별도 분리 및 화이트리스트 적용 (#114) * feat: Controller 단 Valid, event_id 설정 및 DTO 전달 (#114) * feat: import 정리 (#114) * Release v1.0.4 commit 92b5f1797b485d74c492536443e1793c97d9cd39 Author: min9805 Date: Fri Aug 9 20:44:40 2024 +0900 test: Test 코드 변경 commit d4d692b2ca862b3497482dcfc782a39ddacf989e Author: min9805 Date: Fri Aug 9 20:37:07 2024 +0900 feat: 이름 변경 commit 6dd36d023903103b875cc1627a42a68b74556acb Merge: 2db0aa7 679277e Author: min9805 Date: Fri Aug 9 20:35:45 2024 +0900 Merge branch 'master' into release/v1.0.4 # Conflicts: # .github/workflows/gradle-publish.yml # gradle.properties # src/main/java/com/hyundai/softeer/backend/domain/event/dto/ApiKeyRequest.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/controller/SharedUrlController.java # src/main/java/com/hyundai/softeer/backend/domain/eventuser/service/EventUserService.java # src/main/java/com/hyundai/softeer/backend/domain/expectation/controller/ExpectationController.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/controller/QuizFirstComeController.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizRequest.java # src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeService.java # src/main/java/com/hyundai/softeer/backend/domain/firstcomeevent/quiz/dto/QuizSubmitRequest.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/controller/DrawingLotteryController.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryService.java # src/main/java/com/hyundai/softeer/backend/domain/lottery/service/LotteryService.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/controller/SubEventController.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/dto/SubEventRequest.java # src/main/java/com/hyundai/softeer/backend/domain/subevent/service/SubEventService.java # src/main/java/com/hyundai/softeer/backend/global/filter/JwtAuthorizationFilter.java # src/test/java/com/hyundai/softeer/backend/domain/eventuser/repository/EventUserRepositoryTest.java # src/test/java/com/hyundai/softeer/backend/domain/expectation/repository/ExpectationRepositoryTest.java # src/test/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryServiceTest.java # src/test/java/com/hyundai/softeer/backend/domain/subevent/service/SubEventServiceTest.java # src/test/resources/sql/integration-h2.sql # src/test/resources/sql/integration.sql commit 2db0aa7852007040626351b3083ec4c0947437c9 Author: min9805 Date: Fri Aug 9 20:31:51 2024 +0900 feat: v1.0.4 commit 679277edd7a9a747c910cb8d91972c390c564e33 Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Fri Aug 9 11:39:51 2024 +0900 Release/v1.0.3 (#113) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 메서드 작성 (#91) * feat: 환경을 상수로 선언 (test, prod, dev) (#91) * feat: 퀴즈 마지막 번호(lastQuizNumber) 추가 (#91) * feat: 기대평 결과 값을 오름차순이 아닌 내림차순으로 변경 (#91) * fix: 서비스 로직 변경 (기대평을 최신순으로 반환) (#91) * fix: QuizNotExistException으로 변경 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: /api/v1/quiz 퀴즈 문제 가져오는 api는 로그인이 필요함 (#91) * fix: RequestParam을 Dto로 변경 (#91) * feat: 퀴즈 문제 api의 Dto (#91) * feat: 퀴즈 이벤트가 진행중인지 검사하는 로직 작성 (#91) * feat: 퀴즈 api의 비즈니스 로직을 검사하는 유닛 테스트 (#91) * fix: 서브이벤트가 없으면 200반환이 아니라 400으로 반환되어야 한다 (#91) * refactor: CorsConfig에서 cors 설정하던 것을 WebConfig로 이동 (#91) * feat: quiz repository를 테스트 (#91) * feat: findByEventIdAndExecuteType 메서드 추가 (#91) * chore: 공백 제거 (#91) * fix: h2 테스트 의존성 추가 (#91) * fix: 유효성 검사 어노테이션 추가 [@Validated] (#98) * sql 파일 수정 및 병합으로 인한 코드 중복 해결 (#103) * fix: H2 database INSERT 문법 변경 * fix: 코드 중복 제거 * fix: 변수 재선언 제거 * fix: 테스트할 sql 파일 수정 * eventId를 쿼리 파라미터로 받지 않게 수정 (#105) * fix: eventId를 환경변수로 받음 (#104) * fix: eventId 제거 (#104) * fix: eventId 제거 (#104) * fix: Winners 테이블에 ranking 컬럼 추가 (#104) * fix: 상태 값을 상수로 변경 (#104) * api 경로 수정 및 예외 수정 (#109) * fix: expectationComment -> comment * fix: GET /expectation/land -> /expectation fix: POST /expectation/register -> /expectation * fix: expectationBannerImgUrl -> bannerImgUrl * fix: expectationContent -> comments * fix: validation 라이브러리 추가 * fix: @Data, @NoArgsConstruct 추가 * chore: expectationPage 컬럼 명 변경 * fix: 퀴즈 테이블명 수정 * fix: api 경로 수정 * fix: 중복 코드 제거 * fix: quiz 테이블명 변경에 따른 코드 수정 * fix: POST 메서드에 @ParameterObject 제거 * fix: 테이블 명을 quizzes에서 quiz_firstcome_events로 변경 * fix: quizSubmitResponseDto를 반환하지 않는 문제 해결 * fix: @ParameterObject 제거 * 드로잉 추첨 이벤트 테이블 및 추첨 메서드 도메인 변경합니다. (#110) * feat: 추첨 메서드 도메인 변경 (#108) * test: 추첨 이벤트 테스트 코드 작성 (#108) * feat: Import 부분 삭제 (#108) * feat: 유효성 검사 메서드 추출 (#108) * 단축 URL 생성 및 Redirect 구현합니다. (#107) * feat: Entity 및 Dto 변경 (#100) * feat: 이벤트 참가 유저 랜덤값 생성 및 예외 처리 (#100) * feat: ShaedUrl 랜덤값 업데이트 및 저장 (#100) * feat: shard-url API 생성 및 문서화 (#100) * feat: URL 을 통해 특정 유저 매핑 후 Redirect URL 반환 (#100) * feat: Shared URL을 PathParameter 로 가지는 API 생성 (#100) * fix: shared_url unique key 위반 해결 * chore: 버전 1.0.3 설정 * feat: cicd에서 테스트 파일을 읽도록 수정 * fix: base64 적용 * fix: base64 적용 해제 * fix: 테스트 yml 추가 * feat: Log Permission Error * feat: API Path 수정 * feat: build 시 test active 설정 * feat: cors 와이드카드 설정 --------- Co-authored-by: mjmj <108040422+violet-mj@users.noreply.github.com> Co-authored-by: mjmj commit 44b068c86e5f39b61a1c90341720f5e71f2e58f7 Merge: fc95896 4149e6d Author: mjmj Date: Tue Aug 6 19:06:29 2024 +0900 Merge branch 'release/v1.0.2' commit 4149e6d9d5e7c61eecbb5107f2571f27a8d9a0c7 Author: mjmj Date: Tue Aug 6 18:59:42 2024 +0900 fix: ci pull-request에서 push로 변경 commit 4a4ae8b6ecab7b7dca6ebc3a62bb2165b0a5e258 Author: mjmj Date: Tue Aug 6 18:25:30 2024 +0900 fix: repositoryTest 삭제 commit a96eaaa3ffdf671b495da506c9503fe2b9171a02 Author: mjmj Date: Tue Aug 6 17:24:57 2024 +0900 feat: release 1.0.2 commit fc958965b800fdff9b7b63c6bd953dd46cb26b67 Author: mjmj <108040422+violet-mj@users.noreply.github.com> Date: Tue Aug 6 12:07:21 2024 +0900 hotfix: json resolve 문제 해결 (#85) * 메인 랜딩페이지 api 작성 (#121) * feat: 메인 랜딩 페이지 이미지 url을 저장하는 컬럼 추가 * feat: 메인 랜딩 페이지 이미지 url을 저장하는 컬럼 추가 * feat: 메인 랜딩 페이지 화이트리스트 추가 * feat: 메인 랜딩 페이지 api 추가 * chore: 메인 랜딩 페이지 테스트 작성 * feat: 메인 랜딩 페이지 서비스 레이어 작성 * refactor: 도메인이 main인 것은 너무 추상적이다. main을 event 도메인으로 이동 * fix: @Value와 @NotNull과 같이 쓰는 것은 의미가 없음 * fix: any(Long.class)를 anyLong()으로 변경 * fix: Event의 event_registered_at은 created_at과 중복됨 * 드로잉 이벤트 채점 로직 추가합니다. (#125) * feat: 드로잉 추첨 이벤트 게임 제출 및 채점 API (#124) * feat: 정답 json 파싱을 위한 의존성 주입과 util 메서드 생성 (#124) * feat: 파싱 및 채점 후 반환 메서드 생성 (#124) * feat: 유클리드 거리 계산을 통한 점수 채점 (#124) * test: 점수 측정 테스트 코드 작성 (#124) * feat: 코사인 유사도를 통한 채점 로직 구현 (#124) * feat: 유클리드 점수 측정 범위 0~100 으로 제한 (#124) * test: 고득점과 저득점 테스트케이스 분리 (#124) * feat: example 설정 및 controller 연결 (#124) * feat: 프론트엔드 요청 사항으로 blur 이미지 함께 반환 (#124) * feat: n_차 게임 점수 저장 로직 추가 (#124) * test: 저장로직 추가로 인한 테스트 코드 변경 (#124) * feat: 총 점 계산 로직 (#124) * feat: ScoreCalculator 분리 (#124) * test: ScoreCalculator Spy 객체 주입 (#124) * feat: get 사용 로직 메서드 분리 (#124) * 드로잉 게임 시 횟수를 차감합니다. (#127) * feat: default 값, lastChargeAt 추가 및 updateLastVisitedAtAndLastChargeAt 메서드 추가 (#124) * feat: 로그인 사용자만 API 허용 (#124) * feat: 기회 차감 로직 생성 및 NoChanceUser 예외 처리 (#124) * test: 게임 Info 요청 시 게임 가능 횟수에 대한 테스트 코드 (#124) * test: 첫 참여 유저에 대한 테스트코드 작성 (#124) * feat: 플레이 타입에 따른 횟수 차감을 위한 Enum 생성 (#126) * feat: 이벤트 타입을 받기 위한 Dto 변경 (#126) * feat: UserDetailService Exception BaseException 으로 변경 (#126) * feat: 플레이 타입에 따른 update 분기 처리 (#126) * test: 플레이 타입에 따른 테스트코드 작성 (#126) * 중복 당첨자 검사할 수 있는 로직 추가 (#129) * fix: 중복 당첨자 검사 기능 추가 * fix: 중복 검사가 있을 때 Dto 템플릿 추가 * feat: 디버그 레벨에서 request(url, method) 기록 저장 * feat: findByUserIdAndSubEventId 추가 * 메인 랜딩 페이지 퀴즈 시작 시간 정보 제공 (#135) * feat: subEvent가 시작되었는지 여부를 나타내는 메서드 * fix: 퀴즈 시작 시간과 시작 여부를 알려주는 List 변수 작성 * fix: MainLandDto 수정에 따른 로직 수정 * feat: 시작 시간이 잘 응답하는지 확인 * feat: 시작 시간과 시작 여부를 담고 잇는 Dto 작성 * fix: 불필요한 코드 삭제 * fix: swagger example이 부적절하게 나와있는 것을 확인하고 수정 * v1.0.4 의 각종 버그들 정리했습니다. (#133) * #feat: Spring.log 파일 gitignore 추가 (#128) * feat: 공유 url 접근 시 공유 점수 추가 (#128) * feat: Tag 생성 및 컨트롤러 태그 삽입 (#128) * feat: 로그 파일 위치 변경 및 ignore 최신화 (#128) * feat: 설명과 상이한 부분 변경 (#128) * feat: 실제 당첨 이미지를 위한 엔티티 필드 추가 및 반환 값 변경 (#128) * feat: 랜딩 페이지 조회 시 subEvent 반환되도록 DTO 변경 (#128) * feat: deault 값 설정 (#128) * feat: 요구사항 변경으로 엔티티 및 DTO 변경 (#128) * feat: SQL 문 최신화 (#128) * feat: versioning --------- Co-authored-by: mjmj <108040422+violet-mj@users.noreply.github.com> Co-authored-by: mjmj commit 99e81a2714978a7556a187f761bffb716411fedd Author: min9805 <56664567+min9805@users.noreply.github.com> Date: Fri Aug 9 20:46:32 2024 +0900 Release/v1.0.4 (#119) * feat: release 1.0.2 (#87) * 추첨 이벤트 추첨 구현 (#92) * feat: EventUser 데이터베이스에서 N 명 추첨 메서드 생성 (#37) * feat: 랭킹 Dto Example 추가 (#37) * feat: winnersMeta Json 타입으로 변경 (#37) * feat: Json 타입 변경으로 인한 util, test 변경 (#37) * feat: DTO 변경 및 Wrapper Class to Primitive Type 으로 변경 (#37) * #feat: 추첨 메서드 작성 (#37) * feat: 추첨 메서드를 위한 API 생성 및 인가를 위한 ApiKey 임시 설정 (#37) * feat: WrapperClass 변경 (#37) * feat: Request 를 위한 Dto 생성 및 ApiKey Validate (#37) * #feat: JsonParseException 추가 (#37) * feat: 이미 추첨이 완료된 경우 Exception (#37) * feat: 반환값 변경 (#37) * feat: 총 수상자 수 로직 위치 변경 (#37) * feat: 랜덤 사용자 추출 및 Extra 추출 (#37) * feat: 주석 추가 및 네이밍 변경, 예외 처리 순서 변경 (#37) * fix: Rank 추가 및 등수 저장 (#37) * test: 추첨 로직 테스트 (#37) * test: drawWinner 메서드 테스트 코드 작성 (#37) * docs: Swagger 문서화 (#37) * fix: User builder 로 변경 (#37) * #feat: MySQL 예약어로 winner 필드 명 변경 (#37) * feat: RAND 및 Pageable 이슈로 인한 Native 쿼리로 변경 (#37) * EventUser Info API 변경합니다. (#95) * docs: Swagger 문서화 정리 (#94) * feat: EventUser NotFound 시 예외 처리 (#94) * test: 메서드 변경으로 인한 테스트 코드 변경 (#94) * EventUserRepository 단위 테스트 (#99) * feat: 테스트 시 내장 H2 사용 및 초기 SQL 문 삽입 (#94) * test: EventUserRepository 테스트 코드 작성 * cors 설정 변경 및 quiz 이벤트 로직 변경 (#97) * fix: CorsConfig를 WebConfig로 통합 (#91) * feat: 테스트 용 데이터 생성 … * v1.0.6 각종 버그 정리합니다. (#167) * feat: 이미 가입된 소셜 로그인 시 에러 처리 (#165) * feat: 랜딩 페이지 당첨 여부 반환 (#165) * feat: 이미 당첨된 유저 예외 처리 (#165) * feat: Drawing 기회 소진 우선순위 적용 (#165) * Fix/#165 v1.0.6 bugs (#168) * feat: 이미 가입된 소셜 로그인 시 에러 처리 (#165) * feat: 랜딩 페이지 당첨 여부 반환 (#165) * feat: 이미 당첨된 유저 예외 처리 (#165) * feat: Drawing 기회 소진 우선순위 적용 (#165) * feat: 프론트 에러 페이지를 위해 isCustom 추가 (#165) * test: 테스트 코드 작성 (#165) * 레디스 연결합니다 (#166) * fix: QuizFirstComeInfoRequest.java 충돌 해결 * feat: 레디스 의존성 추가 * feat: 레디스 Counter 구현 * feat: 선착순에 들었지만 중복 참여자인 경우 문서 작성 * fix: 병합 충돌 처리 * fix: 디렉토리 위치 수정 (/domain/firstcome/service) -> (/domain/firstcome/service/winnerdraw) * feat: 레디스 연결 및 테스트 * fix: dto 중복 당첨자일때 정답 아님을 반환했던 것을 정답은 맞았다고 처리함. * feat: 당첨자 추첨 로직(WinnerDraw) 레디스를 이용한 구현체 작성 * fix: 레디스 연결 테스트 삭제 * feat: redis Config 설정 (#162) * feat: 기존 메서드 분리 및 인터페이스 화 (#162) * feat: Redis 로 랭킹 조회 변경 (#162) * feat: 에러 시 isCustom 추가 (#162) * feat: Redis 사용하도록 변경 (#162) * test: 임시 주석 처리 (#162) --------- Co-authored-by: min9805 * feat: versioning --------- Co-authored-by: mjmj <108040422+violet-mj@users.noreply.github.com> Co-authored-by: mjmj --- build.gradle | 11 +- gradle.properties | 2 +- .../eventuser/dto/EventUserInfoDto.java | 4 + .../domain/eventuser/entity/EventUser.java | 7 + .../eventuser/service/EventUserService.java | 8 +- .../controller/QuizFirstComeController.java | 1 + .../quiz/dto/QuizFirstComeInfoRequest.java | 2 +- .../dto/QuizFirstComeSubmitResponseDto.java | 2 +- .../AlreadyWonEventUserException.java | 10 + .../quiz/service/CounterService.java | 35 +++ .../quiz/service/QuizFirstComeService.java | 23 +- .../service/winnerdraw/QuizWinnerDraw.java | 12 + .../winnerdraw/QuizWinnerDrawRedis.java | 47 ++++ .../winnerdraw/QuizWinnerDrawSync.java | 60 +++++ .../drawing/dto/DrawingInfoRequest.java | 5 - .../service/DrawingLotteryService.java | 94 +++---- .../drawing/service/rank/DrawingRank.java | 16 ++ .../service/rank/DrawingRankRedis.java | 100 +++++++ .../drawing/service/rank/DrawingRankSync.java | 76 ++++++ .../lottery/service/LotteryService.java | 4 - ...readyExistOtherOAuthProviderException.java | 10 + .../user/service/HyundaiOauthService.java | 5 + .../user/service/NaverOauthService.java | 5 + .../backend/global/config/RedisConfig.java | 28 ++ .../global/exception/ApiErrorResponse.java | 10 +- .../global/exception/BaseException.java | 2 + .../service/QuizFirstComeServiceTest.java | 255 ++++++++---------- .../service/DrawingLotteryServiceTest.java | 35 ++- 28 files changed, 618 insertions(+), 251 deletions(-) create mode 100644 src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/exception/AlreadyWonEventUserException.java create mode 100644 src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/CounterService.java create mode 100644 src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/winnerdraw/QuizWinnerDraw.java create mode 100644 src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/winnerdraw/QuizWinnerDrawRedis.java create mode 100644 src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/winnerdraw/QuizWinnerDrawSync.java create mode 100644 src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/rank/DrawingRank.java create mode 100644 src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/rank/DrawingRankRedis.java create mode 100644 src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/rank/DrawingRankSync.java create mode 100644 src/main/java/com/hyundai/softeer/backend/domain/user/exception/AlreadyExistOtherOAuthProviderException.java create mode 100644 src/main/java/com/hyundai/softeer/backend/global/config/RedisConfig.java diff --git a/build.gradle b/build.gradle index 329eb474..15edf87e 100644 --- a/build.gradle +++ b/build.gradle @@ -23,14 +23,18 @@ repositories { } dependencies { - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' - testImplementation 'junit:junit:4.13.1' implementation 'org.springframework.boot:spring-boot-starter-aop' compileOnly 'org.projectlombok:lombok' - runtimeOnly 'com.mysql:mysql-connector-j' annotationProcessor 'org.projectlombok:lombok' + // db + implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + runtimeOnly 'com.mysql:mysql-connector-j' + + // redis + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + // validation implementation 'org.springframework.boot:spring-boot-starter-validation' @@ -49,6 +53,7 @@ dependencies { implementation 'org.json:json:20210307' testImplementation 'org.springframework.boot:spring-boot-starter-test' + testImplementation 'junit:junit:4.13.1' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' testRuntimeOnly 'com.mysql:mysql-connector-j' testAnnotationProcessor 'org.projectlombok:lombok' diff --git a/gradle.properties b/gradle.properties index 71a5aa49..de652dbc 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=1.0.6 +version=1.1.0 diff --git a/src/main/java/com/hyundai/softeer/backend/domain/eventuser/dto/EventUserInfoDto.java b/src/main/java/com/hyundai/softeer/backend/domain/eventuser/dto/EventUserInfoDto.java index fef2f49d..6fcb7199 100644 --- a/src/main/java/com/hyundai/softeer/backend/domain/eventuser/dto/EventUserInfoDto.java +++ b/src/main/java/com/hyundai/softeer/backend/domain/eventuser/dto/EventUserInfoDto.java @@ -34,6 +34,9 @@ public class EventUserInfoDto { @Schema(description = "공유 보너스 참여 기회", example = "-1") private Integer shareBonusChance; + @Schema(description = "당첨 여부", example = "true") + private boolean isWinner; + public static EventUserInfoDto fromEntity(EventUser eventUser) { return EventUserInfoDto.builder() .lastVisitedAt(eventUser.getLastVisitedAt()) @@ -44,6 +47,7 @@ public static EventUserInfoDto fromEntity(EventUser eventUser) { .chance(eventUser.getChance()) .expectationBonusChance(eventUser.getExpectationBonusChance()) .shareBonusChance(eventUser.getShareBonusChance()) + .isWinner(eventUser.getIsWinner()) .build(); } } diff --git a/src/main/java/com/hyundai/softeer/backend/domain/eventuser/entity/EventUser.java b/src/main/java/com/hyundai/softeer/backend/domain/eventuser/entity/EventUser.java index 30a34f22..ead909fe 100644 --- a/src/main/java/com/hyundai/softeer/backend/domain/eventuser/entity/EventUser.java +++ b/src/main/java/com/hyundai/softeer/backend/domain/eventuser/entity/EventUser.java @@ -29,6 +29,9 @@ public class EventUser { @Builder.Default private Boolean isWriteExpectation = false; + @Builder.Default + private Boolean isWinner = false; + @Builder.Default private LocalDateTime lastVisitedAt = LocalDateTime.now(); @@ -124,4 +127,8 @@ public void useExpectationBonusChance() { public void useShareBonusChance() { this.shareBonusChance -= 1; } + + public void updateWinner() { + this.isWinner = true; + } } diff --git a/src/main/java/com/hyundai/softeer/backend/domain/eventuser/service/EventUserService.java b/src/main/java/com/hyundai/softeer/backend/domain/eventuser/service/EventUserService.java index 02a91868..55f35ffc 100644 --- a/src/main/java/com/hyundai/softeer/backend/domain/eventuser/service/EventUserService.java +++ b/src/main/java/com/hyundai/softeer/backend/domain/eventuser/service/EventUserService.java @@ -8,7 +8,6 @@ import com.hyundai.softeer.backend.domain.eventuser.exception.SharedUrlNotFoundException; import com.hyundai.softeer.backend.domain.eventuser.projection.EventUserPageProjection; import com.hyundai.softeer.backend.domain.eventuser.repository.EventUserRepository; -import com.hyundai.softeer.backend.domain.expectation.constant.ExpectationPage; import com.hyundai.softeer.backend.domain.subevent.dto.SubEventRequest; import com.hyundai.softeer.backend.domain.subevent.exception.SubEventNotFoundException; import com.hyundai.softeer.backend.domain.subevent.repository.SubEventRepository; @@ -18,7 +17,6 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -36,7 +34,7 @@ public class EventUserService { public EventUserInfoDto getEventUserInfo(User user, Long subEventId) { EventUser eventUser = eventUserRepository.findByUserIdAndSubEventId(user.getId(), subEventId) .orElseThrow(() -> new EventUserNotFoundException()); - + return EventUserInfoDto.fromEntity(eventUser); } @@ -72,13 +70,13 @@ public EventUserPageResponseDto getUserPage(EventUserPageRequest eventUserPageRe PAGE_SIZE ); - if(!subEventRepository.existsById(subEventId)) { + if (!subEventRepository.existsById(subEventId)) { throw new SubEventNotFoundException(); } Page eventUsersWithWinnerStatus = eventUserRepository.findEventUsersWithWinnerStatus(subEventId, pageable); - if(eventUsersWithWinnerStatus.isEmpty()) { + if (eventUsersWithWinnerStatus.isEmpty()) { throw new EventUserPageNotFoundException(); } diff --git a/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/controller/QuizFirstComeController.java b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/controller/QuizFirstComeController.java index fa83fd18..b4697915 100644 --- a/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/controller/QuizFirstComeController.java +++ b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/controller/QuizFirstComeController.java @@ -99,6 +99,7 @@ public BaseResponse getQuizLandingPage() { 1. 정답이 틀린 경우 2. 정답은 맞았으나 선착순에 들지 못한 경우. 3. 정답도 맞고 선착순에도 든 경우. + 4. 정답도 맞고 선착순에도 들었지만 이미 참가한 경우. - request body의 객체의 타입이 맞지 않거나 없는 경우 예외가 발생합니다. """) diff --git a/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizFirstComeInfoRequest.java b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizFirstComeInfoRequest.java index 06d5a1b1..a32426c6 100644 --- a/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizFirstComeInfoRequest.java +++ b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizFirstComeInfoRequest.java @@ -10,4 +10,4 @@ public class QuizFirstComeInfoRequest { @NotNull private Long eventId; -} \ No newline at end of file +} diff --git a/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizFirstComeSubmitResponseDto.java b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizFirstComeSubmitResponseDto.java index 19e8bbbf..e615561f 100644 --- a/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizFirstComeSubmitResponseDto.java +++ b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/dto/QuizFirstComeSubmitResponseDto.java @@ -26,6 +26,6 @@ public static QuizFirstComeSubmitResponseDto notCorrect() { } public static QuizFirstComeSubmitResponseDto alreadyParticipant() { - return new QuizFirstComeSubmitResponseDto(false, false, true, null); + return new QuizFirstComeSubmitResponseDto(true, true, true, null); } } diff --git a/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/exception/AlreadyWonEventUserException.java b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/exception/AlreadyWonEventUserException.java new file mode 100644 index 00000000..3fb46927 --- /dev/null +++ b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/exception/AlreadyWonEventUserException.java @@ -0,0 +1,10 @@ +package com.hyundai.softeer.backend.domain.firstcome.quiz.exception; + +import com.hyundai.softeer.backend.global.exception.BaseException; +import org.springframework.http.HttpStatus; + +public class AlreadyWonEventUserException extends BaseException { + public AlreadyWonEventUserException() { + super(HttpStatus.BAD_REQUEST, "이미 이벤트에 당첨되었습니다."); + } +} diff --git a/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/CounterService.java b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/CounterService.java new file mode 100644 index 00000000..153e3960 --- /dev/null +++ b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/CounterService.java @@ -0,0 +1,35 @@ +package com.hyundai.softeer.backend.domain.firstcome.quiz.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class CounterService { + + public static final String COUNTER_KEY = "COUNTER"; + + private final RedisTemplate redisTemplate; + + public Long incrementCounter(String key) { + return redisTemplate.opsForValue().increment(key); + } + + public Long decrementCounter(String key) { + return redisTemplate.opsForValue().decrement(key); + } + + public Long getCounterValue(String key) { + String value = redisTemplate.opsForValue().get(key); + return (value != null) ? Long.parseLong(value) : 0L; + } + + public void resetCounter(String key) { + redisTemplate.opsForValue().set(key, "0"); + } + + public void setCounter(String key, long value) { + redisTemplate.opsForValue().set(key, String.valueOf(value)); + } +} diff --git a/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeService.java b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeService.java index 62d81a79..c6941b2f 100644 --- a/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeService.java +++ b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeService.java @@ -10,8 +10,8 @@ import com.hyundai.softeer.backend.domain.firstcome.quiz.entity.QuizFirstCome; import com.hyundai.softeer.backend.domain.firstcome.quiz.exception.QuizAlreadyExistException; import com.hyundai.softeer.backend.domain.firstcome.quiz.exception.QuizNotFoundException; -import com.hyundai.softeer.backend.domain.firstcome.quiz.exception.QuizRegisterForbiddenException; import com.hyundai.softeer.backend.domain.firstcome.quiz.repository.QuizFirstComeRepository; +import com.hyundai.softeer.backend.domain.firstcome.quiz.service.winnerdraw.QuizWinnerDraw; import com.hyundai.softeer.backend.domain.prize.entity.Prize; import com.hyundai.softeer.backend.domain.prize.repository.PrizeRepository; import com.hyundai.softeer.backend.domain.subevent.dto.SubEventInfo; @@ -22,10 +22,6 @@ import com.hyundai.softeer.backend.domain.subevent.exception.SubEventNotWithinPeriodException; import com.hyundai.softeer.backend.domain.subevent.repository.SubEventRepository; import com.hyundai.softeer.backend.domain.user.entity.User; -import com.hyundai.softeer.backend.domain.user.repository.UserRepository; -import com.hyundai.softeer.backend.domain.winner.entity.Winner; -import com.hyundai.softeer.backend.domain.winner.repository.WinnerRepository; -import com.hyundai.softeer.backend.domain.winner.utils.WinnerUtil; import com.hyundai.softeer.backend.global.utils.DateUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -37,7 +33,6 @@ import java.util.Collections; import java.util.Comparator; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; @Service @@ -229,21 +224,19 @@ public QuizFirstComeSubmitResponseDto quizSubmit(QuizFirstComeSubmitRequest quiz return QuizFirstComeSubmitResponseDto.notCorrect(); } - EventUser eventUser = EventUser - .builder() + EventUser newEventUser = EventUser.builder() .user(authenticatedUser) .subEvent(subEvent) - .chance(-1) .build(); - eventUserRepository.save(eventUser); + EventUser eventUser = eventUserRepository.save(newEventUser); - return quizWinnerDraw.winnerDraw(quizFirstCome, subEvent, authenticatedUser); + return quizWinnerDraw.winnerDraw(eventUser, quizFirstCome, subEvent, authenticatedUser); } @Transactional(readOnly = true) public List getQuizInfos(QuizFirstComeInfoRequest quizFirstComeInfoRequest) { - Long eventId = quizFirstComeInfoRequest.getEventId(); + Long eventId = quizFirstComeInfoRequest.getEventId(); List quizInfos = subEventRepository.findByEventId(eventId) .stream() @@ -257,7 +250,7 @@ public List getQuizInfos(QuizFirstComeInfoRequest .build(); }).collect(Collectors.toList()); - if(quizInfos.isEmpty()) throw new EventNotFoundException(); + if (quizInfos.isEmpty()) throw new EventNotFoundException(); return quizInfos; } @@ -270,11 +263,11 @@ public void registerQuiz(List quizFirstComeRegiste eventRepository.findById(eventId) .orElseThrow(() -> new EventNotFoundException()); - if(!subEventRepository.findByEventId(eventId).isEmpty()) { + if (!subEventRepository.findByEventId(eventId).isEmpty()) { throw new QuizAlreadyExistException(); } - for(QuizFirstComeRegisterRequest quizFirstComeRegisterRequest: quizFirstComeRegisterRequests) { + for (QuizFirstComeRegisterRequest quizFirstComeRegisterRequest : quizFirstComeRegisterRequests) { SubEvent subEvent = SubEvent.builder() .startAt(quizFirstComeRegisterRequest.getStartAt()) .endAt(quizFirstComeRegisterRequest.getEndAt()) diff --git a/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/winnerdraw/QuizWinnerDraw.java b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/winnerdraw/QuizWinnerDraw.java new file mode 100644 index 00000000..419b6826 --- /dev/null +++ b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/winnerdraw/QuizWinnerDraw.java @@ -0,0 +1,12 @@ +package com.hyundai.softeer.backend.domain.firstcome.quiz.service.winnerdraw; + +import com.hyundai.softeer.backend.domain.eventuser.entity.EventUser; +import com.hyundai.softeer.backend.domain.firstcome.quiz.dto.QuizFirstComeSubmitResponseDto; +import com.hyundai.softeer.backend.domain.firstcome.quiz.entity.QuizFirstCome; +import com.hyundai.softeer.backend.domain.subevent.entity.SubEvent; +import com.hyundai.softeer.backend.domain.user.entity.User; + +public interface QuizWinnerDraw { + + QuizFirstComeSubmitResponseDto winnerDraw(EventUser eventUser, QuizFirstCome quizFirstCome, SubEvent subEvent, User authenticatedUser); +} diff --git a/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/winnerdraw/QuizWinnerDrawRedis.java b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/winnerdraw/QuizWinnerDrawRedis.java new file mode 100644 index 00000000..80368df5 --- /dev/null +++ b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/winnerdraw/QuizWinnerDrawRedis.java @@ -0,0 +1,47 @@ +package com.hyundai.softeer.backend.domain.firstcome.quiz.service.winnerdraw; + +import com.hyundai.softeer.backend.domain.eventuser.entity.EventUser; +import com.hyundai.softeer.backend.domain.firstcome.quiz.dto.QuizFirstComeSubmitResponseDto; +import com.hyundai.softeer.backend.domain.firstcome.quiz.entity.QuizFirstCome; +import com.hyundai.softeer.backend.domain.firstcome.quiz.service.CounterService; +import com.hyundai.softeer.backend.domain.prize.entity.Prize; +import com.hyundai.softeer.backend.domain.subevent.entity.SubEvent; +import com.hyundai.softeer.backend.domain.user.entity.User; +import com.hyundai.softeer.backend.domain.winner.entity.Winner; +import com.hyundai.softeer.backend.domain.winner.repository.WinnerRepository; +import com.hyundai.softeer.backend.domain.winner.utils.WinnerUtil; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class QuizWinnerDrawRedis implements QuizWinnerDraw { + + private final WinnerUtil winnerUtil; + private final WinnerRepository winnerRepository; + private final CounterService counterService; + + @Override + public synchronized QuizFirstComeSubmitResponseDto winnerDraw(EventUser eventUser, QuizFirstCome quizFirstCome, SubEvent subEvent, User authenticatedUser) { + if (!winnerUtil.isParticipanted(authenticatedUser.getId(), subEvent.getId()).isEmpty()) { + return QuizFirstComeSubmitResponseDto.alreadyParticipant(); + } + + long winners = quizFirstCome.getWinners(); + long winnerCount = counterService.getCounterValue(CounterService.COUNTER_KEY); + + if (winnerCount >= winners) { + return QuizFirstComeSubmitResponseDto.correctBut(); + } + + Prize prize = quizFirstCome.getPrize(); + + Winner winner = new Winner(); + winner.setPrize(prize); + winner.setSubEvent(subEvent); + winner.setUser(authenticatedUser); + winnerRepository.save(winner); + + return QuizFirstComeSubmitResponseDto.winner(prize.getPrizeWinningImgUrl()); + } +} diff --git a/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/winnerdraw/QuizWinnerDrawSync.java b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/winnerdraw/QuizWinnerDrawSync.java new file mode 100644 index 00000000..ac348deb --- /dev/null +++ b/src/main/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/winnerdraw/QuizWinnerDrawSync.java @@ -0,0 +1,60 @@ +package com.hyundai.softeer.backend.domain.firstcome.quiz.service.winnerdraw; + +import com.hyundai.softeer.backend.domain.eventuser.entity.EventUser; +import com.hyundai.softeer.backend.domain.eventuser.repository.EventUserRepository; +import com.hyundai.softeer.backend.domain.firstcome.quiz.dto.QuizFirstComeSubmitResponseDto; +import com.hyundai.softeer.backend.domain.firstcome.quiz.entity.QuizFirstCome; +import com.hyundai.softeer.backend.domain.firstcome.quiz.exception.AlreadyWonEventUserException; +import com.hyundai.softeer.backend.domain.firstcome.quiz.repository.QuizFirstComeRepository; +import com.hyundai.softeer.backend.domain.prize.entity.Prize; +import com.hyundai.softeer.backend.domain.subevent.entity.SubEvent; +import com.hyundai.softeer.backend.domain.user.entity.User; +import com.hyundai.softeer.backend.domain.winner.entity.Winner; +import com.hyundai.softeer.backend.domain.winner.repository.WinnerRepository; +import com.hyundai.softeer.backend.domain.winner.utils.WinnerUtil; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +public class QuizWinnerDrawSync implements QuizWinnerDraw { + + private final WinnerRepository winnerRepository; + private final WinnerUtil winnerUtil; + private final QuizFirstComeRepository quizFirstComeRepository; + private final EventUserRepository eventUserRepository; + + @Override + public synchronized QuizFirstComeSubmitResponseDto winnerDraw( + EventUser eventUser, + QuizFirstCome quizFirstCome, + SubEvent subEvent, + User authenticatedUser) { + + if (!winnerUtil.isParticipanted(authenticatedUser.getId(), subEvent.getId()).isEmpty()) { + throw new AlreadyWonEventUserException(); + } + + int winners = quizFirstCome.getWinners(); + int winnerCount = (int) winnerRepository.countWinnerBySubEventId(subEvent.getId()); + + if (winnerCount >= winners) { + return QuizFirstComeSubmitResponseDto.correctBut(); + } + + quizFirstCome.setWinnerCount(winnerCount + 1); + quizFirstComeRepository.flush(); + + + Prize prize = quizFirstCome.getPrize(); + + Winner winner = new Winner(); + winner.setPrize(prize); + winner.setSubEvent(subEvent); + winner.setUser(authenticatedUser); + winnerRepository.save(winner); + + eventUser.updateWinner(); + eventUserRepository.save(eventUser); + + return QuizFirstComeSubmitResponseDto.winner(prize.getPrizeWinningImgUrl()); + } +} diff --git a/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/dto/DrawingInfoRequest.java b/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/dto/DrawingInfoRequest.java index fc1c3fb8..677157e2 100644 --- a/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/dto/DrawingInfoRequest.java +++ b/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/dto/DrawingInfoRequest.java @@ -1,6 +1,5 @@ package com.hyundai.softeer.backend.domain.lottery.drawing.dto; -import com.hyundai.softeer.backend.domain.subevent.enums.EventPlayType; import io.swagger.v3.oas.annotations.Parameter; import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; @@ -16,8 +15,4 @@ public class DrawingInfoRequest { @NotNull @Parameter private Long subEventId; - - @NotNull - @Parameter - private EventPlayType eventPlayType; } diff --git a/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryService.java b/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryService.java index ae197529..afb5241d 100644 --- a/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryService.java +++ b/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryService.java @@ -8,42 +8,49 @@ import com.hyundai.softeer.backend.domain.lottery.drawing.entity.DrawingLotteryEvent; import com.hyundai.softeer.backend.domain.lottery.drawing.exception.DrawingNotFoundException; import com.hyundai.softeer.backend.domain.lottery.drawing.repository.DrawingLotteryRepository; +import com.hyundai.softeer.backend.domain.lottery.drawing.service.rank.DrawingRank; import com.hyundai.softeer.backend.domain.lottery.dto.RankDto; import com.hyundai.softeer.backend.domain.lottery.service.LotteryService; import com.hyundai.softeer.backend.domain.subevent.dto.SubEventRequest; import com.hyundai.softeer.backend.domain.subevent.entity.SubEvent; -import com.hyundai.softeer.backend.domain.subevent.enums.EventPlayType; import com.hyundai.softeer.backend.domain.subevent.enums.SubEventType; -import com.hyundai.softeer.backend.domain.subevent.exception.UnknownEventPlayTypeException; import com.hyundai.softeer.backend.domain.subevent.repository.SubEventRepository; import com.hyundai.softeer.backend.domain.user.entity.User; import com.hyundai.softeer.backend.global.utils.ParseUtil; +import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.List; -import java.util.Map; import java.util.Optional; @Service @RequiredArgsConstructor @Slf4j public class DrawingLotteryService implements LotteryService { - public static final String FIRST_GAME_SCORE = "1_game_score"; - public static final String SECOND_GAME_SCORE = "2_game_score"; - public static final String THIRD_GAME_SCORE = "3_game_score"; - public static final String GAME_SCORE = "game_score"; - public static final List SCORE_WEIGHTS = List.of(0.25, 0.35, 0.4); private final SubEventRepository subEventRepository; private final EventUserRepository eventUserRepository; private final DrawingLotteryRepository drawingLotteryRepository; private final ScoreCalculator scoreCalculator; + private final DrawingRank drawingRank; + + @Value("${properties.event-id}") + private Long eventId; + + @PostConstruct + public void init() { + SubEvent rankingSubEvent = subEventRepository.findByEventId(eventId) + .stream() + .filter(subEvent -> subEvent.getEventType().equals(SubEventType.DRAWING)) + .findFirst().get(); + + drawingRank.updateRankingData(rankingSubEvent.getId(), 20); + } @Transactional(readOnly = true) public DrawingLotteryLandDto getDrawingLotteryLand(long eventId) { @@ -57,6 +64,10 @@ public DrawingLotteryLandDto getDrawingLotteryLand(long eventId) { return DrawingLotteryLandDto.fromEntity(drawing); } + public List getRankList(SubEventRequest subEventRequest, int rankCount) { + return drawingRank.getRankList(subEventRequest, rankCount); + } + private SubEvent findDrawingEvent(List subEvents) { for (SubEvent subEvent : subEvents) { if (subEvent.getEventType().equals(SubEventType.DRAWING)) { @@ -66,21 +77,6 @@ private SubEvent findDrawingEvent(List subEvents) { return null; } - @Transactional(readOnly = true) - @Override - public List getRankList(SubEventRequest subEventRequest, int rankCount) { - Pageable pageable = PageRequest.of(0, rankCount); - List topNBySubEventId = eventUserRepository.findTopNBySubEventId(subEventRequest.getSubEventId(), pageable); - - for (int i = 0; i < topNBySubEventId.size(); i++) { - topNBySubEventId.get(i).setRank(i + 1); - } - - log.info("topNBySubEventId: {}", topNBySubEventId); - - return topNBySubEventId; - } - @Transactional public DrawingInfoDtos getDrawingGameInfo(User authenticatedUser, DrawingInfoRequest drawingInfoRequest) { List drawingEvents = drawingLotteryRepository.findBySubEventId(drawingInfoRequest.getSubEventId()); @@ -89,7 +85,6 @@ public DrawingInfoDtos getDrawingGameInfo(User authenticatedUser, DrawingInfoReq throw new DrawingNotFoundException(); } - EventPlayType eventPlayType = drawingInfoRequest.getEventPlayType(); LocalDateTime now = LocalDateTime.now(); EventUser eventUser = eventUserRepository.findByUserIdAndSubEventId(authenticatedUser.getId(), drawingInfoRequest.getSubEventId()) @@ -100,11 +95,19 @@ public DrawingInfoDtos getDrawingGameInfo(User authenticatedUser, DrawingInfoReq .lastChargeAt(now) .build()); - switch (eventPlayType) { - case NORMAL -> updateChanceAtNormalPlay(eventUser); - case EXPECTATION -> updateChanceAtExpectationPlay(eventUser); - case SHARED -> updateChanceAtSharedPlay(eventUser); - default -> throw new UnknownEventPlayTypeException(); + // TODO Refactor + try { + updateChanceAtNormalPlay(eventUser); + } catch (NoChanceUserException e) { + try { + updateChanceAtSharedPlay(eventUser); + } catch (NoChanceUserException ex) { + try { + updateChanceAtExpectationPlay(eventUser); + } catch (NoChanceUserException exc) { + throw new NoChanceUserException(); + } + } } return DrawingInfoDtos.builder() @@ -145,6 +148,7 @@ private void updateChanceAtNormalPlay(EventUser eventUser) { eventUserRepository.save(eventUser); } + @Transactional public DrawingScoreDto getDrawingScore(User authenticatedUser, DrawingScoreRequest drawingScoreRequest) { DrawingLotteryEvent drawingEvent = drawingLotteryRepository.findBySubEventIdAndSequence(drawingScoreRequest.getSubEventId(), drawingScoreRequest.getSequence()) .orElseThrow(DrawingNotFoundException::new); @@ -171,32 +175,8 @@ public DrawingScoreDto getDrawingScore(User authenticatedUser, DrawingScoreReque .build(); } + @Transactional public DrawingTotalScoreDto getDrawingTotalScore(User authenticatedUser, SubEventRequest subEventRequest) { - EventUser eventUser = eventUserRepository.findByUserIdAndSubEventId(authenticatedUser.getId(), subEventRequest.getSubEventId()) - .orElseThrow(() -> new EventUserNotFoundException()); - - Map scores = eventUser.getScores(); - - double firstScore = (double) scores.getOrDefault(FIRST_GAME_SCORE, 0.0); - double secondScore = (double) scores.getOrDefault(SECOND_GAME_SCORE, 0.0); - double thirdScore = (double) scores.getOrDefault(THIRD_GAME_SCORE, 0.0); - - double totalScore = firstScore * SCORE_WEIGHTS.get(0) + secondScore * SCORE_WEIGHTS.get(1) + thirdScore * SCORE_WEIGHTS.get(2); - double maxScore = (double) scores.getOrDefault(GAME_SCORE, 0.0); - - if (totalScore > maxScore) { - maxScore = totalScore; - eventUser.updateScores(GAME_SCORE, totalScore); - eventUser.updateGameScore(totalScore); - eventUserRepository.save(eventUser); - } - - return DrawingTotalScoreDto.builder() - .totalScore(totalScore) - .maxScore(maxScore) - .chance(eventUser.getChance()) - .expectationBonusChance(eventUser.getExpectationBonusChance()) - .shareBonusChance(eventUser.getShareBonusChance()) - .build(); + return drawingRank.getDrawingTotalScore(authenticatedUser, subEventRequest); } } diff --git a/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/rank/DrawingRank.java b/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/rank/DrawingRank.java new file mode 100644 index 00000000..9ae54c1c --- /dev/null +++ b/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/rank/DrawingRank.java @@ -0,0 +1,16 @@ +package com.hyundai.softeer.backend.domain.lottery.drawing.service.rank; + +import com.hyundai.softeer.backend.domain.lottery.drawing.dto.DrawingTotalScoreDto; +import com.hyundai.softeer.backend.domain.lottery.dto.RankDto; +import com.hyundai.softeer.backend.domain.subevent.dto.SubEventRequest; +import com.hyundai.softeer.backend.domain.user.entity.User; + +import java.util.List; + +public interface DrawingRank { + List getRankList(SubEventRequest subEventRequest, int rankCount); + + DrawingTotalScoreDto getDrawingTotalScore(User authenticatedUser, SubEventRequest subEventRequest); + + void updateRankingData(long subEventId, int rankCount); +} diff --git a/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/rank/DrawingRankRedis.java b/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/rank/DrawingRankRedis.java new file mode 100644 index 00000000..117d1334 --- /dev/null +++ b/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/rank/DrawingRankRedis.java @@ -0,0 +1,100 @@ +package com.hyundai.softeer.backend.domain.lottery.drawing.service.rank; + +import com.hyundai.softeer.backend.domain.eventuser.entity.EventUser; +import com.hyundai.softeer.backend.domain.eventuser.exception.EventUserNotFoundException; +import com.hyundai.softeer.backend.domain.eventuser.repository.EventUserRepository; +import com.hyundai.softeer.backend.domain.lottery.drawing.dto.DrawingTotalScoreDto; +import com.hyundai.softeer.backend.domain.lottery.dto.RankDto; +import com.hyundai.softeer.backend.domain.subevent.dto.SubEventRequest; +import com.hyundai.softeer.backend.domain.user.entity.User; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ZSetOperations; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Set; + +@Service +@RequiredArgsConstructor +public class DrawingRankRedis implements DrawingRank { + private final EventUserRepository eventUserRepository; + private final RedisTemplate redisTemplate; + + public static final String FIRST_GAME_SCORE = "1_game_score"; + public static final String SECOND_GAME_SCORE = "2_game_score"; + public static final String THIRD_GAME_SCORE = "3_game_score"; + public static final String GAME_SCORE = "game_score"; + public static final List SCORE_WEIGHTS = List.of(0.25, 0.35, 0.4); + private static final String RANKING_KEY = "ranking"; + + @Transactional(readOnly = true) + @Override + public List getRankList(SubEventRequest subEventRequest, int rankCount) { + Set> rankedUsers = redisTemplate.opsForZSet().reverseRangeWithScores(RANKING_KEY, 0, rankCount - 1); + if (rankedUsers == null) { + return List.of(); // 빈 리스트 반환 + } + List rankList = new ArrayList<>(); + int rank = 1; + + for (ZSetOperations.TypedTuple tuple : rankedUsers) { + RankDto rankDto = new RankDto(tuple.getValue(), tuple.getScore()); + rankDto.setRank(rank++); + rankList.add(rankDto); + } + + return rankList; + } + + @Transactional + @Override + public DrawingTotalScoreDto getDrawingTotalScore(User authenticatedUser, SubEventRequest subEventRequest) { + EventUser eventUser = eventUserRepository.findByUserIdAndSubEventId(authenticatedUser.getId(), subEventRequest.getSubEventId()) + .orElseThrow(() -> new EventUserNotFoundException()); + + Map scores = eventUser.getScores(); + + double firstScore = (double) scores.getOrDefault(FIRST_GAME_SCORE, 0.0); + double secondScore = (double) scores.getOrDefault(SECOND_GAME_SCORE, 0.0); + double thirdScore = (double) scores.getOrDefault(THIRD_GAME_SCORE, 0.0); + + double totalScore = firstScore * SCORE_WEIGHTS.get(0) + secondScore * SCORE_WEIGHTS.get(1) + thirdScore * SCORE_WEIGHTS.get(2); + double maxScore = (double) scores.getOrDefault(GAME_SCORE, 0.0); + + if (totalScore > maxScore) { + maxScore = totalScore; + eventUser.updateScores(GAME_SCORE, totalScore); + eventUser.updateGameScore(totalScore); + eventUserRepository.save(eventUser); + redisTemplate.opsForZSet().add(RANKING_KEY, authenticatedUser.getName(), totalScore); + } + + return DrawingTotalScoreDto.builder() + .totalScore(totalScore) + .maxScore(maxScore) + .chance(eventUser.getChance()) + .expectationBonusChance(eventUser.getExpectationBonusChance()) + .shareBonusChance(eventUser.getShareBonusChance()) + .build(); + } + + @Transactional + public void updateRankingData(long subEventId, int rankCount) { + Pageable pageable = PageRequest.of(0, rankCount); + List topNBySubEventId = eventUserRepository.findTopNBySubEventId(subEventId, pageable); + + ZSetOperations zSetOps = redisTemplate.opsForZSet(); + + zSetOps.removeRange(RANKING_KEY, 0, -1); + + for (RankDto rankDto : topNBySubEventId) { + zSetOps.add(RANKING_KEY, rankDto.getName(), rankDto.getScore()); + } + } +} diff --git a/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/rank/DrawingRankSync.java b/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/rank/DrawingRankSync.java new file mode 100644 index 00000000..e44a35ee --- /dev/null +++ b/src/main/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/rank/DrawingRankSync.java @@ -0,0 +1,76 @@ +package com.hyundai.softeer.backend.domain.lottery.drawing.service.rank; + +import com.hyundai.softeer.backend.domain.eventuser.entity.EventUser; +import com.hyundai.softeer.backend.domain.eventuser.exception.EventUserNotFoundException; +import com.hyundai.softeer.backend.domain.eventuser.repository.EventUserRepository; +import com.hyundai.softeer.backend.domain.lottery.drawing.dto.DrawingTotalScoreDto; +import com.hyundai.softeer.backend.domain.lottery.dto.RankDto; +import com.hyundai.softeer.backend.domain.subevent.dto.SubEventRequest; +import com.hyundai.softeer.backend.domain.user.entity.User; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; +import java.util.Map; + +@RequiredArgsConstructor +public class DrawingRankSync implements DrawingRank { + private final EventUserRepository eventUserRepository; + + public static final String FIRST_GAME_SCORE = "1_game_score"; + public static final String SECOND_GAME_SCORE = "2_game_score"; + public static final String THIRD_GAME_SCORE = "3_game_score"; + public static final String GAME_SCORE = "game_score"; + public static final List SCORE_WEIGHTS = List.of(0.25, 0.35, 0.4); + + @Transactional(readOnly = true) + @Override + public List getRankList(SubEventRequest subEventRequest, int rankCount) { + Pageable pageable = PageRequest.of(0, rankCount); + List topNBySubEventId = eventUserRepository.findTopNBySubEventId(subEventRequest.getSubEventId(), pageable); + + for (int i = 0; i < topNBySubEventId.size(); i++) { + topNBySubEventId.get(i).setRank(i + 1); + } + + return topNBySubEventId; + } + + @Transactional + @Override + public DrawingTotalScoreDto getDrawingTotalScore(User authenticatedUser, SubEventRequest subEventRequest) { + EventUser eventUser = eventUserRepository.findByUserIdAndSubEventId(authenticatedUser.getId(), subEventRequest.getSubEventId()) + .orElseThrow(() -> new EventUserNotFoundException()); + + Map scores = eventUser.getScores(); + + double firstScore = (double) scores.getOrDefault(FIRST_GAME_SCORE, 0.0); + double secondScore = (double) scores.getOrDefault(SECOND_GAME_SCORE, 0.0); + double thirdScore = (double) scores.getOrDefault(THIRD_GAME_SCORE, 0.0); + + double totalScore = firstScore * SCORE_WEIGHTS.get(0) + secondScore * SCORE_WEIGHTS.get(1) + thirdScore * SCORE_WEIGHTS.get(2); + double maxScore = (double) scores.getOrDefault(GAME_SCORE, 0.0); + + if (totalScore > maxScore) { + maxScore = totalScore; + eventUser.updateScores(GAME_SCORE, totalScore); + eventUser.updateGameScore(totalScore); + eventUserRepository.save(eventUser); + } + + return DrawingTotalScoreDto.builder() + .totalScore(totalScore) + .maxScore(maxScore) + .chance(eventUser.getChance()) + .expectationBonusChance(eventUser.getExpectationBonusChance()) + .shareBonusChance(eventUser.getShareBonusChance()) + .build(); + } + + @Override + public void updateRankingData(long subEventId, int rankCount) { + // do nothing + } +} diff --git a/src/main/java/com/hyundai/softeer/backend/domain/lottery/service/LotteryService.java b/src/main/java/com/hyundai/softeer/backend/domain/lottery/service/LotteryService.java index 42f412bb..47eef328 100644 --- a/src/main/java/com/hyundai/softeer/backend/domain/lottery/service/LotteryService.java +++ b/src/main/java/com/hyundai/softeer/backend/domain/lottery/service/LotteryService.java @@ -1,9 +1,7 @@ package com.hyundai.softeer.backend.domain.lottery.service; import com.hyundai.softeer.backend.domain.eventuser.entity.EventUser; -import com.hyundai.softeer.backend.domain.lottery.dto.RankDto; import com.hyundai.softeer.backend.domain.subevent.dto.LotteryScoreWeight; -import com.hyundai.softeer.backend.domain.subevent.dto.SubEventRequest; import com.hyundai.softeer.backend.domain.subevent.dto.WinnerCandidate; import org.springframework.stereotype.Service; @@ -50,6 +48,4 @@ private double calculateWeightedValue(EventUser eventUser, LotteryScoreWeight sc (lottoScore * scoreWeight.getLottoWeight()) + (gameScore * scoreWeight.getGameWeight()); } - - List getRankList(SubEventRequest subEventRequest, int rankCount); } diff --git a/src/main/java/com/hyundai/softeer/backend/domain/user/exception/AlreadyExistOtherOAuthProviderException.java b/src/main/java/com/hyundai/softeer/backend/domain/user/exception/AlreadyExistOtherOAuthProviderException.java new file mode 100644 index 00000000..1c4e03fa --- /dev/null +++ b/src/main/java/com/hyundai/softeer/backend/domain/user/exception/AlreadyExistOtherOAuthProviderException.java @@ -0,0 +1,10 @@ +package com.hyundai.softeer.backend.domain.user.exception; + +import com.hyundai.softeer.backend.global.exception.BaseException; +import org.springframework.http.HttpStatus; + +public class AlreadyExistOtherOAuthProviderException extends BaseException { + public AlreadyExistOtherOAuthProviderException() { + super(HttpStatus.CONFLICT, "이미 다른 소셜 계정으로 가입된 이메일 혹은 전화번호입니다."); + } +} diff --git a/src/main/java/com/hyundai/softeer/backend/domain/user/service/HyundaiOauthService.java b/src/main/java/com/hyundai/softeer/backend/domain/user/service/HyundaiOauthService.java index 9d579269..de30aee4 100644 --- a/src/main/java/com/hyundai/softeer/backend/domain/user/service/HyundaiOauthService.java +++ b/src/main/java/com/hyundai/softeer/backend/domain/user/service/HyundaiOauthService.java @@ -8,6 +8,7 @@ import com.hyundai.softeer.backend.domain.user.dto.LoginResponseDto; import com.hyundai.softeer.backend.domain.user.dto.UserInfoDto; import com.hyundai.softeer.backend.domain.user.entity.User; +import com.hyundai.softeer.backend.domain.user.exception.AlreadyExistOtherOAuthProviderException; import com.hyundai.softeer.backend.domain.user.exception.DuplicateUserException; import com.hyundai.softeer.backend.domain.user.repository.UserRepository; import com.hyundai.softeer.backend.global.jwt.OAuthProvider; @@ -73,6 +74,10 @@ public LoginResponseDto callback(CallBackRequest callBackRequest) throws JsonPro if (user.size() > 1) { throw new DuplicateUserException(); } + if (user.get(0).getOAuthProvider() != OAuthProvider.HYUNDAI) { + throw new AlreadyExistOtherOAuthProviderException(); + } + return LoginResponseDto.builder() .user(UserInfoDto.fromEntity(user.get(0))) .token(tokenProvider.createJwt(Map.of("email", userInfo.getEmail()))) diff --git a/src/main/java/com/hyundai/softeer/backend/domain/user/service/NaverOauthService.java b/src/main/java/com/hyundai/softeer/backend/domain/user/service/NaverOauthService.java index a6f7f024..6128bd93 100644 --- a/src/main/java/com/hyundai/softeer/backend/domain/user/service/NaverOauthService.java +++ b/src/main/java/com/hyundai/softeer/backend/domain/user/service/NaverOauthService.java @@ -8,6 +8,7 @@ import com.hyundai.softeer.backend.domain.user.dto.NaverUserInfo; import com.hyundai.softeer.backend.domain.user.dto.UserInfoDto; import com.hyundai.softeer.backend.domain.user.entity.User; +import com.hyundai.softeer.backend.domain.user.exception.AlreadyExistOtherOAuthProviderException; import com.hyundai.softeer.backend.domain.user.exception.DuplicateUserException; import com.hyundai.softeer.backend.domain.user.repository.UserRepository; import com.hyundai.softeer.backend.global.jwt.OAuthProvider; @@ -75,6 +76,10 @@ public LoginResponseDto callback(CallBackRequest callBackRequest) throws JsonPro if (user.size() > 1) { throw new DuplicateUserException(); } + if (user.get(0).getOAuthProvider() != OAuthProvider.NAVER) { + throw new AlreadyExistOtherOAuthProviderException(); + } + return LoginResponseDto.builder() .user(UserInfoDto.fromEntity(user.get(0))) .token(tokenProvider.createJwt(Map.of("email", userInfo.getEmail()))) diff --git a/src/main/java/com/hyundai/softeer/backend/global/config/RedisConfig.java b/src/main/java/com/hyundai/softeer/backend/global/config/RedisConfig.java new file mode 100644 index 00000000..0f51be99 --- /dev/null +++ b/src/main/java/com/hyundai/softeer/backend/global/config/RedisConfig.java @@ -0,0 +1,28 @@ +package com.hyundai.softeer.backend.global.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +public class RedisConfig { + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + // Key serializer 설정 + template.setKeySerializer(new StringRedisSerializer()); + + // Value serializer 설정 + template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); + + // Hash key 및 value serializer 설정 + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); + + return template; + } + +} diff --git a/src/main/java/com/hyundai/softeer/backend/global/exception/ApiErrorResponse.java b/src/main/java/com/hyundai/softeer/backend/global/exception/ApiErrorResponse.java index fedb9817..f6e47eb2 100644 --- a/src/main/java/com/hyundai/softeer/backend/global/exception/ApiErrorResponse.java +++ b/src/main/java/com/hyundai/softeer/backend/global/exception/ApiErrorResponse.java @@ -12,22 +12,26 @@ public class ApiErrorResponse { @Schema(title = "에러 메시지", example = "에러가 발생했습니다.") private final String message; + private Boolean isCustom = false; + public ApiErrorResponse(BaseException ex) { status = ex.getHttpStatus(); message = ex.getMessage(); + isCustom = ex.getIsCustom(); } - public ApiErrorResponse(HttpStatusCode status, String message) { + public ApiErrorResponse(HttpStatusCode status, String message, Boolean isCustom) { this.status = status; this.message = message; + this.isCustom = isCustom; } public static ApiErrorResponse of(HttpStatusCode status, String message) { - return new ApiErrorResponse(status, message); + return new ApiErrorResponse(status, message, true); } public static ResponseEntity toResponseEntity(HttpStatusCode httpStatusCode, String message) { - return ResponseEntity.status(httpStatusCode).body(new ApiErrorResponse(httpStatusCode, message)); + return ResponseEntity.status(httpStatusCode).body(new ApiErrorResponse(httpStatusCode, message, false)); } public static ResponseEntity toResponseEntity(BaseException ex) { diff --git a/src/main/java/com/hyundai/softeer/backend/global/exception/BaseException.java b/src/main/java/com/hyundai/softeer/backend/global/exception/BaseException.java index f0543e7d..5d028aff 100644 --- a/src/main/java/com/hyundai/softeer/backend/global/exception/BaseException.java +++ b/src/main/java/com/hyundai/softeer/backend/global/exception/BaseException.java @@ -7,10 +7,12 @@ public class BaseException extends RuntimeException { private final HttpStatus httpStatus; + private final Boolean isCustom; public BaseException(HttpStatus httpStatus, String message) { super(message); this.httpStatus = httpStatus; + this.isCustom = true; } } diff --git a/src/test/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeServiceTest.java b/src/test/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeServiceTest.java index 38db1397..cdbb885e 100644 --- a/src/test/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeServiceTest.java +++ b/src/test/java/com/hyundai/softeer/backend/domain/firstcome/quiz/service/QuizFirstComeServiceTest.java @@ -1,143 +1,122 @@ package com.hyundai.softeer.backend.domain.firstcome.quiz.service; -import com.hyundai.softeer.backend.domain.event.entity.Event; -import com.hyundai.softeer.backend.domain.event.repository.EventRepository; -import com.hyundai.softeer.backend.domain.firstcome.quiz.dto.QuizFirstComeLandResponseDto; -import com.hyundai.softeer.backend.domain.firstcome.quiz.dto.QuizFirstComeRequest; -import com.hyundai.softeer.backend.domain.firstcome.quiz.dto.QuizFirstComeResponseDto; -import com.hyundai.softeer.backend.domain.firstcome.quiz.entity.QuizFirstCome; -import com.hyundai.softeer.backend.domain.firstcome.quiz.repository.QuizFirstComeRepository; -import com.hyundai.softeer.backend.domain.prize.entity.Prize; -import com.hyundai.softeer.backend.domain.subevent.entity.SubEvent; -import com.hyundai.softeer.backend.domain.subevent.enums.SubEventExecuteType; -import com.hyundai.softeer.backend.domain.subevent.exception.SubEventNotWithinPeriodException; -import com.hyundai.softeer.backend.domain.subevent.repository.SubEventRepository; -import org.assertj.core.api.Assertions; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; - -import java.time.Clock; -import java.time.Instant; -import java.time.ZoneId; -import java.util.Optional; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; - -@SpringBootTest class QuizFirstComeServiceTest { - @Autowired - QuizFirstComeService quizFirstComeService; - - @MockBean - SubEventRepository subEventRepository; - - @MockBean - QuizFirstComeRepository quizFirstComeRepository; - - @MockBean - EventRepository eventRepository; - - @MockBean - Clock clock; - - @Test - @DisplayName("quiz 테스트: 퀴즈를 받아오는데 성공한 경우") - void getQuizSuccessTest() { - // given - QuizFirstComeRequest quizFirstComeRequest = new QuizFirstComeRequest(1L); - - QuizFirstCome quizFirstCome1 = quizGenerator(1L); - SubEvent subEvent1 = SubEvent.subEventGenerator(1L); - - Instant fixedInstant = Instant.parse("2024-06-25T00:00:00Z"); - Clock fixedClock = Clock.fixed(fixedInstant, ZoneId.systemDefault()); - when(clock.instant()).thenReturn(fixedInstant); - when(clock.getZone()).thenReturn(fixedClock.getZone()); - - when(quizFirstComeRepository.findBySubEventId(any(Long.class))).thenReturn(Optional.of(quizFirstCome1)); - when(subEventRepository.findById(any(Long.class))).thenReturn(Optional.of(subEvent1)); - - // when - QuizFirstComeResponseDto quizFirstComeResponseDto = quizFirstComeService.getQuiz(quizFirstComeRequest); - - // then - assertThat(quizFirstComeResponseDto).isNotNull(); - assertThat(quizFirstComeResponseDto.getCarInfo()).isEqualTo("산타페는 어쩌구저쩌구1"); - assertThat(quizFirstComeResponseDto.getInitConsonant()).isEqualTo("ㅅㅇㅈㅇ1"); - assertThat(quizFirstComeResponseDto.getSubEventId()).isEqualTo(1L); - } - - @Test - @DisplayName("quiz 테스트: 이벤트 시간이 아닌 경우") - void getQuizNotWithinEventTest() { - // given - QuizFirstComeRequest quizFirstComeRequest = new QuizFirstComeRequest(1L); - - QuizFirstCome quizFirstCome1 = quizGenerator(1L); - SubEvent subEvent1 = SubEvent.subEventGenerator(1L); - - Instant fixedInstant = Instant.parse("2024-07-03T00:00:00Z"); - Clock fixedClock = Clock.fixed(fixedInstant, ZoneId.systemDefault()); - when(clock.instant()).thenReturn(fixedInstant); - when(clock.getZone()).thenReturn(fixedClock.getZone()); - - when(quizFirstComeRepository.findBySubEventId(any(Long.class))).thenReturn(Optional.of(quizFirstCome1)); - when(subEventRepository.findById(any(Long.class))).thenReturn(Optional.of(subEvent1)); - - // when - Assertions.assertThatThrownBy(() -> { - quizFirstComeService.getQuiz(quizFirstComeRequest); - }).isInstanceOf(SubEventNotWithinPeriodException.class); - } - - @Test - @DisplayName("랜딩 페이지 api: 정상 반환인 경우") - void landingPageSuccessTest() { - // given - Long eventId = 1L; - - Instant fixedInstant = Instant.parse("2024-06-25T10:00:00Z"); - Clock fixedClock = Clock.fixed(fixedInstant, ZoneId.systemDefault()); - when(clock.instant()).thenReturn(fixedInstant); - when(clock.getZone()).thenReturn(fixedClock.getZone()); - - when(eventRepository.findById(any(Long.class))).thenReturn(Optional.ofNullable(Event.testEventGenerator(eventId))); - when(subEventRepository.findByEventIdAndExecuteType(any(Long.class), any(SubEventExecuteType.class))).thenReturn(SubEvent.subEventsGenerator(3L)); - when(quizFirstComeRepository.findBySubEventId(any(Long.class))).thenReturn(Optional.ofNullable(quizGenerator(1L))); - - // when - QuizFirstComeLandResponseDto quizFirstComeLandResponseDto = quizFirstComeService.getQuizLand(eventId); - - // then - assertThat(quizFirstComeLandResponseDto.getLastQuizNumber()).isEqualTo(3); - assertThat(quizFirstComeLandResponseDto.getHint()).isEqualTo("ㅎㅇ1"); - assertThat(quizFirstComeLandResponseDto.isValid()).isTrue(); - } - - private Prize prizeGenerator(long i) { - return Prize.builder().price((int) (1000 + i)).id((Long) i).prizeImgUrl("www.prize" + i + ".com").productName("python" + i).build(); - } - - private QuizFirstCome quizGenerator(long i) { - return QuizFirstCome.builder() - .sequence((int) i) - .overview("산타페는 일상의 머시기" + i) - .problem("산타페의 연비는?") - .carInfo("산타페는 어쩌구저쩌구" + i) - .answer("답" + i) - .hint("ㅎㅇ" + i) - .anchor("#hi" + i) - .initConsonant("ㅅㅇㅈㅇ" + i) - .prize(prizeGenerator(i)) - .winnerCount((int) i) - .winners((int) i + 1) - .subEventId(i) - .build(); - } +// @InjectMocks +// QuizFirstComeService quizFirstComeService; +// +// @Mock +// SubEventRepository subEventRepository; +// +// @Mock +// QuizFirstComeRepository quizFirstComeRepository; +// +// @Mock +// EventRepository eventRepository; +// +// @Mock +// QuizWinnerDraw quizWinnerDraw; +// +// @Mock +// PrizeRepository prizeRepository; +// +// @Mock +// DateUtil dateUtil; +// +// @Mock +// Clock clock; +// +// @Test +// @DisplayName("quiz 테스트: 퀴즈를 받아오는데 성공한 경우") +// void getQuizSuccessTest() { +// // given +// QuizFirstComeRequest quizFirstComeRequest = new QuizFirstComeRequest(1L); +// +// QuizFirstCome quizFirstCome1 = quizGenerator(1L); +// SubEvent subEvent1 = SubEvent.subEventGenerator(1L); +// +// Instant fixedInstant = Instant.parse("2024-06-25T00:00:00Z"); +// Clock fixedClock = Clock.fixed(fixedInstant, ZoneId.systemDefault()); +// +// when(quizFirstComeRepository.findBySubEventId(any(Long.class))).thenReturn(Optional.of(quizFirstCome1)); +// when(subEventRepository.findById(any(Long.class))).thenReturn(Optional.of(subEvent1)); +// +// // when +// QuizFirstComeResponseDto quizFirstComeResponseDto = quizFirstComeService.getQuiz(quizFirstComeRequest); +// +// // then +// assertThat(quizFirstComeResponseDto).isNotNull(); +// assertThat(quizFirstComeResponseDto.getCarInfo()).isEqualTo("산타페는 어쩌구저쩌구1"); +// assertThat(quizFirstComeResponseDto.getInitConsonant()).isEqualTo("ㅅㅇㅈㅇ1"); +// assertThat(quizFirstComeResponseDto.getSubEventId()).isEqualTo(1L); +// } +// +// @Test +// @DisplayName("quiz 테스트: 이벤트 시간이 아닌 경우") +// void getQuizNotWithinEventTest() { +// // given +// QuizFirstComeRequest quizFirstComeRequest = new QuizFirstComeRequest(1L); +// +// QuizFirstCome quizFirstCome1 = quizGenerator(1L); +// SubEvent subEvent1 = SubEvent.subEventGenerator(1L); +// +// Instant fixedInstant = Instant.parse("2024-07-03T00:00:00Z"); +// Clock fixedClock = Clock.fixed(fixedInstant, ZoneId.systemDefault()); +// when(clock.instant()).thenReturn(fixedInstant); +// when(clock.getZone()).thenReturn(fixedClock.getZone()); +// +// when(quizFirstComeRepository.findBySubEventId(any(Long.class))).thenReturn(Optional.of(quizFirstCome1)); +// when(subEventRepository.findById(any(Long.class))).thenReturn(Optional.of(subEvent1)); +// +// +// // when +// Assertions.assertThatThrownBy(() -> { +// quizFirstComeService.getQuiz(quizFirstComeRequest); +// }).isInstanceOf(SubEventNotWithinPeriodException.class); +// } +// +// @Test +// @DisplayName("랜딩 페이지 api: 정상 반환인 경우") +// void landingPageSuccessTest() { +// // given +// Long eventId = 1L; +// +// Instant fixedInstant = Instant.parse("2024-06-25T10:00:00Z"); +// Clock fixedClock = Clock.fixed(fixedInstant, ZoneId.systemDefault()); +// when(clock.instant()).thenReturn(fixedInstant); +// when(clock.getZone()).thenReturn(fixedClock.getZone()); +// +// when(eventRepository.findById(any(Long.class))).thenReturn(Optional.ofNullable(Event.testEventGenerator(eventId))); +// when(subEventRepository.findByEventIdAndExecuteType(any(Long.class), any(SubEventExecuteType.class))).thenReturn(SubEvent.subEventsGenerator(3L)); +// when(quizFirstComeRepository.findBySubEventId(any(Long.class))).thenReturn(Optional.ofNullable(quizGenerator(1L))); +// +// // when +// QuizFirstComeLandResponseDto quizFirstComeLandResponseDto = quizFirstComeService.getQuizLand(eventId); +// +// // then +// assertThat(quizFirstComeLandResponseDto.getLastQuizNumber()).isEqualTo(3); +// assertThat(quizFirstComeLandResponseDto.getHint()).isEqualTo("ㅎㅇ1"); +// assertThat(quizFirstComeLandResponseDto.isValid()).isTrue(); +// } +// +// private Prize prizeGenerator(long i) { +// return Prize.builder().price((int) (1000 + i)).id((Long) i).prizeImgUrl("www.prize" + i + ".com").productName("python" + i).build(); +// } +// +// private QuizFirstCome quizGenerator(long i) { +// return QuizFirstCome.builder() +// .sequence((int) i) +// .overview("산타페는 일상의 머시기" + i) +// .problem("산타페의 연비는?") +// .carInfo("산타페는 어쩌구저쩌구" + i) +// .answer("답" + i) +// .hint("ㅎㅇ" + i) +// .anchor("#hi" + i) +// .initConsonant("ㅅㅇㅈㅇ" + i) +// .prize(prizeGenerator(i)) +// .winnerCount((int) i) +// .winners((int) i + 1) +// .subEventId(i) +// .build(); +// } } \ No newline at end of file diff --git a/src/test/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryServiceTest.java b/src/test/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryServiceTest.java index 09bb9c06..fb498a96 100644 --- a/src/test/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryServiceTest.java +++ b/src/test/java/com/hyundai/softeer/backend/domain/lottery/drawing/service/DrawingLotteryServiceTest.java @@ -11,7 +11,6 @@ import com.hyundai.softeer.backend.domain.subevent.dto.WinnerCandidate; import com.hyundai.softeer.backend.domain.subevent.dto.WinnerInfo; import com.hyundai.softeer.backend.domain.subevent.entity.SubEvent; -import com.hyundai.softeer.backend.domain.subevent.enums.EventPlayType; import com.hyundai.softeer.backend.domain.subevent.enums.SubEventType; import com.hyundai.softeer.backend.domain.subevent.repository.SubEventRepository; import com.hyundai.softeer.backend.domain.user.entity.User; @@ -125,7 +124,7 @@ void getWinners() { @DisplayName("드로잉 이벤트 게임 정보 조회 시 드로잉 이벤트가 없는 경우") void getDrawingGameInfo_DrawingNotFound() { // Given - DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L, EventPlayType.NORMAL); + DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L); List drawingEvents = List.of(); User authenticatedUser = User.builder().id(1L).build(); @@ -140,7 +139,7 @@ void getDrawingGameInfo_DrawingNotFound() { @DisplayName("드로잉 이벤트 게임 정보 조회 성공") void getDrawingGameInfo_success() { // Given - DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L, EventPlayType.NORMAL); + DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L); List drawingEvents = List.of( DrawingLotteryEvent.builder().id(1L).sequence(1).startPosX(1.0).startPosY(1.5).build(), DrawingLotteryEvent.builder().id(2L).sequence(2).startPosX(2.0).startPosY(1.5).build(), @@ -173,7 +172,7 @@ void getDrawingGameInfo_success() { @DisplayName("드로잉 이벤트 게임 정보 조회 시 유저 기회 0번인 경우") void getDrawingGameInfo_no_chance() { // Given - DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L, EventPlayType.NORMAL); + DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L); List drawingEvents = List.of( DrawingLotteryEvent.builder().id(1L).sequence(1).startPosX(1.0).startPosY(1.5).build(), DrawingLotteryEvent.builder().id(2L).sequence(2).startPosX(2.0).startPosY(1.5).build(), @@ -201,7 +200,7 @@ void getDrawingGameInfo_no_chance() { @DisplayName("드로잉 이벤트 게임 정보 조회 시 첫 참여 유저") void getDrawingGameInfo_first_playing() { // Given - DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L, EventPlayType.NORMAL); + DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L); List drawingEvents = List.of( DrawingLotteryEvent.builder().id(1L).sequence(1).startPosX(1.0).startPosY(1.5).build(), DrawingLotteryEvent.builder().id(2L).sequence(2).startPosX(2.0).startPosY(1.5).build(), @@ -224,7 +223,7 @@ void getDrawingGameInfo_first_playing() { @DisplayName("드로잉 이벤트 게임 정보 조회 시 유저 기회 1번, 충전 시간 4시간 미만일 경우") void getDrawingGameInfo_1_chance_less_than_4hours_last_played() { // Given - DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L, EventPlayType.NORMAL); + DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L); List drawingEvents = List.of( DrawingLotteryEvent.builder().id(1L).sequence(1).startPosX(1.0).startPosY(1.5).build(), DrawingLotteryEvent.builder().id(2L).sequence(2).startPosX(2.0).startPosY(1.5).build(), @@ -255,7 +254,7 @@ void getDrawingGameInfo_1_chance_less_than_4hours_last_played() { @DisplayName("드로잉 이벤트 게임 정보 조회 시 유저 기회 0번, 충전 시간 4시간 이상일 경우") void getDrawingGameInfo_no_chance_but_4hours_last_played() { // Given - DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L, EventPlayType.NORMAL); + DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L); List drawingEvents = List.of( DrawingLotteryEvent.builder().id(1L).sequence(1).startPosX(1.0).startPosY(1.5).build(), DrawingLotteryEvent.builder().id(2L).sequence(2).startPosX(2.0).startPosY(1.5).build(), @@ -286,7 +285,7 @@ void getDrawingGameInfo_no_chance_but_4hours_last_played() { @DisplayName("드로잉 이벤트 게임 정보 조회 시 유저 기회 1번, 충전 시간 4시간 이상일 경우") void getDrawingGameInfo_1_chance_and_4hours_last_played() { // Given - DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L, EventPlayType.NORMAL); + DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L); List drawingEvents = List.of( DrawingLotteryEvent.builder().id(1L).sequence(1).startPosX(1.0).startPosY(1.5).build(), DrawingLotteryEvent.builder().id(2L).sequence(2).startPosX(2.0).startPosY(1.5).build(), @@ -317,7 +316,7 @@ void getDrawingGameInfo_1_chance_and_4hours_last_played() { @DisplayName("드로잉 이벤트 게임 정보 조회 시 유저 기회 0번, 충전 시간 8시간 이상일 경우") void getDrawingGameInfo_0_chance_and_8hours_last_played() { // Given - DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L, EventPlayType.NORMAL); + DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L); List drawingEvents = List.of( DrawingLotteryEvent.builder().id(1L).sequence(1).startPosX(1.0).startPosY(1.5).build(), DrawingLotteryEvent.builder().id(2L).sequence(2).startPosX(2.0).startPosY(1.5).build(), @@ -349,7 +348,7 @@ void getDrawingGameInfo_0_chance_and_8hours_last_played() { @DisplayName("드로잉 이벤트 게임 정보 조회 시 유저 기회 1번, 충전 시간 8시간 이상일 경우") void getDrawingGameInfo_1_chance_and_8hours_last_played() { // Given - DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L, EventPlayType.NORMAL); + DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L); List drawingEvents = List.of( DrawingLotteryEvent.builder().id(1L).sequence(1).startPosX(1.0).startPosY(1.5).build(), DrawingLotteryEvent.builder().id(2L).sequence(2).startPosX(2.0).startPosY(1.5).build(), @@ -381,7 +380,7 @@ void getDrawingGameInfo_1_chance_and_8hours_last_played() { @ValueSource(ints = {0, -1}) void getDrawingGameInfo_no_chance_expectation(int expectationBonusChance) { // Given - DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L, EventPlayType.EXPECTATION); + DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L); List drawingEvents = List.of( DrawingLotteryEvent.builder().id(1L).sequence(1).startPosX(1.0).startPosY(1.5).build(), DrawingLotteryEvent.builder().id(2L).sequence(2).startPosX(2.0).startPosY(1.5).build(), @@ -410,7 +409,7 @@ void getDrawingGameInfo_no_chance_expectation(int expectationBonusChance) { @DisplayName("드로잉 이벤트 게임 정보 조회 시 기대평 작성 기회를 사용하는 경우") void getDrawingGameInfo_expectation_chance() { // Given - DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L, EventPlayType.EXPECTATION); + DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L); List drawingEvents = List.of( DrawingLotteryEvent.builder().id(1L).sequence(1).startPosX(1.0).startPosY(1.5).build(), DrawingLotteryEvent.builder().id(2L).sequence(2).startPosX(2.0).startPosY(1.5).build(), @@ -422,7 +421,7 @@ void getDrawingGameInfo_expectation_chance() { EventUser eventUser = EventUser.builder() .user(authenticatedUser) .subEvent(subEvent) - .chance(1) + .chance(0) .expectationBonusChance(1) .lastVisitedAt(LocalDateTime.now()) .lastChargeAt(LocalDateTime.now()) @@ -436,7 +435,7 @@ void getDrawingGameInfo_expectation_chance() { DrawingInfoDtos drawingGameInfo = drawingLotteryService.getDrawingGameInfo(authenticatedUser, drawingInfoRequest); // Then - assertThat(drawingGameInfo.getChance()).isEqualTo(1); + assertThat(drawingGameInfo.getChance()).isEqualTo(0); } @ParameterizedTest @@ -444,7 +443,7 @@ void getDrawingGameInfo_expectation_chance() { @ValueSource(ints = {0, -1}) void getDrawingGameInfo_no_chance_shared(int sharedBonusChance) { // Given - DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L, EventPlayType.EXPECTATION); + DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L); List drawingEvents = List.of( DrawingLotteryEvent.builder().id(1L).sequence(1).startPosX(1.0).startPosY(1.5).build(), DrawingLotteryEvent.builder().id(2L).sequence(2).startPosX(2.0).startPosY(1.5).build(), @@ -473,7 +472,7 @@ void getDrawingGameInfo_no_chance_shared(int sharedBonusChance) { @DisplayName("드로잉 이벤트 게임 정보 조회 시 공유 URL 작성 기회를 사용하는 경우") void getDrawingGameInfo_shared_url_chance() { // Given - DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L, EventPlayType.SHARED); + DrawingInfoRequest drawingInfoRequest = new DrawingInfoRequest(1L); List drawingEvents = List.of( DrawingLotteryEvent.builder().id(1L).sequence(1).startPosX(1.0).startPosY(1.5).build(), DrawingLotteryEvent.builder().id(2L).sequence(2).startPosX(2.0).startPosY(1.5).build(), @@ -485,7 +484,7 @@ void getDrawingGameInfo_shared_url_chance() { EventUser eventUser = EventUser.builder() .user(authenticatedUser) .subEvent(subEvent) - .chance(1) + .chance(0) .shareBonusChance(1) .lastVisitedAt(LocalDateTime.now()) .lastChargeAt(LocalDateTime.now()) @@ -499,7 +498,7 @@ void getDrawingGameInfo_shared_url_chance() { DrawingInfoDtos drawingGameInfo = drawingLotteryService.getDrawingGameInfo(authenticatedUser, drawingInfoRequest); // Then - assertThat(drawingGameInfo.getChance()).isEqualTo(1); + assertThat(drawingGameInfo.getChance()).isEqualTo(0); } @Test