ExpressJs

⌘K
  1. Home
  2. Docs
  3. ExpressJs
  4. Role And Permission
  5. 8.UserGroupPermission (কোন UserGroup এর কোন পারমিশন )

8.UserGroupPermission (কোন UserGroup এর কোন পারমিশন )

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 the usergroups table.
  • permission_id: References a permission in the permissions 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
};

How can we help?