const { db } = require('../db'); const crypto = require('crypto'); class ApiKey { constructor(keyData) { Object.assign(this, keyData); this.id = keyData._id; } static async find(query) { return new Promise((resolve, reject) => { db.apikeys.find(query, (err, docs) => { if (err) reject(err); else resolve(docs.map(doc => new ApiKey(doc))); }); }); } static async findOne(query) { return new Promise((resolve, reject) => { db.apikeys.findOne(query, (err, doc) => { if (err) reject(err); else resolve(doc ? new ApiKey(doc) : null); }); }); } static async findById(id) { return new Promise((resolve, reject) => { db.apikeys.findOne({ _id: id }, (err, doc) => { if (err) reject(err); else resolve(doc ? new ApiKey(doc) : null); }); }); } static async create(keyData) { keyData.isActive = keyData.isActive !== undefined ? keyData.isActive : true; keyData.createdAt = keyData.createdAt || new Date(); keyData.lastUsed = keyData.lastUsed || null; return new Promise((resolve, reject) => { db.apikeys.insert(keyData, (err, newDoc) => { if (err) reject(err); else resolve(new ApiKey(newDoc)); }); }); } static generateKey() { const token = crypto.randomBytes(24).toString('hex'); return `sk-cdx-${token}`; } async save() { return new Promise((resolve, reject) => { const data = { ...this }; const id = data._id; delete data._id; db.apikeys.update({ _id: id }, { $set: data }, (err) => { if (err) reject(err); else resolve(this); }); }); } async deleteOne() { return new Promise((resolve, reject) => { db.apikeys.remove({ _id: this._id }, {}, (err) => { if (err) reject(err); else resolve(); }); }); } } module.exports = ApiKey;