mmday-firebase/src/repositories/userRepository.ts
윤정민 dfd21ba4c2 Implement nickname reservation system and add user delete functionality.
- 닉네임 선점 및 검증을 위한 예약 시스템을 구현하고 관련 로직을 추가했습니다.
- 유저 데이터 및 하위 컬렉션을 완전히 삭제하는 회원 탈퇴 기능을 구현했습니다.
- 토큰의 프로필 사진 변경 시 유저 정보를 자동으로 동기화하도록 개선했습니다.
- RTDB를 활용하여 닉네임 예약 상태를 관리하고, 회원 가입 시 이를 검증하도록 변경했습니다.
2026-04-14 13:16:50 +09:00

65 lines
1.9 KiB
TypeScript

import { FieldValue } from "firebase-admin/firestore";
import { firestore } from "../firebase";
import type {
KnowledgeLevel,
Provider,
TeamCode,
User,
} from "../types/panit";
const COLLECTION = "users";
export interface RegisterInput {
displayName: string;
email: string;
photoUrl?: string;
provider: Provider;
favoriteTeamCode: TeamCode;
knowledgeLevel: KnowledgeLevel;
}
/**
* 특정 유저 문서를 조회한다.
*
* @param uid - Firebase Auth UID
* @returns 유저 문서. 존재하지 않으면 `null`.
*/
export async function getUser(uid: string): Promise<User | null> {
const snap = await firestore.collection(COLLECTION).doc(uid).get();
return snap.exists ? (snap.data() as User) : null;
}
/**
* 신규 유저 문서를 생성한다. `createdAt`은 서버 타임스탬프로 기록되며,
* 같은 UID가 있으면 전체 덮어쓴다(`merge: false`).
*/
export async function createUser(uid: string, input: RegisterInput): Promise<void> {
const doc: Record<string, unknown> = {
displayName: input.displayName,
email: input.email,
provider: input.provider,
favoriteTeamCode: input.favoriteTeamCode,
knowledgeLevel: input.knowledgeLevel,
createdAt: FieldValue.serverTimestamp(),
};
if (input.photoUrl) doc.photoUrl = input.photoUrl;
await firestore.collection(COLLECTION).doc(uid).set(doc, { merge: false });
}
/**
* 유저 문서의 일부 필드를 병합 업데이트한다.
*/
export async function updateUser(
uid: string,
patch: Partial<Pick<User, "displayName" | "photoUrl" | "favoriteTeamCode" | "knowledgeLevel">>
): Promise<void> {
await firestore.collection(COLLECTION).doc(uid).set(patch, { merge: true });
}
/**
* 유저 문서 및 하위 컬렉션(voteHistory 등)을 모두 삭제한다.
*/
export async function deleteUser(uid: string): Promise<void> {
await firestore.recursiveDelete(firestore.collection(COLLECTION).doc(uid));
}