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
+86 -36
View File
@@ -23,10 +23,10 @@ const { filterableFields } = require('../../models/task/task.attributes');
const TASK_LIST_FIELDS = ['name', 'description', 'createdAt', 'updatedAt', 'deletedAt'];
const TASK_FIELDS = ['name', 'description', 'deadline', 'status', 'createdAt', 'updatedAt', 'deletedAt'];
const FILTERABLE_MODELS = {
TaskList: TaskList,
Task: Task,
TaskList: TaskList,
Task: Task,
TaskRequirement: TaskRequirement,
TaskListGroup: TaskListGroup,
TaskListGroup: TaskListGroup,
};
// ─── Reusable group include for getTaskList / getArchivedTaskList ─────────────
@@ -773,21 +773,21 @@ exports.bulkRestoreTasks = async (req, res) => {
// ─── GET TASK FIELD VALUES ───────────────────────────────────────────────────
exports.getTaskFieldValues = async (req, res) => {
try {
const { field } = req.query;
if (!field) return R.error(res, "Field is required.", 400);
try {
const { field } = req.query;
if (!field) return R.error(res, "Field is required.", 400);
const allowedFields = Object.keys(Task.rawAttributes).filter(
(f) => Task.rawAttributes[f].filterable
);
const auditByFields = ["createdBy", "updatedBy", "deletedBy"];
const dateFields = ["createdAt", "updatedAt", "deletedAt", "deadline"];
const allowedFields = Object.keys(Task.rawAttributes).filter(
(f) => Task.rawAttributes[f].filterable
);
const auditByFields = ["createdBy", "updatedBy", "deletedBy"];
const dateFields = ["createdAt", "updatedAt", "deletedAt", "deadline"];
if (!allowedFields.includes(field))
return R.error(res, "Invalid or restricted field.", 400);
if (!allowedFields.includes(field) && !dateFields.includes(field))
return R.error(res, "Invalid or restricted field.", 400);
if (auditByFields.includes(field)) {
const [rows] = await sequelize.query(`
if (auditByFields.includes(field)) {
const [rows] = await sequelize.query(`
SELECT DISTINCT u."personal_info"->'name'->>'full_name' AS value
FROM tasks t
JOIN users u ON u.user_id = t."${field}"
@@ -795,28 +795,78 @@ exports.getTaskFieldValues = async (req, res) => {
AND u."personal_info"->'name'->>'full_name' IS NOT NULL
ORDER BY value ASC
`);
return R.success(res, "Field values retrieved.", rows.map((r) => r.value).filter(Boolean));
return R.success(res, "Field values retrieved.", rows.map((r) => r.value).filter(Boolean));
}
if (dateFields.includes(field)) {
const results = await Task.findAll({
attributes: [[Sequelize.fn("DISTINCT", Sequelize.fn("DATE", Sequelize.col(field))), "value"]],
where: { [field]: { [Op.ne]: null } },
order: [[Sequelize.fn("DATE", Sequelize.col(field)), "DESC"]],
raw: true,
});
return R.success(res, "Field values retrieved.", results.map((r) => r.value).filter(Boolean));
}
const results = await Task.findAll({
attributes: [[Sequelize.fn("DISTINCT", Sequelize.col(field)), "value"]],
where: { [field]: { [Op.ne]: null } },
raw: true,
});
return R.success(res, "Field values retrieved.", results.map((r) => r.value).filter(Boolean).sort());
} catch (err) {
console.error("[TASK][GET FIELD VALUES]", err);
return R.error(res, "Could not retrieve field values.", 500);
}
};
if (dateFields.includes(field)) {
const results = await Task.findAll({
attributes: [[Sequelize.fn("DISTINCT", Sequelize.fn("DATE", Sequelize.col(field))), "value"]],
where: { [field]: { [Op.ne]: null } },
order: [[Sequelize.fn("DATE", Sequelize.col(field)), "DESC"]],
raw: true,
});
return R.success(res, "Field values retrieved.", results.map((r) => r.value).filter(Boolean));
// ─── GET TASK LIST FIELD VALUES ───────────────────────────────────────────────
exports.getTaskListFieldValues = async (req, res) => {
try {
const { field } = req.query;
if (!field) return R.error(res, 'Field is required.', 400);
const allowedFields = Object.keys(TaskList.rawAttributes).filter(
(f) => TaskList.rawAttributes[f].filterable
);
const auditByFields = ['createdBy', 'updatedBy', 'deletedBy'];
const dateFields = ['createdAt', 'updatedAt', 'deletedAt'];
if (!allowedFields.includes(field) && !dateFields.includes(field))
return R.error(res, "Invalid or restricted field.", 400);
if (auditByFields.includes(field)) {
const [rows] = await sequelize.query(`
SELECT DISTINCT u."personal_info"->'name'->>'full_name' AS value
FROM task_lists tl
JOIN users u ON u.user_id = tl."${field}"
WHERE tl."${field}" IS NOT NULL
AND u."personal_info"->'name'->>'full_name' IS NOT NULL
ORDER BY value ASC
`);
return R.success(res, 'Field values retrieved.', rows.map((r) => r.value).filter(Boolean));
}
if (dateFields.includes(field)) {
const results = await TaskList.findAll({
attributes: [[Sequelize.fn('DISTINCT', Sequelize.fn('DATE', Sequelize.col(field))), 'value']],
where: { [field]: { [Op.ne]: null } },
order: [[Sequelize.fn('DATE', Sequelize.col(field)), 'DESC']],
raw: true,
});
return R.success(res, 'Field values retrieved.', results.map((r) => r.value).filter(Boolean));
}
const results = await TaskList.findAll({
attributes: [[Sequelize.fn('DISTINCT', Sequelize.col(field)), 'value']],
where: { [field]: { [Op.ne]: null } },
raw: true,
});
return R.success(res, 'Field values retrieved.', results.map((r) => r.value).filter(Boolean).sort());
} catch (err) {
console.error('[TASK LIST][GET FIELD VALUES]', err);
return R.error(res, 'Could not retrieve field values.', 500);
}
const results = await Task.findAll({
attributes: [[Sequelize.fn("DISTINCT", Sequelize.col(field)), "value"]],
where: { [field]: { [Op.ne]: null } },
raw: true,
});
return R.success(res, "Field values retrieved.", results.map((r) => r.value).filter(Boolean).sort());
} catch (err) {
console.error("[TASK][GET FIELD VALUES]", err);
return R.error(res, "Could not retrieve field values.", 500);
}
};