import { firestore } from "../firebase.js"; import type { VoteHistoryDoc } from "../types/panit.js"; import type { DateString } from "../types/dateString.js"; /** * 특정 유저의 voteHistory 서브컬렉션 레퍼런스를 반환한다. */ function col(uid: string): FirebaseFirestore.CollectionReference { return firestore.collection("users").doc(uid).collection("voteHistory"); } /** * 특정 날짜의 투표 기록 단일 문서를 조회한다. * * @param uid - 조회할 유저 ID * @param date - 조회할 날짜 (YYYY-MM-DD, 문서 ID로 사용됨) * @returns 해당 날짜의 투표 기록. 존재하지 않으면 `null`. */ export async function getDay(uid: string, date: DateString): Promise { const snap = await col(uid).doc(date).get(); return snap.exists ? (snap.data() as VoteHistoryDoc) : null; } /** * 지정한 날짜 범위(양끝 포함)에 해당하는 투표 기록을 조회한다. * * 문서 ID(`__name__`) 기준으로 범위 쿼리하므로 문서 ID가 * `YYYY-MM-DD` 형식이어야 날짜 순 정렬과 일치한다. * * @param uid - 조회할 유저 ID * @param startDate - 범위 시작 날짜 (포함) * @param endDate - 범위 종료 날짜 (포함) * @returns `{ date, doc }` 배열 (문서 ID 오름차순) */ export async function getRange( uid: string, startDate: DateString, endDate: DateString ): Promise> { const snap = await col(uid) .where("__name__", ">=", startDate) .where("__name__", "<=", endDate) .get(); return snap.docs.map((d) => ({ date: d.id as DateString, doc: d.data() as VoteHistoryDoc })); } /** * 유저의 전체 투표 기록을 날짜 오름차순으로 조회한다. * * @param uid - 조회할 유저 ID * @returns `{ date, doc }` 배열 (날짜 오름차순) */ export async function getAll(uid: string): Promise> { const snap = await col(uid).orderBy("__name__").get(); return snap.docs.map((d) => ({ date: d.id as DateString, doc: d.data() as VoteHistoryDoc })); } /** * 특정 날짜의 투표 기록을 저장한다. 동일 날짜 문서가 있으면 전체를 덮어쓴다. * * @param uid - 저장할 유저 ID * @param date - 저장할 날짜 (YYYY-MM-DD, 문서 ID로 사용됨) * @param doc - 저장할 투표 기록 */ export async function setDay(uid: string, date: DateString, doc: VoteHistoryDoc): Promise { await col(uid).doc(date).set(doc); }