Skip to content

fix: 팀원모집 개선 - #624

Merged
hgjwilly merged 8 commits into
developfrom
fix/recruit
Oct 14, 2026
Merged

hgjwilly merged 8 commits into
developfrom
fix/recruit

Conversation

@hgjwilly

@hgjwilly hgjwilly commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

#️⃣연관된 이슈

📝작업 내용

이번 PR에서 작업한 내용을 간략히 설명해주세요(이미지 첨부 가능)

팀원모집 개선 작업입니다.

  1. 포그라운드에서 보고 있는 채팅방 푸시알림 묵살

    • 포그라운드에서 푸시알림 수신시 willPresent에서 현재 보고 있는 채팅방인지 확인합니다.
    • navigationController.topViewController를 통해 분실물/콜밴팟/팀원모집 채팅을 구별합니다.
    • 팀원모집 채팅 : 푸시알림에 채팅방 정보가 없으므로, notificationId를 비교합니다. AppDelegate에서 FetchRecruitNotificationListUseCase를 호출합니다. (알림 화면 리팩토링 예정 - 임시 구현)
    • 분실물 채팅 : chatRoomId를 비교합니다.
    • 콜밴팟 채팅일 경우 postId를 비교합니다.
  2. 팀원모집 팀채팅 navigationTitle에 인원수가 표시되지 않는 문제 수정

  3. 팀원모집 채팅 unreadCount UI 구현

  4. 푸시알림 body가 static image url이 보이는 문제 수정

    • body에 담긴 static image url를 "사진을 보냈습니다." 텍스트로 치환합니다.
    • body에 담긴 static image url을 attachment로 변환하여 푸시알림에 첨부합니다.
  5. 비로그인 상태에서 팀원모집 목록 화면 진입시 토스트메시지가 뜨는 문제 수정

  6. 팀원모집 프로필 학번 검증

    • BasicInfo의 isValid내부에 StudentNumberInput.isValid 호출을 추가했습니다.

스크린샷 (선택)

💬리뷰 요구사항(선택)

리뷰어가 특별히 봐주었으면 하는 부분이 있다면 작성해주세요

@hgjwilly hgjwilly self-assigned this Oct 13, 2026
@hgjwilly hgjwilly added the FIX 버그 수정 label Oct 13, 2026
@coderabbitai

coderabbitai Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 62b87c29-95f3-4faf-af79-b30de42188bf
📥 Commits

Reviewing files that changed from the base of the PR and between 8dc3cac and a6de24e.

📒 Files selected for processing (17)
  • Koin/Apps/AppDelegate.swift
  • Koin/Core/View/UIKit/Chat/Models/ChatMessageRowModel.swift
  • Koin/Core/View/UIKit/Chat/Views/ChatTableView/ChatLeftCell.swift
  • Koin/Core/View/UIKit/Chat/Views/ChatTableView/ChatRightCell.swift
  • Koin/Data/DTOs/Decodable/Recruit/RecruitChatDataDto.swift
  • Koin/Data/DTOs/Decodable/Recruit/RecruitChatMessageDto.swift
  • Koin/Domain/Model/Recruit/BasicInfo.swift
  • Koin/Domain/Model/Recruit/RecruitChatData.swift
  • Koin/Domain/Model/Recruit/RecruitChatMessage.swift
  • Koin/Presentation/CallVan/CallVanChat/CallVanChatViewController.swift
  • Koin/Presentation/CallVan/CallVanChat/Support/ChatListModel+CallVanChat.swift
  • Koin/Presentation/LostItem/LostItemChat/LostItemChatViewController.swift
  • Koin/Presentation/Recruit/RecruitChat/Mapper/ChatListModel+RecruitChat.swift
  • Koin/Presentation/Recruit/RecruitChat/RecruitChatViewController.swift
  • Koin/Presentation/Recruit/RecruitChat/RecruitChatViewModel.swift
  • Koin/Presentation/Recruit/RecruitList/RecruitListViewModel.swift
  • NotificationService/NotificationService.swift

Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review.

📝 Walkthrough

