Entity
Services
Controller
Routes
Index.js
const { EntitySchema } = require('typeorm');
module.exports = new EntitySchema({
name: 'RolePermission',
tableName: 'role_permissions',
columns: {
roleId: {
name: 'role_id',
type: 'int',
primary: true,
},
permissionId: {
name: 'permission_id',
type: 'int',
primary: true,
},
},
relations: {
role: {
type: 'many-to-one',
target: 'Role',
joinColumn: { name: 'role_id' },
onDelete: 'CASCADE',
},
permission: {
type: 'many-to-one',
target: 'Permission',
joinColumn: { name: 'permission_id' },
onDelete: 'CASCADE',
},
},
});
const { AppDataSource } = require('../../../index');
const RolePermission = require('../entities/rolePermission.entity');
/**
* Format the rolePermission response to exclude sensitive or unnecessary fields.
* @param {object} rolePermission - The rolePermission entity object.
* @returns {object} - The formatted rolePermission response.
*/
const formatRolePermissionResponse = (rolePermission) => {
if (!rolePermission) return null;
return {
roleId: rolePermission.roleId,
permissionId: rolePermission.permissionId,
};
};
/**
* Create a new RolePermission entry.
* @param {object} data - The data to create the rolePermission.
* @returns {Promise<object>} - The saved rolePermission response.
*/
const createRolePermission = async (data) => {
const rolePermissionRepository = AppDataSource.getRepository(RolePermission);
const rolePermission = rolePermissionRepository.create(data);
const savedRolePermission = await rolePermissionRepository.save(rolePermission);
return formatRolePermissionResponse(savedRolePermission);
};
/**
* Find a RolePermission by its roleId and permissionId.
* @param {number} roleId - The ID of the role.
* @param {number} permissionId - The ID of the permission.
* @returns {Promise<object>} - The found rolePermission or null.
*/
const findRolePermissionById = async (roleId, permissionId) => {
const rolePermissionRepository = AppDataSource.getRepository(RolePermission);
const rolePermission = await rolePermissionRepository.findOne({
where: { roleId, permissionId },
});
return formatRolePermissionResponse(rolePermission);
};
/**
* Update a RolePermission entry.
* @param {number} roleId - The ID of the role.
* @param {number} permissionId - The ID of the permission.
* @param {object} newData - The data to update the rolePermission.
* @returns {Promise<object>} - The updated rolePermission or null if not found.
*/
const updateRolePermission = async (roleId, permissionId, newData) => {
const rolePermissionRepository = AppDataSource.getRepository(RolePermission);
const rolePermission = await rolePermissionRepository.findOne({ where: { roleId, permissionId } });
if (!rolePermission) return null;
Object.assign(rolePermission, newData); // Update the existing fields
const updatedRolePermission = await rolePermissionRepository.save(rolePermission);
return formatRolePermissionResponse(updatedRolePermission);
};
/**
* Delete a RolePermission by roleId and permissionId.
* @param {number} roleId - The ID of the role.
* @param {number} permissionId - The ID of the permission.
* @returns {Promise<number>} - Number of affected rows (0 if not found).
*/
const deleteRolePermission = async (roleId, permissionId) => {
const rolePermissionRepository = AppDataSource.getRepository(RolePermission);
const result = await rolePermissionRepository.delete({ roleId, permissionId });
return result.affected; // Returns 1 if deleted, 0 if not found
};
/**
* Get all RolePermission entries.
* @returns {Promise<Array>} - List of all rolePermissions.
*/
const getAllRolePermissions = async () => {
const rolePermissionRepository = AppDataSource.getRepository(RolePermission);
const rolePermissions = await rolePermissionRepository.find();
return rolePermissions.map(formatRolePermissionResponse);
};
module.exports = {
createRolePermission,
findRolePermissionById,
updateRolePermission,
deleteRolePermission,
getAllRolePermissions,
};
const rolePermissionService = require('../services/rolePermission.service');
/**
* Controller to handle creating a new rolePermission.
* @param {object} req - The request object with the roleId and permissionId in the body.
* @param {object} res - The response object.
* @returns {Promise<void>}
*/
const createRolePermission = async (req, res) => {
const { roleId, permissionId } = req.body;
try {
const newRolePermission = await rolePermissionService.createRolePermission({ roleId, permissionId });
res.status(201).json({ message: 'RolePermission created successfully', rolePermission: newRolePermission });
} catch (error) {
res.status(500).json({ message: 'Error creating rolePermission', error: error.message });
}
};
/**
* Controller to get a rolePermission by roleId and permissionId.
* @param {object} req - The request object with roleId and permissionId as params.
* @param {object} res - The response object.
* @returns {Promise<void>}
*/
const getRolePermissionById = async (req, res) => {
const { roleId, permissionId } = req.params;
try {
const rolePermission = await rolePermissionService.findRolePermissionById(roleId, permissionId);
if (!rolePermission) {
return res.status(404).json({ message: 'RolePermission not found' });
}
res.status(200).json(rolePermission);
} catch (error) {
res.status(500).json({ message: 'Error retrieving rolePermission', error: error.message });
}
};
/**
* Controller to update an existing rolePermission.
* @param {object} req - The request object with roleId and permissionId as params and data in the body.
* @param {object} res - The response object.
* @returns {Promise<void>}
*/
const updateRolePermission = async (req, res) => {
const { roleId, permissionId } = req.params;
const newData = req.body;
try {
const updatedRolePermission = await rolePermissionService.updateRolePermission(roleId, permissionId, newData);
if (!updatedRolePermission) {
return res.status(404).json({ message: 'RolePermission not found' });
}
res.status(200).json({ message: 'RolePermission updated successfully', rolePermission: updatedRolePermission });
} catch (error) {
res.status(500).json({ message: 'Error updating rolePermission', error: error.message });
}
};
/**
* Controller to delete a rolePermission.
* @param {object} req - The request object with roleId and permissionId as params.
* @param {object} res - The response object.
* @returns {Promise<void>}
*/
const deleteRolePermission = async (req, res) => {
const { roleId, permissionId } = req.params;
try {
const deleted = await rolePermissionService.deleteRolePermission(roleId, permissionId);
if (!deleted) {
return res.status(404).json({ message: 'RolePermission not found' });
}
res.status(200).json({ message: 'RolePermission deleted successfully' });
} catch (error) {
res.status(500).json({ message: 'Error deleting rolePermission', error: error.message });
}
};
/**
* Controller to get all rolePermissions.
* @param {object} req - The request object.
* @param {object} res - The response object.
* @returns {Promise<void>}
*/
const getAllRolePermissions = async (req, res) => {
try {
const rolePermissions = await rolePermissionService.getAllRolePermissions();
res.status(200).json(rolePermissions);
} catch (error) {
res.status(500).json({ message: 'Error retrieving rolePermissions', error: error.message });
}
};
module.exports = {
createRolePermission,
getRolePermissionById,
updateRolePermission,
deleteRolePermission,
getAllRolePermissions,
};
const express = require('express');
const router = express.Router();
const rolePermissionController = require('../controllers/rolePermission.controller');
// Routes for rolePermission CRUD operations
router.post('/role-permissions', rolePermissionController.createRolePermission);
router.get('/role-permissions/:roleId/:permissionId', rolePermissionController.getRolePermissionById);
router.put('/role-permissions/:roleId/:permissionId', rolePermissionController.updateRolePermission);
router.delete('/role-permissions/:roleId/:permissionId', rolePermissionController.deleteRolePermission);
router.get('/role-permissions', rolePermissionController.getAllRolePermissions);
module.exports = router;
const rolePermissionRoutes = require('./modules/Authentication/routes/rolePermission.routes'); // Add this line
app.use('/api', rolePermissionRoutes);
2.1 Assigning Permissions to Roles
Relationship: A role can have multiple permissions, and a permission can be assigned to multiple roles.
Implementation: Create a join table role_permissions
.
2.1.1 Create role_permissions
Join Table
const { EntitySchema } = require('typeorm');
module.exports = new EntitySchema({
name: 'RolePermission',
tableName: 'role_permissions',
columns: {
roleId: {
name: 'role_id',
type: 'int',
primary: true,
},
permissionId: {
name: 'permission_id',
type: 'int',
primary: true,
},
},
relations: {
role: {
type: 'many-to-one',
target: 'Role',
joinColumn: { name: 'role_id' },
onDelete: 'CASCADE',
},
permission: {
type: 'many-to-one',
target: 'Permission',
joinColumn: { name: 'permission_id' },
onDelete: 'CASCADE',
},
},
});
Explanation:
role_id
: References a role in theroles
table.permission_id
: References a permission in thepermissions
table.- Composite Primary Key: Combines
role_id
andpermission_id
to ensure each pair is unique. ON DELETE CASCADE
: If a role or permission is deleted, related entries in this table are also deleted automatically.
Usage Example:
-- Assign 'CREATE_USER' permission to 'Admin' role
INSERT INTO role_permissions (role_id, permission_id)
VALUES (1, 2);
/**
* নির্দিষ্ট রোলে অনুমতি অ্যাসাইন করার জন্য মেথড
* @function assignPermissionsToRole
* @description এই মেথডটি নির্দিষ্ট রোলে অনুমতি অ্যাসাইন করে।
* @param {object} req - রিকোয়েস্ট অবজেক্ট যা রোল আইডি এবং অনুমতি আইডি ধারণ করে।
* @param {object} res - রেসপন্স অবজেক্ট যা ক্লায়েন্টকে রেসপন্স পাঠাতে ব্যবহৃত হয়।
* @returns {Promise<void>} - ফাংশনটি একটি প্রমিস রিটার্ন করে যা রিকোয়েস্ট সম্পন্ন হওয়ার পর রেসপন্স প্রদান করে।
*/
const assignPermissionsToRole = async (req, res) => {
const { roleId, permissionIds } = req.body;
const roleRepository = getRepository(Role);
const permissionRepository = getRepository(Permission);
try {
// রোল এবং অনুমতিগুলি চেক করা হচ্ছে
const role = await roleRepository.findOne({ where: { id: roleId }, relations: ['permissions'] });
if (!role) {
return res.status(404).json({ message: 'রোল পাওয়া যায়নি' });
}
// চেক করা হচ্ছে প্রদান করা অনুমতিগুলি বিদ্যমান কিনা
const permissions = await permissionRepository.findByIds(permissionIds);
if (permissions.length !== permissionIds.length) {
return res.status(404).json({ message: 'এক বা একাধিক অনুমতি পাওয়া যায়নি' });
}
// চেক করা হচ্ছে অনুমতিগুলি ইতোমধ্যে রোলে আছে কিনা
const existingPermissionIds = role.permissions.map(permission => permission.id);
const newPermissions = permissions.filter(permission => !existingPermissionIds.includes(permission.id));
if (newPermissions.length === 0) {
return res.status(400).json({ message: 'প্রদত্ত অনুমতিগুলি ইতোমধ্যে রোলে অ্যাসাইন করা আছে' });
}
// নতুন অনুমতিগুলি রোলে অ্যাসাইন করা হচ্ছে
role.permissions = [...role.permissions, ...newPermissions];
await roleRepository.save(role);
return res.status(200).json({ message: 'অনুমতি সফলভাবে রোলে অ্যাসাইন করা হয়েছে' });
} catch (err) {
return res.status(500).json({ message: 'অনুমতি অ্যাসাইন করতে ত্রুটি', error: err.message });
}
};
/**
* নির্দিষ্ট রোল থেকে অনুমতি অপসারণ করার জন্য মেথড
* @function removePermissionsFromRole
* @description এই মেথডটি নির্দিষ্ট রোল থেকে অনুমতি অপসারণ করে।
* @param {object} req - রিকোয়েস্ট অবজেক্ট যা রোল আইডি এবং অনুমতি আইডি ধারণ করে।
* @param {object} res - রেসপন্স অবজেক্ট যা ক্লায়েন্টকে রেসপন্স পাঠাতে ব্যবহৃত হয়।
* @returns {Promise<void>} - ফাংশনটি একটি প্রমিস রিটার্ন করে যা রিকোয়েস্ট সম্পন্ন হওয়ার পর রেসপন্স প্রদান করে।
*/
const removePermissionsFromRole = async (req, res) => {
const { roleId, permissionIds } = req.body;
const roleRepository = getRepository(Role);
const permissionRepository = getRepository(Permission);
try {
// রোল এবং অনুমতিগুলি চেক করা হচ্ছে
const role = await roleRepository.findOne({ where: { id: roleId }, relations: ['permissions'] });
if (!role) {
return res.status(404).json({ message: 'রোল পাওয়া যায়নি' });
}
// চেক করা হচ্ছে প্রদান করা অনুমতিগুলি বিদ্যমান কিনা
const permissions = await permissionRepository.findByIds(permissionIds);
if (permissions.length !== permissionIds.length) {
return res.status(404).json({ message: 'এক বা একাধিক অনুমতি পাওয়া যায়নি' });
}
// চেক করা হচ্ছে অনুমতিগুলি রোলে বিদ্যমান কিনা
const existingPermissionIds = role.permissions.map(permission => permission.id);
const permissionsToRemove = permissions.filter(permission => existingPermissionIds.includes(permission.id));
if (permissionsToRemove.length === 0) {
return res.status(400).json({ message: 'প্রদত্ত অনুমতিগুলি রোলে পাওয়া যায়নি' });
}
// অনুমতিগুলি রোল থেকে অপসারণ করা হচ্ছে
role.permissions = role.permissions.filter(permission => !permissionIds.includes(permission.id));
await roleRepository.save(role);
return res.status(200).json({ message: 'অনুমতি সফলভাবে রোল থেকে অপসারণ করা হয়েছে' });
} catch (err) {
return res.status(500).json({ message: 'অনুমতি অপসারণ করতে ত্রুটি', error: err.message });
}
};
/**
* নির্দিষ্ট রোলের জন্য অনুমতি তালিকা দেখানোর জন্য মেথড
* @function getPermissionsByRole
* @description এই মেথডটি নির্দিষ্ট রোলের অনুমতিগুলির তালিকা দেখায়।
* @param {object} req - রিকোয়েস্ট অবজেক্ট যা রোল আইডি ধারণ করে।
* @param {object} res - রেসপন্স অবজেক্ট যা ক্লায়েন্টকে রেসপন্স পাঠাতে ব্যবহৃত হয়।
* @returns {Promise<void>} - ফাংশনটি একটি প্রমিস রিটার্ন করে যা রিকোয়েস্ট সম্পন্ন হওয়ার পর রেসপন্স প্রদান করে।
*/
const getPermissionsByRole = async (req, res) => {
const { roleId } = req.params;
const roleRepository = getRepository(Role);
try {
// রোল এবং অনুমতিগুলি চেক করা হচ্ছে
const role = await roleRepository.findOne({ where: { id: roleId }, relations: ['permissions'] });
if (!role) {
return res.status(404).json({ message: 'রোল পাওয়া যায়নি' });
}
return res.status(200).json({ permissions: role.permissions });
} catch (err) {
return res.status(500).json({ message: 'অনুমতি তালিকা দেখতে ত্রুটি', error: err.message });
}
};
/**
* নির্দিষ্ট রোলের জন্য অনুমতি তালিকার বাইরে থাকা অনুমতিগুলির তালিকা দেখানোর জন্য মেথড
* @function getPermissionsNotInRole
* @description এই মেথডটি নির্দিষ্ট রোলের জন্য অনুমতি তালিকার বাইরে থাকা অনুমতিগুলির তালিকা দেখায়।
* @param {object} req - রিকোয়েস্ট অবজেক্ট যা রোল আইডি ধারণ করে।
* @param {object} res - রেসপন্স অবজেক্ট যা ক্লায়েন্টকে রেসপন্স পাঠাতে ব্যবহৃত হয়।
* @returns {Promise<void>} - ফাংশনটি একটি প্রমিস রিটার্ন করে যা রিকোয়েস্ট সম্পন্ন হওয়ার পর রেসপন্স প্রদান করে।
*/
const getPermissionsNotInRole = async (req, res) => {
const { roleId } = req.params;
const roleRepository = getRepository(Role);
const permissionRepository = getRepository(Permission);
try {
// রোল এবং অনুমতিগুলির চেক
const role = await roleRepository.findOne({ where: { id: roleId }, relations: ['permissions'] });
if (!role) {
return res.status(404).json({ message: 'রোল পাওয়া যায়নি' });
}
// রোলে অন্তর্ভুক্ত অনুমতিগুলির আইডি সংগ্রহ
const existingPermissionIds = role.permissions.map(permission => permission.id);
// সমস্ত অনুমতিগুলি রিটার্ন করা হচ্ছে
const allPermissions = await permissionRepository.find();
// রোলে অন্তর্ভুক্ত নয় এমন অনুমতিগুলির ফিল্টার করা হচ্ছে
const permissionsNotInRole = allPermissions.filter(permission => !existingPermissionIds.includes(permission.id));
return res.status(200).json({ permissions: permissionsNotInRole });
} catch (err) {
return res.status(500).json({ message: 'অনুমতি তালিকা দেখতে ত্রুটি', error: err.message });
}
};