mmday-firebase/src/repositories/voteHistoryRepository.ts
2026-04-13 09:18:34 +09:00

68 lines
2.5 KiB
TypeScript

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<VoteHistoryDoc | null> {
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<Array<{ date: DateString; doc: VoteHistoryDoc }>> {
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<Array<{ date: DateString; doc: VoteHistoryDoc }>> {
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<void> {
await col(uid).doc(date).set(doc);
}