public override async Task <UseCaseResult <RentRequirementValidationResult> > Validate(RentRequirement requirement)
        {
            var isTryingToRentWithoutProducts = requirement.ProductsIds == null;

            if (isTryingToRentWithoutProducts)
            {
                return(UseCasesResponses.Failure <RentRequirementValidationResult>("Trying to Rent without products"));
            }

            var productsToRent = await _products.GetByIds(requirement.ProductsIds.ToList());

            if (!productsToRent.Success)
            {
                return(UseCasesResponses.Failure <RentRequirementValidationResult>(productsToRent.Message));
            }

            var renter = await _renter.GetById(requirement.RenterId);

            if (!renter.Success)
            {
                return(UseCasesResponses.Failure <RentRequirementValidationResult>(renter.Message));
            }

            var rentPeriod = DateRangeProvider.GetDateRange(requirement.StartDate, requirement.EndDate);

            if (!rentPeriod.Success)
            {
                return(UseCasesResponses.Failure <RentRequirementValidationResult>(rentPeriod.Message));
            }

            var validationResult = new RentRequirementValidationResult
            {
                Products   = productsToRent.Response,
                RentPeriod = rentPeriod.Result,
                Renter     = renter.Response
            };

            return(UseCasesResponses.Success(validationResult));
        }
        public virtual async Task <UseCaseResult <List <TEntity> > > GetByIds(List <Guid> ids)
        {
            var persistenceResponse = await ReadOnlyPersistenceGateway.GetByIds(ids);

            return(UseCasesResponses.GetUseCaseResult(persistenceResponse));
        }