Skip to article
Documentation

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
  );
}