public override ValidationResult Validate(SessionRequestDto entity)
        {
            var validation = base.Validate(entity);

            if (validation.Errors.Any())
            {
                return(validation);
            }

            var hasComponent = _componentRepository.GetComponentsByModule(entity.ModuleId);

            if (!hasComponent.Any())
            {
                validation.Errors.Add("You can't open a session without any components");
            }

            var classroomByModule = _classroomRepository.GetClassroomByModule(entity.ModuleId);

            if (classroomByModule == null)
            {
                validation.Errors.Add($"No classroom was assigned to {entity.ModuleId}");
            }

            var session = _repository.GetOpenSessions(entity.ModuleId).ToList();

            if (session.Count >= 1)
            {
                validation.Errors.Add($"A session for {entity.ModuleId} was already opened");
            }


            return(validation);
        }
コード例 #2
0
        public async Task <IActionResult> sessions([FromBody] SessionRequestDto sessionRequest)
        {
            string token    = string.Empty;
            User   user     = null;
            var    tokenStr = await AuthService.LoginByPWD(sessionRequest.email, sessionRequest.password);

            if (!string.IsNullOrEmpty(tokenStr))
            {
                var response = new SessionResponseDto
                {
                    id      = token,
                    user_id = user.UserId.ToHex24()
                };
                return(Json(response, MyJsonConvert.GetLeanoteOptions()));
            }
            else
            {
                var response = new SessionResponseDto
                {
                    error = "Invalid username or password"
                };
                //(禁止) 服务器拒绝请求。
                Response.StatusCode = (int)HttpStatusCode.Forbidden;
                return(Json(response, MyJsonConvert.GetLeanoteOptions()));
            }
        }
コード例 #3
0
ファイル: RoomsControllerTests.cs プロジェクト: meutley/ISTS
        public async void RequestSession_Returns_OkObjectResult_With_SessionRequestDto()
        {
            var userId    = Guid.NewGuid();
            var roomId    = Guid.NewGuid();
            var startTime = new DateTime(2018, 1, 1, 10, 0, 0, DateTimeKind.Unspecified);
            var endTime   = startTime.AddHours(2);

            _identity.Setup(i => i.IsAuthenticated).Returns(true);
            _identity.Setup(i => i.Name).Returns(userId.ToString());
            _identity.Setup(i => i.Claims).Returns(new List <Claim>
            {
                new Claim(ClaimTypes.Name, userId.ToString()),
                new Claim(ApiClaimTypes.TimeZoneId, "1"),
                new Claim(ApiClaimTypes.TimeZoneName, "Central Standard Time"),
                new Claim(ApiClaimTypes.TimeZoneUtcOffset, "-6")
            });

            var room = new RoomDto
            {
                Id = roomId
            };

            var expectedModel = new SessionRequestDto
            {
                Id               = Guid.NewGuid(),
                RoomId           = roomId,
                RequestingUserId = userId,
                RequestedTime    = new DateRangeDto {
                    Start = startTime, End = endTime
                }
            };

            _roomService
            .Setup(s => s.GetAsync(It.IsAny <Guid>()))
            .Returns(Task.FromResult(room));

            _roomService
            .Setup(s => s.RequestSessionAsync(It.IsAny <SessionRequestDto>()))
            .Returns(Task.FromResult(expectedModel));

            var result = await _roomsController.RequestSession(roomId, expectedModel.RequestedTime);

            Assert.IsType <OkObjectResult>(result);

            var okResult = result as OkObjectResult;

            Assert.IsType <SessionRequestDto>(okResult.Value);

            var actual = okResult.Value as SessionRequestDto;

            Assert.Equal(expectedModel.Id, actual.Id);
            Assert.Equal(expectedModel.RoomId, actual.RoomId);
            Assert.Equal(expectedModel.RequestingUserId, actual.RequestingUserId);
            Assert.Equal(expectedModel.RequestedTime.Start, actual.RequestedTime.Start);
            Assert.Equal(expectedModel.RequestedTime.End, actual.RequestedTime.End);
        }
コード例 #4
0
        public async Task <SessionResponseDto> Close(SessionRequestDto sessionRequest)
        {
            var session = GetCurrentSession(sessionRequest);

            session.EndTime = DateTime.UtcNow.FromUtcToGmt();
            var updatedSession = await _sessionRepository.UpdateSession(session);

            var(totalStudents, finishedStudents) = GetStudentStats(updatedSession);

            return(_mapper.Map <SessionResponseDto>((totalStudents, finishedStudents, updatedSession)));
        }
コード例 #5
0
        public async Task <SessionResponseDto> Open(SessionRequestDto sessionRequest)
        {
            var sessionModel = _mapper.Map <Session>(sessionRequest);

            sessionModel.StartTime = DateTime.UtcNow.FromUtcToGmt();

            var savedSession = await _sessionRepository.SaveSession(sessionModel);

            var(totalStudents, finishedStudents) = GetStudentStats(savedSession);

            return(_mapper.Map <SessionResponseDto>((totalStudents, finishedStudents, savedSession)));
        }
コード例 #6
0
        public async Task <IActionResult> CloseSession(SessionRequestDto sessionRequest)
        {
            var validationResult = _closeSessionRequestDtoValidator.Validate(sessionRequest);

            if (validationResult.Errors.Any())
            {
                return(BadRequest(validationResult));
            }

            var sessionResponseDto = await _sessionProcessor.Close(sessionRequest);

            return(Ok(sessionResponseDto));
        }
