28 lines
1.4 KiB
TypeScript
28 lines
1.4 KiB
TypeScript
import { createHash } from 'node:crypto';
|
|
|
|
/**
|
|
* 원장 문서 ID — 설계서 §3.3 「`txId = SHA-256(idempotencyKey)` 의 앞 20자」.
|
|
*
|
|
* 조건문으로 중복을 막지 않는 것이 핵심이다. 조회와 쓰기 사이에 동시 요청이
|
|
* 끼어들 수 있으므로, 문서 ID 충돌을 Firestore 가 원자적으로 판정하게 한다.
|
|
*/
|
|
export const txIdOf = (idempotencyKey: string): string =>
|
|
createHash('sha256').update(idempotencyKey).digest('hex').slice(0, 20);
|
|
|
|
/** lot ID 는 원장과 1:1 로 묶어 대사 때 역추적할 수 있게 한다. */
|
|
export const lotIdOf = (txId: string): string => `lot_${txId}`;
|
|
|
|
/** 단말 해시 — 어뷰징 판정 입력. 원값을 저장하지 않는다. */
|
|
export const deviceHashOf = (raw: string): string =>
|
|
createHash('sha256').update(raw).digest('hex').slice(0, 32);
|
|
|
|
/**
|
|
* 브리핑 중복 판정 키 — 같은 기사를 두 번 받아도 문서가 늘지 않게 한다.
|
|
*
|
|
* 수집기 재시도는 정상 경로다. 자동 생성 ID 를 쓰면 재시도마다 카드가 늘어나고
|
|
* 관리자가 같은 기사를 세 번 승인하게 된다. 암호 용도가 아니라 중복 판정이므로
|
|
* sha1 로 충분하고, 앞 12 자면 하루치 기사 수에서 충돌하지 않는다.
|
|
*/
|
|
export const briefingHashOf = (key: string): string =>
|
|
createHash('sha1').update(key).digest('hex').slice(0, 12);
|