const db = require('../../config/db'); const fs = require('fs/promises'); const path = require('path'); const chainMetadataDir = path.resolve(process.cwd(), 'storage', 'certificates', 'metadata'); const chainMetadataFile = path.join(chainMetadataDir, 'chain-status.json'); const readChainMetadata = async () => { try { const raw = await fs.readFile(chainMetadataFile, 'utf8'); return JSON.parse(raw); } catch { return {}; } }; const writeChainMetadata = async (data) => { await fs.mkdir(chainMetadataDir, { recursive: true }); await fs.writeFile(chainMetadataFile, JSON.stringify(data, null, 2), 'utf8'); }; const create = async ({ userId, alias, filename, storagePath, subjectCn, issuerCn, validFrom, validTo, serialNumber }) => { const [result] = await db.execute( `INSERT INTO certificates (user_id, alias, filename, storage_path, subject_cn, issuer_cn, valid_from, valid_to, serial_number) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, [userId, alias, filename, storagePath, subjectCn || null, issuerCn || null, validFrom || null, validTo || null, serialNumber || null] ); return result.insertId; }; const findByUser = async (userId) => { const [rows] = await db.execute( 'SELECT id, user_id, alias, filename, subject_cn, issuer_cn, valid_from, valid_to, serial_number, is_active, created_at FROM certificates WHERE user_id = ? ORDER BY created_at DESC', [userId] ); return rows; }; const findById = async (id) => { const [rows] = await db.execute('SELECT * FROM certificates WHERE id = ?', [id]); return rows[0] || null; }; const deactivate = async (id) => { await db.execute('UPDATE certificates SET is_active = 0 WHERE id = ?', [id]); }; const remove = async (id) => { await db.execute('DELETE FROM certificates WHERE id = ?', [id]); }; const saveChainStatus = async (certId, metadata) => { const current = await readChainMetadata(); current[String(certId)] = metadata; await writeChainMetadata(current); }; const getChainStatus = async (certId) => { const current = await readChainMetadata(); return current[String(certId)] || null; }; const removeChainStatus = async (certId) => { const current = await readChainMetadata(); delete current[String(certId)]; await writeChainMetadata(current); }; module.exports = { create, findByUser, findById, deactivate, remove, saveChainStatus, getChainStatus, removeChainStatus, };