コード例 #7
0
        public async Task <SessionRequestDto> RequestSessionAsync(SessionRequestDto model)
        {
            var requestedDateRange = model.RequestedTime != null
                ? DateRange.Create(model.RequestedTime.Start, model.RequestedTime.End)
                : null;

            var room = await _roomRepository.GetAsync(model.RoomId);

            var newModel = room.RequestSession(model.RequestingUserId, requestedDateRange, model.RoomFunctionId, _sessionScheduleValidator);
            var entity   = await _roomRepository.RequestSessionAsync(newModel);

            var result = _mapper.Map <SessionRequestDto>(entity);

            return(result);
        }
コード例 #8
0
ファイル: RoomsControllerTests.cs プロジェクト: meutley/ISTS
        public async void RejectSessionRequest_Returns_OkObjectResult_With_Rejected_SessionRequestDto(string reason)
        {
            var userId    = Guid.NewGuid();
            var roomId    = Guid.NewGuid();
            var startTime = DateTime.Now;
            var endTime   = startTime.AddHours(2);

            _identity.Setup(i => i.IsAuthenticated).Returns(true);
            _identity.Setup(i => i.Name).Returns(userId.ToString());

            var room = new RoomDto
            {
                Id = roomId
            };

            var expectedModel = new SessionRequestDto
            {
                Id               = Guid.NewGuid(),
                RoomId           = roomId,
                RequestingUserId = userId,
                RequestedTime    = new DateRangeDto {
                    Start = startTime, End = endTime
                },
                SessionRequestStatusId = (int)SessionRequestStatusId.Rejected,
                RejectedReason         = reason
            };

            _roomService
            .Setup(s => s.GetAsync(It.IsAny <Guid>()))
            .Returns(Task.FromResult(room));

            _roomService
            .Setup(s => s.RejectSessionRequestAsync(It.IsAny <Guid>(), It.IsAny <Guid>(), It.IsAny <string>()))
            .Returns(Task.FromResult(expectedModel));

            var result = await _roomsController.RejectSessionRequest(roomId, expectedModel.Id, reason);

            Assert.IsType <OkObjectResult>(result);

            var okResult = result as OkObjectResult;

            Assert.IsType <SessionRequestDto>(okResult.Value);

            var actual = okResult.Value as SessionRequestDto;

            Assert.Equal(expectedModel.SessionRequestStatusId, actual.SessionRequestStatusId);
            Assert.Equal(expectedModel.RejectedReason, actual.RejectedReason);
        }
コード例 #9
0
        private Session GetCurrentSession(SessionRequestDto sessionRequest)
        {
            var sessions = _sessionRepository.GetOpenSessions(sessionRequest.ModuleId).ToList();

            if (sessions.Count > 1)
            {
                throw new Exception($"Multiple open session for {sessionRequest.ModuleId} found!");
            }

            if (sessions.Count == 0)
            {
                throw new Exception($"No open session for {sessionRequest.ModuleId} found!");
            }

            return(sessions.First());
        }
コード例 #10
0
ファイル: RoomServiceTests.cs プロジェクト: meutley/ISTS
        public async void RequestSessionAsync_Returns_New_SessionRequestDto()
        {
            var studioId = Guid.NewGuid();
            var room     = Room.Create(studioId, "Room");

            var userId        = Guid.NewGuid();
            var startTime     = DateTime.Now;
            var endTime       = startTime.AddHours(2);
            var requestedTime = DateRange.Create(startTime, endTime);
            var entity        = room.RequestSession(userId, requestedTime, null, _sessionScheduleValidator.Object);

            var requestedTimeDto = new DateRangeDto {
                Start = startTime, End = endTime
            };

            _roomRepository
            .Setup(r => r.GetAsync(It.IsAny <Guid>()))
            .Returns(Task.FromResult(room));

            _roomRepository
            .Setup(r => r.RequestSessionAsync(It.IsAny <SessionRequest>()))
            .Returns(Task.FromResult(entity));

            _sessionScheduleValidator
            .Setup(v => v.ValidateAsync(It.IsAny <Guid>(), It.IsAny <Guid?>(), It.IsAny <DateRange>()))
            .Returns(Task.FromResult(SessionScheduleValidatorResult.Success));

            var dto = new SessionRequestDto
            {
                RoomId           = room.Id,
                RequestingUserId = userId,
                RequestedTime    = new DateRangeDto {
                    Start = startTime, End = endTime
                }
            };

            var result = await _roomService.RequestSessionAsync(dto);

            Assert.NotNull(result);
            Assert.Equal(entity.Id, result.Id);
            Assert.Equal(entity.RoomId, result.RoomId);
            Assert.Equal(entity.RoomFunctionId, result.RoomFunctionId);
            Assert.Equal(entity.RequestingUserId, result.RequestingUserId);
            Assert.Equal(entity.RequestedStartTime, result.RequestedTime.Start);
            Assert.Equal(entity.RequestedEndTime, result.RequestedTime.End);
        }
        public override ValidationResult Validate(SessionRequestDto entity)
        {
            var validation = base.Validate(entity);

            if (validation.Errors.Any())
            {
                return(validation);
            }

            var session = _repository.GetOpenSessions(entity.ModuleId).ToList();

            if (session.Count == 0)
            {
                validation.Errors.Add("No open session found!");
            }

            return(validation);
        }
コード例 #12
0
ファイル: RoomsController.cs プロジェクト: meutley/ISTS
        public async Task <IActionResult> RequestSession(Guid id, [FromBody] DateRangeDto requestedTime)
        {
            var room = await _roomService.GetAsync(id);

            if (room == null)
            {
                return(NotFound());
            }

            var model = new SessionRequestDto
            {
                RoomId           = room.Id,
                RequestingUserId = UserId.Value,
                RequestedTime    = requestedTime
            };

            model.RequestedTime?.ConvertToUtc(UserTimeZone.Name);
            var request = await _roomService.RequestSessionAsync(model);

            return(Ok(request));
        }