UNPKG

@replyke/express

Version:

Replyke: Build interactive apps with social features like comments, votes, feeds, user lists, notifications, and more.

217 lines (216 loc) 7.54 kB
"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 Token_1 = __importDefault(require("./Token")); const Entity_1 = __importDefault(require("./Entity")); const Comment_1 = __importDefault(require("./Comment")); const List_1 = __importDefault(require("./List")); const AppNotification_1 = __importDefault(require("./AppNotification")); const Follow_1 = __importDefault(require("./Follow")); class User extends sequelize_1.Model { static initModel(sequelize) { User.init({ id: { type: sequelize_1.DataTypes.UUID, defaultValue: sequelize_1.DataTypes.UUIDV4, primaryKey: true, allowNull: false, }, projectId: { type: sequelize_1.DataTypes.UUID, allowNull: false, }, role: { type: sequelize_1.DataTypes.ENUM("admin", "editor", "visitor"), allowNull: false, defaultValue: "visitor", }, referenceId: { type: sequelize_1.DataTypes.STRING, allowNull: true, }, foreignId: { type: sequelize_1.DataTypes.STRING, allowNull: true, }, hash: { type: sequelize_1.DataTypes.TEXT, allowNull: true, }, salt: { type: sequelize_1.DataTypes.STRING, allowNull: true, }, email: { type: sequelize_1.DataTypes.STRING, allowNull: true, validate: { isEmail: true, }, set(value) { this.setDataValue("email", value?.trim() ?? null); }, }, name: { type: sequelize_1.DataTypes.STRING, allowNull: true, set(value) { this.setDataValue("name", value?.trim() ?? null); }, }, username: { type: sequelize_1.DataTypes.STRING, allowNull: true, set(value) { this.setDataValue("username", value?.trim() ?? null); }, }, avatar: { type: sequelize_1.DataTypes.TEXT, allowNull: true, }, bio: { type: sequelize_1.DataTypes.STRING(300), allowNull: true, set(value) { this.setDataValue("bio", value?.trim() ?? null); }, }, birthdate: { type: sequelize_1.DataTypes.DATE, allowNull: true, }, location: { type: sequelize_1.DataTypes.GEOGRAPHY("POINT"), allowNull: true, }, isVerified: { type: sequelize_1.DataTypes.BOOLEAN, defaultValue: false, }, isActive: { type: sequelize_1.DataTypes.BOOLEAN, defaultValue: true, }, lastActive: { type: sequelize_1.DataTypes.DATE, allowNull: false, defaultValue: sequelize_1.DataTypes.NOW, }, reputation: { type: sequelize_1.DataTypes.INTEGER, allowNull: false, defaultValue: 0, }, metadata: { type: sequelize_1.DataTypes.JSONB, allowNull: false, defaultValue: {}, validate: { notTooLarge(value) { const MAX_SIZE = 1024 * 512; // 512 KB if (value !== null) { const size = Buffer.byteLength(JSON.stringify(value), "utf8"); if (size > MAX_SIZE) { throw new Error(`Metadata exceeds the size limit of ${MAX_SIZE} bytes.`); } } }, }, }, secureMetadata: { type: sequelize_1.DataTypes.JSONB, allowNull: false, defaultValue: {}, validate: { notTooLarge(value) { const MAX_SIZE = 1024 * 512; // 512 KB if (value !== null) { const size = Buffer.byteLength(JSON.stringify(value), "utf8"); if (size > MAX_SIZE) { throw new Error(`Metadata exceeds the size limit of ${MAX_SIZE} bytes.`); } } }, }, }, createdAt: { type: sequelize_1.DataTypes.DATE, allowNull: false, }, updatedAt: { type: sequelize_1.DataTypes.DATE, allowNull: false, }, deletedAt: { type: sequelize_1.DataTypes.DATE, allowNull: true, }, }, { sequelize, modelName: "User", tableName: "Users", timestamps: true, paranoid: true, indexes: [ { unique: true, fields: ["projectId", "referenceId"], }, { unique: true, fields: ["projectId", "foreignId"], }, { unique: true, fields: ["projectId", "email"], }, { unique: true, fields: ["projectId", "username"], }, { fields: ["location"], using: "gist", }, ], }); } /** * Define associations to other models */ static associate() { User.hasMany(Token_1.default, { foreignKey: "userId", onDelete: "CASCADE", // If a User is deleted, all their Tokens are deleted }); User.hasMany(Entity_1.default, { foreignKey: "userId", }); User.hasMany(Comment_1.default, { foreignKey: "userId", }); User.hasMany(List_1.default, { foreignKey: "userId", onDelete: "CASCADE", // If a User is deleted, all its Lists are deleted }); User.hasMany(AppNotification_1.default, { foreignKey: "userId", onDelete: "CASCADE", // If a User is deleted, all their Notification are deleted }); User.hasMany(Follow_1.default, { foreignKey: "followerId", as: "following", // Users this user follows onDelete: "CASCADE", // Ensure cascade delete }); User.hasMany(Follow_1.default, { foreignKey: "followedId", as: "followers", // Users following this user onDelete: "CASCADE", // Ensure cascade delete }); } } exports.default = User;