const BaseDatabaseController = require('./BaseDatabaseController');
const bcrypt = require('bcrypt');
const saltRounds = 10;
/** Class representing a tokn controller. */
class TokenController extends BaseDatabaseController {
/** Create a token controller. */
constructor() {
super();
}
/**
* Get a token by id.
*
* @param {number} id
* @returns {Promise<object>}
*/
async byId(id) {
const tokenResponse = await this._query('SELECT * FROM tokens WHERE id = ?', id);
if (tokenResponse.length !== 1) {
return null;
}
return tokenResponse[0];
}
/**
* Get a token by token string.
*
* @param {string} tokenString
* @returns {Promise<object>}
*/
async byTokenString(tokenString) {
const tokenResponse = await this._query('SELECT * FROM tokens WHERE token = ?', tokenString);
if (tokenResponse.length !== 1) {
return null;
}
return tokenResponse[0];
}
/**
* Create a token for a user.
*
* @param {number} userId
* @returns {Promise<object>}
*/
async createToken(userId) {
const tokenString = await bcrypt.hash(userId.toString() + Date.now().toString(), saltRounds);
const tokenInsertResult = await this._query(
'INSERT INTO tokens (user_id, token) VALUES (?, ?)',
userId,
tokenString
);
return await this.byId(tokenInsertResult.insertId);
}
/**
* Delete a token.
*
* @param {number} tokenId
*/
async delete(tokenId) {
await this._query('DELETE FROM tokens WHERE id = ?', tokenId);
}
}
module.exports = TokenController;