Signed-off-by: Kenneth Obsequio <k80308392@gmail.com>
This commit is contained in:
2026-05-21 11:48:37 +08:00
parent db0e6f00f6
commit 1e567397d0
4 changed files with 101 additions and 56 deletions
+3 -3
View File
@@ -8,13 +8,13 @@ const adminExclude = [
const userExclude = [
...excludeAttributes,
// regular users cannot see audit trails
"createdBy", "updatedBy", "deletedBy", "deletedAt",
];
const jsonbSchemas = {};
const computedAttributes = [];
const filterableFields = {}
module.exports = { adminExclude, userExclude, excludeAttributes, jsonbSchemas, computedAttributes, filterableFields };
+11 -17
View File
@@ -5,7 +5,7 @@ const { mdl_UserGroups } = require('../users/user_groups.mdl');
const TaskList = sequelize.define('TaskList', {
task_list_id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true, hidden: true },
name: { type: DataTypes.STRING, allowNull: false, validate: { notEmpty: true }, filterable: true },
description: { type: DataTypes.TEXT, allowNull: true, hidden: true },
description: { type: DataTypes.TEXT, allowNull: true, hidden: true, filterable: false },
// ── Audit trails ────────────────────────────────────────────────────────
createdBy: { type: DataTypes.INTEGER, allowNull: true },
@@ -18,8 +18,6 @@ const TaskList = sequelize.define('TaskList', {
});
// ─── Junction: TaskList ↔ UserGroups ──────────────────────────────────────────
// Tracks which groups a task list is visible to / assigned to, plus who assigned
// it and when. Stored in `task_list_groups` so it lives alongside `task_lists`.
const TaskListGroup = sequelize.define('TaskListGroup', {
id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true },
task_list_id: { type: DataTypes.UUID, allowNull: false, references: { model: 'task_lists', key: 'task_list_id' }, onDelete: 'CASCADE', },
@@ -39,9 +37,9 @@ const TaskListGroup = sequelize.define('TaskListGroup', {
const Task = sequelize.define('Task', {
task_id: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV4, primaryKey: true, hidden: true },
task_list_id: { type: DataTypes.UUID, allowNull: false, references: { model: 'task_lists', key: 'task_list_id' }, hidden: true },
task_list_id: { type: DataTypes.UUID, allowNull: false, references: { model: 'task_lists', key: 'task_list_id' }, hidden: true, filterable: false },
name: { type: DataTypes.STRING, allowNull: false, validate: { notEmpty: true }, order: 1, filterable: true },
description: { type: DataTypes.TEXT, allowNull: true, hidden: true, },
description: { type: DataTypes.TEXT, allowNull: true, hidden: true, filterable: false },
deadline: { type: DataTypes.DATE, allowNull: true, order: 2, filterable: true },
status: { type: DataTypes.ENUM('pending', 'in_progress', 'completed', 'overdue'), defaultValue: 'pending', allowNull: false, filterable: true },
@@ -61,16 +59,16 @@ const TaskRequirement = sequelize.define('TaskRequirement', {
type: { type: DataTypes.ENUM('visit_link', 'upload_file', 'read_course', 'read_unit', 'read_lesson'), allowNull: false, filterable: true },
// ── visit_link ──────────────────────────────────────────────────────────
link_url: { type: DataTypes.STRING, allowNull: true },
link_label: { type: DataTypes.STRING, allowNull: true },
link_url: { type: DataTypes.STRING, allowNull: true, filterable: false },
link_label: { type: DataTypes.STRING, allowNull: true, filterable: false },
// ── upload_file ─────────────────────────────────────────────────────────
allowed_file_types: { type: DataTypes.JSONB, allowNull: true },
max_file_count: { type: DataTypes.INTEGER, allowNull: true, defaultValue: 1 },
allowed_file_types: { type: DataTypes.JSONB, allowNull: true, filterable: false },
max_file_count: { type: DataTypes.INTEGER, allowNull: true, defaultValue: 1, filterable: false },
// ── read_course / read_unit / read_lesson ────────────────────────────────
reference_id: { type: DataTypes.UUID, allowNull: true, comment: 'course_id | unit_id | lesson_id depending on type' },
reference_label: { type: DataTypes.STRING, allowNull: true, comment: 'Cached display name so we do not always join' },
reference_id: { type: DataTypes.UUID, allowNull: true, comment: 'course_id | unit_id | lesson_id depending on type', filterable: false },
reference_label: { type: DataTypes.STRING, allowNull: true, comment: 'Cached display name so we do not always join', filterable: false },
order: { type: DataTypes.INTEGER, defaultValue: 0, filterable: true },
// ── Audit trails ────────────────────────────────────────────────────────
@@ -87,13 +85,9 @@ TaskList.hasMany(Task, { foreignKey: 'task_list_id', as: 'tasks' });
Task.belongsTo(TaskList, { foreignKey: 'task_list_id', as: 'taskList' });
Task.hasMany(TaskRequirement, { foreignKey: 'task_id', as: 'requirements' });
TaskRequirement.belongsTo(Task, { foreignKey: 'task_id', as: 'task' });
// TaskList ↔ UserGroups (many-to-many through TaskListGroup)
TaskList.belongsToMany(mdl_UserGroups, { through: TaskListGroup, foreignKey: 'task_list_id', otherKey: 'group_id', as: 'groups', });
mdl_UserGroups.belongsToMany(TaskList, {
through: TaskListGroup, foreignKey: 'group_id',
otherKey: 'task_list_id',
as: 'taskLists',
});
mdl_UserGroups.belongsToMany(TaskList, { through: TaskListGroup, foreignKey: 'group_id', otherKey: 'task_list_id', as: 'taskLists', });
module.exports = { Task, TaskList, TaskRequirement, TaskListGroup, mdl_UserGroups };