Пример #1
0
        public async Task CancelExchangeTest()
        {
            IMongoDatabase      database           = _mongoFixture.MongoClient.GetDatabase("StudentsDB");
            StudentService      studentSrv         = new StudentService(database);
            BlockChangesService blockChangeService = new BlockChangesService(database);
            var           options             = GetProxyOptions();
            var           schoolScheduleProxy = new SchoolScheduleProxy(options);
            var           schoolCourseProxy   = new SchoolCourseProxy(options);
            CourseService courseService       = new CourseService(_loggerMockCourse.Object, database, schoolScheduleProxy, schoolCourseProxy);

            Course course = await CreateAndAddCourse("Programovanie", "11111", courseService);

            Block block1 = CreateBlock(BlockType.Laboratory, Day.Monday, 2, 7, course.Id);
            Block block2 = CreateBlock(BlockType.Laboratory, Day.Wednesday, 2, 10, course.Id);
            Block block3 = CreateBlock(BlockType.Laboratory, Day.Wednesday, 2, 8, course.Id);

            Student student = new Student();
            await studentSrv.AddAsync(student);

            BlockChangeRequest blockToChange  = CreateBlockChangeRequest(block2, block1, student.Id);
            BlockChangeRequest blockToChange1 = CreateBlockChangeRequest(block3, block1, student.Id);

            (await blockChangeService.AddAndFindMatch(blockToChange)).Should().Be((null, null));
            (await blockChangeService.AddAndFindMatch(blockToChange1)).Should().Be((null, null));

            blockChangeService.FindWaitingStudentRequests(student.Id).Result.Count.Should().Be(2);
            (await blockChangeService.CancelExchangeRequest(blockToChange1)).Should().Be(true);
            blockChangeService.FindWaitingStudentRequests(student.Id).Result.Count.Should().Be(1);
        }
Пример #2
0
 private async Task SetDoneStatus(BlockChangeRequest request)
 {
     if (request.Status == ExchangeStatus.Done)
     {
         await new Task(() => { throw new ArgumentException("You cannot exchange requests which are already exchanged!"); });
     }
     request.Status = ExchangeStatus.Done;
     await _blockChangesCollection.ReplaceOneAsync(x => x.Id == request.Id, request);
 }
Пример #3
0
 private async Task RemoveStudentRequests(BlockChangeRequest request)
 {
     await _blockChangesCollection.DeleteManyAsync(x => x.StudentId == request.StudentId &&
                                                   x.BlockFrom.CourseId == request.BlockFrom.CourseId &&
                                                   x.BlockFrom.StartHour == request.BlockFrom.StartHour &&
                                                   x.BlockFrom.Day == request.BlockFrom.Day &&
                                                   x.BlockFrom.Duration == request.BlockFrom.Duration &&
                                                   x.Status == ExchangeStatus.WaitingForExchange);
 }
Пример #4
0
        public async Task <IActionResult> CancelExchangeRequest([FromBody] BlockChangeRequest request)
        {
            var response = await _blockChangesService.CancelExchangeRequest(request);

            if (response)
            {
                return(Ok(response));
            }
            return(ErrorResponse($"Cannot cancel request from student {request.StudentId} because it was changed"));
        }
Пример #5
0
        private BlockChangeRequest CreateBlockChangeRequest(Block blockFrom, Block blockTo, Guid studentId)
        {
            BlockChangeRequest blockToChange = new BlockChangeRequest();

            blockToChange.DateOfCreation = DateTime.Now;
            blockToChange.BlockFrom      = blockFrom.Clone();
            blockToChange.BlockTo        = blockTo.Clone();
            blockToChange.StudentId      = studentId;
            return(blockToChange);
        }
Пример #6
0
 private async Task <BlockChangeRequest> FindExchange(BlockChangeRequest blockRequest)
 {
     return(await _blockChangesCollection.Find(
                x => (x.BlockTo.CourseId == blockRequest.BlockFrom.CourseId &&
                      x.BlockTo.Day == blockRequest.BlockFrom.Day &&
                      x.BlockTo.Duration == blockRequest.BlockFrom.Duration &&
                      x.BlockTo.StartHour == blockRequest.BlockFrom.StartHour &&
                      x.BlockFrom.CourseId == blockRequest.BlockTo.CourseId &&
                      x.BlockFrom.Day == blockRequest.BlockTo.Day &&
                      x.BlockFrom.Duration == blockRequest.BlockTo.Duration &&
                      x.BlockFrom.StartHour == blockRequest.BlockTo.StartHour &&
                      x.StudentId != blockRequest.StudentId &&
                      x.Status != ExchangeStatus.Done)).SortBy(x => x.DateOfCreation).FirstOrDefaultAsync());
 }
