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 })); }
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); }
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 })); }