public IServiceResultWrap SaveRelations([FromBody] VmRelations model) { return(serviceManager.CallService( () => new ServiceLocalizedResultWrap() { Data = new VmServiceAndChannelResult() { ConnectedServices = serviceAndChannelService.SaveServiceAndChannels(model), } }, new Dictionary <Type, string>() { { typeof(string), MessageAddServiceAndChannel }, { typeof(RoleActionException), MessageAddServiceAndChannelRole } })); }
public List <IVmBase> SaveServiceAndChannels(VmRelations relations) { var result = new List <IVmBase>(); Dictionary <Guid, Guid> serviceVersion = new Dictionary <Guid, Guid>(); contextManager.ExecuteWriter(unitOfWork => { IQueryable <Guid> supportedChannelIds = null; var userOrgs = userOrganizationService.GetUserCompleteOrgStructure(unitOfWork); if (userOrganizationService.UserHighestRole(userOrgs) != UserRoleEnum.Eeva) { var schvRep = unitOfWork.CreateRepository <IServiceChannelVersionedRepository>(); var userOrgsIds = userOrgs.SelectMany(i => i).Select(i => i.OrganizationId).ToList(); var psPublished = typesCache.Get <PublishingStatusType>(PublishingStatus.Published.ToString()); var psCommonForAll = typesCache.Get <ServiceChannelConnectionType>(ServiceChannelConnectionTypeEnum.CommonForAll.ToString()); var channelIds = relations.ServiceAndChannelRelations.SelectMany(r => r.ChannelRelations).Select(ch => ch.ConnectedChannel.Id); var channels = schvRep.All().Where(i => channelIds.Contains(i.Id)); var supportedChannels = channels.Where(ch => (userOrgsIds.Contains(ch.OrganizationId) || (ch.PublishingStatusId == psPublished && ch.ConnectionTypeId == psCommonForAll))); supportedChannelIds = supportedChannels.Select(ch => ch.UnificRootId); } SetTranslatorLanguage(relations); relations.ServiceAndChannelRelations = relations.ServiceAndChannelRelations.Distinct(new RelationComparer()).ToList(); relations.ServiceAndChannelRelations.ForEach(i => i.ChannelRelations = i.ChannelRelations.Distinct(new RelationChannelsComparer()).ToList()); var serviceVersionedRep = unitOfWork.CreateRepository <IServiceVersionedRepository>(); var serviceVersionedIds = relations.ServiceAndChannelRelations.Select(sv => sv.Id).ToList(); var unificRootIds = serviceVersionedRep.All().Where(sv => serviceVersionedIds.Contains(sv.Id)).ToDictionary(k => k.Id, v => v.UnificRootId); foreach (var item in relations.ServiceAndChannelRelations) { if (!item.Id.IsAssigned() || !unificRootIds.ContainsKey(item.Id.Value)) { continue; } item.UnificRootId = unificRootIds[item.Id.Value]; item.ChannelRelations.ForEach(chs => chs.Service = unificRootIds[item.Id.Value]); } var relationData = TranslationManagerToEntity.TranslateAll <VmServiceChannelRelation, Service>(relations.ServiceAndChannelRelations, unitOfWork); serviceVersion = unitOfWork.TranslationCloneCache.GetFromCachedSet <ServiceVersioned>().ToDictionary(i => i.OriginalEntity.Id, i => i.ClonedEntity.Id); foreach (var service in relationData) { var supportedServiceServiceChannels = supportedChannelIds == null ? service.ServiceServiceChannels : service.ServiceServiceChannels.Where(ch => supportedChannelIds.Contains(ch.ServiceChannelId)).ToList(); service.ServiceServiceChannels = dataUtils.UpdateCollectionForReferenceTable(unitOfWork, supportedServiceServiceChannels, query => query.ServiceId == service.Id, channel => channel.ServiceChannelId); UpdateDigitalAuthorizationCollection(unitOfWork, service.ServiceServiceChannels); } unitOfWork.Save(); }); contextManager.ExecuteReader(unitOfWork => { var serviceCloneData = new Dictionary <Guid, string>(); relations.ServiceAndChannelRelations.ForEach(service => { if (serviceVersion.ContainsKey(service.Id.Value)) { serviceCloneData.Add(serviceVersion[service.Id.Value], service.ConnectedServiceId); } }); var cloneServiceIds = serviceCloneData.Select(y => y.Key).ToList(); var serviceRep = unitOfWork.CreateRepository <IServiceVersionedRepository>(); var resultTemp = unitOfWork.ApplyIncludes(serviceRep.All().Where(x => cloneServiceIds.Contains(x.Id)), q => q.Include(i => i.ServiceNames).ThenInclude(i => i.Type) .Include(i => i.UnificRoot).ThenInclude(i => i.ServiceServiceChannels).ThenInclude(i => i.ServiceChannel).ThenInclude(i => i.Versions).ThenInclude(i => i.ServiceChannelNames).ThenInclude(i => i.Type) .Include(i => i.UnificRoot).ThenInclude(i => i.ServiceServiceChannels).ThenInclude(i => i.ServiceChannel).ThenInclude(i => i.Versions).ThenInclude(i => i.Type) .Include(i => i.UnificRoot).ThenInclude(i => i.ServiceServiceChannels).ThenInclude(i => i.ServiceServiceChannelDescriptions).ThenInclude(i => i.Type) .Include(i => i.UnificRoot).ThenInclude(i => i.ServiceServiceChannels).ThenInclude(i => i.ServiceServiceChannelDigitalAuthorizations).ThenInclude(i => i.DigitalAuthorization) ); var cloneServices = TranslationManagerToVm.TranslateAll <ServiceVersioned, VmServiceRelationListItem>(resultTemp).Cast <IVmServiceListItem>().ToList(); cloneServices.ForEach(service => { if (serviceCloneData.ContainsKey(service.Id)) { result.Add(new VmConnectedService() { UiId = serviceCloneData[service.Id], Service = service }); } }); }); return(result); }