public override async Task <IViewProviderResult> BuildUpdateAsync(Question question, IViewProviderContext context) { // Ensure entity exists before attempting to update var entity = await _entityStore.GetByIdAsync(question.Id); if (entity == null) { return(await BuildIndexAsync(question, context)); } // Validate model if (await ValidateModelAsync(question, context.Updater)) { // Get selected labels //var labelsToAdd = GetLabelsToAdd(); var labelsToAdd = await GetLabelsToAddAsync(); // Build labels to remove var labelsToRemove = new List <EntityLabel>(); foreach (var entityLabel in await GetEntityLabelsByEntityIdAsync(question.Id)) { // Entry already exists remove from labels to add if (labelsToAdd.Contains(entityLabel.LabelId)) { labelsToAdd.Remove(entityLabel.LabelId); } else { // Entry does NOT exist in labels to add ensure it's removed labelsToRemove.Add(entityLabel); } } // Remove entity labels foreach (var entityLabel in labelsToRemove) { var result = await _entityLabelManager.DeleteAsync(entityLabel); if (!result.Succeeded) { foreach (var error in result.Errors) { context.Updater.ModelState.AddModelError(string.Empty, error.Description); } } } // Get authenticated user var user = await _contextFacade.GetAuthenticatedUserAsync(); // Add new entity labels foreach (var labelId in labelsToAdd) { var result = await _entityLabelManager.CreateAsync(new EntityLabel() { EntityId = question.Id, LabelId = labelId, CreatedUserId = user?.Id ?? 0, CreatedDate = DateTime.UtcNow }); if (!result.Succeeded) { foreach (var error in result.Errors) { context.Updater.ModelState.AddModelError(string.Empty, error.Description); } } // Ensure we clear our labels cache to return new associations _cacheManager.CancelTokens(typeof(LabelStore <Label>)); } } return(await BuildEditAsync(question, context)); }
// ---------- async Task <ICommandResultBase> InstallInternalAsync(IShellFeature feature) { // Validate if (feature == null) { throw new ArgumentNullException(nameof(feature)); } if (string.IsNullOrEmpty(feature.ModuleId)) { throw new ArgumentNullException(nameof(feature.ModuleId)); } var user = await _contextFacade.GetAuthenticatedUserAsync(); // Get all feature tags var labels = await _labelStore.QueryAsync() .Select <LabelQueryParams>(Q => { Q.FeatureId.Equals(feature.Id); }) .ToList(); // Associate every tag with at least 1 entity var output = new CommandResultBase(); if (labels != null) { var entities = await _entityStore.QueryAsync() .Select <EntityQueryParams>(q => { q.FeatureId.Equals(feature.Id); }) .ToList(); var alreadyAdded = new Dictionary <int, Entity>(); foreach (var label in labels?.Data) { var randomEntities = GetRandomEntities(entities?.Data, alreadyAdded); if (randomEntities == null) { return(output.Success()); } foreach (var entity in randomEntities) { var result = await _entityLabelManager.CreateAsync(new EntityLabel() { EntityId = entity.Id, LabelId = label.Id, CreatedUserId = user?.Id ?? 0, CreatedDate = DateTime.UtcNow }); if (!result.Succeeded) { return(output.Failed(result.Errors.ToArray())); } } } } return(output.Success()); }