public async Task <IEnumerable <SalesViewModel> > Handle(SalesQueryDto request, CancellationToken cancellationToken)
        {
            var query = _orderDbContext.Sales.AsQueryable();

            if (request.CustomerId is not null)
            {
                query = query.Where(p => p.CustomerId == request.CustomerId);
            }

            if (request.Reference is not null)
            {
                query = query.Where(p => p.Reference == request.Reference);
            }

            if (request.OperatedBy is not null)
            {
                query = query.Where(p => p.OperatedBy == request.OperatedBy);
            }

            if (request.SoldAt is not null)
            {
                query = query.Where(p => p.SoldAt >= request.SoldAt &&
                                    p.SoldAt <= request.SoldAt);
            }

            var sales = await query
                        .ProjectTo <SalesViewModel>(_mapper.ConfigurationProvider)
                        .ToListAsync(cancellationToken: cancellationToken);

            return(sales);
        }
Example #2
0
        public async Task <IActionResult> GetOrders([FromQuery] SalesQueryDto queryDto)
        {
            var cacheKey       = $"sales-{queryDto.CustomerId}-{queryDto.Reference}-{queryDto.SoldAt}-{queryDto.OperatedBy}";
            var salesFromCache = await _redisCacheClient.GetAsync <IEnumerable <SalesViewModel> >(cacheKey);

            if (salesFromCache != null)
            {
                Response.Headers.Add("X-DataSource", $"From-Cache");
                return(Ok(salesFromCache));
            }
            var salesFromDb = await _mediator.Send(queryDto);

            if (salesFromDb.Any())
            {
                await _redisCacheClient.AddAsync(cacheKey, salesFromDb, 300);
            }

            return(Ok(salesFromDb));
        }