Skip to content

feat: 공유 링크 활성/비활성 토글 api 구현 - #72

Merged
Kohseoyoung merged 7 commits into
developfrom
feature/61-share-link
Jul 25, 2026
Merged

feat: 공유 링크 활성/비활성 토글 api 구현#72
Kohseoyoung merged 7 commits into
developfrom
feature/61-share-link

Conversation

@Kohseoyoung

@Kohseoyoung Kohseoyoung commented Jul 25, 2026

Copy link
Copy Markdown
Contributor

🔗 관련 이슈 (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 는 게스트 접근을 위해 SecurityConfigpermitAll을 추가했습니다. (팀 공용 설정 변경)
  • 신규 조회/토글 API는 @AuthenticationPrincipal로 userId를 토큰에서 가져오는 방식으로 구현했습니다.
  • 게스트가 발급받은 guestId로 피드백/답글을 작성하는 부분은 피드백 API의 인증 방식 통일이 필요하여 별도 이슈로 진행할 예정입니다.

✅ PR 체크리스트

  • PR 제목은 커밋 컨벤션을 따랐습니다.
  • 관련 이슈를 연결했습니다.
  • 변경 사항에 대한 테스트를 진행했습니다.

Summary by CodeRabbit

  • 새로운 기능
    • /api/v1 기준으로 영상별 공유 링크 생성(만료 기간 설정)과 정보 조회, 활성/비활성 토글 기능을 제공합니다.
    • 공유 링크 토큰으로 링크 진입 확인을 하고, 비로그인 상태에서도 게스트 이름 등록을 지원합니다.
  • 보안/접근 제어
    • 게스트 등록 및 링크 진입 관련 엔드포인트는 로그인 없이 접근 가능하도록 확장되었습니다.
  • 오류 처리
    • 만료/비활성/중복/미존재 링크 및 권한 없는 접근에 대해 명확한 오류 응답을 제공합니다.

@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 2d023193-db71-4c93-8c97-26c2f22c718f

📥 Commits

Reviewing files that changed from the base of the PR and between 283b7e9 and 5f583df.

📒 Files selected for processing (4)
  • src/main/java/com/slatto/domain/sharelink/controller/ShareLinkController.java
  • src/main/java/com/slatto/domain/sharelink/dto/request/ShareLinkRequest.java
  • src/main/java/com/slatto/domain/sharelink/entity/ShareLink.java
  • src/main/java/com/slatto/domain/sharelink/service/ShareLinkService.java
🚧 Files skipped from review as they are similar to previous changes (2)
  • src/main/java/com/slatto/domain/sharelink/entity/ShareLink.java
  • src/main/java/com/slatto/domain/sharelink/controller/ShareLinkController.java

📝 Walkthrough

Walkthrough

공유 링크 생성·조회·활성 상태 변경과 토큰 기반 게스트 등록 기능을 추가했습니다. 요청·응답 DTO, 도메인 로직, 저장소, 서비스, 컨트롤러 및 공개 접근 인가 설정이 함께 구성되었습니다.

Changes

공유 링크 API

Layer / File(s) Summary
요청·응답 계약과 도메인 상태 로직
src/main/java/com/slatto/domain/sharelink/dto/..., src/main/java/com/slatto/domain/sharelink/entity/..., src/main/java/com/slatto/domain/sharelink/exception/...
공유 링크 생성·게스트 등록 요청과 다섯 가지 응답 DTO, 오류 코드, UUID 토큰 생성, 활성 상태 토글 및 만료 검증 로직을 추가했습니다.
서비스 및 저장소 처리
src/main/java/com/slatto/domain/sharelink/repository/..., src/main/java/com/slatto/domain/sharelink/converter/..., src/main/java/com/slatto/domain/sharelink/service/...
영상별 링크 생성 중복 검사, 프로젝트 멤버 검증, 토큰 기반 진입·게스트 등록, 소유자 조회와 활성 상태 변경을 구현했습니다.
HTTP 엔드포인트와 보안 설정
src/main/java/com/slatto/domain/sharelink/controller/..., src/main/java/com/slatto/global/config/SecurityConfig.java
공유 링크 관련 다섯 개 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
Loading

Possibly related issues

Possibly related PRs

  • SLAT-TO/SLAT-TO-BE#40SecurityConfig의 공유 링크 공개 접근 인가 규칙과 직접 연결됩니다.

Suggested reviewers: sangwon02, guingguing, young0206, ahnsyeon, kcleverp

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 42.86% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed 토글 API를 중심으로 하지만 공유 링크 관련 변경사항의 핵심 일부를 정확히 반영합니다.
Description check ✅ Passed 필수인 관련 이슈와 작업 내용은 갖췄지만 PR 체크리스트 섹션은 포함되지 않았습니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch

Comment @coderabbitai help to get the list of available commands.

@Kohseoyoung Kohseoyoung self-assigned this Jul 25, 2026
@Kohseoyoung Kohseoyoung added the feature 새로운 기능 추가 label Jul 25, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

📥 Commits

Reviewing files that changed from the base of the PR and between 10662bc and 283b7e9.

📒 Files selected for processing (10)
  • src/main/java/com/slatto/domain/sharelink/controller/ShareLinkController.java
  • src/main/java/com/slatto/domain/sharelink/converter/ShareLinkConverter.java
  • src/main/java/com/slatto/domain/sharelink/dto/request/ShareLinkRequest.java
  • src/main/java/com/slatto/domain/sharelink/dto/response/ShareLinkResponse.java
  • src/main/java/com/slatto/domain/sharelink/entity/Guest.java
  • src/main/java/com/slatto/domain/sharelink/entity/ShareLink.java
  • src/main/java/com/slatto/domain/sharelink/exception/ShareLinkErrorCode.java
  • src/main/java/com/slatto/domain/sharelink/repository/ShareLinkRepository.java
  • src/main/java/com/slatto/domain/sharelink/service/ShareLinkService.java
  • src/main/java/com/slatto/global/config/SecurityConfig.java

Comment on lines +65 to +72
// 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);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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.

@Kohseoyoung

Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature 새로운 기능 추가

Projects

None yet

Development

Successfully merging this pull request may close these issues.

FEAT: 공유 링크 및 게스트 접근 API 구현

2 participants