Beispiel #1
0
        public async Task <SubRealm> CreateAsync(SubRealmSubmit subRealmSubmit, Guid createdById)
        {
            InitSharedTransaction();

            try
            {
                SubRealmModel existingSubRealm = await subRealmRepository.GetByNameAsync(subRealmSubmit.Name, false);

                if (existingSubRealm != null)
                {
                    throw new ItemNotProcessableException($"Sub-Realm with name '{subRealmSubmit.Name}' already exists.");
                }

                SubRealmModel newSubRealm = mapper.Map <SubRealmModel>(subRealmSubmit);
                newSubRealm.ChangedBy = createdById;
                // Set a new relations list.
                newSubRealm.SubRealmPermissions             = new List <SubRealmPermissionModel>();
                newSubRealm.SubRealmApplicationDataPolicies = new List <SubRealmApplicationDataPolicyModel>();
                await AssignPermissionsToSubRealmFromPermissionIdListAsync(newSubRealm, subRealmSubmit.PermissionIds, createdById);
                await AssignApplicationDataPoliciesToSubRealmFromApplicationDataPolicyIdListAsync(newSubRealm, subRealmSubmit.ApplicationDataPolicyIds, createdById);

                SubRealmModel createdSubRealm = await subRealmRepository.CreateAsync(newSubRealm);

                CommitTransaction();

                return(mapper.Map <SubRealm>(createdSubRealm));
            }
            catch
            {
                RollbackTransaction();
                throw;
            }
        }
Beispiel #2
0
        public async Task <SubRealm> GetByIdAsync(Guid subRealmId)
        {
            SubRealmModel existingSubRealm = await subRealmRepository.GetByIdAsync(subRealmId, true);

            if (existingSubRealm == null)
            {
                throw new ItemNotFoundException($"Sub-Realm with ID '{subRealmId}' not found.");
            }

            return(mapper.Map <SubRealm>(existingSubRealm));
        }
Beispiel #3
0
        public async Task <SubRealm> UpdateAsync(Guid subRealmId, SubRealmSubmit subRealmSubmit, Guid updatedBy)
        {
            InitSharedTransaction();

            try
            {
                SubRealmModel existingSubRealm = await subRealmRepository.GetByIdAsync(subRealmId, true);

                if (existingSubRealm == null)
                {
                    throw new ItemNotFoundException($"Sub-Realm with ID '{subRealmId}' does not exist.");
                }

                // Sub-Realm names must be unique. If the sub-realm name has changed, then check that another sub-realm does have the same name.
                if (existingSubRealm.Name != subRealmSubmit.Name)
                {
                    SubRealmModel existingNamedSubRealm = await subRealmRepository.GetByNameAsync(subRealmSubmit.Name, false);

                    if (existingNamedSubRealm != null)
                    {
                        throw new ItemNotProcessableException($"Cannot update sub-Realm with name '{subRealmSubmit.Name}', as this name is already used by another sub-realm.");
                    }
                }

                // Map any potential updates from the submit model onto the existing sub-realms model.
                if (subRealmSubmit.Name != existingSubRealm.Name)
                {
                    existingSubRealm.Name      = subRealmSubmit.Name;
                    existingSubRealm.ChangedBy = updatedBy;
                }

                if (subRealmSubmit.Description != existingSubRealm.Description)
                {
                    existingSubRealm.Description = subRealmSubmit.Description;
                    existingSubRealm.ChangedBy   = updatedBy;
                }

                await AssignPermissionsToSubRealmFromPermissionIdListAsync(existingSubRealm, subRealmSubmit.PermissionIds, updatedBy);
                await AssignApplicationDataPoliciesToSubRealmFromApplicationDataPolicyIdListAsync(existingSubRealm, subRealmSubmit.ApplicationDataPolicyIds, updatedBy);

                existingSubRealm = await subRealmRepository.UpdateAsync(existingSubRealm);

                CommitTransaction();

                return(mapper.Map <SubRealm>(existingSubRealm));
            }
            catch
            {
                RollbackTransaction();
                throw;
            }
        }
Beispiel #4
0
        private async Task AssignPermissionsToSubRealmFromPermissionIdListAsync(SubRealmModel subRealm, List <Guid> permissionIds, Guid changedById)
        {
            // We want to track which permissions were added so that their changedById can be updated, but leave the permissions that already exist un-touched.
            List <SubRealmPermissionModel> newSubRealmPermissionsState = new List <SubRealmPermissionModel>();

            foreach (var permissionId in permissionIds)
            {
                // Search existing sub-realm permissions state for the permission.
                var existingSubRealmPermission = subRealm.SubRealmPermissions.FirstOrDefault(SubRealmPermissionModel => SubRealmPermissionModel.PermissionId == permissionId);

                if (existingSubRealmPermission != null)
                {
                    newSubRealmPermissionsState.Add(existingSubRealmPermission);
                    continue;
                }

                // If the permissions is new, attempt to add it, but perform some checks first.
                PermissionModel existingPermission = await permissionRepository.GetByIdAsync(permissionId);

                if (existingPermission == null)
                {
                    throw new ItemNotFoundException($"Permission with ID '{permissionId}' not found when attempting to assign it to a sub-realm.");
                }

                newSubRealmPermissionsState.Add(new SubRealmPermissionModel
                {
                    Permission = existingPermission,
                    SubRealm   = subRealm,
                    ChangedBy  = changedById
                });

                // If a permission was added, it indicates that parent sub-realm was changed.
                subRealm.ChangedBy = changedById;
            }

            subRealm.SubRealmPermissions = newSubRealmPermissionsState;
        }
Beispiel #5
0
        private async Task AssignApplicationDataPoliciesToSubRealmFromApplicationDataPolicyIdListAsync(SubRealmModel subRealm, List <Guid> applicationDataPolicyIds, Guid changedById)
        {
            // We want to track which permissions were added so that their changedById can be updated, but leave the permissions that already exist un-touched.
            List <SubRealmApplicationDataPolicyModel> newApplicationDataPolicyState = new List <SubRealmApplicationDataPolicyModel>();

            foreach (var applicationDataPolicyId in applicationDataPolicyIds)
            {
                // Search existing sub-realm permissions state for the permission.
                var existingSubRealmApplicationDataPolicy = subRealm.SubRealmApplicationDataPolicies.FirstOrDefault(SubRealmApplicationDataPolicyModel => SubRealmApplicationDataPolicyModel.ApplicationDataPolicyId == applicationDataPolicyId);

                if (existingSubRealmApplicationDataPolicy != null)
                {
                    newApplicationDataPolicyState.Add(existingSubRealmApplicationDataPolicy);
                    continue;
                }

                // If the application data policy is new, attempt to add it, but perform some checks first.
                ApplicationDataPolicyModel existingApplicationDataPolicy = await applicationDataPolicyRepository.GetByIdAsync(applicationDataPolicyId);

                if (existingApplicationDataPolicy == null)
                {
                    throw new ItemNotFoundException($"Application Data Policy with ID '{applicationDataPolicyId}' not found when attempting to assign it to a sub-realm.");
                }

                newApplicationDataPolicyState.Add(new SubRealmApplicationDataPolicyModel
                {
                    ApplicationDataPolicy = existingApplicationDataPolicy,
                    SubRealm  = subRealm,
                    ChangedBy = changedById
                });

                // If a permission was added, it indicates that parent sub-realm was changed.
                subRealm.ChangedBy = changedById;
            }

            subRealm.SubRealmApplicationDataPolicies = newApplicationDataPolicyState;
        }