Cloud Functions 도메인 함수 — POP 원장 · 퀘스트 · 이클립스 · 행성 성장 · 캠페인 · 결제 · 알림 · 브리핑 · INSIDE · 추천 · 번역 · 서버 테스트

This commit is contained in:
Sn-Kinos
2026-09-29 17:06:48 +09:00
parent f483e8d94b
commit 316821e7d5
61 changed files with 14660 additions and 60 deletions
+27
View File
@@ -0,0 +1,27 @@
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);