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
92 changes: 92 additions & 0 deletions src/controllers/department.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -472,3 +472,95 @@
next(error);
}
};

/**
* @desc Restore a soft-deleted department
* @route PATCH /api/department/:id/restore
* @access Private (Owner or Admin only)
*/
export const restoreDepartment = async (req, res, next) => {
try {
const { id } = req.params;
const { userId, role } = req.user;

Check warning on line 484 in src/controllers/department.controller.js

View workflow job for this annotation

GitHub Actions / eslint

'role' is assigned a value but never used

Check warning on line 484 in src/controllers/department.controller.js

View workflow job for this annotation

GitHub Actions / eslint

'role' is assigned a value but never used

// 1. Check if department exists and is deleted
const department = await prisma.department.findUnique({
where: { id },
include: {
organization: true,
manager: true,
},
});

if (!department) {
return res.status(404).json({
success: false,
message: 'Department not found',
});
}

if (!department.deletedAt) {
return res.status(400).json({
success: false,
message: 'Department is not deleted',
});
}

// 2. Verify permissions (Owner or Admin of the organization)
// For ADMIN/OWNER, check if they belong to the department's organization
const userInOrg = await prisma.user.findFirst({
where: {
id: userId,
organizationId: department.organizationId,
role: { in: ['ADMIN', 'OWNER'] },
deletedAt: null,
},
});

if (!userInOrg) {
return res.status(403).json({
success: false,
message:
'You do not have permission to restore departments in this organization',
});
}

// 3. Restore the department
const restoredDepartment = await prisma.department.update({
where: { id },
data: {
deletedAt: null,
},
include: {
organization: { select: { id: true, name: true } },
manager: {
select: { id: true, firstName: true, lastName: true, role: true },
},
users: {
where: { deletedAt: null },
select: {
id: true,
firstName: true,
lastName: true,
email: true,
role: true,
},
},
teams: {
select: {
id: true,
name: true,
},
},
},
});

return res.status(200).json({
success: true,
message: 'Department restored successfully',
data: restoredDepartment,
});
} catch (error) {
next(error);
}
};
8 changes: 8 additions & 0 deletions src/routes/department.routes.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
createDepartment,
getAllDepartments,
getDepartmentById,
restoreDepartment,
softDeleteDepartment,
updateDepartment,
} from '../controllers/department.controller.js';
Expand Down Expand Up @@ -53,4 +54,11 @@ router.delete(
verifyOwnerOrAdmin,
softDeleteDepartment,
);

router.patch(
'/api/department/:id/restore',
verifyAccessToken,
verifyOwnerOrAdmin, // Use your existing middleware
restoreDepartment,
);
export default router;