Skip to content

fix: 무료수강 CTA 계약 정렬#684

Merged
Hyeonjun0527 merged 1 commit into
developfrom
fix/course-free-enroll-contract
May 23, 2026
Merged

fix: 무료수강 CTA 계약 정렬#684
Hyeonjun0527 merged 1 commit into
developfrom
fix/course-free-enroll-contract

Conversation

@Hyeonjun0527

@Hyeonjun0527 Hyeonjun0527 commented May 22, 2026

Copy link
Copy Markdown
Member

요약

  • PR fix: 관리자 코스 수강 상태 분기 반영 #683 후속으로 코스 상세 응답 계약에 맞춰 무료수강 CTA/수강상태 분기를 정렬했습니다.
  • canFreeEnroll === true만 무료수강 CTA 노출 기준으로 사용합니다. (ADMIN != PAID)
  • 실제 수강 상태는 isFreeEnrolled / isPaidEnrolled, 전체 접근은 hasFullAccess만 기준으로 사용합니다.
  • 무료수강신청 성공 후 즉시 학습홈으로 이동하지 않고 코스 상세를 재조회한 뒤 응답 기준으로 화면을 다시 그립니다.

백엔드 계약 확인

  • /tmp/spmvp-chapter-open-fix/src/main/java/com/codezerotoone/mvp/domain/course/dto/response/CourseDetailResponse.java
  • /tmp/spmvp-chapter-open-fix/src/main/java/com/codezerotoone/mvp/domain/course/controller/CourseFreeEnrollmentController.java
  • /tmp/spmvp-chapter-open-fix/src/main/java/com/codezerotoone/mvp/domain/course/controller/apidocs/GetCourseDetailApiDocs.java
  • /tmp/spmvp-chapter-open-fix/src/main/java/com/codezerotoone/mvp/domain/course/controller/apidocs/PostCourseFreeEnrollmentApiDocs.java

검증

  • yarn prettier:fix
  • yarn typecheck
  • ./node_modules/.bin/vitest run --project unit src/components/pages/class/course-viewer-status.test.ts
  • yarn lint:fix (0 errors, existing warnings only)

Summary by CodeRabbit

릴리스 노트

  • 개선 사항
    • 수강 신청 버튼 표시 조건 및 우선순위 개선
    • 무료 코스 등록 시 에러 처리 흐름 개선
    • 미인증 사용자의 무료 코스 접근 로직 개선

Review Change Stack

@vercel

vercel Bot commented May 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
study-platform-client-dev Ready Ready Preview, Comment May 23, 2026 1:39am

@coderabbitai

coderabbitai Bot commented May 22, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@Hyeonjun0527, we couldn't start this review because you've used your available PR reviews for now.

Your plan currently allows 1 review/hour. Refill in 13 minutes and 34 seconds.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more review capacity refills, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than trial, open-source, and free plans. In all cases, review capacity refills continuously over time.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 4b8f016b-2acd-4b27-9899-487d0ddcbf9c

📥 Commits

Reviewing files that changed from the base of the PR and between eb83872 and f6c64d0.

📒 Files selected for processing (4)
  • src/app/(landing)/class/[slug]/page.tsx
  • src/components/pages/class/class-detail-sidebar.tsx
  • src/components/pages/class/course-viewer-status.test.ts
  • src/components/pages/class/course-viewer-status.ts
📝 Walkthrough

개요

코스 뷰어 상태 판단 로직을 viewerStatus 열거형에서 course 객체의 부울 필드(isFreeEnrolled, isPaidEnrolled, hasFullAccess, canFreeEnroll)로 전환하여 단순화하고, 페이지의 CTA 라벨 계산, 사이드바 렌더링, 무료 코스 등록 흐름, 테스트, E2E 모킹을 일관되게 조정합니다.

변경사항

수강 CTA 로직 단순화

Layer / File(s) 요약
코스 상태 판단 헬퍼 단순화
src/components/pages/class/course-viewer-status.ts
isCourseFreeEnrolled, isCoursePaidEnrolled, hasCourseFullAccess, canShowCourseFreeEnrollCta 함수들의 판단 로직이 viewerStatus 열거형 대신 course의 부울 필드들만 사용하도록 단순화됩니다.
헬퍼 로직 테스트 검증
src/components/pages/class/course-viewer-status.test.ts
무료 수강 CTA 표시가 canFreeEnroll 필드에만 의존하는지 검증하는 신규 테스트가 추가되고, ADMIN 시나리오에서 canFreeEnroll에 따른 동작을 확인하도록 기존 단언이 조정됩니다.
페이지 수준 CTA 라벨과 무료 등록 흐름
src/app/(landing)/class/[slug]/page.tsx
ctaLabel 계산에서 canFreeEnrollFromDetail 조건이 isCoursePaidEnrolled, isCourseFreeEnrolled, hasFullAccessFromDetail보다 먼저 평가되도록 우선순위가 변경되고, handleStartCourse의 무료 코스 등록 분기에서 return 위치가 조정되어 에러 후 페이지 이동이 발생하지 않습니다.
사이드바 CTA 렌더링 조건
src/components/pages/class/class-detail-sidebar.tsx
ClassDetailSidebarProps의 ctaLabel 타입이 string | undefined로 변경되어, 인증된 경우 ctaLabel이 존재할 때만 시작 버튼을 표시하고, 미인증인 경우 canFreeEnroll === true일 때만 LoginModal을 통해 무료 등록 옵션을 제공합니다.
E2E 테스트 모킹 데이터 정합화
e2e/class/journey-map.spec.ts
LOGIN_ONLY 테스트의 makeCourseDetail 모킹 객체에 isFreeEnrolled: false, isPaidEnrolled: false, hasFullAccess: false를 명시적으로 추가하여 상태 플래그를 명확히 일치시킵니다.

