Entity
Services
Controller
Routes
Index.js
const { EntitySchema } = require('typeorm');
module.exports = new EntitySchema({
name: 'UserGroupPermission',
tableName: 'usergroup_permissions',
columns: {
usergroupId: {
name: 'usergroup_id',
type: 'int',
primary: true,
},
permissionId: {
name: 'permission_id',
type: 'int',
primary: true,
},
},
relations: {
usergroup: {
type: 'many-to-one',
target: 'UserGroup',
joinColumn: { name: 'usergroup_id' },
onDelete: 'CASCADE',
},
permission: {
type: 'many-to-one',
target: 'Permission',
joinColumn: { name: 'permission_id' },
onDelete: 'CASCADE',
},
},
});
const { AppDataSource } = require('../../../index');
const UserGroupPermission = require('../entities/userGroupPermission.entity');
/**
* Format the userGroupPermission response to exclude sensitive or unnecessary fields.
* @param {object} userGroupPermission - The userGroupPermission entity object.
* @returns {object} - The formatted userGroupPermission response.
*/
const formatUserGroupPermissionResponse = (userGroupPermission) => {
if (!userGroupPermission) return null;
return {
userId: userGroupPermission.userId,
groupId: userGroupPermission.groupId,
permissionId: userGroupPermission.permissionId,
};
};
/**
* Create a new UserGroupPermission entry.
* @param {object} data - The data to create the userGroupPermission.
* @returns {Promise<object>} - The saved userGroupPermission response.
*/
const createUserGroupPermission = async (data) => {
const userGroupPermissionRepository = AppDataSource.getRepository(UserGroupPermission);
const userGroupPermission = userGroupPermissionRepository.create(data);
const savedUserGroupPermission = await userGroupPermissionRepository.save(userGroupPermission);
return formatUserGroupPermissionResponse(savedUserGroupPermission);
};
/**
* Find a UserGroupPermission by its groupId and permissionId.
* @param {number} groupId - The ID of the group.
* @param {number} permissionId - The ID of the permission.
* @returns {Promise<object>} - The found userGroupPermission or null.
*/
const findUserGroupPermissionByGroupIdAndPermissionId = async (groupId, permissionId) => {
const userGroupPermissionRepository = AppDataSource.getRepository(UserGroupPermission);
const userGroupPermission = await userGroupPermissionRepository.findOne({
where: { groupId, permissionId },
});
return formatUserGroupPermissionResponse(userGroupPermission);
};
/**
* Update a UserGroupPermission entry.
* @param {number} groupId - The ID of the group.
* @param {number} permissionId - The ID of the permission.
* @param {object} newData - The data to update the userGroupPermission.
* @returns {Promise<object>} - The updated userGroupPermission or null if not found.
*/
const updateUserGroupPermission = async (groupId, permissionId, newData) => {
const userGroupPermissionRepository = AppDataSource.getRepository(UserGroupPermission);
const userGroupPermission = await userGroupPermissionRepository.findOne({ where: { groupId, permissionId } });
if (!userGroupPermission) return null;
Object.assign(userGroupPermission, newData); // Update the existing fields
const updatedUserGroupPermission = await userGroupPermissionRepository.save(userGroupPermission);
return formatUserGroupPermissionResponse(updatedUserGroupPermission);
};
/**
* Delete a UserGroupPermission by groupId and permissionId.
* @param {number} groupId - The ID of the group.
* @param {number} permissionId - The ID of the permission.
* @returns {Promise<number>} - Number of affected rows (0 if not found).
*/
const deleteUserGroupPermission = async (groupId, permissionId) => {
const userGroupPermissionRepository = AppDataSource.getRepository(UserGroupPermission);
const result = await userGroupPermissionRepository.delete({ groupId, permissionId });
return result.affected; // Returns 1 if deleted, 0 if not found
};
/**
* Get all UserGroupPermission entries.
* @returns {Promise<Array>} - List of all userGroupPermissions.
*/
const getAllUserGroupPermissions = async () => {
const userGroupPermissionRepository = AppDataSource.getRepository(UserGroupPermission);
const userGroupPermissions = await userGroupPermissionRepository.find();
return userGroupPermissions.map(formatUserGroupPermissionResponse);
};
/**
* Get permissions by userGroupId.
* @param {number} userGroupId - The ID of the user group.
* @returns {Promise<Array>} - List of permissions belonging to the user group.
*/
const getPermissionsByUserGroup = async (userGroupId) => {
const userGroupPermissionRepository = AppDataSource.getRepository(UserGroupPermission);
const permissions = await userGroupPermissionRepository.find({
where: { groupId: userGroupId },
relations: ['permission'], // Assuming there's a relation to a Permission entity
});
return permissions.map((userGroupPermission) => userGroupPermission.permission); // Returning the permissions
};
/**
* Get permissions not in the userGroupId.
* @param {number} userGroupId - The ID of the user group.
* @returns {Promise<Array>} - List of permissions not in the user group.
*/
const getPermissionsNotInUserGroup = async (userGroupId) => {
const permissionRepository = AppDataSource.getRepository(Permission); // Assuming Permission entity exists
const userGroupPermissions = await AppDataSource.getRepository(UserGroupPermission).find({
where: { groupId: userGroupId },
});
const groupPermissionIds = userGroupPermissions.map((ugp) => ugp.permissionId);
const permissionsNotInGroup = await permissionRepository.createQueryBuilder('permission')
.where('permission.id NOT IN (:...ids)', { ids: groupPermissionIds })
.getMany();
return permissionsNotInGroup;
};
module.exports = {
createUserGroupPermission,
findUserGroupPermissionByGroupIdAndPermissionId,
updateUserGroupPermission,
deleteUserGroupPermission,
getAllUserGroupPermissions,
getPermissionsByUserGroup,
getPermissionsNotInUserGroup,
};
const userGroupPermissionService = require('../services/userGroupPermission.service');
/**
* Create a new UserGroupPermission entry.
* @param {object} req - Request object
* @param {object} res - Response object
* @returns {Promise<void>}
*/
const createUserGroupPermission = async (req, res) => {
try {
const data = req.body;
const userGroupPermission = await userGroupPermissionService.createUserGroupPermission(data);
res.status(201).json({ userGroupPermission });
} catch (error) {
res.status(500).json({ message: error.message });
}
};
/**
* Get a UserGroupPermission by groupId and permissionId.
* @param {object} req - Request object
* @param {object} res - Response object
* @returns {Promise<void>}
*/
const getUserGroupPermission = async (req, res) => {
try {
const { groupId, permissionId } = req.params;
const userGroupPermission = await userGroupPermissionService.findUserGroupPermissionByGroupIdAndPermissionId(groupId, permissionId);
if (userGroupPermission) {
res.status(200).json({ userGroupPermission });
} else {
res.status(404).json({ message: 'UserGroupPermission not found' });
}
} catch (error) {
res.status(500).json({ message: error.message });
}
};
/**
* Update a UserGroupPermission entry.
* @param {object} req - Request object
* @param {object} res - Response object
* @returns {Promise<void>}
*/
const updateUserGroupPermission = async (req, res) => {
try {
const { groupId, permissionId } = req.params;
const newData = req.body;
const updatedUserGroupPermission = await userGroupPermissionService.updateUserGroupPermission(groupId, permissionId, newData);
if (updatedUserGroupPermission) {
res.status(200).json({ updatedUserGroupPermission });
} else {
res.status(404).json({ message: 'UserGroupPermission not found' });
}
} catch (error) {
res.status(500).json({ message: error.message });
}
};
/**
* Delete a UserGroupPermission entry.
* @param {object} req - Request object
* @param {object} res - Response object
* @returns {Promise<void>}
*/
const deleteUserGroupPermission = async (req, res) => {
try {
const { groupId, permissionId } = req.params;
const affectedRows = await userGroupPermissionService.deleteUserGroupPermission(groupId, permissionId);
if (affectedRows > 0) {
res.status(200).json({ message: 'UserGroupPermission deleted successfully' });
} else {
res.status(404).json({ message: 'UserGroupPermission not found' });
}
} catch (error) {
res.status(500).json({ message: error.message });
}
};
/**
* Get all UserGroupPermission entries.
* @param {object} req - Request object
* @param {object} res - Response object
* @returns {Promise<void>}
*/
const getAllUserGroupPermissions = async (req, res) => {
try {
const userGroupPermissions = await userGroupPermissionService.getAllUserGroupPermissions();
res.status(200).json({ userGroupPermissions });
} catch (error) {
res.status(500).json({ message: error.message });
}
};
/**
* Get permissions associated with a user group.
* @param {object} req - Request object
* @param {object} res - Response object
* @returns {Promise<void>}
*/
const getPermissionsByUserGroup = async (req, res) => {
try {
const { userGroupId } = req.params;
const permissions = await userGroupPermissionService.getPermissionsByUserGroup(userGroupId);
res.status(200).json({ permissions });
} catch (error) {
res.status(500).json({ message: error.message });
}
};
/**
* Get permissions not associated with a user group.
* @param {object} req - Request object
* @param {object} res - Response object
* @returns {Promise<void>}
*/
const getPermissionsNotInUserGroup = async (req, res) => {
try {
const { userGroupId } = req.params;
const permissions = await userGroupPermissionService.getPermissionsNotInUserGroup(userGroupId);
res.status(200).json({ permissions });
} catch (error) {
res.status(500).json({ message: error.message });
}
};
module.exports = {
createUserGroupPermission,
getUserGroupPermission,
updateUserGroupPermission,
deleteUserGroupPermission,
getAllUserGroupPermissions,
getPermissionsByUserGroup,
getPermissionsNotInUserGroup,
};
const express = require('express');
const router = express.Router();
const userGroupPermissionController = require('../controllers/userGroupPermission.controller');
// Create a new UserGroupPermission entry
router.post('/user-group-permissions', userGroupPermissionController.createUserGroupPermission);
// Get a UserGroupPermission by groupId and permissionId
router.get('/user-group-permissions/:groupId/:permissionId', userGroupPermissionController.getUserGroupPermission);
// Update a UserGroupPermission entry
router.put('/user-group-permissions/:groupId/:permissionId', userGroupPermissionController.updateUserGroupPermission);
// Delete a UserGroupPermission entry
router.delete('/user-group-permissions/:groupId/:permissionId', userGroupPermissionController.deleteUserGroupPermission);
// Get all UserGroupPermission entries
router.get('/user-group-permissions', userGroupPermissionController.getAllUserGroupPermissions);
// Fetch permissions belonging to a user group
router.get('/user-group-permissions/:userGroupId/permissions', userGroupPermissionController.getPermissionsByUserGroup);
// Fetch permissions not belonging to a user group
router.get('/user-group-permissions/:userGroupId/permissions-not-in', userGroupPermissionController.getPermissionsNotInUserGroup);
module.exports = router;
const userGroupPermissionRoutes = require('./modules/Authentication/routes/userGroupPermission.routes');
app.use('/api', userGroupPermissionRoutes);
2.2 Assigning Permissions to UserGroups
Relationship: A user group can have multiple permissions, and a permission can be assigned to multiple user groups.
Implementation: Create a join table usergroup_permissions
.
2.2.1 Create usergroup_permissions
Join Table
const { EntitySchema } = require('typeorm');
module.exports = new EntitySchema({
name: 'UserGroupPermission',
tableName: 'usergroup_permissions',
columns: {
usergroupId: {
name: 'usergroup_id',
type: 'int',
primary: true,
},
permissionId: {
name: 'permission_id',
type: 'int',
primary: true,
},
},
relations: {
usergroup: {
// Many-to-Many relationship (part of the join table definition)
// This field references the 'usergroups' table via the foreign key 'usergroup_id'.
type: 'many-to-one',
target: 'UserGroup', // Refers to the UserGroup entity
joinColumn: { name: 'usergroup_id' }, // The foreign key in the 'usergroup_permissions' table
onDelete: 'CASCADE', // If a usergroup is deleted, remove the related entries in the join table
},
permission: {
// Many-to-Many relationship (part of the join table definition)
// This field references the 'permissions' table via the foreign key 'permission_id'.
type: 'many-to-one',
target: 'Permission', // Refers to the Permission entity
joinColumn: { name: 'permission_id' }, // The foreign key in the 'usergroup_permissions' table
onDelete: 'CASCADE', // If a permission is deleted, remove the related entries in the join table
},
},
});
Explanation:
usergroup_id
: References a user group in theusergroups
table.permission_id
: References a permission in thepermissions
table.- Composite Primary Key: Ensures each user group and permission pair is unique.
ON DELETE CASCADE
: Maintains referential integrity by deleting related entries upon deletion of a user group or permission.
Usage Example:
-- Assign 'EDIT_POST' permission to 'Editors' user group
INSERT INTO usergroup_permissions (usergroup_id, permission_id)
VALUES (3, 4);
const AppDataSource = require('../config/database');
const UserGroup = require('../entities/UserGroup'); // Import UserGroup entity
const Permission = require('../entities/Permission'); // Import Permission entity
const UserGroupPermission = require('../entities/UserGroupPermission'); // Import UserGroupPermission entity
/**
* ইউজারগ্রুপে অনুমতি অ্যাসাইন করার জন্য মেথড
* @function assignPermissionsToUserGroup
* @description এই মেথডটি নির্দিষ্ট ইউজারগ্রুপে অনুমতি অ্যাসাইন করে।
* @param {object} req - রিকোয়েস্ট অবজেক্ট যা ইউজারগ্রুপ আইডি এবং অনুমতি আইডি ধারণ করে।
* @param {object} res - রেসপন্স অবজেক্ট যা ক্লায়েন্টকে রেসপন্স পাঠাতে ব্যবহৃত হয়।
* @returns {Promise<void>} - ফাংশনটি একটি প্রমিস রিটার্ন করে যা রিকোয়েস্ট সম্পন্ন হওয়ার পর রেসপন্স প্রদান করে।
*/
const assignPermissionsToUserGroup = async (req, res) => {
const { userGroupId, permissionIds } = req.body;
// Repositories for interacting with the database
const userGroupRepository = AppDataSource.getRepository(UserGroup);
const permissionRepository = AppDataSource.getRepository(Permission);
const userGroupPermissionRepository = AppDataSource.getRepository(UserGroupPermission);
try {
// Checking if the UserGroup exists
const userGroup = await userGroupRepository.findOne({ where: { id: userGroupId } });
if (!userGroup) {
return res.status(404).json({ message: 'ইউজারগ্রুপ পাওয়া যায়নি' });
}
// Checking if the provided permissions exist
const permissions = await permissionRepository.findByIds(permissionIds);
if (permissions.length !== permissionIds.length) {
return res.status(404).json({ message: 'এক বা একাধিক অনুমতি পাওয়া যায়নি' });
}
// Checking if the permissions are already assigned to the UserGroup
const existingPermissions = await userGroupPermissionRepository.find({
where: { userGroup: { id: userGroupId }, permission: { id: permissionIds } }
});
const existingPermissionIds = existingPermissions.map(up => up.permission.id);
const newPermissions = permissions.filter(permission => !existingPermissionIds.includes(permission.id));
if (newPermissions.length === 0) {
return res.status(400).json({ message: 'প্রদত্ত অনুমতিগুলি ইতোমধ্যে ইউজারগ্রুপে অ্যাসাইন করা আছে' });
}
// Assigning new permissions to the UserGroup
const userGroupPermissions = newPermissions.map(permission => {
const userGroupPermission = new UserGroupPermission();
userGroupPermission.userGroup = userGroup;
userGroupPermission.permission = permission;
return userGroupPermission;
});
// Save the new user group permissions in the database
await userGroupPermissionRepository.save(userGroupPermissions);
return res.status(200).json({ message: 'অনুমতি সফলভাবে ইউজারগ্রুপে অ্যাসাইন করা হয়েছে' });
} catch (err) {
return res.status(500).json({ message: 'অনুমতি অ্যাসাইন করতে ত্রুটি', error: err.message });
}
};
/**
* ইউজারগ্রুপ থেকে অনুমতি অপসারণ করার জন্য মেথড
* @function removePermissionsFromUserGroup
* @description এই মেথডটি নির্দিষ্ট ইউজারগ্রুপ থেকে অনুমতি অপসারণ করে।
* @param {object} req - রিকোয়েস্ট অবজেক্ট যা ইউজারগ্রুপ আইডি এবং অনুমতি আইডি ধারণ করে।
* @param {object} res - রেসপন্স অবজেক্ট যা ক্লায়েন্টকে রেসপন্স পাঠাতে ব্যবহৃত হয়।
* @returns {Promise<void>} - ফাংশনটি একটি প্রমিস রিটার্ন করে যা রিকোয়েস্ট সম্পন্ন হওয়ার পর রেসপন্স প্রদান করে।
*/
const removePermissionsFromUserGroup = async (req, res) => {
const { userGroupId, permissionIds } = req.body;
// Repositories for interacting with the database
const userGroupRepository = AppDataSource.getRepository(UserGroup);
const userGroupPermissionRepository = AppDataSource.getRepository(UserGroupPermission);
try {
// ইউজারগ্রুপ এবং অনুমতিগুলি চেক করা হচ্ছে
const userGroup = await userGroupRepository.findOne({ where: { id: userGroupId }, relations: ['permissions'] });
if (!userGroup) {
return res.status(404).json({ message: 'ইউজারগ্রুপ পাওয়া যায়নি' });
}
// চেক করা হচ্ছে অনুমতিগুলি ইউজারগ্রুপে বিদ্যমান কিনা
const permissionsToRemove = await userGroupPermissionRepository.find({
where: { userGroup: { id: userGroupId }, permission: { id: permissionIds } }
});
if (permissionsToRemove.length === 0) {
return res.status(400).json({ message: 'প্রদত্ত অনুমতিগুলি ইউজারগ্রুপে পাওয়া যায়নি' });
}
// অনুমতিগুলি ইউজারগ্রুপ থেকে অপসারণ করা হচ্ছে
await userGroupPermissionRepository.remove(permissionsToRemove);
return res.status(200).json({ message: 'অনুমতি সফলভাবে ইউজারগ্রুপ থেকে অপসারণ করা হয়েছে' });
} catch (err) {
return res.status(500).json({ message: 'অনুমতি অপসারণ করতে ত্রুটি', error: err.message });
}
};
/**
* নির্দিষ্ট ইউজারগ্রুপের জন্য অনুমতি তালিকা দেখানোর জন্য মেথড
* @function getPermissionsByUserGroup
* @description এই মেথডটি নির্দিষ্ট ইউজারগ্রুপের অনুমতিগুলির তালিকা দেখায়।
* @param {object} req - রিকোয়েস্ট অবজেক্ট যা ইউজারগ্রুপ আইডি ধারণ করে।
* @param {object} res - রেসপন্স অবজেক্ট যা ক্লায়েন্টকে রেসপন্স পাঠাতে ব্যবহৃত হয়।
* @returns {Promise<void>} - ফাংশনটি একটি প্রমিস রিটার্ন করে যা রিকোয়েস্ট সম্পন্ন হওয়ার পর রেসপন্স প্রদান করে।
*/
const getPermissionsByUserGroup = async (req, res) => {
const { userGroupId } = req.params;
// Repository for interacting with the database
const userGroupRepository = AppDataSource.getRepository(UserGroup);
try {
// ইউজারগ্রুপ এবং অনুমতিগুলি চেক করা হচ্ছে
const userGroup = await userGroupRepository.findOne({ where: { id: userGroupId }, relations: ['permissions'] });
if (!userGroup) {
return res.status(404).json({ message: 'ইউজারগ্রুপ পাওয়া যায়নি' });
}
return res.status(200).json({ permissions: userGroup.permissions });
} catch (err) {
return res.status(500).json({ message: 'অনুমতি তালিকা দেখতে ত্রুটি', error: err.message });
}
};
/**
* নির্দিষ্ট ইউজারগ্রুপে অন্তর্ভুক্ত নয় এমন অনুমতিগুলির তালিকা দেখানোর জন্য মেথড
* @function getPermissionsNotInUserGroup
* @description এই মেথডটি নির্দিষ্ট ইউজারগ্রুপে অন্তর্ভুক্ত নয় এমন অনুমতিগুলির তালিকা দেখায়।
* @param {object} req - রিকোয়েস্ট অবজেক্ট যা ইউজারগ্রুপ আইডি ধারণ করে।
* @param {object} res - রেসপন্স অবজেক্ট যা ক্লায়েন্টকে রেসপন্স পাঠাতে ব্যবহৃত হয়।
* @returns {Promise<void>} - ফাংশনটি একটি প্রমিস রিটার্ন করে যা রিকোয়েস্ট সম্পন্ন হওয়ার পর রেসপন্স প্রদান করে।
*/
const getPermissionsNotInUserGroup = async (req, res) => {
const { userGroupId } = req.params;
// Repositories for interacting with the database
const userGroupRepository = AppDataSource.getRepository(UserGroup);
const permissionRepository = AppDataSource.getRepository(Permission);
try {
// ইউজারগ্রুপ এবং অনুমতিগুলির চেক
const userGroup = await userGroupRepository.findOne({ where: { id: userGroupId }, relations: ['permissions'] });
if (!userGroup) {
return res.status(404).json({ message: 'ইউজারগ্রুপ পাওয়া যায়নি' });
}
// ইউজারগ্রুপে অন্তর্ভুক্ত অনুমতিগুলির আইডি সংগ্রহ
const existingPermissionIds = userGroup.permissions.map(permission => permission.id);
// সমস্ত অনুমতিগুলি রিটার্ন করা হচ্ছে
const allPermissions = await permissionRepository.find();
// ইউজারগ্রুপে অন্তর্ভুক্ত নয় এমন অনুমতিগুলির ফিল্টার করা হচ্ছে
const permissionsNotInUserGroup = allPermissions.filter(permission => !existingPermissionIds.includes(permission.id));
return res.status(200).json({ permissions: permissionsNotInUserGroup });
} catch (err) {
return res.status(500).json({ message: 'অনুমতি তালিকা দেখতে ত্রুটি', error: err.message });
}
};
module.exports = {
assignPermissionsToUserGroup,removePermissionsFromUserGroup,getPermissionsByUserGroup,getPermissionsNotInUserGroup
};