public async Task MakeTeamReservation(TeamSession session) { var state = await _authenticationStateProvider.GetAuthenticationStateAsync(); var userId = (await _userManager.GetUserAsync(state.User)).Id; if (_teamService.GetTeam(session.TeamId).Limits.TryGetValue(TeamLimit.ActiveBookings, out var maxTeamReservations)) { await _reservationLock.WaitAsync(); try { var reservationsForUser = await _bookingStorage.GetReservationsFor(userId); if (reservationsForUser.Count(e => e.TeamId == session.TeamId && e.StartTime > DateTime.Now) < maxTeamReservations) { await _bookingStorage.AddReservation(userId, new UserReservation { StartTime = session.StartTime, TeamId = session.TeamId }); } else { return; } } finally { _reservationLock.Release(); } } else { await _bookingStorage.AddReservation(userId, new UserReservation { StartTime = session.StartTime, TeamId = session.TeamId }); } OnBookingsChanged(); }
public async Task AddReservation(string userId, UserReservation reservation) { await using var dbCtx = new BookingsDbContext(_dbContextOptions); var reservationEntity = new UserReservationEntity { StartTime = reservation.StartTime, TeamId = reservation.TeamId, UserId = userId, EndTime = reservation.StartTime + _teamService.GetTeam(reservation.TeamId).Duration }; dbCtx.UserReservations.Add(reservationEntity); await dbCtx.SaveChangesAsync(); }
public int GetFreeSpace(TimeSlot timeSlot) { var sessions = GetTeamSessionsActiveDuring(timeSlot); return _spaceSize - sessions.Sum(e => _teamService.GetTeam(e.TeamId).Limits.GetValueOrDefault(TeamLimit.Size)); }