private RealmUpdateResponse ProcessAndPersistRealmShards(Realm realm, List <RealmShardInputModel> shards) { var response = new RealmUpdateResponse(); var allFragments = realm.Fragments.ToList(); var currentShards = realm.RealmShards.ToList(); var existingShards = shards .Where(x => x.Id.HasValue); var shardIds = existingShards .Select(x => x.Id.Value); // Update or Remove shards foreach (var shard in currentShards) { if (shardIds.Contains(shard.Id)) { var update = existingShards.First(x => x.Id.Value == shard.Id); if (string.IsNullOrEmpty(update.Name)) { response.ErrorMessages.Add("Shard Name is required."); return(response); } shard.Name = update.Name; shard.IsOrdered = update.IsOrdered; var shardFragmentIds = update.EntryList.Select(x => x.FragmentId).ToList(); var entries = shard.RealmShardEntries.ToList(); foreach (var frag in entries) { if (shardFragmentIds.Contains(frag.FragmentId)) { frag.EntryOrder = shard.IsOrdered ? shardFragmentIds.IndexOf(frag.FragmentId) : (int?)null; _realmDataService.SetToPersist(frag); } else { shard.RealmShardEntries.Remove(frag); } } var newFragments = update.EntryList.Where(x => !shard.RealmShardEntries.Any(s => s.FragmentId == x.FragmentId)); foreach (var inputFrag in newFragments) { var newFragEntry = new RealmShardEntry { EntryOrder = shard.IsOrdered ? shardFragmentIds.IndexOf(inputFrag.FragmentId) : (int?)null, FragmentId = inputFrag.FragmentId }; _realmDataService.SetToPersist(newFragEntry); shard.RealmShardEntries.Add(newFragEntry); } _realmDataService.SetToPersist(shard); } else { realm.RealmShards.Remove(shard); } } var newShards = shards.Where(x => !x.Id.HasValue); // Add shards foreach (var input in newShards) { if (string.IsNullOrEmpty(input.Name)) { response.ErrorMessages.Add("Shard Name is required."); return(response); } var newRealmShard = new RealmShard { Name = input.Name, IsOrdered = input.IsOrdered, RealmId = realm.Id }; ValidateAndSetRealmShardCode(realm, newRealmShard); var entryOrder = 0; foreach (var frag in input.EntryList) { var entry = new RealmShardEntry { EntryOrder = newRealmShard.IsOrdered ? entryOrder++ : (int?)null, FragmentId = frag.FragmentId, }; _realmDataService.SetToPersist(entry); newRealmShard.RealmShardEntries.Add(entry); } _realmDataService.SetToPersist(newRealmShard); realm.RealmShards.Add(newRealmShard); } return(response); }
public async Task <RealmUpdateResponse> UpdateRealm(ClaimsPrincipal claim, RealmUpdateRequest request) { var response = new RealmUpdateResponse(); var user = await _userService.GetCurrentUser(claim); var userId = user == null ? string.Empty : user.Id; if (string.IsNullOrEmpty(userId)) { response.ErrorMessages.Add("You are not authorised to perform this action."); return(response); } var realm = await _realmDataService.GetRealmById(request.Id); if (realm == null) { response.ErrorMessages.Add("Realm not found."); return(response); } else if (realm.IsPrivate && realm.ApplicationUserId != userId) { response.ErrorMessages.Add($"Realm(code: {realm.Code}) is a private realm."); return(response); } _mapper.Map(request, realm); if (string.IsNullOrEmpty(realm.Name)) { response.ErrorMessages.Add("Name is required."); return(response); } // Update tags var oldTagIds = request.TagList .Where(x => x.Id.HasValue) .Select(x => x.Id.Value); var currentTags = realm.Tags.ToList(); foreach (var t in currentTags) { if (!oldTagIds.Contains(t.Id)) { realm.Tags.Remove(t); } } await ProcessAndPersistNewTags(realm, request.TagList); var shardResponse = ProcessAndPersistRealmShards(realm, request.Shards); if (!shardResponse.Success) { return(shardResponse); } // Save and return _realmDataService.SetToPersist(realm); await _realmDataService.SaveAsync(); response.Data = _mapper.Map <RealmItemViewModel>(realm); return(response); }