chore: relocate backend into apps/api ahead of monorepo merge

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-24 12:20:40 +08:00
co-authored by Claude Sonnet 5
parent af44598df6
commit eaa6d2276a
388 changed files with 0 additions and 13998 deletions
+44
View File
@@ -0,0 +1,44 @@
"use strict";
const { Op } = require("sequelize");
const onlyDeleted = { deletedAt: { [Op.not]: null } };
/**
* Soft-restore a single record by clearing deletedAt / deletedBy.
* Returns the record on success, null if not found.
*
* @param {Model} Model - Sequelize model
* @param {object} where - Where clause (must include onlyDeleted or equivalent)
* @param {*} restoredBy - User ID stamped onto updatedBy
* @param {object} t - Sequelize transaction
*/
async function restoreOne(Model, where, restoredBy, t) {
const record = await Model.findOne({ where, paranoid: false });
if (!record) return null;
await record.restore();
await record.update({ updatedBy: restoredBy, deletedBy: null })
return record;
}
/**
* Soft-restore many records by their primary key column.
* Returns the count of restored records.
*
* @param {Model} Model - Sequelize model
* @param {string} pkColumn - Primary key column name (e.g. "course_id")
* @param {Array} ids - Array of primary key values to restore
* @param {*} restoredBy - User ID stamped onto updatedBy
* @param {object} t - Sequelize transaction
*/
async function restoreMany(Model, pkColumn, ids, restoredBy, t) {
const [count] = await Model.update(
{ deletedAt: null, deletedBy: null, updatedBy: restoredBy ?? null },
{ where: { [pkColumn]: ids, ...onlyDeleted }, transaction: t, paranoid: false }
);
return count;
}
module.exports = { restoreOne, restoreMany };