Example #1
0
        public async Task <Result> Deactivate(AccommodationsDeactivationRequest request, CancellationToken cancellationToken = default)
        {
            if (!request.HtAccommodationIds.Any())
            {
                return(Result.Failure("Accommodation ids must be specified"));
            }

            if (request.Reason == DeactivationReasons.None)
            {
                return(Result.Failure("Deactivation reason must be specified"));
            }

            var(_, isFailure, accommodationIds, error) = AccommodationIdRetriever.RetrieveIds(request.HtAccommodationIds);
            if (isFailure)
            {
                return(Result.Failure(error));
            }

            var accommodationsToDeactivate =
                await _context.Accommodations.Where(a => accommodationIds.Contains(a.Id) && a.IsActive).ToListAsync(cancellationToken);

            if (!accommodationsToDeactivate.Any())
            {
                return(Result.Success());
            }

            return(await DeactivateAccommodations(accommodationsToDeactivate)
                   .Tap(Unpublish)
                   .Tap(AddDeactivationEvents));


            async Task <Result <List <RichAccommodationDetails> > > DeactivateAccommodations(List <RichAccommodationDetails> accommodations)
            {
                var dateTime = DateTimeOffset.UtcNow;

                foreach (var accommodation in accommodations)
                {
                    accommodation.IsActive                      = false;
                    accommodation.DeactivationReason            = request.Reason;
                    accommodation.DeactivationReasonDescription = request.DeactivationReasonDescription;
                    accommodation.Modified                      = dateTime;
                }

                _context.UpdateRange(accommodations);
                await _context.SaveChangesAsync(cancellationToken);

                return(accommodations);
            }

            Task Unpublish(List <RichAccommodationDetails> accommodations)
            {
                var ids = accommodations.Select(a => a.Id).ToList();

                return(_accommodationChangePublisher.PublishRemoved(ids));
            }

            Task AddDeactivationEvents()
            => _accommodationChangeLogService.AddDeactivationEvents(accommodationIds !, AccommodationChangeEventSources.Api, request.Reason,
                                                                    request.DeactivationReasonDescription);
        }
Example #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));
            }
        }