File size: 2,226 Bytes
cfbb685 a966957 cfbb685 7b0c22b cfbb685 7b0c22b cfbb685 7b0c22b cfbb685 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | import { prisma } from './prisma';
import { logger } from '../logger';
import { redis } from '../lib/redis';
const CACHE_KEY = 'normalization:rules:wolof';
const CACHE_TTL = 3600; // 1 hour
export const normalizationService = {
/**
* Get all normalization rules for a language
*/
async getRules(language: string = 'WOLOF'): Promise<Record<string, string>> {
const cacheKey = `${CACHE_KEY}:${language}`;
try {
const cached = await redis.get(cacheKey);
if (cached) return JSON.parse(cached);
} catch (err) {
logger.error({ err }, '[NORMALIZATION] Redis get error');
}
const rules = await prisma.normalizationRule.findMany({
where: { language }
});
const ruleMap: Record<string, string> = {};
rules.forEach((r: { original: string; replacement: string }) => {
ruleMap[r.original.toLowerCase()] = r.replacement;
});
try {
await redis.set(cacheKey, JSON.stringify(ruleMap), 'EX', CACHE_TTL);
} catch (err) {
logger.error({ err }, '[NORMALIZATION] Redis set error');
}
return ruleMap;
},
/**
* Create or update a rule
*/
async saveRule(original: string, replacement: string, language: string = 'WOLOF') {
const rule = await prisma.normalizationRule.upsert({
where: { original },
update: { replacement, language },
create: { original, replacement, language }
});
// Invalidate cache
await redis.del(`${CACHE_KEY}:${language}`).catch(() => {});
return rule;
},
/**
* Batch save rules
*/
async saveRules(rules: { original: string, replacement: string }[], language: string = 'WOLOF') {
const operations = rules.map(r => prisma.normalizationRule.upsert({
where: { original: r.original },
update: { replacement: r.replacement, language },
create: { original: r.original, replacement: r.replacement, language }
}));
await Promise.all(operations);
await redis.del(`${CACHE_KEY}:${language}`).catch(() => {});
}
};
|