mirror of
https://github.com/rgrgogu/new_starr.git
synced 2026-09-27 00:12:54 +08:00
90 lines
3.7 KiB
JavaScript
90 lines
3.7 KiB
JavaScript
'use strict';
|
|
const mdl_Category = require('../../models/courses/categories.mdl');
|
|
const R = require('../../utils/response.util');
|
|
const logActivity = require('../../utils/logActivity.util');
|
|
|
|
const slugify = (str) =>
|
|
str.toLowerCase().trim().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '');
|
|
|
|
exports.getCategories = async (req, res) => {
|
|
try {
|
|
const rows = await mdl_Category.findAll({ order: [['name', 'ASC']], paranoid: false });
|
|
return R.success(res, 'Categories retrieved.', rows);
|
|
} catch (err) {
|
|
console.error('[ADMIN][CATEGORIES][GET ALL]', err);
|
|
return R.error(res, 'Could not retrieve categories.', 500);
|
|
}
|
|
};
|
|
|
|
exports.getCategory = async (req, res) => {
|
|
try {
|
|
const row = await mdl_Category.findByPk(req.params.id, { paranoid: false });
|
|
if (!row) return R.error(res, 'Category not found.', 404);
|
|
return R.success(res, 'Category retrieved.', row);
|
|
} catch (err) {
|
|
console.error('[ADMIN][CATEGORIES][GET ONE]', err);
|
|
return R.error(res, 'Could not retrieve category.', 500);
|
|
}
|
|
};
|
|
|
|
exports.createCategory = async (req, res) => {
|
|
try {
|
|
const { name, description, is_active } = req.body;
|
|
if (!name) return R.error(res, 'name is required.', 400);
|
|
|
|
const slug = slugify(name);
|
|
const row = await mdl_Category.create({ name, slug, description: description ?? null, is_active: is_active ?? true });
|
|
logActivity(req.user?.user_id, 'create_category', { entityType: 'category', entityId: row.category_id, details: { name: row.name } });
|
|
return R.success(res, 'Category created.', row, 201);
|
|
} catch (err) {
|
|
if (err.name === 'SequelizeUniqueConstraintError')
|
|
return R.error(res, 'A category with that name already exists.', 409);
|
|
console.error('[ADMIN][CATEGORIES][CREATE]', err);
|
|
return R.error(res, 'Could not create category.', 500);
|
|
}
|
|
};
|
|
|
|
exports.updateCategory = async (req, res) => {
|
|
try {
|
|
const row = await mdl_Category.findByPk(req.params.id);
|
|
if (!row) return R.error(res, 'Category not found.', 404);
|
|
|
|
const { name, description, is_active } = req.body;
|
|
const slug = name ? slugify(name) : row.slug;
|
|
await row.update({ name: name ?? row.name, slug, description: description ?? row.description, is_active: is_active ?? row.is_active });
|
|
logActivity(req.user?.user_id, 'update_category', { entityType: 'category', entityId: row.category_id });
|
|
return R.success(res, 'Category updated.', row);
|
|
} catch (err) {
|
|
if (err.name === 'SequelizeUniqueConstraintError')
|
|
return R.error(res, 'A category with that name already exists.', 409);
|
|
console.error('[ADMIN][CATEGORIES][UPDATE]', err);
|
|
return R.error(res, 'Could not update category.', 500);
|
|
}
|
|
};
|
|
|
|
exports.archiveCategory = async (req, res) => {
|
|
try {
|
|
const row = await mdl_Category.findByPk(req.params.id);
|
|
if (!row) return R.error(res, 'Category not found.', 404);
|
|
await row.destroy();
|
|
logActivity(req.user?.user_id, 'archive_category', { entityType: 'category', entityId: row.category_id });
|
|
return R.success(res, 'Category archived.');
|
|
} catch (err) {
|
|
console.error('[ADMIN][CATEGORIES][ARCHIVE]', err);
|
|
return R.error(res, 'Could not archive category.', 500);
|
|
}
|
|
};
|
|
|
|
exports.restoreCategory = async (req, res) => {
|
|
try {
|
|
const row = await mdl_Category.findByPk(req.params.id, { paranoid: false });
|
|
if (!row) return R.error(res, 'Category not found.', 404);
|
|
await row.restore();
|
|
logActivity(req.user?.user_id, 'restore_category', { entityType: 'category', entityId: row.category_id });
|
|
return R.success(res, 'Category restored.', row);
|
|
} catch (err) {
|
|
console.error('[ADMIN][CATEGORIES][RESTORE]', err);
|
|
return R.error(res, 'Could not restore category.', 500);
|
|
}
|
|
};
|