src/features/reviews/review-key.ts
Linked repository file from this build.
import { validate, v7 } from "uuid";
import { RuleError } from "@/lib/errors";
/** Internal identity is opaque: never derive business facts from this value. */
export function reviewKey(review: { id: string }): string {
return review.id;
}
export const newReviewKey = v7;
export const isReviewKey = validate;
export function fiscalYear(sampleMonth: string): number {
const match = /^(\d{4})-(0[1-9]|1[0-2])$/.exec(sampleMonth);
if (!match) throw new RuleError("Enter a valid sample month.");
return Number(match[1]) + (Number(match[2]) >= 10 ? 1 : 0);
}
export interface ReviewIdentity {
program: string;
fiscalYear: number;
reviewNumber: string;
}
export function reviewIdentity(review: {
program: string;
sampleMonth: string;
reviewNumber: string;
}): ReviewIdentity {
return {
program: review.program,
fiscalYear: fiscalYear(review.sampleMonth),
reviewNumber: review.reviewNumber,
};
}
/** For matching import rows/maps only. Never a stored ID or URL. */
export function businessKey(review: {
reviewNumber: string;
sampleMonth: string;
program: string;
}): string {
return JSON.stringify([review.program, fiscalYear(review.sampleMonth), review.reviewNumber]);
}
export function sameReviewIdentity(left: ReviewIdentity, right: ReviewIdentity): boolean {
return (
left.program === right.program &&
left.fiscalYear === right.fiscalYear &&
left.reviewNumber === right.reviewNumber
);
}