UNPKG

@replyke/express

Version:

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

109 lines (108 loc) 3.48 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 User_1 = __importDefault(require("./User")); class List extends sequelize_1.Model { static initModel(sequelize) { List.init({ id: { type: sequelize_1.DataTypes.UUID, defaultValue: sequelize_1.DataTypes.UUIDV4, primaryKey: true, allowNull: false, }, projectId: { type: sequelize_1.DataTypes.UUID, allowNull: false, }, userId: { type: sequelize_1.DataTypes.UUID, allowNull: false, }, parentId: { type: sequelize_1.DataTypes.UUID, allowNull: true, }, name: { type: sequelize_1.DataTypes.STRING, allowNull: false, }, isRoot: { type: sequelize_1.DataTypes.BOOLEAN, allowNull: false, defaultValue: false, }, entityIds: { type: sequelize_1.DataTypes.ARRAY(sequelize_1.DataTypes.UUID), allowNull: false, defaultValue: [], validate: { isUnique(value) { const unique = new Set(value); if (unique.size !== value.length) { throw new Error("Duplicate entity IDs are not allowed"); } }, }, }, createdAt: { type: sequelize_1.DataTypes.DATE, allowNull: false, }, updatedAt: { type: sequelize_1.DataTypes.DATE, allowNull: false, }, }, { sequelize, modelName: "List", tableName: "Lists", // ✅ Capitalized + plural timestamps: true, indexes: [ { unique: true, fields: ["userId", "isRoot"], where: { isRoot: true, // Partial unique constraint }, }, { unique: true, fields: ["projectId", "parentId", "name"], }, ], }); } /** * Define associations to other models */ static associate() { List.belongsTo(User_1.default, { foreignKey: "userId", onDelete: "CASCADE", // Ensures each List belongs to a User }); // Nested lists: A List can have multiple sub-lists, referencing other Lists by parentId List.hasMany(List, { foreignKey: "parentId", constraints: false, as: "subLists", scope: { parentType: "List", }, onDelete: "CASCADE", }); List.belongsTo(List, { foreignKey: "parentId", constraints: false, as: "parentList", scope: { parentType: "List", }, onDelete: "CASCADE", }); } } exports.default = List;