public OrderPromoteCommandValidator(IGenericReadRepository readRepository, IOrderFiltersProvider orderFiltersProvider, IOrderRelationsProvider orderRelationsProvider) : base(readRepository) { _orderFiltersProvider = orderFiltersProvider; RuleFor(x => x.OrderId) .NotEmptyWithMessage() .MustExistsWithMessageAsync(OrderExists) .CustomAsync(async(orderId, context, cancellationToken) => { var query = await ReadRepository.GetQueryableAsync(_orderFiltersProvider.ById(orderId), orderRelationsProvider.JoinDeliveryRequest); var orderInfo = query .Select(x => new { OrderStatus = x.StatusId, DeliveryRequestStatus = x.DeliveryRequest != null ? x.DeliveryRequest.StatusId : (int?)null }) .FirstOrDefault(); if ((OrderStatuses)orderInfo.OrderStatus == OrderStatuses.Completed) { context.AddFailure(nameof(OrderPromoteCommand.OrderId), "Order is completed."); return; } if (orderInfo.DeliveryRequestStatus.HasValue && (DeliveryRequestStatuses)orderInfo.DeliveryRequestStatus != DeliveryRequestStatuses.Closed) { context.AddFailure(nameof(OrderPromoteCommand.OrderId), "You cannot promote the order until the corresponding delivery request is completed."); } }); }
public OrderQueryFunctionality(IUnitOfWork unitOfWork, IMapperFactory mapperFactory, IGenericReadRepository readRepository, IOrderFiltersProvider filtersProvider, IOrderRelationsProvider relationsProvider) : base(unitOfWork, mapperFactory, readRepository) { _filtersProvider = filtersProvider; _relationsProvider = relationsProvider; }