@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
JavaScript
"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;