| 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; |