Beispiel #1
0
        public async Task <Result <Create.Response, Error> > Handle(Create.Command request, CancellationToken cancellationToken)
        {
            var maybeEdition = await _editionProvider.GetEdition(request.EditionID);

            if (maybeEdition.HasNoValue)
            {
                return(Result.Failure <Create.Response, Error>(new Error.ResourceNotFound($"Edition with ID={request.EditionID} not found")));
            }
            if (maybeEdition.Value.StartDateTime > request.StartDateTime.ToInstant())
            {
                return(Result.Failure <Create.Response, Error>(new Error.ValidationFailed(nameof(request.StartDateTime), Create.ErrorMessages.CampaignCannotStartBeforeEditionStart)));
            }
            if (maybeEdition.Value.EndDateTime < request.EndDateTime.ToInstant())
            {
                return(Result.Failure <Create.Response, Error>(new Error.ValidationFailed(nameof(request.EndDateTime), Create.ErrorMessages.CampaignMustEndBeforeEditionEnd)));
            }

            var existingCampaigns = await _repository.GetAll();

            var interval = new Interval(request.StartDateTime.ToInstant(), request.EndDateTime.ToInstant());

            if (existingCampaigns.Any(x => new Interval(x.StartDateTime.ToInstant(), x.EndDateTime.ToInstant()).Overlaps(interval)))
            {
                return(Result.Failure <Create.Response, Error>(new Error.DomainError(Create.ErrorMessages.CampaignsCannotOverlap)));
            }

            var campaign = new Entities.Campaign(request.StartDateTime, request.EndDateTime, request.EditionID, request.Name);

            var id = await _repository.Insert(campaign);

            return(Result.Success <Create.Response, Error>(new Create.Response()
            {
                ID = id
            }));
        }
Beispiel #2
0
        public async Task <ClaimsPrincipal> CreateAsync(ApplicationUser user)
        {
            var principal = await _baseImpl.CreateAsync(user);

            if (user.EmailConfirmed == false)
            {
                return(principal);
            }

            var email               = EmailAddress.Parse(user.Email);
            var submissions         = _enrollmentRepo.Query().Where(x => x.Email == email);
            var filteredSubmissions = submissions
                                      .Where(x => x.Email.ToString().ToLowerInvariant() == user.Email.ToLowerInvariant())
                                      .ToArray();

            if (filteredSubmissions.None())
            {
                return(principal);
            }

            var latestSubmission = filteredSubmissions.OrderByDescending(x => x.Timestamp).First();
            var campaign         = await _campaignRepo.GetById(latestSubmission.Campaign.Id);

            var edition = await _editionProvider.GetEdition(campaign.EditionId);

            if (edition.HasNoValue)
            {
                throw new ApplicationException($"Niespójność danych: nie znaleziono edycji o ID={campaign.EditionId} dla kampanii o ID={campaign.Id}");
            }

            if (new NodaTime.Interval(edition.Value.StartDateTime, edition.Value.EndDateTime).Contains(_clock.GetCurrentInstant()) == false)
            {
                return(principal);
            }

            principal.AddIdentity(new ClaimsIdentity(new[] { new Claim(SharedKernel.ClaimTypes.Candidate, latestSubmission.Id.GetGuid().ToString()) }));
            return(principal);
        }
Beispiel #3
0
        public async Task <Result <Response, Error> > Handle(Command request, CancellationToken cancellationToken)
        {
            var now = _clock.GetCurrentInstant();

            if (request.StartDateTime < now.InMainTimezone().LocalDateTime)
            {
                return(Result.Failure <Response, Error>(new Error.DomainError(ErrorMessages.CannotScheduleTrainingInThePast)));
            }

            var campaign = await _campaignRepo.GetById(request.CampaignID);

            if (campaign == null)
            {
                return(Result.Failure <Response, Error>(new Error.ResourceNotFound($"Campaign with ID={request.CampaignID} not found")));
            }
            if (campaign.StartDateTime.ToInstant() < now)
            {
                return(Result.Failure <Response, Error>(new Error.DomainError(ErrorMessages.CannotScheduleTrainingAfterCampaignStart)));
            }

            var maybeEdition = await _editionProvider.GetEdition(campaign.EditionId);

            if (maybeEdition.HasNoValue)
            {
                throw new ApplicationException($"DB contains invalid data, edition with ID={campaign.EditionId} not found!");
            }
            if (request.EndDateTime.InMainTimezone().ToInstant() > maybeEdition.Value.EndDateTime)
            {
                return(Result.Failure <Response, Error>(new Error.DomainError(ErrorMessages.CannotScheduleTrainingAfterEditionEnd)));
            }

            var user = await _userAccessor.GetUser();

            var scheduledTraining = new Training(
                request.Address,
                request.City,
                request.StartDateTime.InMainTimezone().ToOffsetDateTime(),
                request.EndDateTime.InMainTimezone().ToOffsetDateTime(),
                user.Id);

            var result = campaign.ScheduleTraining(scheduledTraining);

            if (result.IsFailure)
            {
                return(Result.Failure <Response, Error>(new Error.DomainError(result.Error)));
            }

            if (request.Notes != null)
            {
                var addNoteResult = scheduledTraining.AddNote(user.Id, request.Notes, _clock.GetCurrentInstant());
                if (addNoteResult.IsFailure)
                {
                    return(Result.Failure <Response, Error>(new Error.DomainError(addNoteResult.Error)));
                }
            }

            var id = await _trainingRepo.Insert(scheduledTraining);

            return(Result.Success <Response, Error>(new Response()
            {
                ID = id
            }));
        }