Пример #7
0
        public async Task <bool> CancelExchangeRequest(BlockChangeRequest request)
        {
            BlockChangeRequest a = null;

            if (request.Status == ExchangeStatus.WaitingForExchange)
            {
                a = await _blockChangesCollection.FindOneAndDeleteAsync(
                    x => x.StudentId == request.StudentId &&
                    x.BlockFrom.CourseId == request.BlockFrom.CourseId &&
                    x.BlockFrom.StartHour == request.BlockFrom.StartHour &&
                    x.BlockFrom.Day == request.BlockFrom.Day &&
                    x.BlockFrom.Duration == request.BlockFrom.Duration &&
                    x.Status == request.Status);
            }
            return(a != null);
        }
Пример #8
0
        public async Task <IActionResult> ExchangeConfirm([FromBody] ExchangeRequestModel request)
        {
            try
            {
                var blockChangeRequest = new BlockChangeRequest();
                blockChangeRequest.BlockFrom      = BlockForExchangeModel.ConvertToBlock(request.BlockFrom);
                blockChangeRequest.BlockTo        = BlockForExchangeModel.ConvertToBlock(request.BlockTo);
                blockChangeRequest.Status         = ExchangeStatus.WaitingForExchange;
                blockChangeRequest.DateOfCreation = DateTime.Now;
                blockChangeRequest.StudentId      = Guid.Parse(request.StudentId);

                var res = await _blockChangesService.AddAndFindMatch(blockChangeRequest);

                if (res != (null, null))
                {
                    var student1 = await _studentService.FindByIdAsync(res.Item1.StudentId);

                    student1.Timetable.RemoveBlock(res.Item1.BlockFrom.BlockId);
                    student1.Timetable.AddNewBlock(res.Item1.BlockTo.Clone());
                    await _studentService.UpdateStudentAsync(student1);

                    var user1 = await _userService.GetUserByIdAsync(student1.UserId.ToString());

                    if (user1 == null)
                    {
                        string message = $"Cannot find user with ID {res.Item1.StudentId}.";
                        _logger.LogError(message);
                        return(NotFound(message));
                    }

                    var student2 = await _studentService.FindByIdAsync(res.Item2.StudentId);

                    student2.Timetable.RemoveBlock(res.Item2.BlockFrom.BlockId);
                    student2.Timetable.AddNewBlock(res.Item2.BlockTo.Clone());
                    await _studentService.UpdateStudentAsync(student2);

                    var user2 = await _userService.GetUserByIdAsync(student2.UserId.ToString());

                    if (user2 == null)
                    {
                        string message = $"Cannot find user with ID {res.Item2.StudentId}.";
                        _logger.LogError(message);
                        return(NotFound(message));
                    }

                    string callbackUrl1 = new Uri(_baseUrl, $@"getStudentTimetable/{user1.Email}").ToString();
                    string callbackUrl2 = new Uri(_baseUrl, $@"getStudentTimetable/{user2.Email}").ToString();

                    if (!_emailService.SendConfirmationEmail(user1.Email, callbackUrl1, "ConfirmExchangeEmail"))
                    {
                        string message = $"Error when sending confirmation email to user {user1.Email}.";
                        _logger.LogError(message);
                    }

                    if (!_emailService.SendConfirmationEmail(user2.Email, callbackUrl2, "ConfirmExchangeEmail"))
                    {
                        string message = $"Error when sending confirmation email to user {user2.Email}.";
                        _logger.LogError(message);
                    }
                    return(Ok(res));
                }
                return(Ok(null));
            }
            catch
            {
                string message = $"Error when creating block change request";
                _logger.LogError(message);
                return(ErrorResponse(message));
            }
        }
