public async Task <Result> Activate(string htAccommodationId, DeactivationReasons deactivationReasonToCheck = default, CancellationToken cancellationToken = default) { var(_, isFailure, accommodationId, error) = AccommodationIdRetriever.RetrieveId(htAccommodationId); if (isFailure) { return(Result.Failure(error)); } var accommodationToActivate = await _context.Accommodations.SingleOrDefaultAsync(a => a.Id == accommodationId, cancellationToken); if (accommodationToActivate is null) { return(Result.Failure <RichAccommodationDetails>($"Accommodation with htId {htAccommodationId} doesn't exist")); } if (deactivationReasonToCheck != default && accommodationToActivate.DeactivationReason != deactivationReasonToCheck) { return(Result.Failure <RichAccommodationDetails>( $"Accommodation with htId {htAccommodationId} must have {deactivationReasonToCheck.ToString()} deactivation reason.")); } if (accommodationToActivate.IsActive) { return(Result.Success()); } return(await ActivateAccommodation(accommodationToActivate) .Tap(Publish) .Tap(AddActivationEvent)); async Task <Result <RichAccommodationDetails> > ActivateAccommodation(RichAccommodationDetails accommodation) { accommodation.IsActive = true; accommodation.DeactivationReason = DeactivationReasons.None; accommodation.DeactivationReasonDescription = string.Empty; accommodation.Modified = DateTimeOffset.UtcNow; _context.Update(accommodation); await _context.SaveChangesAsync(cancellationToken); return(accommodation); } Task Publish(RichAccommodationDetails accommodation) { return(_accommodationChangePublisher.PublishAdded(AccommodationDataForPublicationConverter.Convert(accommodation), accommodation.LocalityId ?? default)); } Task AddActivationEvent() => _accommodationChangeLogService.AddActivationEvent(accommodationId, AccommodationChangeEventSources.Api, accommodationToActivate.DeactivationReason); }
public async Task <Result> Activate(AccommodationsActivationRequest request, CancellationToken cancellationToken = default) { if (!request.HtAccommodationIds.Any()) { return(Result.Failure("Accommodation htIds must be specified")); } var(_, isFailure, accommodationIds, error) = AccommodationIdRetriever.RetrieveIds(request.HtAccommodationIds); if (isFailure) { return(Result.Failure(error)); } var accommodationsToActivate = await _context.Accommodations.Where(a => accommodationIds.Contains(a.Id) && !a.IsActive) .ToListAsync(cancellationToken); if (!accommodationsToActivate.Any()) { return(Result.Success()); } return(await ActivateAccommodations(accommodationsToActivate) .Tap(Publish)); async Task <Result <List <RichAccommodationDetails> > > ActivateAccommodations(List <RichAccommodationDetails> accommodations) { var dateTime = DateTimeOffset.UtcNow; foreach (var accommodation in accommodations) { _accommodationChangeLogCollectorService.CollectActivationEvent(accommodation.Id, AccommodationChangeEventSources.Api, accommodation.DeactivationReason); accommodation.IsActive = true; accommodation.DeactivationReason = DeactivationReasons.None; accommodation.DeactivationReasonDescription = string.Empty; accommodation.IsCorrected = false; accommodation.Modified = dateTime; } _context.UpdateRange(accommodations); await _context.SaveChangesAsync(cancellationToken); await _accommodationChangeLogCollectorService.SaveCollectedEventLogs(cancellationToken); return(accommodations); } Task Publish(List <RichAccommodationDetails> richAccommodationsData) { var accommodationsToPublish = new List <(AccommodationDataForPublication accommodation, int localityId)>(richAccommodationsData.Count); foreach (var richAccommodationData in richAccommodationsData) { var accommodation = AccommodationDataForPublicationConverter.Convert(richAccommodationData); accommodationsToPublish.Add((accommodation, richAccommodationData.LocalityId ?? default)); } return(_accommodationChangePublisher.PublishAdded(accommodationsToPublish)); } }