Codeai / backend /models /ApiKey.js
zhlajiex's picture
fix: resolve CastError by making ApiKey model NeDB-compatible
777b311
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;