private async Task <IndexUseCase.UserSummary> ToUserData(ApplicationUser user)
        {
            var roles = await _userManager.GetRolesAsync(user);

            return(new IndexUseCase.UserSummary()
            {
                ID = user.Id,
                FullName = user.FullName,
                Email = user.Email,
                CanShowDetails = (await _authorizer.Authorize(new DetailsUseCase.Query()
                {
                    UserId = user.Id
                })).Succeeded,
                CanDelete = (await _authorizer.Authorize(new DeleteUseCase.Command()
                {
                    UserID = user.Id
                })).Succeeded,
                Roles = roles.ToList(),
                CanGrantRoles = (await _authorizer.Authorize(new GrantRoleUseCase.Command()
                {
                    UserID = user.Id
                })).Succeeded,
                CanRevokeRoles = (await _authorizer.Authorize(new RevokeRoleUseCase.Command()
                {
                    UserID = user.Id
                })).Succeeded
            });
        }
        public async Task <DetailsUseCase.UserDetails> Handle(DetailsUseCase.Query request, CancellationToken cancellationToken)
        {
            var user = await _userManager.FindByIdAsync(request.UserId.ToString());

            if (user == null)
            {
                throw new ResourceNotFoundException();
            }

            var roleNames = await _userManager.GetRolesAsync(user);

            var roles = await _roleManager.Roles.Where(x => roleNames.Contains(x.Name)).ToListAsync();

            return(new DetailsUseCase.UserDetails()
            {
                ID = user.Id,
                FirstName = user.FirstName,
                LastName = user.LastName,
                FullName = user.FullName,
                Email = user.Email,
                Roles = (await roles.SelectAsync(x => BuildRole(x, user))).ToArray(),
                CanChangeName = (await _authorizer.Authorize(new ChangeNameUseCase.Command()
                {
                    UserID = user.Id
                })).Succeeded,
                CanGrantRoles = (await _authorizer.Authorize(new GrantRoleUseCase.Command()
                {
                    UserID = user.Id
                })).Succeeded,
                CanDelete = (await _authorizer.Authorize(new DeleteUseCase.Command()
                {
                    UserID = user.Id
                })).Succeeded,
            });
        }
        public async Task <IndexUseCase.EditionSummary[]> Handle(IndexUseCase.Query request, CancellationToken cancellationToken)
        {
            var editions = await _dbContext.Editions.AsNoTracking().ToListAsync();

            return(await Task.WhenAll(editions
                                      .Select(async x => new IndexUseCase.EditionSummary()
            {
                ID = x.ID,
                Name = x.Name,
                StartDate = NodaTime.LocalDate.FromDateTime(x.StartDate),
                EndDate = NodaTime.LocalDate.FromDateTime(x.EndDate),
                CanShowDetails = (await _authorizationAnalyzer.Authorize(new DetailsUseCase.Query()
                {
                    EditionID = x.ID
                })).Succeeded
            })));
        }
        public async Task <Result <Campaign, Error> > Handle(Query request, CancellationToken cancellationToken)
        {
            var campaign = await _repository.GetById(request.CampaignID);

            if (campaign == null)
            {
                return(Result.Failure <Campaign, Error>(new Error.ResourceNotFound($"Nie znaleziono kampanii o ID={request.CampaignID}")));
            }

            var now = _clock.GetCurrentInstant();

            var trainerIDs = campaign.Trainings.Select(x => x.CoordinatorID).Distinct().ToArray();
            var trainers   = await _trainerProvider.GetTrainerDetails(trainerIDs);

            var isrecruitmentFormOpen = new Interval(campaign.StartDateTime.ToInstant(), campaign.EndDateTime.ToInstant()).Contains(now);
            var canScheduleTraining   = (now < campaign.StartDateTime.ToInstant()) &&
                                        (await _authorizationAnalyzer.Authorize(new ScheduleTraining.Command())).Succeeded;

            return(Result.Success <Campaign, Error>(new Campaign()
            {
                ID = campaign.Id,
                Name = campaign.Name,
                StartDateTime = campaign.StartDateTime,
                EndDateTime = campaign.EndDateTime,
                Trainings = campaign.Trainings
                            .OrderBy(x => x.StartDateTime, OffsetDateTime.Comparer.Instant)
                            .Select(x => new TrainingSummary()
                {
                    ID = x.ID,
                    Address = x.Address,
                    City = x.City,
                    CoordinatorID = x.CoordinatorID,
                    CoordinatorName = trainers.Single(y => y.Guid == x.CoordinatorID).Name,
                    StartDateTime = x.StartDateTime,
                    EndDateTime = x.EndDateTime,
                    Timing = x.CalculateTiming(now)
                })
                            .ToArray(),
                IsRecruitmentFormOpen = isrecruitmentFormOpen,
                CanScheduleTraining = canScheduleTraining
            }));
        }
        public async Task <Result <EditionDetails, Error> > Handle(Query request, CancellationToken cancellationToken)
        {
            if (request.EditionID == default)
            {
                return(Result.Failure <EditionDetails, Error>(new Error.ResourceNotFound()));
            }

            var edition = await _dbContext.Editions
                          .AsNoTracking()
                          .Where(x => x.ID == request.EditionID)
                          .SingleOrDefaultAsync();

            if (edition == null)
            {
                return(Result.Failure <EditionDetails, Error>(new Error.ResourceNotFound()));
            }

            var campaigns = await _mediator.Send(new Szlem.Recruitment.Campaigns.Index.Query()
            {
                EditionID = edition.ID
            });

            var isCurrent = (edition.StartDate <= DateTime.Today && edition.EndDate >= DateTime.Today);
            var canAddRecruitmentCampaign = edition.EndDate >= DateTime.Today && (await _authorizer.Authorize(new Szlem.Recruitment.Campaigns.Create.Command()
            {
                EditionID = edition.ID
            })).Succeeded;

            return(Result.Success <EditionDetails, Error>(new EditionDetails()
            {
                ID = edition.ID,
                Name = edition.Name,
                StartDate = NodaTime.LocalDate.FromDateTime(edition.StartDate),
                EndDate = NodaTime.LocalDate.FromDateTime(edition.EndDate),
                CumulativeStatistics = edition.CumulativeStatistics,
                ThisEditionStatistics = edition.ThisEditionStatistics,
                RecruitmentCampaigns = campaigns.IsSuccess ? campaigns.Value.Select(x => new EditionDetails.RecruitmentCampaignData()
                {
                    ID = x.ID,
                    Name = x.Name,
                    StartDateTime = x.StartDateTime,
                    EndDateTime = x.EndDateTime
                }).ToArray() : new EditionDetails.RecruitmentCampaignData[0],
                CanAddRecruitmentCampaign = canAddRecruitmentCampaign,
                IsCurrent = isCurrent
            }));
        }