Conversation
This reverts commit 7efaebe.
This reverts commit bf91a99.
chore/#1 spotless
- flyway, r2dbc 의존성 추가 - flyway 관련 설정 추가 - local 환경 개발용 docker compose 추가 - yapp-net network 추가 - postgresql container 추가
* chore: app url, version 설정 추가 * chore: swagger config 추가 * feat: test용 controller 추가
* feat: User Entity 생성 및 UserPrincipal 세팅 * feat: ExceptionHandler 및 BaseResponse 세팅 * feat: Swagger 403/500 이슈 해결 및 auth 패키지 분리 * fix: spotlessApply * fix: @repository 제거 * fix: security 관련 설정 user 패키지로 이동 * fix: User Entity 및 repository 관련 파일 user 패키지로 이동 * fix: spotless 적용 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local>
Chore/#2 S3
feat: transactionRunner 추가
* fix: 소셜로그인 providerType 타입 String으로 변경 (대소문자 모두 허용을 위해) * fix: enum클래스 from 메서드 추가
* fix: 카카오 로그인 시 platform 파람 추가 할당 * fix: 프론트 검증을 위해 임시 배포 * fix: spotless 적용 * fix: 엑세스, 리프레쉬 토큰 expiry 변경 * fix: deploy-staging.yml fix/#106 브랜치 제거 * fix: auth Platform enum으로 타입 세이프 --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local>
fix: Brand 목록조회 id 오름차순으로 변경
* fix: 사용자 닉네임 최대 글자 수정 * fix: 사용자 닉네임 제약 조건 추가 * fix: 닉네임 제약 조건 메시지 수정 * chore: 닉네임 flyway 제약 조건 버전 추가
feat/#113: 포즈목록 조회시 scrap 여부 반환
* feat: 약관 목록 및 약관 동의 개발 * fix: 약관 목록 조회시 버전 컬럼 제거 * fix: Gemini 성능 개선 반영 * fix: 중복 정렬 코드 제거
* fix: 랜덤포즈 조회시 excludeIds 추가 * fix: 랜덤포즈 조회할 포즈 없을 시 문구 수정 * test: 테스트 코드 수정
Co-authored-by: darren <darren@darrenui-MacBookPro.local>
* fix: media 생성시 width, height 입력 받기 * fix: 포즈 상세 및 랜덤포즈 오동작 문제 해결 (관리자 계정만 동작했었음) --------- Co-authored-by: darren <darren@darrenui-MacBookPro.local>
fix: : presignedURL 업로드 시 media 엔티티 size 추가 저장 (#129)
chore: iOS 개발/상용 키 분리 (#131)
# Conflicts: # src/main/kotlin/com/yapp2app/auth/infra/oauth/OidcTokenValidator.kt # src/main/kotlin/com/yapp2app/auth/infra/oauth/oidc/KakaoOidc.kt # src/main/kotlin/com/yapp2app/common/exception/handler/ExceptionHandler.kt # src/main/kotlin/com/yapp2app/common/filter/ServletFilterConfig.kt # src/main/kotlin/com/yapp2app/media/api/converter/MediaCommandConverter.kt # src/main/kotlin/com/yapp2app/media/api/dto/UploadTicketRequest.kt # src/main/kotlin/com/yapp2app/media/application/command/MediaCommand.kt # src/main/kotlin/com/yapp2app/media/application/port/MediaRepositoryPort.kt # src/main/kotlin/com/yapp2app/media/application/result/MediaResult.kt # src/main/kotlin/com/yapp2app/media/application/usecase/GenerateUploadTicketUseCase.kt # src/main/kotlin/com/yapp2app/media/application/usecase/GetMediaStorageInfoUseCase.kt # src/main/kotlin/com/yapp2app/media/application/usecase/GetMediaStorageInfosUseCase.kt # src/main/kotlin/com/yapp2app/media/domain/entity/Media.kt # src/main/kotlin/com/yapp2app/media/infra/persist/MediaRepositoryAdapter.kt # src/main/kotlin/com/yapp2app/media/infra/persist/jpa/JpaMediaRepository.kt # src/main/kotlin/com/yapp2app/photo/api/converter/PhotoImageResultConverter.kt # src/main/kotlin/com/yapp2app/photo/api/dto/PhotoImageResponse.kt # src/main/kotlin/com/yapp2app/photo/application/contract/MediaContract.kt # src/main/kotlin/com/yapp2app/photo/application/result/GetPhotosResult.kt # src/main/kotlin/com/yapp2app/photo/application/usecase/GetFavoritePhotosUseCase.kt # src/main/kotlin/com/yapp2app/photo/application/usecase/GetPhotoUseCase.kt # src/main/kotlin/com/yapp2app/photo/application/usecase/GetPhotosUseCase.kt # src/main/kotlin/com/yapp2app/photo/infra/client/PhotoMediaClient.kt # src/main/kotlin/com/yapp2app/pose/api/converter/PoseResultConverter.kt # src/main/kotlin/com/yapp2app/pose/api/converter/ScrapPoseResultConverter.kt # src/main/kotlin/com/yapp2app/pose/api/dto/PoseResponse.kt # src/main/kotlin/com/yapp2app/pose/application/contract/MediaAvailability.kt # src/main/kotlin/com/yapp2app/pose/application/port/MediaClientPort.kt # src/main/kotlin/com/yapp2app/pose/application/result/GetPosesResult.kt # src/main/kotlin/com/yapp2app/pose/application/usecase/GetPoseUseCase.kt # src/main/kotlin/com/yapp2app/pose/application/usecase/GetPosesUseCase.kt # src/main/kotlin/com/yapp2app/pose/application/usecase/GetScrapPosesUseCase.kt # src/main/kotlin/com/yapp2app/pose/application/usecase/RandomPoseUseCase.kt # src/main/kotlin/com/yapp2app/pose/infra/client/PoseMediaClient.kt # src/main/kotlin/com/yapp2app/pose/infra/persist/jpa/PosesQueryRepository.kt # src/main/resources/application-staging.yaml # src/main/resources/logback-spring.xml
* feat: 이미지 조회를 위한 분산락 추가 * feat: redis media 캐시 어댑터 추가 * ref: 메서드 시그니처 변경에 따른 media fake 구현체 메서드 수정 * chore: 사용하지 않는 클래스 제거 * feat: media 조회 usecase 분산락 추가 * feat: redis binary template 추가 * feat: async config 추가 * fix: Redis 분산락 test profile 추가 * fix: media S3 fallback 후 cache 재확인 * fix: RedisMediaBinaryCacheAdapter nullable type 수정 * fix: media 캐시 ttl 만료 전 expire로 갱신하도록 수정 * fix: async 설정 제거 * fix: media type별 캐시 ttl 적용 * fix: 분산락 single-flight 제거
* fix: 폴더 목록 limit 추가 * fix: 이미지 추가에 따른 폴더 정렬 * fix: 폴더 목록 bean validation 추가
fix: photo 업로드 멱등성
* fix: 폴더명 글자수 제한 10자로 수정 * fix: bean validation 메시지 수정 * chore: 폴더명 제약 flyway schema에 추가
fix: 사진 등록 즐겨찾기 필드 추가
* fix: android 개발/상용 키 분리
# Conflicts: # src/main/resources/application-staging.yaml
Summary of ChangesHello @Darren4641, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed! 이 Pull Request는 운영 환경 1.0.0 버전 반영을 위한 변경 사항을 포함합니다. 주요 변경 사항으로는 폴더명 길이 제한 조정 및 관련 DB 마이그레이션, 사진 업로드 API의 기능 확장 및 멱등성 보장, 폴더 목록 조회 API의 정렬 및 제한 기능 추가, 그리고 전반적인 예외 처리 강화 및 DB 스키마 개선이 있습니다. 이는 시스템의 안정성과 사용자 경험을 향상시키는 데 기여합니다. Highlights
🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console. Changelog
Activity
Using Gemini Code AssistThe full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips. Invoking Gemini You can request assistance from Gemini at any point by creating a comment using either
Customization To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a Limitations & Feedback Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here. You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension. Footnotes
|
Code Format Check ✅
|
Test ✅
|
| val command = commandConverter.toGetFoldersCommand(userId) | ||
| fun getAllFolder( | ||
| @AuthenticationPrincipal(expression = "id") userId: Long, | ||
| @RequestParam("limit") @Min(1) limit: Int?, |
There was a problem hiding this comment.
limit 파라미터는 Int? 타입으로 선언되어 선택적으로 사용될 수 있음을 나타내지만, @RequestParam("limit") 어노테이션은 기본적으로 required=true로 동작합니다. 따라서 클라이언트가 limit 파라미터를 전달하지 않으면 MissingServletRequestParameterException이 발생하여 API가 실패하게 됩니다. limit 파라미터를 선택적으로 만드려면 @RequestParam(name = "limit", required = false)로 명시해야 합니다.
| @RequestParam("limit") @Min(1) limit: Int?, | |
| @RequestParam(name = "limit", required = false) @Min(1) limit: Int?, |
| fun handleMethodValidationExceptionHandler(ex: HandlerMethodValidationException): ResponseEntity<ExceptionMsg> = | ||
| ResponseEntity( | ||
| ExceptionMsg( | ||
| resultCode = ResultCode.INVALID_PARAMETER.code, | ||
| message = ResultCode.INVALID_PARAMETER.message, | ||
| ), | ||
| HttpStatus.BAD_REQUEST, |
There was a problem hiding this comment.
HandlerMethodValidationException에는 어떤 파라미터가 유효성 검사에 실패했는지에 대한 구체적인 정보가 포함되어 있습니다. 현재 구현은 일반적인 INVALID_PARAMETER 메시지를 반환하고 있어 디버깅이 어려울 수 있습니다. MethodArgumentNotValidException 핸들러와 유사하게, 예외 객체에서 실제 유효성 검사 실패 메시지를 추출하여 반환하는 것이 좋습니다. 이렇게 하면 클라이언트가 어떤 값이 잘못되었는지 명확하게 알 수 있습니다.
| fun handleMethodValidationExceptionHandler(ex: HandlerMethodValidationException): ResponseEntity<ExceptionMsg> = | |
| ResponseEntity( | |
| ExceptionMsg( | |
| resultCode = ResultCode.INVALID_PARAMETER.code, | |
| message = ResultCode.INVALID_PARAMETER.message, | |
| ), | |
| HttpStatus.BAD_REQUEST, | |
| fun handleMethodValidationExceptionHandler(ex: HandlerMethodValidationException): ResponseEntity<ExceptionMsg> = | |
| ResponseEntity( | |
| ExceptionMsg( | |
| resultCode = ResultCode.INVALID_PARAMETER.code, | |
| message = ex.allErrors.firstOrNull()?.defaultMessage ?: ResultCode.INVALID_PARAMETER.message, | |
| ), | |
| HttpStatus.BAD_REQUEST, | |
| ) |
No description provided.