Source: controllers/TokenController.js

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;