public void save(RoleDto role_dto)
        {
            try
            {
                _transactionManager.beginTransaction();
                var roleWithSameName = _roleRepo.getByName(role_dto.name.Trim());

                if (roleWithSameName != null)
                {
                    throw new DuplicateItemException($"User Role with same name already exists.");
                }

                Role role = new Role()
                {
                    name       = role_dto.name,
                    is_enabled = role_dto.is_active
                };
                _roleRepo.insert(role);

                var rolePermissionDto = new RolePermissionMapDto();
                rolePermissionDto.role_id = role.role_id;
                foreach (var permission in role_dto.permissions)
                {
                    rolePermissionDto.addPermission(permission);
                }
                _rolePermissionMapService.saveOrUpdate(rolePermissionDto);

                _transactionManager.commitTransaction();
            }
            catch (Exception)
            {
                _transactionManager.rollbackTransaction();
                throw;
            }
        }
        protected void update(RolePermissionMapDto dto)
        {
            var previousSavePermissions = _rolePermissionMapRepo.getByRoleId(dto.role_id) ?? throw new ItemNotFoundException($"Permissions has not been assigned to specified role.");

            List <string> previouslyAssignedPermissions = previousSavePermissions.Select(a => a.permission_name).ToList();

            var userRole = _roleRepo.getById(dto.role_id) ?? throw new ItemNotFoundException($"User role with the id {dto.role_id} doesnot exist.");

            var removedPermissions = previousSavePermissions.Where(l1 => !dto.permissions.Any(permission => l1.permission_name == permission)).ToList();

            foreach (var rolePermissionMap in removedPermissions)
            {
                _rolePermissionMapRepo.delete(rolePermissionMap);
            }

            var addedPermissions = dto.permissions.Where(l1 => !previousSavePermissions.Any(permission => l1 == permission.permission_name)).ToList();

            dto.removeAllPermissions();

            foreach (var addedPermission in addedPermissions)
            {
                dto.addPermission(addedPermission);
            }

            if (dto.permissions.Count > 0)
            {
                save(dto);
            }
        }
        public void saveOrUpdate(RolePermissionMapDto dto)
        {
            try
            {
                _transactionManager.beginTransaction();
                if (dto.permissions.Count == 0)
                {
                    throw new InvalidValueException("At least one permission is required.");
                }

                var previousSavePermissions = _rolePermissionMapRepo.getByRoleId(dto.role_id);
                if (previousSavePermissions.Count == 0)
                {
                    save(dto);
                }
                else
                {
                    update(dto);
                }
                _transactionManager.commitTransaction();
            }
            catch (Exception)
            {
                _transactionManager.rollbackTransaction();
                throw;
            }
        }
        private void updateRolePermissions(RoleDto role_dto)
        {
            RolePermissionMapDto rolePermissionMapDto = new RolePermissionMapDto();

            rolePermissionMapDto.role_id = role_dto.role_id;
            foreach (var permission in role_dto.permissions.Distinct())
            {
                rolePermissionMapDto.addPermission(permission);
            }
            _rolePermissionMapService.saveOrUpdate(rolePermissionMapDto);
        }
        protected void save(RolePermissionMapDto dto)
        {
            if (dto.permissions.Count == 0)
            {
                throw new InvalidValueException("At least one permission is required.");
            }

            var role = _roleRepo.getById(dto.role_id) ?? throw new ItemNotFoundException($"User role with the id {dto.role_id} doesnot exist.");

            foreach (var permission in dto.permissions)
            {
                RolePermissionMap rolePermissionMap = new RolePermissionMap()
                {
                    role            = role,
                    permission_name = permission
                };
                _rolePermissionMapRepo.insert(rolePermissionMap);
            }
        }