Esempio n. 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);
        }
        public async Task <IActionResult> DeactivateAccommodations([FromBody] AccommodationsDeactivationRequest request,
                                                                   CancellationToken cancellationToken = default)
        {
            var(_, isFailure, error) = await _activityStatusManagementService.Deactivate(request, cancellationToken);

            if (isFailure)
            {
                return(BadRequestWithProblemDetails(error));
            }

            return(NoContent());
        }