private async Task <Result> RefreshStatus(Booking booking, ApiCaller apiCaller, BookingStatusRefreshState state) { return(await ValidateBooking() .Bind(CheckIsRefreshStatusNeeded) .Bind(RefreshBookingStatus)); Result ValidateBooking() { if (!BookingStatusesForRefresh.Contains(booking.Status)) { return(Result.Failure <BookingStatusRefreshState>( $"Cannot refresh booking status for booking {booking.ReferenceCode} with status {booking.Status}")); } return(Result.Success()); } Result CheckIsRefreshStatusNeeded() { if (state == default) { return(Result.Success()); } return(RefreshCondition(state, _dateTimeProvider.UtcNow()) ? Result.Success() : Result.Failure($"Booking {booking.ReferenceCode} status is recently updated")); } Task <Result> RefreshBookingStatus() => _supplierBookingManagement.RefreshStatus(booking, apiCaller, BookingChangeEvents.Refresh); }
public async Task <List <int> > GetBookingsToRefresh() { var states = await GetStates(); var disabledSuppliers = _statusUpdateOptionsMonitor.CurrentValue.DisabledSuppliers.Select(d => (int)d); var now = _dateTimeProvider.UtcNow(); var excludedIds = states .Where(s => !RefreshCondition(s, now)) .Select(s => s.BookingId) .ToList(); return(await _context.Bookings .Where(b => !excludedIds.Contains(b.Id) && b.CheckInDate > now && BookingStatusesForRefresh.Contains(b.Status) && !disabledSuppliers.Contains(b.Supplier)) .Select(b => b.Id) .ToListAsync()); }