시퀀스 다이어그램

sequenceDiagram
    participant Page as 페이지 ([slug]/page.tsx)
    participant StatusHelper as 상태 헬퍼<br/>(course-viewer-status.ts)
    participant Sidebar as 사이드바<br/>(class-detail-sidebar.tsx)
    participant User as 사용자
    
    Page->>StatusHelper: canShowCourseFreeEnrollCta(course)
    StatusHelper-->>Page: course.canFreeEnroll만 확인
    
    Page->>Page: ctaLabel 계산<br/>(canFreeEnroll 우선)
    Page->>Sidebar: ctaLabel, courseDetail 전달
    
    Sidebar->>Sidebar: ctaLabel 존재?
    alt ctaLabel 있음 (인증)
        Sidebar->>User: "수강 시작" 버튼 표시
    else ctaLabel 없음 & canFreeEnroll (미인증)
        Sidebar->>User: "무료 코스 시작" 모달 제공
    else 둘 다 없음
        Sidebar->>User: 버튼 미표시
    end
Loading

추정 검토 난이도

🎯 3 (중간) | ⏱️ ~20분

관련 PR

추천 라벨

🐛 bug, release:patch

부울 필드 정렬하니 CTA 로직이 반짝반짝 ✨
viewerStatus 열거형은 이제 안녕히 👋
상태 판단이 예리해지고 페이지도 가벼워져,
테스트도 맞춰지니 모두 행복해 🐰💚

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 풀 리퀘스트 제목이 주요 변경사항과 일치합니다. '무료수강 CTA 계약 정렬'은 PR의 핵심 목표인 무료수강 CTA 로직을 코스 상세 응답 계약에 맞춰 정렬하는 변경사항을 명확하게 설명합니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/course-free-enroll-contract

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.

❤️ Share

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

@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.

🧹 Nitpick comments (1)
src/components/pages/class/class-detail-sidebar.tsx (1)

138-160: 💤 Low value

미인증 사용자의 CTA 텍스트 일관성을 확인하세요.

미인증 상태에서 표시되는 버튼 텍스트 "무료 코스 시작하기"(156번 줄)가 page.tsxctaLabel 계산 로직(72번 줄)과 일치합니다. 다만 이 문자열이 두 곳에 하드코딩되어 있어, 향후 문구 변경 시 불일치가 발생할 수 있습니다.

♻️ 제안: 상수로 추출하여 일관성 보장

공통 상수 파일에 CTA 레이블을 정의하고 양쪽에서 참조하도록 리팩터링할 수 있습니다:

// src/components/pages/class/class-detail-constants.ts 또는 별도 파일
export const CTA_LABELS = {
  FREE_COURSE_START: '무료 코스 시작하기',
  // ... 다른 레이블들
} as const;

그런 다음 page.tsxclass-detail-sidebar.tsx 양쪽에서 이 상수를 import하여 사용할 수 있습니다.

🤖 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/components/pages/class/class-detail-sidebar.tsx` around lines 138 - 160,
양쪽에 하드코딩된 "무료 코스 시작하기" 텍스트 때문에 ctaLabel 계산과 사이드바 버튼 텍스트가 불일치할 수 있으니, 공통 상수(예:
CTA_LABELS.FREE_COURSE_START)를 새로 추출해서 page.tsx와 class-detail-sidebar.tsx에서
import하여 사용하도록 교체하세요; 구체적으로는 현재 사용중인 ctaLabel 계산 로직과 LoginModal의 openTrigger 버튼
안의 문자열을 해당 상수로 대체하고, 상수를 export하는 모듈을 만들어 CTA_LABELS.FREE_COURSE_START를 참조하도록
수정하면 됩니다.
🤖 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.

Nitpick comments:
In `@src/components/pages/class/class-detail-sidebar.tsx`:
- Around line 138-160: 양쪽에 하드코딩된 "무료 코스 시작하기" 텍스트 때문에 ctaLabel 계산과 사이드바 버튼 텍스트가
불일치할 수 있으니, 공통 상수(예: CTA_LABELS.FREE_COURSE_START)를 새로 추출해서 page.tsx와
class-detail-sidebar.tsx에서 import하여 사용하도록 교체하세요; 구체적으로는 현재 사용중인 ctaLabel 계산 로직과
LoginModal의 openTrigger 버튼 안의 문자열을 해당 상수로 대체하고, 상수를 export하는 모듈을 만들어
CTA_LABELS.FREE_COURSE_START를 참조하도록 수정하면 됩니다.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 1734bafa-53c2-41dc-b784-b427d71b4780

📥 Commits

Reviewing files that changed from the base of the PR and between b3d89e5 and eb83872.

📒 Files selected for processing (5)
  • e2e/class/journey-map.spec.ts
  • src/app/(landing)/class/[slug]/page.tsx
  • src/components/pages/class/class-detail-sidebar.tsx
  • src/components/pages/class/course-viewer-status.test.ts
  • src/components/pages/class/course-viewer-status.ts

@Hyeonjun0527 Hyeonjun0527 force-pushed the fix/course-free-enroll-contract branch from 290f37d to f6c64d0 Compare May 23, 2026 01:35
@Hyeonjun0527 Hyeonjun0527 self-assigned this May 23, 2026
@Hyeonjun0527 Hyeonjun0527 merged commit c8277ba into develop May 23, 2026
10 of 11 checks passed
@Hyeonjun0527 Hyeonjun0527 deleted the fix/course-free-enroll-contract branch May 23, 2026 01:48
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