Skip to content

[FEATURE] 어드민 디자이너 포트폴리오 조회 기능 구현#117

Merged
fervovita merged 3 commits into
devfrom
feat/#113-admin-designer-portfolio
Jul 13, 2026
Merged

[FEATURE] 어드민 디자이너 포트폴리오 조회 기능 구현#117
fervovita merged 3 commits into
devfrom
feat/#113-admin-designer-portfolio

Conversation

@fervovita

@fervovita fervovita commented Jul 9, 2026

Copy link
Copy Markdown
Collaborator

🚀 Related issue

Closes #113

#️⃣ Summary

  • 어드민에서 디자이너가 회원가입시 제출한 포트폴리오 조회할 수 있는 기능을 구현합니다.

🔧 Changes

  • 디자이너 포트폴리오 조회 API(GET /api/v1/admin/designers/{designerId}/portfolios) 추가

📸 Test Evidence

image

💬 Reviewer Notes

  • 리뷰어나 같이 작업하는 사람들에게 남길 코멘트

Summary by CodeRabbit

  • New Features

    • 관리자에서 디자이너 포트폴리오를 조회할 수 있는 기능이 추가되었습니다.
    • 가입, 결제, 커미션 진행 관련 알림이 더 일관된 방식으로 예약 발송되도록 개선되었습니다.
  • Bug Fixes

    • 일부 알림의 발송 시각과 시간 표시가 한국 시간 기준으로 처리되도록 수정되었습니다.
    • 디자이너 가입 안내 메일에서 포트폴리오 안내 문구와 접근 방식이 개선되었습니다.

@fervovita fervovita self-assigned this Jul 9, 2026
@fervovita
fervovita requested a review from Jong0128 as a code owner July 9, 2026 16:09
@coderabbitai

coderabbitai Bot commented Jul 9, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

디자이너 포트폴리오 조회 API가 어드민 컨트롤러에 추가되었고, 관련 DTO/매퍼/서비스 로직이 도입되었습니다. 동시에 다수의 알림 발송 로직이 즉시 메일 발송 방식에서 NotificationType enum 기반의 outbox 저장 방식으로 전환되었으며, DesignerSignupMailerDepositMailer가 삭제되고 관련 이메일 템플릿이 수정되었습니다.

Changes

어드민 디자이너 포트폴리오 조회 기능

Layer / File(s) Summary
포트폴리오 응답 DTO 및 조회 로직
.../DesignerPortfolioResponse.java, .../PortfolioRepository.java, .../PortfolioService.java, .../DesignerService.java
DesignerPortfolioResponse 레코드와 of(...) 팩토리, findByDesignerIdOrderByIdAsc, getPortfolioKeys, validateExists가 추가됨.
포트폴리오 조회 API 및 매퍼
.../AdminDesignerController.java, .../AdminDesignerMapper.java, .../AdminDesignerService.java
getDesignerPortfolios 엔드포인트, presigned URL 변환 매퍼, 서비스 오케스트레이션 로직이 추가됨.

Estimated code review effort: 2 (Simple) | ~12 minutes

알림 발송 outbox 전환

