db/models/admin.jsjavascript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const sequelize_1 = require("sequelize");
const db_1 = __importDefault(require("../db"));
const bcrypt = require("bcrypt");
/**
 * @openapi
 * components:
 *  schemas:
 *    Admin:
 *      type: object
 *      required:
 *      - id
 *      - username
 *      - password
 *      properties:
 *        id:
 *          type: string
 *          format: uuid
 *        username:
 *          type: string
 *        password:
 *          type: string
 *          format: password
 */
/**
 * @typedef Admin
 * @property {UUID} id
 * @property {string} username
 * @memberof module:Models
 */
class Admin extends sequelize_1.Model {
}
Admin.init({
    id: {
        type: sequelize_1.DataTypes.UUID,
        defaultValue: sequelize_1.DataTypes.UUIDV4,
        primaryKey: true,
    },
    username: {
        type: sequelize_1.DataTypes.STRING,
        allowNull: false,
        unique: true,
        validate: {
            len: {
                args: [6, 999],
                msg: "Username has to be at least 6 characters",
            },
        },
    },
    password: {
        type: sequelize_1.DataTypes.STRING,
        allowNull: false,
        set(value) {
            const salt = bcrypt.genSaltSync(10, "a");
            this.setDataValue("password", bcrypt.hashSync(value, salt));
        },
    },
    // technically, `createdAt` & `updatedAt` are added by Sequelize and don't need to be configured in Model.init
    // but the typings of Model.init do not know this. Add the following to mute the typing error:
    createdAt: sequelize_1.DataTypes.DATE,
    updatedAt: sequelize_1.DataTypes.DATE,
    deletedAt: sequelize_1.DataTypes.DATE,
}, {
    sequelize: db_1.default,
    defaultScope: {
        attributes: {
            exclude: ["password"],
        },
    },
    scopes: {
        withPasswordHash: {
            attributes: {
                exclude: [],
            },
        },
    },
    paranoid: true,
});
exports.default = Admin;