private static void AddMissingRoles(IObject[] actualRoles, string[] requestedRoleIds, PushResponse pushResponse) { var actualRoleIds = actualRoles.Select(x => x.Id.ToString()); var missingRoleIds = requestedRoleIds.Except(actualRoleIds); foreach (var missingRoleId in missingRoleIds) { pushResponse.AddMissingError(missingRoleId); } }
private void SaveRequestRoles(IList <PushRequestRole> saveRequestRoles, IObject obj, PushResponse pushResponse, Dictionary <string, IObject> objectByNewId) { foreach (var saveRequestRole in saveRequestRoles) { var composite = (Composite)obj.Strategy.Class; var roleTypes = composite.RoleTypesByGroup[this.@group]; var acl = new AccessControlList(obj, this.user); var roleTypeName = saveRequestRole.T; var roleType = roleTypes.FirstOrDefault(v => v.PropertyName.Equals(roleTypeName)); if (roleType != null) { if (acl.CanWrite(roleType)) { if (roleType.ObjectType.IsUnit) { var unitType = (IUnit)roleType.ObjectType; var role = saveRequestRole.S; if (role is string) { role = Serialization.ReadString((string)role, unitType.UnitTag); } obj.Strategy.SetUnitRole(roleType.RelationType, role); } else { if (roleType.IsOne) { var roleId = (string)saveRequestRole.S; if (string.IsNullOrEmpty(roleId)) { obj.Strategy.RemoveCompositeRole(roleType.RelationType); } else { var role = this.GetRole(roleId, objectByNewId); if (role == null) { pushResponse.AddMissingError(roleId); } else { obj.Strategy.SetCompositeRole(roleType.RelationType, role); } } } else { // Add if (saveRequestRole.A != null) { var roleIds = saveRequestRole.A; if (roleIds.Length != 0) { var roles = this.GetRoles(roleIds, objectByNewId); if (roles.Length != roleIds.Length) { AddMissingRoles(roles, roleIds, pushResponse); } else { foreach (var role in roles) { obj.Strategy.AddCompositeRole(roleType.RelationType, role); } } } } // Remove if (saveRequestRole.R != null) { var roleIds = saveRequestRole.R; if (roleIds.Length != 0) { var roles = this.GetRoles(roleIds, objectByNewId); if (roles.Length != roleIds.Length) { AddMissingRoles(roles, roleIds, pushResponse); } else { foreach (var role in roles) { obj.Strategy.RemoveCompositeRole(roleType.RelationType, role); } } } } } } } else { pushResponse.AddAccessError(obj); } } } }