5 callsite (NoteRepository, ftsHelpers, BackupService, ContinuityService,
NoteCard) 모두 canonical export 로 정리. 알고리즘 동일 (9 * 60 * 60 * 1000),
회귀 PASS 검증.
v0.2.6 commit 3cfa60b 가 4 callsite migrate 했지만 5 callsite 잔여.
Cut F audit 에서 발견.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
33 lines
1.1 KiB
TypeScript
33 lines
1.1 KiB
TypeScript
/**
|
|
* v0.2.11 Cut D — FTS5 검색 + 회고 view 의 순수 함수 헬퍼.
|
|
*/
|
|
|
|
import { KST_OFFSET_MS } from '../../shared/util/kstDate.js';
|
|
|
|
const FTS5_SPECIAL_CHARS_RE = /["*():]/g;
|
|
const WS_COLLAPSE_RE = /\s+/g;
|
|
|
|
/**
|
|
* FTS5 MATCH 쿼리에 안전한 형태로 변환. " * ( ) : 제거 + 공백 정리.
|
|
* 다중 토큰은 그대로 두어 FTS5 implicit AND 활용.
|
|
*/
|
|
export function sanitizeFtsQuery(input: string): string {
|
|
return input.replace(FTS5_SPECIAL_CHARS_RE, ' ').replace(WS_COLLAPSE_RE, ' ').trim();
|
|
}
|
|
|
|
export type ReviewPeriod = 'daily' | 'weekly' | 'monthly';
|
|
|
|
/**
|
|
* 회고 cutoff = period 시작점의 KST 자정 (UTC ISO).
|
|
* daily = 오늘 0시, weekly = 7일 전 0시, monthly = 30일 전 0시.
|
|
*/
|
|
export function computeCutoff(period: ReviewPeriod, now: Date): string {
|
|
const kstNow = new Date(now.getTime() + KST_OFFSET_MS);
|
|
const y = kstNow.getUTCFullYear();
|
|
const m = kstNow.getUTCMonth();
|
|
const d = kstNow.getUTCDate();
|
|
const todayMidKstUtc = Date.UTC(y, m, d) - KST_OFFSET_MS;
|
|
const days = period === 'daily' ? 0 : period === 'weekly' ? 7 : 30;
|
|
return new Date(todayMidKstUtc - days * 24 * 60 * 60 * 1000).toISOString();
|
|
}
|