feat: 공유 링크 활성/비활성 토글 api 구현 - #72
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (4)
🚧 Files skipped from review as they are similar to previous changes (2)
📝 WalkthroughWalkthrough공유 링크 생성·조회·활성 상태 변경과 토큰 기반 게스트 등록 기능을 추가했습니다. 요청·응답 DTO, 도메인 로직, 저장소, 서비스, 컨트롤러 및 공개 접근 인가 설정이 함께 구성되었습니다. Changes공유 링크 API
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant GuestClient
participant ShareLinkController
participant ShareLinkService
participant ShareLinkRepository
participant GuestRepository
GuestClient->>ShareLinkController: GET /share-links/{token}
ShareLinkController->>ShareLinkService: getShareLinkByToken(token)
ShareLinkService->>ShareLinkRepository: findByToken(token)
ShareLinkRepository-->>ShareLinkService: ShareLink
ShareLinkService-->>GuestClient: ShareLinkEntryResDTO
GuestClient->>ShareLinkController: POST /share-links/{token}/guests
ShareLinkController->>ShareLinkService: registerGuest(token, name)
ShareLinkService->>ShareLinkRepository: findByToken(token)
ShareLinkService->>GuestRepository: save(Guest)
GuestRepository-->>ShareLinkService: GuestCreateResDTO
ShareLinkService-->>GuestClient: guest response
Possibly related issues
Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/main/java/com/slatto/domain/sharelink/dto/request/ShareLinkRequest.java`:
- Around line 12-18:
src/main/java/com/slatto/domain/sharelink/dto/request/ShareLinkRequest.java:12-18에서
ShareLinkCreateReqDTO의 userId 필드를 제거하세요.
src/main/java/com/slatto/domain/sharelink/controller/ShareLinkController.java:32-38에서는
`@AuthenticationPrincipal` Long userId를 받아 서비스에 전달하도록 변경하세요.
src/main/java/com/slatto/domain/sharelink/service/ShareLinkService.java:39-54에서는
req.userId() 대신 인증 주체에서 전달받은 userId로 멤버십을 검증하세요.
- Around line 22-25: Update the name field in GuestCreateReqDTO by adding a
`@Size` constraint with a maximum of 100 characters alongside the existing
`@NotBlank` validation, so oversized names are rejected during request validation.
In `@src/main/java/com/slatto/domain/sharelink/service/ShareLinkService.java`:
- Around line 65-72: Enforce the one-share-link-per-video rule at the database
level by adding a unique constraint or index for ShareLink.video_id, and update
the creation flow around ShareLinkService to flush the save and translate
duplicate-key persistence errors into BaseException with
SHARE_LINK_ALREADY_EXISTS. Preserve the existing pre-check for normal conflict
handling.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: 87e10f75-5021-4d1f-8939-4bbfef49461f
📒 Files selected for processing (10)
src/main/java/com/slatto/domain/sharelink/controller/ShareLinkController.javasrc/main/java/com/slatto/domain/sharelink/converter/ShareLinkConverter.javasrc/main/java/com/slatto/domain/sharelink/dto/request/ShareLinkRequest.javasrc/main/java/com/slatto/domain/sharelink/dto/response/ShareLinkResponse.javasrc/main/java/com/slatto/domain/sharelink/entity/Guest.javasrc/main/java/com/slatto/domain/sharelink/entity/ShareLink.javasrc/main/java/com/slatto/domain/sharelink/exception/ShareLinkErrorCode.javasrc/main/java/com/slatto/domain/sharelink/repository/ShareLinkRepository.javasrc/main/java/com/slatto/domain/sharelink/service/ShareLinkService.javasrc/main/java/com/slatto/global/config/SecurityConfig.java
| // 4. 영상당 링크는 1개만 (중복 시 409) | ||
| if (shareLinkRepository.existsByVideoId(videoId)) { | ||
| throw new BaseException(ShareLinkErrorCode.SHARE_LINK_ALREADY_EXISTS); | ||
| } | ||
|
|
||
| // 5. 생성 (토큰은 엔티티가 UUID로 발급) | ||
| ShareLink shareLink = shareLinkConverter.toShareLink(video, req.expiredAt()); | ||
| ShareLink saved = shareLinkRepository.save(shareLink); |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
영상당 링크 1개 규칙을 DB 제약으로 보장하세요.
동시 요청은 모두 Line 66의 조회를 통과한 뒤 각각 저장할 수 있습니다. 현재 ShareLink.java Lines 26-28의 video_id에는 유니크 제약이 없으므로 요구사항이 깨집니다. video_id에 DB unique constraint/index를 추가하고, 강제 flush 시 발생하는 duplicate-key 예외를 SHARE_LINK_ALREADY_EXISTS(409)로 변환하세요.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/main/java/com/slatto/domain/sharelink/service/ShareLinkService.java`
around lines 65 - 72, Enforce the one-share-link-per-video rule at the database
level by adding a unique constraint or index for ShareLink.video_id, and update
the creation flow around ShareLinkService to flush the save and translate
duplicate-key persistence errors into BaseException with
SHARE_LINK_ALREADY_EXISTS. Preserve the existing pre-check for normal conflict
handling.
|
@coderabbitai review |
✅ Action performedReview finished.
|
🔗 관련 이슈 (Related Issue)
📝 작업 내용
로그인 없이도 영상 리뷰에 참여할 수 있도록, 영상별 공유 링크를 생성하고 링크로 진입한 게스트가 이름만 입력하고 참여할 수 있는 API를 추가했습니다.
공유 링크 생성, 진입 검증, 게스트 등록, 소유자 조회, 활성/비활성 토글 흐름을 구현했습니다.
주요 변경 파일
src/main/java/com/slatto/domain/sharelink/controller/ShareLinkController.java- 공유 링크 생성·진입 검증·게스트 등록·조회·토글 엔드포인트 추가src/main/java/com/slatto/domain/sharelink/service/ShareLinkService.java- 토큰 생성, 조회, 게스트 등록, 프로젝트 멤버 검증, 상태 토글 로직 추가src/main/java/com/slatto/domain/sharelink/entity/ShareLink.java- 공유 링크 생성/토글/사용 가능 여부 도메인 메서드 추가src/main/java/com/slatto/domain/sharelink/entity/Guest.java- 게스트 생성 도메인 메서드 추가src/main/java/com/slatto/domain/sharelink/repository/ShareLinkRepository.java- 토큰·영상 기준 조회 및 중복 검증 쿼리 추가src/main/java/com/slatto/domain/sharelink/dto/*ShareLink*.java- 공유 링크/게스트 요청·응답 DTO 추가src/main/java/com/slatto/domain/sharelink/exception/ShareLinkErrorCode.java- 공유 링크 전용 에러 코드 추가src/main/java/com/slatto/global/config/SecurityConfig.java- 게스트 접근 경로 인증 예외 추가1. 공유 링크 생성 API 추가
프로젝트 멤버가 영상 공유용 URL을 생성할 수 있도록 API를 추가했습니다.
POST /api/v1/videos/{videoId}/share-links
토큰은
UUID로 생성하며, 영상당 링크는 1개만 생성할 수 있습니다. 이미 존재하는 경우409를 반환합니다.만료 일시(
expiredAt)는 선택값이며, 지정하지 않으면 무기한으로 저장됩니다.2. 공유 링크 진입 검증 API 추가
게스트가 링크로 진입했을 때 유효성과 대상 영상 정보를 확인할 수 있도록 조회 API를 추가했습니다.
GET /api/v1/share-links/{token}
로그인 전 게스트도 사용할 수 있도록 사용자 검증 없이 토큰 기준으로 조회합니다.
비활성화되었거나 만료된 링크는
410을 반환하고, 유효한 경우videoId,videoTitle,requiresNickname을 내려줍니다.3. 게스트 등록 API 추가
링크로 진입한 게스트가 이름을 등록하고
guestId를 발급받도록 API를 추가했습니다.POST /api/v1/share-links/{token}/guests
이 API도 로그인 없이 접근할 수 있으며, 게스트는 발급받은
guestId를 이후 피드백/답글 작성 요청에 사용합니다.비활성화·만료된 링크로는 게스트를 등록할 수 없습니다.
4. 공유 링크 조회 API 추가 (소유자용)
프로젝트 멤버가 영상의 공유 링크를 확인할 수 있도록 조회 API를 추가했습니다.
GET /api/v1/videos/{videoId}/share-links
@AuthenticationPrincipal로 인증된 사용자를 확인하며, 프로젝트 멤버만 조회할 수 있습니다.5. 공유 링크 활성/비활성 토글 API 추가
프로젝트 멤버가 공유 링크를 활성화/비활성화할 수 있도록 API를 추가했습니다.
PATCH /api/v1/share-links/{shareLinkId}
별도 body 없이 현재 활성 상태를 토글하며, 변경 후의
isActive를 반환합니다.ℹ️ 참고 사항
GET /share-links/{token},POST /share-links/{token}/guests는 게스트 접근을 위해SecurityConfig에permitAll을 추가했습니다. (팀 공용 설정 변경)@AuthenticationPrincipal로 userId를 토큰에서 가져오는 방식으로 구현했습니다.guestId로 피드백/답글을 작성하는 부분은 피드백 API의 인증 방식 통일이 필요하여 별도 이슈로 진행할 예정입니다.✅ PR 체크리스트
Summary by CodeRabbit
/api/v1기준으로 영상별 공유 링크 생성(만료 기간 설정)과 정보 조회, 활성/비활성 토글 기능을 제공합니다.