diff --git a/backend/src/services/schedule.js b/backend/src/services/schedule.js index b05cb9d..e3d06ad 100644 --- a/backend/src/services/schedule.js +++ b/backend/src/services/schedule.js @@ -80,8 +80,21 @@ export function formatSchedule(rawSchedule, members = []) { }; } +/** + * 현재 활동 멤버 수 조회 + * @param {object} db - 데이터베이스 연결 + * @returns {number} 현재 활동 멤버 수 + */ +async function getActiveMemberCount(db) { + const [[{ count }]] = await db.query( + 'SELECT COUNT(*) as count FROM members WHERE is_former = 0' + ); + return count; +} + /** * 멤버 맵 조회 (일정 ID → 멤버 이름 배열) + * 전체 멤버인 경우 "프로미스나인"으로 대체 * @param {object} db - 데이터베이스 연결 * @param {number[]} scheduleIds - 일정 ID 배열 * @returns {object} { scheduleId: [memberName, ...] } @@ -91,11 +104,14 @@ export async function buildMemberMap(db, scheduleIds) { return {}; } + // 현재 활동 멤버 수 조회 + const activeMemberCount = await getActiveMemberCount(db); + const [scheduleMembers] = await db.query(` SELECT sm.schedule_id, m.name FROM schedule_members sm JOIN members m ON sm.member_id = m.id - WHERE sm.schedule_id IN (?) + WHERE sm.schedule_id IN (?) AND m.is_former = 0 ORDER BY m.id `, [scheduleIds]); @@ -107,6 +123,13 @@ export async function buildMemberMap(db, scheduleIds) { memberMap[sm.schedule_id].push(sm.name); } + // 전체 멤버인 경우 "프로미스나인"으로 대체 + for (const scheduleId of Object.keys(memberMap)) { + if (memberMap[scheduleId].length === activeMemberCount) { + memberMap[scheduleId] = ['프로미스나인']; + } + } + return memberMap; } @@ -176,15 +199,23 @@ export async function getScheduleDetail(db, id, getXProfile = null) { const s = schedules[0]; - // 멤버 정보 조회 + // 현재 활동 멤버 수 조회 + const activeMemberCount = await getActiveMemberCount(db); + + // 멤버 정보 조회 (탈퇴 멤버 제외) const [members] = await db.query(` SELECT m.id, m.name FROM schedule_members sm JOIN members m ON sm.member_id = m.id - WHERE sm.schedule_id = ? + WHERE sm.schedule_id = ? AND m.is_former = 0 ORDER BY m.id `, [id]); + // 전체 멤버인 경우 "프로미스나인"으로 대체 + const formattedMembers = members.length === activeMemberCount + ? [{ id: 0, name: '프로미스나인' }] + : members; + // 공통 필드 const result = { id: s.id, @@ -195,7 +226,7 @@ export async function getScheduleDetail(db, id, getXProfile = null) { name: s.category_name, color: s.category_color, }, - members, + members: formattedMembers, createdAt: s.created_at, updatedAt: s.updated_at, }; diff --git a/docs/api.md b/docs/api.md index d3c5759..9bef46a 100644 --- a/docs/api.md +++ b/docs/api.md @@ -88,7 +88,7 @@ Base URL: `/api` } ] ``` -※ 멤버가 5명 이상이면 `[{ "name": "프로미스나인" }]` 반환 +※ 현재 활동 멤버 전원인 경우 `[{ "name": "프로미스나인" }]` 반환 (탈퇴 멤버 제외) **검색 응답:** ```json diff --git a/frontend-temp/src/utils/schedule.js b/frontend-temp/src/utils/schedule.js index d974f6b..978121f 100644 --- a/frontend-temp/src/utils/schedule.js +++ b/frontend-temp/src/utils/schedule.js @@ -73,16 +73,13 @@ export function getMemberList(schedule) { } /** - * 멤버 표시 이름 가져오기 (5명 이상이면 '프로미스나인') + * 멤버 표시 이름 가져오기 + * 백엔드에서 전체 멤버인 경우 '프로미스나인'으로 처리함 * @param {object} schedule - 스케줄 객체 * @returns {string[]} 표시할 멤버 이름 배열 */ export function getDisplayMembers(schedule) { - const memberList = getMemberList(schedule); - if (memberList.length >= 5) { - return ['프로미스나인']; - } - return memberList; + return getMemberList(schedule); } /**