import { DataTypes, Model, InferAttributes, InferCreationAttributes, CreationOptional, HasManyAddAssociationMixin, HasManyCountAssociationsMixin, HasManyCreateAssociationMixin, HasManyGetAssociationsMixin, HasManyHasAssociationMixin, HasManySetAssociationsMixin, HasManyAddAssociationsMixin, HasManyHasAssociationsMixin, HasManyRemoveAssociationMixin, HasManyRemoveAssociationsMixin, NonAttribute, Association } from "sequelize"; import { UserRole } from "./User/UserRole"; import { ObjectIdType } from "@/modules/DataModule"; import Session from "./Session"; import News from "./News"; export class User extends Model< // eslint-disable-next-line no-use-before-define InferAttributes, // eslint-disable-next-line no-use-before-define InferCreationAttributes > { declare _id: CreationOptional; declare username: string; declare name: string; declare role: CreationOptional; declare createdAt: CreationOptional; declare updatedAt: CreationOptional; declare getSessionModels: HasManyGetAssociationsMixin; declare addSessionModel: HasManyAddAssociationMixin; declare addSessionModels: HasManyAddAssociationsMixin; declare setSessionModels: HasManySetAssociationsMixin; declare removeSessionModel: HasManyRemoveAssociationMixin; declare removeSessionModels: HasManyRemoveAssociationsMixin< Session, number >; declare hasSessionModel: HasManyHasAssociationMixin; declare hasSessionModels: HasManyHasAssociationsMixin; declare countSessionModels: HasManyCountAssociationsMixin; declare createSessionModel: HasManyCreateAssociationMixin< Session, "userId" >; declare sessionModels?: NonAttribute; declare getCreatedNewsModels: HasManyGetAssociationsMixin; declare addCreatedNewsModel: HasManyAddAssociationMixin; declare addCreatedNewsModels: HasManyAddAssociationsMixin; declare setCreatedNewsModels: HasManySetAssociationsMixin; declare removeCreatedNewsModel: HasManyRemoveAssociationMixin; declare removeCreatedNewsModels: HasManyRemoveAssociationsMixin< News, number >; declare hasCreatedNewsModel: HasManyHasAssociationMixin; declare hasCreatedNewsModels: HasManyHasAssociationsMixin; declare countCreatedNewsModels: HasManyCountAssociationsMixin; declare createCreatedNewsModel: HasManyCreateAssociationMixin< News, "createdBy" >; declare createdNewsModels?: NonAttribute; declare static associations: { // eslint-disable-next-line no-use-before-define sessionModels: Association; // eslint-disable-next-line no-use-before-define createdNewsModels: Association; }; } export const schema = { _id: { type: DataTypes.OBJECTID, primaryKey: true, allowNull: false }, username: { type: DataTypes.STRING, allowNull: false }, name: { type: DataTypes.STRING, allowNull: false }, role: { type: DataTypes.ENUM(...Object.values(UserRole)), defaultValue: UserRole.USER, allowNull: false }, createdAt: DataTypes.DATE, updatedAt: DataTypes.DATE, _name: { type: DataTypes.VIRTUAL, get() { return `users`; } } }; export const options = {}; export const setup = async () => { User.hasMany(Session, { as: "sessionModels", foreignKey: { name: "userId", type: DataTypes.OBJECTID, allowNull: false }, onDelete: "RESTRICT", onUpdate: "RESTRICT" }); User.hasMany(News, { as: "createdNewsModels", foreignKey: { name: "createdBy", type: DataTypes.OBJECTID, allowNull: false }, onDelete: "RESTRICT", onUpdate: "RESTRICT" }); // User.afterSave(async record => {}); // User.afterDestroy(async record => {}); User.addHook("afterFind", (user, options) => { console.log("AFTER FIND USER", user, options); }); }; export default User;