public async Task <ActionResult <DistributionReadModel> > GetById(Guid distributionId) { DistributionReadModel distribution = await distributionsRepository.Query(x => x.Id == distributionId); if (distribution == null) { return(NotFound()); } var user = authorizedUserProvider.Get(); if (!user.IsAdmin && distribution.Owners.All(o => o.Sid != user.Sid)) { return(Forbid()); } return(distribution); }
private async Task Update(Event @event, Action <DistributionReadModel> update, CancellationToken cancellationToken) { Guid distributionId = @event.Metadata.AggregateId; DistributionReadModel distribution = await distributionRepository.Query(b => b.Id == distributionId, cancellationToken); if (distribution == null) { throw new UpdateDistributionException($"Distribution {distributionId} not found."); } DistributionReadModel oldDistribution = distribution.DeepClone(); update(distribution); await distributionRepository.Update(x => x.Id == distributionId, distribution, cancellationToken); await SendNotification(ServerEventType.DistributionUpdated, oldDistribution, distribution); }
private void UpdateRuleSet() { RuleFor(d => d.Id) .MustAsync(DistributionExist) .WithMessage(x => $"Дистрибутив c идентификатором {x.Id} не существует") .DependentRules(CommonRuleSet); RuleFor(model => model) .CustomAsync(async(model, context, token) => { DistributionReadModel distribution = await distributionsRepository.Query(x => x.Id == model.Id, token); if (distribution == null) { return; } if (DistributionNameChanged(distribution, model) && !await IsUniqueDistributionName(model.Name, token)) { context.AddFailure(nameof(model.Name), DistributionNameShouldBeUniqueMessage); } IEnumerable <LifeCycleState> deletedLifeCycleStates = distribution.AvailableLifeCycles.Except(model.AvailableLifeCycles); if (await ExistBuildByDeletedLifeCycleState(distribution, deletedLifeCycleStates)) { context.AddFailure(nameof(model.AvailableLifeCycles), $"Существует сборка с удаленным состоянием {deletedLifeCycleStates.First():G}"); } }); When(x => x.BuildBindings.Any(), () => { RuleFor(x => x.BuildBindings) .MustAsync((distribution, buildBindings, cancellationToken) => BindingsPathsIsUnique(buildBindings, distribution.Id, cancellationToken)) .WithMessage("Один из путей в привязках используется в другом дистрибутиве."); }); }
private bool DistributionNameChanged(DistributionReadModel existDistribution, DistributionModel updatedDistribution) { return(!string.Equals(updatedDistribution.Name, existDistribution.Name, StringComparison.OrdinalIgnoreCase)); }
private async Task <bool> ExistBuildByDeletedLifeCycleState(DistributionReadModel distribution, IEnumerable <LifeCycleState> deletedLifeCycleState) { return(await buildsRepository.Any(x => x.DistributionId == distribution.Id && deletedLifeCycleState.Contains(x.LifeCycleState))); }
private async Task SendNotification(string type, DistributionReadModel oldDistribution, DistributionReadModel newDistribution) { await mediator.Publish(new SendDiffEntitiesNotifications.Notification(type, oldDistribution, newDistribution, newDistribution?.Owners)); }