Layer / File(s) Summary
공용 알림 인프라
global/notification/NotificationType.java, .../NotificationOutbox.java, .../NotificationOutboxRepository.java, .../NotificationOutboxScheduler.java, .../OutboxStatus.java, .../EmailSender.java, .../EmailVerificationMailer.java
NotificationType enum 신설, 패키지 global.emailglobal.notification 이동, NotificationOutbox.create/EmailSender.sendAsync 시그니처가 NotificationType 인자로 변경됨.
디자이너 가입 알림 전환
.../DesignerSignedUpEvent.java, .../DesignerSignupNotifier.java, .../DesignerAuthService.java, .../DesignerSignupMailer.java, email/designer-signup-notification.html
이벤트 필드가 designerId/hasPortfolio/mailScheduledAt로 변경, @EventListener 전환 및 outbox 저장, 메일러 삭제, 템플릿에서 포트폴리오 링크 대신 어드민 Swagger 안내로 대체됨.
커미션 매칭 이벤트/알림
.../CommissionMatchedEvent.java, .../DesignerApplicationFacade.java, .../CommissionMatchedNotifier.java
신규 CommissionMatchedEvent 도입, ApplicationDeadlineClosedEvent에서 교체, 강사/디자이너 매칭 완료 outbox 등록 로직 추가됨.
기존 커미션 Notifier들 전환
.../ApplicationDeadlineClosedNotifier.java, .../AllFirstDraftsSubmittedNotifier.java, .../CommissionCompletedNotifier.java, .../DraftSelectedNotifier.java, .../FinalDeadlineClosedNotifier.java, .../FirstDraftDeadlineClosedNotifier.java, .../PayoutRequestedNotifier.java, .../RevisionRequestedNotifier.java, .../RevisionSubmittedNotifier.java
각 outbox 생성 호출이 문자열 제목/템플릿 대신 NotificationType 값을 전달하도록 변경됨.
입금 알림 전환
.../DepositNotifiedEvent.java, .../DepositNotifier.java, .../DepositMailer.java, .../PaymentService.java, email/deposit-notification.html
이벤트에 mailScheduledAt 추가, KST 기준 시각 전달, @EventListener 전환 및 outbox 등록, 메일러 삭제, 템플릿 시각 표시 방식 변경됨.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant DesignerAuthService
  participant DesignerSignupNotifier
  participant NotificationOutboxRepository
  participant NotificationOutboxScheduler
  participant EmailSender
  DesignerAuthService->>DesignerSignupNotifier: DesignerSignedUpEvent(designerId, hasPortfolio, mailScheduledAt)
  DesignerSignupNotifier->>NotificationOutboxRepository: save(outbox with NotificationType)
  NotificationOutboxScheduler->>NotificationOutboxRepository: poll pending outbox
  NotificationOutboxScheduler->>EmailSender: sendAsync(to, type, variables)
Loading

Possibly related PRs

Suggested reviewers: Jong0128

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning 포트폴리오 조회 외에 알림 아웃박스 전환, 이메일 패키지 이동, 결제·커미션 notifier 수정 등 무관한 변경이 많이 포함됩니다. 조회 기능만 남기고 알림/이메일/결제 관련 리팩터링은 별도 PR로 분리하세요.
Docstring Coverage ⚠️ Warning Docstring coverage is 56.52% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Linked Issues check ✅ Passed 직접 링크된 #113의 어드민 디자이너 포트폴리오 조회 API와 응답 DTO 구현이 포함되어 요구사항을 충족합니다.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 어드민이 디자이너 포트폴리오를 조회하는 기능 추가라는 मुख्य 변경을 명확히 요약합니다.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#113-admin-designer-portfolio

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.

@fervovita
fervovita changed the base branch from dev to refactor/#94-notification-event July 9, 2026 16:10
@fervovita
fervovita changed the base branch from refactor/#94-notification-event to dev July 9, 2026 16:13
@fervovita
fervovita changed the base branch from dev to refactor/#94-notification-event July 9, 2026 16:13
@fervovita

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jul 9, 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.

@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: 1

🧹 Nitpick comments (1)
src/main/java/ditda/backend/domain/commission/core/notification/CommissionMatchedNotifier.java (1)

35-66: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

ApplicationDeadlineClosedNotifier와 매칭 완료 알림 등록 로직이 중복됩니다.

registerInstructorMatchCompleteregisterDesignerMatchComplete 메서드가 ApplicationDeadlineClosedNotifier의 동명 메서드와 NotificationType, 템플릿 변수 키, 값 추출 방식까지 완전히 동일합니다. 이벤트 타입(CommissionMatchedEvent vs ApplicationDeadlineClosedEvent)만 다를 뿐입니다. 공유 헬퍼로 추출하여 중복을 제거하는 것을 권장합니다.

