示例#1
0
        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);
        }
示例#2
0
        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));
            }
        }