The changes add foreground notification matching for visible chats, carry recruitment unread counts into chat message cells, update notification image processing, validate student numbers, and change handling for unauthorized recruitment profile requests.

Changes: Foreground notification matching

Layer / File(s) Summary
Match foreground pushes to the visible chat
Koin/Apps/AppDelegate.swift, Koin/Presentation/Recruit/RecruitChat/RecruitChatViewController.swift, Koin/Presentation/Recruit/RecruitChat/RecruitChatViewModel.swift, Koin/Presentation/LostItem/LostItemChat/LostItemChatViewController.swift, Koin/Presentation/CallVan/CallVanChat/CallVanChatViewController.swift
Chat controllers expose identifiers used by the matching helper. The foreground delegate suppresses presentation when the helper matches the push to the visible chat; otherwise, it keeps banner, list, and sound options.

Chat unread counts

Layer / File(s) Summary
Carry unread counts into chat rows
Koin/Domain/Model/Recruit/RecruitChatData.swift, Koin/Domain/Model/Recruit/RecruitChatMessage.swift, Koin/Data/DTOs/Decodable/Recruit/RecruitChatDataDto.swift, Koin/Data/DTOs/Decodable/Recruit/RecruitChatMessageDto.swift, Koin/Core/View/UIKit/Chat/Models/ChatMessageRowModel.swift, Koin/Presentation/Recruit/RecruitChat/Mapper/ChatListModel+RecruitChat.swift, Koin/Presentation/CallVan/CallVanChat/Support/ChatListModel+CallVanChat.swift
Recruitment data carries unread counts into chat rows. A message count of zero maps to nil; call-van rows pass nil.
Render unread counts in message cells
Koin/Core/View/UIKit/Chat/Views/ChatTableView/ChatLeftCell.swift, Koin/Core/View/UIKit/Chat/Views/ChatTableView/ChatRightCell.swift
Image and text message cells display unread counts above their time labels.

Notification image processing

Layer / File(s) Summary
Update notification content and image handling
NotificationService/NotificationService.swift
The service replaces qualifying notification bodies with “사진을 보냈습니다.”, saves data from full notification content, and resolves image URLs from FCM options or the original body. Image downloads use URLSession; successful downloads create attachments.

Student number validation

Layer / File(s) Summary
Validate the student number
Koin/Domain/Model/Recruit/BasicInfo.swift
BasicInfo.isValid rejects a nonempty student number when StudentNumberInput.isValid returns false.

Recruit profile fetch errors

Layer / File(s) Summary
Handle unauthorized profile responses
Koin/Presentation/Recruit/RecruitList/RecruitListViewModel.swift
fetchMyRecruitProfile() returns without setting errorMessage for a 401 response. Other errors continue through the existing error-message path.

Priority: ⬇️ Low

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Bug fix

Sequence Diagram(s)

sequenceDiagram
  participant NotificationService
  participant URLSession
  participant UNNotificationAttachment
  NotificationService->>URLSession: Download the resolved image URL
  URLSession-->>NotificationService: Return image data or a download failure
  NotificationService->>UNNotificationAttachment: Create an attachment from downloaded image data
Loading
Merge Risk: ⚪ Minimal · up to a6de2

The changes adjust chat notification suppression, unread counts, notification images, and student-number validation. No concrete merge-blocking risk is identified.

Pre-merge checks · Passed 4 · Failed 1

Failed Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage Warning Docstring coverage is 52.17% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 23 functions across 17 files. Write docstrings for the functions missing them to satisfy the coverage threshold.
Passed Passed checks (4 passed)
Check name Status Explanation
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.
Description Check Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check Passed The title, “fix: 팀원모집 개선,” accurately identifies the team recruitment improvements, including chat, profile validation, participant count, and unread-count changes. It does not mention the separate no…
  • Fix all pre-merge checks with AI
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Commit to this branch
  • Create a new PR
🧪 Generate unit tests (beta)
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

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.

@hgjwilly
hgjwilly merged commit f4e4a04 into develop Oct 14, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

FIX 버그 수정

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant