'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); } };