Пример #9
0
        public async Task ExchangeRequests_ExchangingRequests_ExchangedRequests()
        {
            IMongoDatabase      database           = _mongoFixture.MongoClient.GetDatabase("StudentsDB");
            StudentService      studentSrv         = new StudentService(database);
            BlockChangesService blockChangeService = new BlockChangesService(database);
            var           options             = GetProxyOptions();
            var           schoolScheduleProxy = new SchoolScheduleProxy(options);
            var           schoolCourseProxy   = new SchoolCourseProxy(options);
            CourseService courseService       = new CourseService(_loggerMockCourse.Object, database, schoolScheduleProxy, schoolCourseProxy);

            Course course = await CreateAndAddCourse("Programovanie", "11111", courseService);

            Course course2 = await CreateAndAddCourse("Programovanie", "11111", courseService);


            Block block1 = CreateBlock(BlockType.Laboratory, Day.Monday, 2, 7, course.Id);
            Block block2 = CreateBlock(BlockType.Laboratory, Day.Wednesday, 2, 10, course.Id);
            Block block3 = CreateBlock(BlockType.Laboratory, Day.Tuesday, 2, 15, course.Id);
            Block block4 = CreateBlock(BlockType.Laboratory, Day.Friday, 2, 18, course2.Id);

            Student student1 = new Student();
            Student student2 = new Student();
            Student student3 = new Student();
            await studentSrv.AddAsync(student1);

            await studentSrv.AddAsync(student2);

            await studentSrv.AddAsync(student3);

            BlockChangeRequest blockToChange1 = CreateBlockChangeRequest(block1, block2, student1.Id);
            BlockChangeRequest blockToChange2 = CreateBlockChangeRequest(block1, block3, student1.Id);
            BlockChangeRequest blockToChange3 = CreateBlockChangeRequest(block1, block2, student2.Id);
            BlockChangeRequest blockToChange4 = CreateBlockChangeRequest(block1, block3, student2.Id);
            BlockChangeRequest blockToChange5 = CreateBlockChangeRequest(block4, block2, student3.Id);
            BlockChangeRequest blockToChange  = CreateBlockChangeRequest(block2, block1, student3.Id);
            ValueTuple <BlockChangeRequest, BlockChangeRequest> result = new ValueTuple <BlockChangeRequest, BlockChangeRequest>();

            result = (null, null);
            (await blockChangeService.AddAndFindMatch(blockToChange1)).Should().Equals(result);
            (await blockChangeService.AddAndFindMatch(blockToChange2)).Should().Equals(result);
            (await blockChangeService.AddAndFindMatch(blockToChange3)).Should().Equals(result);
            (await blockChangeService.AddAndFindMatch(blockToChange4)).Should().Equals(result);
            (await blockChangeService.AddAndFindMatch(blockToChange5)).Should().Equals(result);

            result = (blockToChange, blockToChange1);
            (await blockChangeService.AddAndFindMatch(blockToChange)).Should().Equals(result);

            blockChangeService.FindAllStudentRequests(student1.Id).Result.Count.Should().Be(1);
            blockChangeService.FindAllStudentRequests(student2.Id).Result.Count.Should().Be(2);
            blockChangeService.FindAllStudentRequests(student3.Id).Result.Count.Should().Be(2);

            blockChangeService.FindWaitingStudentRequests(student1.Id).Result.Count.Should().Be(0);
            blockChangeService.FindWaitingStudentRequests(student2.Id).Result.Count.Should().Be(2);
            blockChangeService.FindWaitingStudentRequests(student3.Id).Result.Count.Should().Be(1);

            BlockChangeRequest blockToChange6 = CreateBlockChangeRequest(block3, block2, student1.Id);

            (await blockChangeService.AddAndFindMatch(blockToChange6)).Should().Be((null, null));
            blockChangeService.FindWaitingStudentRequests(student1.Id).Result.Count.Should().Be(1);
            blockChangeService.FindWaitingStudentRequests(student2.Id).Result.Count.Should().Be(2);
            blockChangeService.FindWaitingStudentRequests(student3.Id).Result.Count.Should().Be(1);
        }
Пример #10
0
 public static SuccessfulExchangeNotification Create(BlockChangeRequest requestOfUserToNotify,
                                                     BlockChangeRequest requestOfOtherUser)
 {
     return(new SuccessfulExchangeNotification(requestOfUserToNotify.StudentId, requestOfUserToNotify.Id));
 }
Пример #11
0
        private async Task <(BlockChangeRequest, BlockChangeRequest)> MakeExchangeAndDeleteRequests(BlockChangeRequest request)
        {
            var requestForExchange = await FindExchange(request);

            if (requestForExchange == null)
            {
                return(null, null);
            }
            await SetDoneStatus(request);
            await SetDoneStatus(requestForExchange);
            await RemoveStudentRequests(request);
            await RemoveStudentRequests(requestForExchange);

            return(request, requestForExchange);
        }
Пример #12
0
 private async Task AddAsync(BlockChangeRequest entityToAdd)
 {
     entityToAdd.Id = Guid.NewGuid();
     await _blockChangesCollection.InsertOneAsync(entityToAdd);
 }
Пример #13
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="blockChangeRequest"></param>
        /// <returns>bool value if corresponding second BlockChangeRequest was found and the found BlockChangeRequest</returns>
        public async Task <(BlockChangeRequest, BlockChangeRequest)> AddAndFindMatch(BlockChangeRequest blockChangeRequest)
        {
            await AddAsync(blockChangeRequest);

            return(await MakeExchangeAndDeleteRequests(blockChangeRequest));
        }