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