- 닉네임 선점 및 검증을 위한 예약 시스템을 구현하고 관련 로직을 추가했습니다. - 유저 데이터 및 하위 컬렉션을 완전히 삭제하는 회원 탈퇴 기능을 구현했습니다. - 토큰의 프로필 사진 변경 시 유저 정보를 자동으로 동기화하도록 개선했습니다. - RTDB를 활용하여 닉네임 예약 상태를 관리하고, 회원 가입 시 이를 검증하도록 변경했습니다.
65 lines
1.9 KiB
TypeScript
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));
|
|
}
|