import { onRequest } from "firebase-functions/https"; import { requireAuthToken } from "../middleware/auth"; import { sendError } from "../middleware/errors"; import { checkNickname, createMe, deleteMe, getMe, updateMe, updateNotifications, } from "../services/userService"; import type { MeResponseDto, NotificationsResponseDto, UserProfileDto, } from "../types/dto/userDto"; /** `uid` + 프로필 DTO를 `MeResponseDto`로 조립한다. 필드를 하나하나 명시해 새 필드 누락을 방지한다. */ function toMeResponse(uid: string, profile: UserProfileDto): MeResponseDto { return { user: { uid, displayName: profile.displayName, email: profile.email, photoUrl: profile.photoUrl, provider: profile.provider, favoriteTeamCode: profile.favoriteTeamCode, knowledgeLevel: profile.knowledgeLevel, createdAt: profile.createdAt, lastJudgedDate: profile.lastJudgedDate, }, }; } export const user = onRequest(async (req, res) => { try { if (req.method === "GET" && req.path === "/check-nickname") { const token = await requireAuthToken(req); const result = await checkNickname(token, req.query.displayName); res.status(200).json(result); return; } if (req.method === "GET" && req.path === "/") { const token = await requireAuthToken(req); const u = await getMe(token); res.status(200).json(toMeResponse(token.uid, u)); return; } if (req.method === "POST" && req.path === "/") { const token = await requireAuthToken(req); const u = await createMe(token, req.body ?? {}); res.status(201).json(toMeResponse(token.uid, u)); return; } if (req.method === "PATCH" && req.path === "/") { const token = await requireAuthToken(req); const u = await updateMe(token, req.body ?? {}); res.status(200).json(toMeResponse(token.uid, u)); return; } if (req.method === "PATCH" && req.path === "/notifications") { const token = await requireAuthToken(req); const notifications = await updateNotifications(token, req.body ?? {}); const body: NotificationsResponseDto = { notifications }; res.status(200).json(body); return; } if (req.method === "DELETE" && req.path === "/") { const token = await requireAuthToken(req); await deleteMe(token); res.status(204).send(); return; } res.status(404).json({ error: "not found" }); } catch (err) { sendError(res, err); } });