diff --git a/src/api/Controllers/ProgramCourseController.js b/src/api/Controllers/ProgramCourseController.js index f0fed15..8e3e98f 100644 --- a/src/api/Controllers/ProgramCourseController.js +++ b/src/api/Controllers/ProgramCourseController.js @@ -12,12 +12,12 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url)); const createProgram = async (req, res) => { try { const addProgram = await ProgramService.createProgram(req.body); - if (addProgram) { + // if(addProgram){ res.status(201).json({ message: 'Program Added Successfully', - userId: addProgram.id + id: addProgram.id }); - } + // } } catch (error) { res.status(error.status || 500).json({ error: error.message || 'Internal Server Error' }); } @@ -26,68 +26,49 @@ const createProgram = async (req, res) => { // ✅ Get All Programs const getAllPrograms = async (req, res) => { try { - let { top, page, limit } = req.body; + let { top, page, limit, search } = req.query; // use query params for GET + let response = await ProgramService.SearchProgram(top, page,limit, search) - top = parseInt(top); - page = parseInt(page); - limit = parseInt(limit); - - const queryOptions = { - order: [["createdAt", "DESC"]], - }; - - if (top) { - queryOptions.limit = top; - } else if (page && limit) { - const offset = (page - 1) * limit; - queryOptions.limit = limit; - queryOptions.offset = offset; - } - - const programs = await ProgramCourse.findAll(queryOptions); - - res.status(200).json({ - status: "success", - data: programs, - }); + return res.status(200).json({ + code:res.statusCode, + response + }) + } catch (error) { - res.status(500).json({ - status: "error", - message: error.message, - }); + res.status(error.status || 500).json({ error: error.message || 'Internal Server Error' }); } }; // ✅ Update Program const updateProgram = async (req, res) => { try { - const result = await ProgramService.UpdateProgram(req.body); - - if (result.success) { - res.status(200).json({ - success: true, - message: result.message || "Operation successful", - data: result.data || null - }); - } else { - res.status(result.statusCode || 400).json({ - success: false, - message: result.message || "Operation failed", - error: result.error || null - }); - } + const { message } = await ProgramService.updateProgram(req.body); - } catch (error) { - res.status(500).json({ - message: "Update failed", - error: error.message + res.status(200).json({ + code:200, + data: data, + message }); + } catch (err) { + res.status(error.status || 500).json({ error: error.message || 'Internal Server Error' }); } }; // ✅ Delete Program -const deleteProgram = async (id) => { - return await ProgramService.DeleteProgram(id); +const deleteProgram = async (req, res) => { + try { + const { message } = await ProgramService.deleteProgram(req.params.id); + + return res.status(200).json({ + code: 200, + message + }); + } catch (error) { + return res.status(error.status || 500).json({ + code: error.status || 500, + error: error.message || "Internal Server Error" + }); + } }; // ✅ Single default export diff --git a/src/api/Routes/ProgramRoutes.js b/src/api/Routes/ProgramRoutes.js index 72d9d62..a9b3c64 100644 --- a/src/api/Routes/ProgramRoutes.js +++ b/src/api/Routes/ProgramRoutes.js @@ -4,35 +4,29 @@ import { Sequelize, DataTypes } from 'sequelize'; const router = express.Router(); -// GET /api/programs -router.get('/', (req, res) => { - res.status(200).send('Welcome To Program API'); -}); +// GET /api/ - Commented as it serves no purpose +// router.get('/', (req, res) => { +// res.status(200).send('Welcome To Program API'); +// }); // GET /api/programs/listing -router.get('/listing', async (req, res) => { +router.get('/', async (req, res) => { await programController.getAllPrograms(req, res); }); // POST /api/programs/create (create program) -router.post('/create', async (req, res) => { +router.post('/', async (req, res) => { await programController.createProgram(req, res); }); // PUT /api/programs/update (update program) -router.put('/update', async (req, res) => { - await programController.UpdateProgram(req, res); +router.put('/', async (req, res) => { + await programController.updateProgram(req, res); }); // DELETE /api/programs/delete (delete program) -router.delete('/delete', async (req, res) => { - try { - const { id } = req.body; // ✅ from body - const result = await programController.DeleteProgram(id); - res.status(200).json(result); - } catch (error) { - res.status(error.status || 500).json({ message: error.message }); - } +router.delete('/:id', async (req, res) => { + await programController.deleteProgram(req, res); }); export default router; \ No newline at end of file diff --git a/src/api/Services/ProgramCourseServices.js b/src/api/Services/ProgramCourseServices.js index 6a9e917..5b432d5 100644 --- a/src/api/Services/ProgramCourseServices.js +++ b/src/api/Services/ProgramCourseServices.js @@ -14,30 +14,32 @@ const ProgramCourse = ProgramCourseModelFactory(sequelize, DataTypes); // 🟩 Create Program const createProgram = async (programData) => { try { - const existingProgram = await ProgramCourse.findOne({ - where: { code: programData.code }, - }); + // const existingProgram = await ProgramCourse.findOne({ + // where: { code: programData.code }, + // }); - if (existingProgram) { - const error = new Error('Program code already exists'); - error.status = 400; - throw error; - } + // if (existingProgram) { + // const error = new Error('Program code already exists'); + // error.status = 400; + // throw error; + // } + + // const newProgram = await ProgramCourse.create({ + // parent_id: null, + // type: 'PROGRAM', + // code: programData.code, + // name: programData.name, + // department_id: programData.department_id, + // credit_hours: programData.credit_hours || null, + // semester: programData.semester || null, + // level: programData.level, + // is_active: programData.is_active ?? true, + // mode: programData.mode || 'FULLTIME', + // }); - const newProgram = await ProgramCourse.create({ - parent_id: null, - type: 'PROGRAM', - code: programData.code, - name: programData.name, - department_id: programData.department_id, - credit_hours: programData.credit_hours || null, - semester: programData.semester || null, - level: programData.level, - is_active: programData.is_active ?? true, - mode: programData.mode || 'FULLTIME', - }); + const createProgram = await ProgramCourse.create(programData); - return newProgram; + return createProgram; } catch (error) { throw error; } @@ -64,29 +66,73 @@ const deleteProgram = async (id) => { // 🟩 Update Program const updateProgram = async (programData) => { try { + const { id, ...updateFields } = programData; if (!id) { throw new Error('Program ID is required to update'); } - const [rowsUpdated] = await ProgramCourse.update(updateFields, { + const update = await ProgramCourse.update(updateFields, { where: { id }, }); - if (rowsUpdated === 0) { - return { success: false, message: 'No program found with the given ID' }; - } - - return { success: true, message: 'Program updated successfully' }; + return {message: 'Program updated successfully'}; } catch (error) { - return { success: false, message: error.message }; + throw error; } }; +const SearchProgram = async (top,page,limit,search) => { + try { + + const queryOptions = { + where: { type: "PROGRAM" }, + // order: [["createdAt", "DESC"]], + }; + + // Pagination + if (top) { + queryOptions.limit = parseInt(top, 10); + } else if (page && limit) { + page = parseInt(page, 10); + limit = parseInt(limit, 10); + queryOptions.limit = limit; + queryOptions.offset = (page - 1) * limit; // ✅ fixed parseDecimal + } + + // Wildcard search + if (search) { + queryOptions.where = { + ...queryOptions.where, + [Op.or]: [ + { name: { [Op.like]: `%${search}%` } }, + { code: { [Op.like]: `%${search}%` } } + // add more fields if needed + ] + }; + } + + const programs = await ProgramCourse.findAll(queryOptions); + + return { + programs, + pagination: { + page: page || null, + limit: queryOptions.limit || null, + total: programs.length + } +}; + } catch (error) { + throw error; + } + } + + // ✅ Single default export export default { createProgram, updateProgram, - deleteProgram + deleteProgram, + SearchProgram };