68 lines
2.5 KiB
TypeScript
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);
|
|
}
|