Ejemplo n.º 1
0
        public async Task RecalculateProjectLobbyStateAsync_IfInvalid_ThrowsValidationFailedException()
        {
            _validatorMock
            .Setup(m => m.Validate(It.IsAny <object>()))
            .Returns(FailedValidationResult);

            await Assert.ThrowsAsync <ValidationFailedException>(() => _target.RecalculateProjectLobbyStateAsync(Guid.NewGuid()));
        }
Ejemplo n.º 2
0
        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);
        }