50 lines
1.6 KiB
JavaScript
50 lines
1.6 KiB
JavaScript
const database = require('../config/database');
|
|
|
|
class FeatureBusinessRules {
|
|
static async upsert(template_id, feature_id, rules) {
|
|
// Normalize to JSON array
|
|
let businessRules;
|
|
if (Array.isArray(rules)) {
|
|
businessRules = rules.map((r) => (typeof r === 'string' ? tryParse(r) ?? r : r));
|
|
} else if (typeof rules === 'string') {
|
|
const parsed = tryParse(rules);
|
|
businessRules = Array.isArray(parsed) ? parsed : [parsed ?? rules];
|
|
} else if (rules && typeof rules === 'object') {
|
|
businessRules = [rules];
|
|
} else {
|
|
businessRules = [];
|
|
}
|
|
|
|
const sql = `
|
|
INSERT INTO feature_business_rules (template_id, feature_id, business_rules, updated_at)
|
|
VALUES ($1, $2, $3::jsonb, NOW())
|
|
ON CONFLICT (template_id, feature_id)
|
|
DO UPDATE SET business_rules = EXCLUDED.business_rules, updated_at = NOW()
|
|
RETURNING *
|
|
`;
|
|
const result = await database.query(sql, [template_id, feature_id, JSON.stringify(businessRules)]);
|
|
|
|
// DISABLED: Auto CKG migration on business rules update to prevent loops
|
|
// Only trigger CKG migration when new templates are created
|
|
console.log(`📝 [FeatureBusinessRules.upsert] Business rules updated for template: ${template_id} - CKG migration will be triggered when template is created`);
|
|
|
|
return result.rows[0];
|
|
}
|
|
}
|
|
|
|
function tryParse(s) {
|
|
try {
|
|
const t = String(s).trim();
|
|
if ((t.startsWith('{') && t.endsWith('}')) || (t.startsWith('[') && t.endsWith(']'))) {
|
|
return JSON.parse(t);
|
|
}
|
|
return null;
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
module.exports = FeatureBusinessRules;
|
|
|
|
|