User.ts 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. import {
  2. DataTypes,
  3. Model,
  4. InferAttributes,
  5. InferCreationAttributes,
  6. CreationOptional,
  7. HasManyAddAssociationMixin,
  8. HasManyCountAssociationsMixin,
  9. HasManyCreateAssociationMixin,
  10. HasManyGetAssociationsMixin,
  11. HasManyHasAssociationMixin,
  12. HasManySetAssociationsMixin,
  13. HasManyAddAssociationsMixin,
  14. HasManyHasAssociationsMixin,
  15. HasManyRemoveAssociationMixin,
  16. HasManyRemoveAssociationsMixin,
  17. NonAttribute,
  18. Association
  19. } from "sequelize";
  20. import { UserRole } from "./User/UserRole";
  21. import { ObjectIdType } from "@/modules/DataModule";
  22. import Session from "./Session";
  23. import News from "./News";
  24. export class User extends Model<
  25. // eslint-disable-next-line no-use-before-define
  26. InferAttributes<User>,
  27. // eslint-disable-next-line no-use-before-define
  28. InferCreationAttributes<User>
  29. > {
  30. declare _id: CreationOptional<ObjectIdType>;
  31. declare username: string;
  32. declare name: string;
  33. declare role: CreationOptional<UserRole>;
  34. declare createdAt: CreationOptional<Date>;
  35. declare updatedAt: CreationOptional<Date>;
  36. declare getSessionModels: HasManyGetAssociationsMixin<Session>;
  37. declare addSessionModel: HasManyAddAssociationMixin<Session, number>;
  38. declare addSessionModels: HasManyAddAssociationsMixin<Session, number>;
  39. declare setSessionModels: HasManySetAssociationsMixin<Session, number>;
  40. declare removeSessionModel: HasManyRemoveAssociationMixin<Session, number>;
  41. declare removeSessionModels: HasManyRemoveAssociationsMixin<
  42. Session,
  43. number
  44. >;
  45. declare hasSessionModel: HasManyHasAssociationMixin<Session, number>;
  46. declare hasSessionModels: HasManyHasAssociationsMixin<Session, number>;
  47. declare countSessionModels: HasManyCountAssociationsMixin;
  48. declare createSessionModel: HasManyCreateAssociationMixin<
  49. Session,
  50. "userId"
  51. >;
  52. declare sessionModels?: NonAttribute<Session[]>;
  53. declare getCreatedNewsModels: HasManyGetAssociationsMixin<News>;
  54. declare addCreatedNewsModel: HasManyAddAssociationMixin<News, number>;
  55. declare addCreatedNewsModels: HasManyAddAssociationsMixin<News, number>;
  56. declare setCreatedNewsModels: HasManySetAssociationsMixin<News, number>;
  57. declare removeCreatedNewsModel: HasManyRemoveAssociationMixin<News, number>;
  58. declare removeCreatedNewsModels: HasManyRemoveAssociationsMixin<
  59. News,
  60. number
  61. >;
  62. declare hasCreatedNewsModel: HasManyHasAssociationMixin<News, number>;
  63. declare hasCreatedNewsModels: HasManyHasAssociationsMixin<News, number>;
  64. declare countCreatedNewsModels: HasManyCountAssociationsMixin;
  65. declare createCreatedNewsModel: HasManyCreateAssociationMixin<
  66. News,
  67. "createdBy"
  68. >;
  69. declare createdNewsModels?: NonAttribute<News[]>;
  70. declare static associations: {
  71. // eslint-disable-next-line no-use-before-define
  72. sessionModels: Association<User, Session>;
  73. // eslint-disable-next-line no-use-before-define
  74. createdNewsModels: Association<User, News>;
  75. };
  76. }
  77. export const schema = {
  78. _id: {
  79. type: DataTypes.OBJECTID,
  80. primaryKey: true,
  81. allowNull: false
  82. },
  83. username: {
  84. type: DataTypes.STRING,
  85. allowNull: false
  86. },
  87. name: {
  88. type: DataTypes.STRING,
  89. allowNull: false
  90. },
  91. role: {
  92. type: DataTypes.ENUM(...Object.values(UserRole)),
  93. defaultValue: UserRole.USER,
  94. allowNull: false
  95. },
  96. createdAt: DataTypes.DATE,
  97. updatedAt: DataTypes.DATE,
  98. _name: {
  99. type: DataTypes.VIRTUAL,
  100. get() {
  101. return `users`;
  102. }
  103. }
  104. };
  105. export const options = {};
  106. export const setup = async () => {
  107. User.hasMany(Session, {
  108. as: "sessionModels",
  109. foreignKey: {
  110. name: "userId",
  111. type: DataTypes.OBJECTID,
  112. allowNull: false
  113. },
  114. onDelete: "RESTRICT",
  115. onUpdate: "RESTRICT"
  116. });
  117. User.hasMany(News, {
  118. as: "createdNewsModels",
  119. foreignKey: {
  120. name: "createdBy",
  121. type: DataTypes.OBJECTID,
  122. allowNull: false
  123. },
  124. onDelete: "RESTRICT",
  125. onUpdate: "RESTRICT"
  126. });
  127. // User.afterSave(async record => {});
  128. // User.afterDestroy(async record => {});
  129. User.addHook("afterFind", (user, options) => {
  130. console.log("AFTER FIND USER", user, options);
  131. });
  132. };
  133. export default User;