123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338 |
- 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 { UserAvatarColor } from "./User/UserAvatarColor";
- import { UserAvatarType } from "./User/UserAvatarType";
- import News from "./News";
- import Session from "./Session";
- import { ObjectIdType } from "@/modules/DataModule";
- export class User extends Model<
- // eslint-disable-next-line no-use-before-define
- InferAttributes<User>,
- // eslint-disable-next-line no-use-before-define
- InferCreationAttributes<User>
- > {
- declare _id: CreationOptional<ObjectIdType>;
- declare username: string;
- declare role: UserRole;
- declare emailVerified: CreationOptional<boolean>;
- declare emailVerificationToken: CreationOptional<string | null>;
- declare emailAddress: string;
- declare avatarType: UserAvatarType;
- declare avatarUrl: CreationOptional<string | null>;
- declare avatarColor: CreationOptional<UserAvatarColor | null>;
- // Services
- declare password: string;
- declare passwordResetCode: CreationOptional<string | null>;
- declare passwordResetExpiresAt: CreationOptional<Date | null>;
- declare passwordSetCode: CreationOptional<string | null>;
- declare passwordSetExpiresAt: CreationOptional<Date | null>;
- declare githubId: CreationOptional<number | null>;
- declare githubAccessToken: CreationOptional<string | null>;
- // End services
- // Statistics
- declare songsRequested: CreationOptional<number>;
- // End statistics
- // declare likedSongsPlaylist: Types.ObjectId;
- // declare dislikedSongsPlaylist: Types.ObjectId;
- // declare favoriteStations: Types.ObjectId[];
- declare name: string;
- declare location: CreationOptional<string | null>;
- declare bio: CreationOptional<string | null>;
- // Preferences
- // declare orderOfPlaylists: Types.ObjectId[];
- declare nightmode: CreationOptional<boolean>;
- declare autoSkipDisliked: CreationOptional<boolean>;
- declare activityLogPublic: CreationOptional<boolean>;
- declare anonymousSongRequests: CreationOptional<boolean>;
- declare activityWatch: CreationOptional<boolean>;
- // End preferences
- declare createdAt: CreationOptional<Date>;
- declare updatedAt: CreationOptional<Date>;
- declare getSessionModels: HasManyGetAssociationsMixin<Session>;
- declare addSessionModel: HasManyAddAssociationMixin<Session, number>;
- declare addSessionModels: HasManyAddAssociationsMixin<Session, number>;
- declare setSessionModels: HasManySetAssociationsMixin<Session, number>;
- declare removeSessionModel: HasManyRemoveAssociationMixin<Session, number>;
- declare removeSessionModels: HasManyRemoveAssociationsMixin<
- Session,
- number
- >;
- declare hasSessionModel: HasManyHasAssociationMixin<Session, number>;
- declare hasSessionModels: HasManyHasAssociationsMixin<Session, number>;
- declare countSessionModels: HasManyCountAssociationsMixin;
- declare createSessionModel: HasManyCreateAssociationMixin<
- Session,
- "userId"
- >;
- declare sessionModels?: NonAttribute<Session[]>;
- declare getCreatedNewsModels: HasManyGetAssociationsMixin<News>;
- declare addCreatedNewsModel: HasManyAddAssociationMixin<News, number>;
- declare addCreatedNewsModels: HasManyAddAssociationsMixin<News, number>;
- declare setCreatedNewsModels: HasManySetAssociationsMixin<News, number>;
- declare removeCreatedNewsModel: HasManyRemoveAssociationMixin<News, number>;
- declare removeCreatedNewsModels: HasManyRemoveAssociationsMixin<
- News,
- number
- >;
- declare hasCreatedNewsModel: HasManyHasAssociationMixin<News, number>;
- declare hasCreatedNewsModels: HasManyHasAssociationsMixin<News, number>;
- declare countCreatedNewsModels: HasManyCountAssociationsMixin;
- declare createCreatedNewsModel: HasManyCreateAssociationMixin<
- News,
- "createdBy"
- >;
- declare createdNewsModels?: NonAttribute<News[]>;
- declare static associations: {
- // eslint-disable-next-line no-use-before-define
- sessionModels: Association<User, Session>;
- // eslint-disable-next-line no-use-before-define
- createdNewsModels: Association<User, News>;
- };
- }
- // TODO add validation
- export const schema = {
- _id: {
- type: DataTypes.OBJECTID,
- autoNull: false,
- primaryKey: true
- },
- username: {
- type: DataTypes.STRING,
- allowNull: false
- },
- role: {
- type: DataTypes.ENUM(...Object.values(UserRole)),
- allowNull: false
- },
- emailVerified: {
- type: DataTypes.BOOLEAN,
- allowNull: true,
- defaultValue: false
- },
- emailVerificationToken: {
- type: DataTypes.STRING,
- allowNull: true
- },
- emailAddress: {
- type: DataTypes.STRING,
- allowNull: false
- },
- avatarType: {
- type: DataTypes.ENUM(...Object.values(UserAvatarType)),
- allowNull: false
- },
- avatarUrl: {
- type: DataTypes.STRING,
- allowNull: true
- },
- avatarColor: {
- type: DataTypes.ENUM(...Object.values(UserAvatarColor)),
- allowNull: true
- },
- password: {
- type: DataTypes.STRING,
- allowNull: false
- },
- passwordResetCode: {
- type: DataTypes.STRING,
- allowNull: true
- },
- passwordResetExpiresAt: {
- type: DataTypes.DATE,
- allowNull: true
- },
- passwordSetCode: {
- type: DataTypes.STRING,
- allowNull: true
- },
- passwordSetExpiresAt: {
- type: DataTypes.DATE,
- allowNull: true
- },
- githubId: {
- type: DataTypes.BIGINT,
- allowNull: true
- },
- githubAccessToken: {
- type: DataTypes.STRING,
- allowNull: true
- },
- songsRequested: {
- type: DataTypes.BIGINT,
- allowNull: false,
- defaultValue: 0
- },
- name: {
- type: DataTypes.STRING,
- allowNull: false
- },
- location: {
- type: DataTypes.STRING,
- allowNull: true
- },
- bio: {
- type: DataTypes.STRING,
- allowNull: true
- },
- nightmode: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: false
- },
- autoSkipDisliked: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: true
- },
- activityLogPublic: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: false
- },
- anonymousSongRequests: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: false
- },
- activityWatch: {
- type: DataTypes.BOOLEAN,
- allowNull: false,
- defaultValue: false
- },
- createdAt: DataTypes.DATE,
- updatedAt: DataTypes.DATE,
- hasPassword: {
- type: DataTypes.BOOLEAN,
- readonly: true
- },
- _name: {
- type: DataTypes.VIRTUAL,
- get() {
- return `users`;
- }
- },
- // Temporary
- favoriteStations: {
- type: DataTypes.VIRTUAL,
- get() {
- return [];
- }
- }
- };
- export const options = {
- defaultScope: {
- attributes: {
- exclude: [
- "emailVerificationToken",
- "password",
- "passwordResetCode",
- "passwordSetCode",
- "githubAccessToken"
- ]
- }
- }
- };
- 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 => {});
- };
- export default User;
|