Esempio n. 1
0
        public async Task <ListResponse <Project> > Handle
            (DbGetProjectFilterRequest request,
            CancellationToken cancellationToken)
        {
            try
            {
                Logger.LogInformation(LogEvent.DatabaseRequest,
                                      "Request={Request}.", request.ToDictionary());

                var validation = new DbGetProjectFilterRequestValidator()
                                 .Validate(request);
                if (!validation.IsValid)
                {
                    Logger.LogWarning
                        (LogEvent.DatabaseRequestArgumentError,
                        "Database request validation" +
                        " error. Error={Error}.", validation.Errors);
                    return(ErrorResult("Database request validation error"));
                }

                var db         = DbContext.Db;
                var query      = BuildQuery(request);
                var totalCount = await query.CountAsync()
                                 .ConfigureAwait(false);

                if (totalCount == 0)
                {
                    return(new ListResponse <Project>(new List <Project>(),
                                                      totalCount));
                }

                query = ApplyPagination(query, request);
                var dbEntityList = await query
                                   .ToListAsync()
                                   .ConfigureAwait(false);

                if (dbEntityList is null)
                {
                    Logger.LogWarning
                        (LogEvent.DatabaseEmptyResponse,
                        "Database Project null response.");
                    return(ErrorResult("Database Project null response."));
                }

                var result = new ListResponse <Project>
                {
                    Success    = true,
                    TotalCount = totalCount
                };
                result.Entities.AddRange(dbEntityList);

                return(result);
            }
            catch (Exception e)
            {
                Logger.LogWarning(LogEvent.DatabaseExceptionError, e,
                                  "Database exception error. Error={Error}.", e.Message);
                return(ErrorResult("Database exception error"));
            }
        }
Esempio n. 2
0
 private IMongoQueryable <Project> ApplyPagination(
     IMongoQueryable <Project> query, DbGetProjectFilterRequest request)
 {
     if (request.Offset > 0)
     {
         query = query.Skip(request.Offset);
     }
     if (request.Limit > 0)
     {
         query = query.Take(request.Limit);
     }
     return(query);
 }
        public static Dictionary <string, object> ToDictionary
            (this DbGetProjectFilterRequest from)
        {
            if (from is null)
            {
                return(null);
            }

            return(new Dictionary <string, object>
            {
                { nameof(from.Archived), from.Archived },
                { nameof(from.Contains), from.Contains },
                { nameof(from.Limit), from.Limit },
                { nameof(from.Offset), from.Offset },
            });
        }
Esempio n. 4
0
        private IMongoQueryable <Project> BuildQuery
        (
            DbGetProjectFilterRequest request
        )
        {
            var query = DbContext.Db.GetCollection <Project>
                            (Defaults.ProjectCollectionName)
                        .AsQueryable();

            if (!string.IsNullOrWhiteSpace(request.Contains))
            {
                query = query.WhereText(request.Contains);
            }

            if (request.Archived.HasValue)
            {
                query = query.Where(x => x.IsArchived == request.Archived);
            }

            return(query);
        }
        public async Task <ListResponse <_TEntity> > Handle(_TListQuery request,
                                                            CancellationToken cancellationToken)
        {
            Logger.LogInformation(AppLogEvent.HandleRequest,
                                  "Handle Get Project List {Request}", request.ToDictionary());

            if (request is null)
            {
                Logger.LogWarning(AppLogEvent.HandleArgumentError,
                                  "Handle Get Project List request with empty request");
                return(ErrorResponse("Request empty argument"));
            }

            try
            {
                // Validate request
                var validator        = new ListQueryValidator <_TListQuery>();
                var validationResult = await validator.ValidateAsync(request)
                                       .ConfigureAwait(false);

                if (!validationResult.IsValid)
                {
                    Logger.LogError("Query validation error. " +
                                    "Request={Request}. Error={Error}.",
                                    request.ToDictionary(),
                                    validationResult.Errors.Select(x => x.ErrorMessage));
                    return(ErrorResponse
                               (validationResult.Errors.Select(x => x.ErrorMessage)));
                }

                // Build filter
                var defaultLimit = Configuration.GetValue
                                       (Defaults.ConfigurationApiDefaultLimitParameterName,
                                       Defaults.ConfigurationApiDefaultLimitDefaultValue);
                var maxLimit = Configuration.GetValue
                                   (Defaults.ConfigurationApiMaxLimitParameterName,
                                   Defaults.ConfigurationApiMaxLimitDefaultValue);
                var dbRequest = new DbGetProjectFilterRequest
                {
                    Offset = request.Offset,
                    Limit  = request.Limit == 0
                        ? defaultLimit
                        : Math.Min(request.Limit, maxLimit),
                    Archived = request.Archived,
                    Contains = request.СontainsKeyWords
                };

                // Get Actor for current user by user name
                var currentActorResponse = await Mediator
                                           .Send(new DbGetActorByNameRequest
                                                 (request.CurrentPrincipal?.Identity?.Name))
                                           .ConfigureAwait(false);

                Actor currentActor = null;
                if (currentActorResponse.Success)
                {
                    currentActor = currentActorResponse.Entity;
                }
                else
                {
                    Logger.LogWarning(AppLogEvent.HandleArgumentError,
                                      "Not found current actor");
                    return(ErrorResponse("Not found current actor"));
                }

                // Apply security filter
                var securizator = new DbGetProjectFilterRequestSecurityBuilder
                                      (dbRequest, currentActor);
                DbGetProjectFilterRequest securedFilter = securizator.Build();

                return(await Mediator
                       .Send(securedFilter)
                       .ConfigureAwait(false));
            }
            catch (Exception e)
            {
                Logger.LogError(AppLogEvent.HandleErrorResponse, e,
                                "Call repository exception");
                return(ErrorResponse("Not found"));
            }
        }