ExpressJs

⌘K
  1. Home
  2. Docs
  3. ExpressJs
  4. Role And Permission
  5. 7.RolePermission(কোন রোলের কোন পারমিশন)

7.RolePermission(কোন রোলের কোন পারমিশন)

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 the roles table.
  • permission_id: References a permission in the permissions table.
  • Composite Primary Key: Combines role_id and permission_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 });
    }
};

How can we help?