Exemplo n.º 1
0
        public Task <PagingCollection <ScoringOfferDetails> > GetAsync(OffersQuery query, DateTimeOffset now)
        {
            var queryable = from scoringOffer in _readContext.ScoringOffers
                            join scoring in _readContext.Scorings on scoringOffer.ScoringId equals scoring.Id
                            join project in _readContext.Projects on scoring.ProjectId equals project.Id
                            join user in _readContext.Users on scoringOffer.ExpertId equals user.Id
                            join country in _readContext.Countries on project.CountryId equals country.Id
                            where !query.ExpertId.HasValue || user.Id == query.ExpertId.Value
                            where !query.ScoringId.HasValue || scoring.Id == query.ScoringId.Value
                            where !query.ProjectId.HasValue || project.Id == query.ProjectId.Value
                            where query.Statuses.Count == 0 ||
                            query.Statuses.Contains(ScoringOfferStatus.Expired) && (scoring.AcceptingDeadline < now && scoringOffer.Status == ScoringOfferStatus.Pending ||
                                                                                    scoring.ScoringDeadline < now && scoringOffer.Status == ScoringOfferStatus.Accepted) ||
                            query.Statuses.Contains(scoringOffer.Status) &&
                            !(scoring.AcceptingDeadline < now && scoringOffer.Status == ScoringOfferStatus.Pending) &&
                            !(scoring.ScoringDeadline < now && scoringOffer.Status == ScoringOfferStatus.Accepted)
                            select new ScoringOfferDetails(scoringOffer.Status,
                                                           scoring.AcceptingDeadline,
                                                           scoring.ScoringDeadline,
                                                           scoring.ContractAddress,
                                                           scoring.Id,
                                                           user.Id,
                                                           project.Name,
                                                           country.Code,
                                                           project.Category,
                                                           project.Description,
                                                           scoringOffer.AreaId,
                                                           project.ExternalId,
                                                           project.Id,
                                                           project.IsPrivate,
                                                           scoring.Score);

            if (query.OrderBy.HasValue)
            {
                switch (query.OrderBy.Value)
                {
                case ScoringOffersOrderBy.Name:
                    queryable = query.SortDirection == SortDirection.Ascending
                                        ? queryable.OrderBy(o => o.Name)
                                        : queryable.OrderByDescending(o => o.Name);
                    break;

                case ScoringOffersOrderBy.Status:
                    queryable = query.SortDirection == SortDirection.Ascending
                                        ? queryable.OrderBy(o => o.Status)
                                        : queryable.OrderByDescending(o => o.Status);
                    break;

                case ScoringOffersOrderBy.Deadline:
                    queryable = query.SortDirection == SortDirection.Ascending
                                        ? queryable.OrderBy(o => o.AcceptingDeadline)
                                        : queryable.OrderByDescending(o => o.AcceptingDeadline);
                    break;
                }
            }

            return(queryable.GetPageAsync(query.Offset, query.Count));
        }
Exemplo n.º 2
0
        public async Task <IActionResult> QueryAsync([FromQuery] QueryScoringOffersRequest request)
        {
            var isAdmin = User.IsInRole(nameof(RoleType.Admin));

            if (request.ExpertId.HasValue && request.ExpertId.Value != User.GetUserId() && !isAdmin || !request.ExpertId.HasValue && !isAdmin)
            {
                return(Unauthorized());
            }

            var query = new OffersQuery(request.Offset, request.Count, request.Statuses, request.ExpertId,
                                        request.ScoringId, request.ProjectId, request.OrderBy, request.SortDirection);
            var now    = _clock.UtcNow;
            var offers = await _scoringService.QueryOffersAsync(query, now);

            return(Ok(offers.ToPartialCollectionResponse(o => ScoringOfferResponse.Create(o, now))));
        }
Exemplo n.º 3
0
        public async Task <bool> IsAuthorizedToSeeProjectAsync(long projectId, long?userId)
        {
            var project = await GetByIdAsync(projectId);

            if (!project.IsPrivate)
            {
                return(true);
            }

            if (!userId.HasValue)
            {
                return(false);
            }

            if (project.AuthorId == userId.Value)
            {
                return(true);
            }

            var user = await _userRepository.GetByIdAsync(userId.Value);

            var isAdmin = await _userRepository.HasRoleAsync(user.Address, RoleType.Admin);

            if (isAdmin)
            {
                return(true);
            }

            if (project.Scoring == null)
            {
                return(false);
            }

            var offersQuery = new OffersQuery(0, 1, expertId: userId, scoringId: project.Scoring.Id);
            var offers      = await _scoringOffersRepository.GetAsync(offersQuery, _clock.UtcNow);

            return(offers.Any());
        }
Exemplo n.º 4
0
 public Task <PagingCollection <ScoringOfferDetails> > QueryOffersAsync(OffersQuery query, DateTimeOffset now)
 => _scoringOffersRepository.GetAsync(query, now);