Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
83 changes: 32 additions & 51 deletions src/api/Controllers/ProgramCourseController.js
Original file line number Diff line number Diff line change
Expand Up @@ -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' });
}
Expand All @@ -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
Expand Down
26 changes: 10 additions & 16 deletions src/api/Routes/ProgramRoutes.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
104 changes: 75 additions & 29 deletions src/api/Services/ProgramCourseServices.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
Expand All @@ -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
};
Loading