♻️ 공유 헬퍼 추출 제안
 // 예시: 별도의 공통 컴포넌트 또는 NotificationOutboxRepository 확장 메서드로 추출
 `@Component`
 `@RequiredArgsConstructor`
 public class MatchCompleteNotificationHelper {
     private final NotificationOutboxRepository outboxRepository;

     public void registerInstructorMatchComplete(
         String instructorEmail, String instructorName, String commissionTitle,
         int requiredCount, int designerCount, LocalDateTime mailScheduledAt
     ) {
         outboxRepository.save(NotificationOutbox.create(
             instructorEmail,
             NotificationType.APPLICATION_MATCHED_INSTRUCTOR,
             Map.of(
                 "instructorName", instructorName,
                 "commissionTitle", commissionTitle,
                 "requiredCount", requiredCount,
                 "designerCount", designerCount
             ),
             mailScheduledAt
         ));
     }

     public void registerDesignerMatchComplete(
         String designerEmail, String designerName, String commissionTitle,
         LocalDate firstDraftDeadline, LocalDateTime mailScheduledAt
     ) {
         outboxRepository.save(NotificationOutbox.create(
             designerEmail,
             NotificationType.APPLICATION_MATCHED_DESIGNER,
             Map.of(
                 "designerName", designerName,
                 "commissionTitle", commissionTitle,
                 "firstDraftDeadline", firstDraftDeadline
             ),
             mailScheduledAt
         ));
     }
 }

이후 CommissionMatchedNotifierApplicationDeadlineClosedNotifier 양쪽에서 이 헬퍼를 주입받아 호출하도록 변경하면 됩니다.

🤖 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/ditda/backend/domain/commission/core/notification/CommissionMatchedNotifier.java`
around lines 35 - 66, `CommissionMatchedNotifier` duplicates the same
notification registration logic already present in
`ApplicationDeadlineClosedNotifier`. Extract the shared outbox creation flow
from `registerInstructorMatchComplete` and `registerDesignerMatchComplete` into
a reusable helper that accepts the recipient, `NotificationType`, template
variables, and schedule time, then have both notifier classes call that helper
with their respective event data. Keep the existing field/value mapping in
`CommissionMatchedEvent` and preserve the current `NotificationType` and
template keys while removing the duplicated
`NotificationOutbox.create`/`outboxRepository.save` code.
🤖 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/ditda/backend/domain/payment/service/PaymentService.java`:
- Around line 82-83: The deposit notification timestamp is being recorded in the
server default timezone instead of KST, so align it with the existing KST
scheduling logic. Update the timestamp assignment path used by PaymentService
and Payment.markDepositNotified() so the “notifiedAt” value is created with
ZONE_KST, matching mailScheduledAt and ensuring admin display/storage stays
consistent.

---

Nitpick comments:
In
`@src/main/java/ditda/backend/domain/commission/core/notification/CommissionMatchedNotifier.java`:
- Around line 35-66: `CommissionMatchedNotifier` duplicates the same
notification registration logic already present in
`ApplicationDeadlineClosedNotifier`. Extract the shared outbox creation flow
from `registerInstructorMatchComplete` and `registerDesignerMatchComplete` into
a reusable helper that accepts the recipient, `NotificationType`, template
variables, and schedule time, then have both notifier classes call that helper
with their respective event data. Keep the existing field/value mapping in
`CommissionMatchedEvent` and preserve the current `NotificationType` and
template keys while removing the duplicated
`NotificationOutbox.create`/`outboxRepository.save` code.
🪄 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: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro Plus

Run ID: a2e3224c-8439-476a-adbe-4ae22d3a5f69

📥 Commits

Reviewing files that changed from the base of the PR and between 9389c15 and 7a05d6c.

