const db = require('../service/db.js'), coll = db.collection('token'); module.exports = { TYPE_SESSION: 0, TYPE_CSRF_TOKEN: 1, TYPE_REGISTER: 2, /** * Add a token. * @param {number} tokenType type of the token. * @param {number} expireSeconds expire time, in seconds. * @param {object} data extra data. * @returns {Array} token ID, token data */ async add(tokenType, expireSeconds, data) { let now = new Date(); let str = String.random(32); let res = await coll.insertOne(Object.assign({}, data, { _id: str, tokenType, createAt: now, updateAt: now, expireAt: new Date(now.getTime() + expireSeconds * 1000) })); return [str, res.ops]; }, /** * Get a token. * @param {string} tokenId token ID. * @param {number} tokenType type of the token. * @returns {object} The token document, or null. */ get(tokenId, tokenType) { return coll.findOne({ _id: tokenId, tokenType }); }, /** * Update a token. * @param {string} tokenId token ID. * @param {number} tokenType type of the token. * @param {number} expireSeconds expire time, in seconds. * @param {object} data extra data. * @returns {object} The token document, or null. */ async update(tokenId, tokenType, expireSeconds, data) { let now = new Date(); let res = await coll.findOneAndUpdate({ _id: tokenId, tokenType }, { $set: Object.assign({ updateAt: now, expireAt: new Date(now.getTime() + expireSeconds * 1000) }, data, { tokenType }) }); return res.value; }, /** * Delete a token. * @param {string} tokenId token ID. * @param {int} tokenType type of the token. * @returns {boolean} true if deleted, or false. */ async delete(tokenId, tokenType) { let result = await coll.deleteOne({ _id: tokenId, tokenType }); return !!result.deletedCount; }, async getMostRecentSessionByUid(uid) { return await coll.findOne({ uid, token_type: this.TYPE_SESSION }, { sort: { updateAt: -1 } }); } };