feat: 전체 멤버인 경우 '프로미스나인'으로 표시

- 백엔드: buildMemberMap, getScheduleDetail 함수에서 현재 활동 멤버 전원인 경우
  "프로미스나인"으로 대체하여 반환
- 프론트엔드: getDisplayMembers 함수에서 멤버 수 계산 로직 제거 (백엔드에서 처리)
- 탈퇴 멤버(is_former=1) 제외하고 현재 활동 멤버만 계산

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
caadiq 2026-01-22 20:42:05 +09:00
parent ff5c168529
commit 9515db712d
3 changed files with 39 additions and 11 deletions

View file

@ -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,
};

View file

@ -88,7 +88,7 @@ Base URL: `/api`
}
]
```
멤버가 5명 이상이면 `[{ "name": "프로미스나인" }]` 반환
현재 활동 멤버 전원인 경우 `[{ "name": "프로미스나인" }]` 반환 (탈퇴 멤버 제외)
**검색 응답:**
```json

View file

@ -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);
}
/**