📒 Files selected for processing (36)
  • src/main/java/ditda/backend/domain/admin/designer/controller/AdminDesignerController.java
  • src/main/java/ditda/backend/domain/admin/designer/dto/response/DesignerPortfolioResponse.java
  • src/main/java/ditda/backend/domain/admin/designer/mapper/AdminDesignerMapper.java
  • src/main/java/ditda/backend/domain/admin/designer/service/AdminDesignerService.java
  • src/main/java/ditda/backend/domain/auth/event/DesignerSignedUpEvent.java
  • src/main/java/ditda/backend/domain/auth/notification/DesignerSignupMailer.java
  • src/main/java/ditda/backend/domain/auth/notification/DesignerSignupNotifier.java
  • src/main/java/ditda/backend/domain/auth/notification/EmailVerificationMailer.java
  • src/main/java/ditda/backend/domain/auth/service/DesignerAuthService.java
  • src/main/java/ditda/backend/domain/commission/application/facade/DesignerApplicationFacade.java
  • src/main/java/ditda/backend/domain/commission/core/event/CommissionMatchedEvent.java
  • src/main/java/ditda/backend/domain/commission/core/notification/AllFirstDraftsSubmittedNotifier.java
  • src/main/java/ditda/backend/domain/commission/core/notification/ApplicationDeadlineClosedNotifier.java
  • src/main/java/ditda/backend/domain/commission/core/notification/CommissionCompletedNotifier.java
  • src/main/java/ditda/backend/domain/commission/core/notification/CommissionMatchedNotifier.java
  • src/main/java/ditda/backend/domain/commission/core/notification/DraftSelectedNotifier.java
  • src/main/java/ditda/backend/domain/commission/core/notification/FinalDeadlineClosedNotifier.java
  • src/main/java/ditda/backend/domain/commission/core/notification/FirstDraftDeadlineClosedNotifier.java
  • src/main/java/ditda/backend/domain/commission/core/notification/PayoutRequestedNotifier.java
  • src/main/java/ditda/backend/domain/commission/core/notification/RevisionRequestedNotifier.java
  • src/main/java/ditda/backend/domain/commission/core/notification/RevisionSubmittedNotifier.java
  • src/main/java/ditda/backend/domain/designer/repository/PortfolioRepository.java
  • src/main/java/ditda/backend/domain/designer/service/DesignerService.java
  • src/main/java/ditda/backend/domain/designer/service/PortfolioService.java
  • src/main/java/ditda/backend/domain/payment/event/DepositNotifiedEvent.java
  • src/main/java/ditda/backend/domain/payment/notification/DepositMailer.java
  • src/main/java/ditda/backend/domain/payment/notification/DepositNotifier.java
  • src/main/java/ditda/backend/domain/payment/service/PaymentService.java
  • src/main/java/ditda/backend/global/notification/EmailSender.java
  • src/main/java/ditda/backend/global/notification/NotificationOutbox.java
  • src/main/java/ditda/backend/global/notification/NotificationOutboxRepository.java
  • src/main/java/ditda/backend/global/notification/NotificationOutboxScheduler.java
  • src/main/java/ditda/backend/global/notification/NotificationType.java
  • src/main/java/ditda/backend/global/notification/OutboxStatus.java
  • src/main/resources/templates/email/deposit-notification.html
  • src/main/resources/templates/email/designer-signup-notification.html
💤 Files with no reviewable changes (2)
  • src/main/java/ditda/backend/domain/payment/notification/DepositMailer.java
  • src/main/java/ditda/backend/domain/auth/notification/DesignerSignupMailer.java

Comment thread src/main/java/ditda/backend/domain/payment/service/PaymentService.java Outdated
Base automatically changed from refactor/#94-notification-event to dev July 10, 2026 03:53
@fervovita
fervovita merged commit 0740806 into dev Jul 13, 2026
2 checks passed
@fervovita
fervovita deleted the feat/#113-admin-designer-portfolio branch July 13, 2026 08:39
@fervovita fervovita mentioned this pull request Jul 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[FEATURE] 어드민 디자이너 포트폴리오 조회 기능 구현

1 participant