public async Task RecalculateProjectLobbyStateAsync_IfInvalid_ThrowsValidationFailedException() { _validatorMock .Setup(m => m.Validate(It.IsAny <object>())) .Returns(FailedValidationResult); await Assert.ThrowsAsync <ValidationFailedException>(() => _target.RecalculateProjectLobbyStateAsync(Guid.NewGuid())); }
public async void HandleEvent(SessionEnded payload) { try { var guestSession = await _guestSessionController.GetGuestSessionBySessionIdAsync(payload.SessionId); if (guestSession == null) { return; } if (guestSession.GuestSessionState == GuestState.Ended) { return; } guestSession.GuestSessionState = GuestState.Ended; await _guestSessionController.UpdateGuestSessionAsync(guestSession, guestSession.UserId); // Recalc lobby state after guest session is ended. await _projectLobbyStateController.RecalculateProjectLobbyStateAsync(guestSession.ProjectId); } catch (Exception ex) { _logger.Error($"Unexpected exception while ending the guest session for session ID {payload.SessionId}", ex); } }
private async Task <object> RecalculateProjectLobbyStateAsync(dynamic input) { var projectId = input.projectId; await RequiresAccess() .WithProjectIdExpansion(ctx => projectId) .ExecuteAsync(CancellationToken.None); try { return(await _projectLobbyStateController.RecalculateProjectLobbyStateAsync(projectId)); } catch (ValidationFailedException ex) { Logger.Error($"Validation failed during recalculation of the lobby state for project: {projectId}", ex); return(Response.BadRequestValidationFailed(ex.Errors)); } catch (NotFoundException ex) { Logger.Error($"Could not recalculate the project lobby state because project={projectId} could not be found.", ex); return(Response.NotFound(ResponseReasons.NotFoundProject)); } catch (Exception ex) { Logger.Error($"An error occurred while recalculating the lobby state for project: {projectId}", ex); return(Response.InternalServerError(ResponseReasons.InternalServerErrorGetProjectLobbyState)); } }
public async Task <GuestSession> CreateGuestSessionAsync(GuestSession model, Guid principalId, Guid tenantId) { var validationResult = _validatorLocator.Validate <GuestSessionValidator>(model); if (!validationResult.IsValid) { _logger.Error("Validation failed while attempting to create a GuestSession resource."); throw new ValidationFailedException(validationResult.Errors); } Task <MicroserviceResponse <Project> > getProjectTask = null; var isTenantUnknown = tenantId == Guid.Empty; if (isTenantUnknown) { getProjectTask = _serviceToServiceProjectApi.GetProjectByIdAsync(model.ProjectId); } await EndGuestSessionsForUser(model.UserId, principalId); if (isTenantUnknown) { var projectResponse = await getProjectTask; if (!projectResponse.IsSuccess()) { throw new InvalidOperationException($"Error fetching tenantid for project {model.ProjectId}: {projectResponse.ResponseCode} - {projectResponse.ReasonPhrase} "); } model.ProjectTenantId = projectResponse.Payload.TenantId; } else { model.ProjectTenantId = tenantId; } model.Id = model.Id == Guid.Empty ? Guid.NewGuid() : model.Id; model.CreatedDateTime = DateTime.UtcNow; if (_requestHeaders.Keys.Contains("SessionIdString")) { model.SessionId = _requestHeaders["SessionIdString"].FirstOrDefault(); } else if (_requestHeaders.Keys.Contains("SessionId")) { model.SessionId = _requestHeaders["SessionId"].FirstOrDefault(); } else { throw new BadRequestException("Request headers do not contain a SessionId"); } var result = await _guestSessionRepository.CreateItemAsync(model); // Delete all prior guest sessions with the same UserId and ProjectId as the session just created. await _guestSessionRepository.DeleteItemsAsync(x => x.UserId == model.UserId && x.ProjectId == model.ProjectId && x.Id != result.Id); await _projectLobbyStateController.RecalculateProjectLobbyStateAsync(model.ProjectId); _eventService.Publish(EventNames.GuestSessionCreated, result); return(result); }