mirror of
https://github.com/rgrgogu/new_starr.git
synced 2026-09-27 00:12:54 +08:00
merged
This commit is contained in:
@@ -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);
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user