feat: AI 이미지 생성권 남은 횟수 조회 API 구현 (#157)#158
Conversation
|
Caution Review failedThe pull request is closed. WalkthroughAI 이미지 사용권의 남은 생성 횟수를 조회하는 API가 추가되었습니다. 서비스에 읽기 전용 조회 메서드가 도입되고 컨트롤러에 GET 엔드포인트가 추가되었으며, 관련 응답 DTO 추가/변경 및 해당 기능을 검증하는 통합 테스트가 포함되었습니다. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor U as 사용자
participant C as AiImagePermissionController
participant S as AiImagePermissionService
participant R as AiImagePermissionRepository
U->>C: GET /api/ai/image-permissions/remaining-generations?postId
C->>S: getRemainingGenerations(userId, postId)
S->>R: findByUserIdAndPostId(userId, postId)
alt 권한 존재
R-->>S: AiImagePermissionEntity
S-->>C: GetRemainingGenerationsResponse(aiImagePermissionId, remainingGenerations)
C-->>U: 200 OK + JSON
else 권한 없음
R-->>S: 없음
S-->>C: throw AI_IMAGE_PERMISSION_NOT_FOUND
C-->>U: 404 Not Found + error payload
end
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~20 minutes Assessment against linked issues
Assessment against linked issues: Out-of-scope changes
Possibly related PRs
Poem
Tip 🔌 Remote MCP (Model Context Protocol) integration is now available!Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats. 📜 Recent review detailsConfiguration used: CodeRabbit UI Review profile: CHILL Plan: Pro 💡 Knowledge Base configuration:
You can enable these sources in your CodeRabbit configuration. 📒 Files selected for processing (4)
✨ Finishing Touches
🧪 Generate unit tests
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. CodeRabbit Commands (Invoked using PR/Issue comments)Type Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Actionable comments posted: 0
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
src/main/java/hanium/modic/backend/domain/ai/service/AiImagePermissionService.java (1)
29-33: 문서와 기본 생성 횟수(20 vs 3) 불일치서비스 기본값은 20인데, 컨트롤러의 API 설명은 “기본 3회”로 표기되어 있습니다. 대외 문서 불일치로 혼선 유발 소지 큽니다. 한 곳으로 상수화하거나 설정값으로 분리해 단일 진실 공급원을 두세요.
src/main/java/hanium/modic/backend/web/ai/controller/AiImagePermissionController.java (1)
34-35: API 문서의 기본 생성 횟수 표기 수정 필요설명 문자열의 “기본 3회”가 실제 기본값(20회)과 다릅니다. 외부 문서 불일치이므로 즉시 수정 권장합니다.
적용 예:
- description = "코인을 사용하여 AI 이미지 생성권을 구매합니다. 기본 3회 생성 가능합니다.", + description = "코인을 사용하여 AI 이미지 생성권을 구매합니다. 기본 20회 생성 가능합니다.",- description = "티켓을 사용하여 AI 이미지 생성권을 구매합니다. 기본 3회 생성 가능합니다.", + description = "티켓을 사용하여 AI 이미지 생성권을 구매합니다. 기본 20회 생성 가능합니다.",Also applies to: 55-56
🧹 Nitpick comments (5)
src/main/java/hanium/modic/backend/web/ai/dto/response/AiImagePermissionResponse.java (2)
3-3: 불필요한 import 제거
LocalDateTime을 사용하지 않습니다. 정리해주세요.-import java.time.LocalDateTime;
5-8: DTO 축소 적절함 + null 안정성 검토응답 축소는 적절합니다.
remainingGenerations가 DB에서 null이 될 가능성이 없다면int로 고정해 NPE 여지를 없애는 것도 고려해 보세요.src/main/java/hanium/modic/backend/web/ai/controller/AiImagePermissionController.java (2)
74-90: 요청 파라미터 제약 추가(+ 스웨거 명확화) 제안
postId에 음수/0이 들어오는 것을 사전에 차단하면 좋습니다. 또한 파라미터 설명을 추가하면 문서 가독성이 높아집니다.다음 변경을 제안합니다:
import org.springframework.web.bind.annotation.RequestParam; +import io.swagger.v3.oas.annotations.Parameter; +import jakarta.validation.constraints.Positive; ... - public ResponseEntity<AiImagePermissionResponse> getRemainingGenerations( - @CurrentUser UserEntity user, - @RequestParam Long postId - ) { + public ResponseEntity<AiImagePermissionResponse> getRemainingGenerations( + @CurrentUser UserEntity user, + @Parameter(description = "조회할 포스트 ID", required = true, example = "1") + @RequestParam @Positive Long postId + ) {
74-90: 200 응답 스키마 문서화(선택)성공(200) 응답의 스키마를 명시하면 API 문서 완성도가 올라갑니다.
@ApiResponse에content/schema추가를 고려하세요.src/test/java/hanium/modic/backend/web/ai/controller/AiImagePermissionControllerIntegrationTest.java (1)
316-331: 존재하지 않는 포스트도 동일 404로 매핑 확인 OK요구사항과 일치합니다. 추가로 파라미터 누락 400 케이스도 있으면 방어력이 더 좋아집니다.
아래 테스트 추가 제안:
@@ class AiImagePermissionControllerIntegrationTest extends BaseIntegrationTest { @@ + @Test + @WithCustomUser(email = "test@test.com") + @DisplayName("AI 이미지 생성권 남은 횟수 조회 - postId 미지정 시 400") + void getRemainingGenerations_MissingPostId_BadRequest() throws Exception { + mockMvc.perform(get("/api/ai/image-permissions/remaining-generations")) + .andExpect(status().isBadRequest()); + }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
💡 Knowledge Base configuration:
- MCP integration is disabled by default for public repositories
- Jira integration is disabled by default for public repositories
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (4)
src/main/java/hanium/modic/backend/domain/ai/service/AiImagePermissionService.java(2 hunks)src/main/java/hanium/modic/backend/web/ai/controller/AiImagePermissionController.java(2 hunks)src/main/java/hanium/modic/backend/web/ai/dto/response/AiImagePermissionResponse.java(1 hunks)src/test/java/hanium/modic/backend/web/ai/controller/AiImagePermissionControllerIntegrationTest.java(1 hunks)
🔇 Additional comments (3)
src/main/java/hanium/modic/backend/domain/ai/service/AiImagePermissionService.java (1)
76-88: 조회 로직 간결·안정적 (읽기 전용 트랜잭션 OK)권한 없을 때
AI_IMAGE_PERMISSION_NOT_FOUND로 일관되게 처리하는 부분 좋습니다. 현재 요구사항과 테스트 기대와도 일치합니다.src/test/java/hanium/modic/backend/web/ai/controller/AiImagePermissionControllerIntegrationTest.java (2)
272-296: 성공 케이스 테스트 적절상태 코드 및 페이로드 필드 검증이 명확합니다.
298-315: 권한 없음(404) 케이스 적절에러 코드/메시지까지 검증한 점 좋습니다.
개요
특정 포스트에 대한 사용자의 AI 이미지 생성권 남은 횟수를 조회할 수 있는 API를 구현했습니다.
구현 내용
API 추가
GET /api/ai/image-permissions/remaining-generationspostId(쿼리 파라미터)@CurrentUser사용하여 현재 로그인한 유저의 권한 조회GetRemainingGenerationsResponse(aiImagePermissionId, remainingGenerations)Service Layer
AiImagePermissionService.getRemainingGenerations()메서드 추가@Transactional(readOnly = true)적용으로 읽기 전용 트랜잭션 처리AI_IMAGE_PERMISSION_NOT_FOUND예외 발생Swagger 문서화
테스트 내용
통합 테스트 추가 (AiImagePermissionControllerIntegrationTest)
정상 조회 테스트 (
getRemainingGenerations_Success)권한 없음 테스트 (
getRemainingGenerations_PermissionNotFound)존재하지 않는 포스트 테스트 (
getRemainingGenerations_PostNotExist)테스트 결과
관련 이슈
Closes #157
🤖 Generated with Claude Code
Summary by CodeRabbit