Skip to content

feat(shorts): add shorts feed v1 (cursor paging + saved state)#46

Open
rivkode wants to merge 1 commit into
devfrom
feat/shorts-feed-v1
Open

feat(shorts): add shorts feed v1 (cursor paging + saved state)#46
rivkode wants to merge 1 commit into
devfrom
feat/shorts-feed-v1

Conversation

@rivkode
Copy link
Copy Markdown
Owner

@rivkode rivkode commented Apr 26, 2026

Summary

신규 shorts 도메인을 추가합니다.

  • 도메인
    • Shorts 엔티티 (youtube_video_id length=11, source_url, is_active)
    • UserSavedShort 엔티티 (User ↔ Shorts join, unique(user_id, short_id))
  • 인프라
    • ShortsFeedQueryRepository (cursor 기반)
    • ShortsRepository, UserSavedShortRepository (Spring Data JPA)
  • 애플리케이션
    • ShortsService.retrieveFeed: 슬림 응답 (shortId, youtubeVideoId, sourceUrl, userState.saved) + 커서 페이지네이션
  • 인터페이스
    • GET /api/v1/shorts/feed(cursor, size 1..50) → ShortsApiController
  • 참고용 DDL
    • system/db/migration/202604200001_create_shorts_and_seed_feed.sql
    • shorts, user_saved_short 테이블 + seed insert
    • ⚠️ 이 SQL에는 clip_source_video / clip_learning_clip seed insert도 함께 들어있습니다. shorts와 결합도가 없는 부분이라 별도 PR로 분리할지 검토 필요.

Notes

  • 시크릿 없음
  • 실제 Flyway 적용은 src/main/resources/db/migration/V?__create_shorts.sql로 별도 PR에서 추가 권장

Test plan

  • ./gradlew compileKotlin compileTestKotlin 통과
  • GET /api/v1/shorts/feed?size=10 200 응답 확인 (saved=false 기본)
  • 저장된 short가 있는 사용자에서 userState.saved=true 확인
  • 커서로 다음 페이지 조회 시 nextCursor/hasNext 정상 동작

🤖 Generated with Claude Code

- New domain: Shorts entity (youtube_video_id, source_url, is_active) and
  UserSavedShort join entity tied to User
- ShortsFeedQueryRepository (cursor-based) + Spring Data repositories
- ShortsService.retrieveFeed returns slim feed items
  (shortId, youtubeVideoId, sourceUrl, userState.saved) with cursor paging
- GET /api/v1/shorts/feed (cursor + size 1..50) wired through
  ShortsApiController
- Reference DDL `system/db/migration/202604200001_create_shorts_and_seed_feed.sql`
  with `shorts`, `user_saved_short` schemas plus seed inserts (note: also
  contains seeds into clip_source_video / clip_learning_clip — keep an eye
  on whether those belong here)

No external secrets introduced.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant