95 lines
2.5 KiB
JavaScript
95 lines
2.5 KiB
JavaScript
|
|
/**
|
||
|
|
* 멤버 서비스
|
||
|
|
* 멤버 관련 비즈니스 로직
|
||
|
|
*/
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 전체 멤버 목록 조회 (별명 포함)
|
||
|
|
* @param {object} db - 데이터베이스 연결
|
||
|
|
* @returns {array} 멤버 목록
|
||
|
|
*/
|
||
|
|
export async function getAllMembers(db) {
|
||
|
|
const [members] = await db.query(`
|
||
|
|
SELECT
|
||
|
|
m.id, m.name, m.name_en, m.birth_date, m.instagram, m.image_id, m.is_former,
|
||
|
|
i.original_url as image_original,
|
||
|
|
i.medium_url as image_medium,
|
||
|
|
i.thumb_url as image_thumb
|
||
|
|
FROM members m
|
||
|
|
LEFT JOIN images i ON m.image_id = i.id
|
||
|
|
ORDER BY m.is_former ASC, m.id ASC
|
||
|
|
`);
|
||
|
|
|
||
|
|
// 별명 조회
|
||
|
|
const [nicknames] = await db.query(
|
||
|
|
'SELECT member_id, nickname FROM member_nicknames'
|
||
|
|
);
|
||
|
|
|
||
|
|
// 멤버별 별명 매핑
|
||
|
|
const nicknameMap = {};
|
||
|
|
for (const n of nicknames) {
|
||
|
|
if (!nicknameMap[n.member_id]) {
|
||
|
|
nicknameMap[n.member_id] = [];
|
||
|
|
}
|
||
|
|
nicknameMap[n.member_id].push(n.nickname);
|
||
|
|
}
|
||
|
|
|
||
|
|
// 멤버 데이터에 별명 추가
|
||
|
|
return members.map(m => ({
|
||
|
|
...m,
|
||
|
|
nicknames: nicknameMap[m.id] || [],
|
||
|
|
image_url: m.image_thumb || m.image_medium || m.image_original,
|
||
|
|
}));
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* 이름으로 멤버 조회 (별명 포함)
|
||
|
|
* @param {object} db - 데이터베이스 연결
|
||
|
|
* @param {string} name - 멤버 이름
|
||
|
|
* @returns {object|null} 멤버 정보 또는 null
|
||
|
|
*/
|
||
|
|
export async function getMemberByName(db, name) {
|
||
|
|
const [members] = await db.query(`
|
||
|
|
SELECT
|
||
|
|
m.id, m.name, m.name_en, m.birth_date, m.instagram, m.image_id, m.is_former,
|
||
|
|
i.original_url as image_original,
|
||
|
|
i.medium_url as image_medium,
|
||
|
|
i.thumb_url as image_thumb
|
||
|
|
FROM members m
|
||
|
|
LEFT JOIN images i ON m.image_id = i.id
|
||
|
|
WHERE m.name = ?
|
||
|
|
`, [name]);
|
||
|
|
|
||
|
|
if (members.length === 0) {
|
||
|
|
return null;
|
||
|
|
}
|
||
|
|
|
||
|
|
const member = members[0];
|
||
|
|
|
||
|
|
// 별명 조회
|
||
|
|
const [nicknames] = await db.query(
|
||
|
|
'SELECT nickname FROM member_nicknames WHERE member_id = ?',
|
||
|
|
[member.id]
|
||
|
|
);
|
||
|
|
|
||
|
|
return {
|
||
|
|
...member,
|
||
|
|
nicknames: nicknames.map(n => n.nickname),
|
||
|
|
image_url: member.image_original || member.image_medium || member.image_thumb,
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* ID로 멤버 기본 정보 조회 (수정용)
|
||
|
|
* @param {object} db - 데이터베이스 연결
|
||
|
|
* @param {string} name - 멤버 이름
|
||
|
|
* @returns {object|null} 멤버 기본 정보 또는 null
|
||
|
|
*/
|
||
|
|
export async function getMemberBasicByName(db, name) {
|
||
|
|
const [members] = await db.query(
|
||
|
|
'SELECT id, image_id FROM members WHERE name = ?',
|
||
|
|
[name]
|
||
|
|
);
|
||
|
|
return members.length > 0 ? members[0] : null;
|
||
|
|
}
|