Example #1
0
        public async Task AddStudentToGroupAsync(StudentGroupModel studentGroupModel)
        {
            var dbStudent = await _unitOfWork.StudentRepository.GetAsync(x => x.Id == studentGroupModel.StudentId, includeProperties : nameof(DbStudent.Group));

            if (dbStudent == null)
            {
                throw new NotFoundException(typeof(DbStudent), studentGroupModel.StudentId);
            }

            var existingStudentGroup = dbStudent.Group.FirstOrDefault(x => x.Id == studentGroupModel.GroupId);

            if (existingStudentGroup != null)
            {
                throw new InvalidOperationException("Student is already in this group.");
            }
            ;

            var dbGroup = await _unitOfWork.GroupRepository.FindByIdAsync(studentGroupModel.GroupId);

            if (dbGroup == null)
            {
                throw new NotFoundException(typeof(DbGroup), studentGroupModel.GroupId);
            }

            dbStudent.Group.Add(dbGroup);

            await _unitOfWork.StudentRepository.UpdateAsync(dbStudent);
        }
Example #2
0
        public async Task RemoveStudentFromGroupAsync(StudentGroupModel studentGroupModel)
        {
            var dbStudent = await _unitOfWork.StudentRepository.GetAsync(x => x.Id == studentGroupModel.StudentId, includeProperties : nameof(DbStudent.Group));

            if (dbStudent == null)
            {
                throw new NotFoundException(typeof(DbStudent), studentGroupModel.StudentId);
            }

            dbStudent.Group.RemoveAll(x => x.Id == studentGroupModel.GroupId);

            await _unitOfWork.StudentRepository.UpdateAsync(dbStudent);
        }
        public IActionResult Index(int count, string messages)
        {
            List <int>    canSendMessagesList;
            List <string> response = new List <string>();

            // Распарсим строку в список.
            try
            {
                canSendMessagesList = messages.Split(' ').Select(x => int.Parse(x)).ToList();
            }
            catch (Exception e)
            {
                response.Add($"Неправильная последовательность чисел: {messages}." +
                             $"Ошибка: {e.Message}");
                return(View());
            }


            // Текущая группа студентов.
            var studentGroupModel = new StudentGroupModel
            {
                StudentsCount      = count,
                AllMessagesCounter = 0,
                StudentsList       = new List <StudentModel>()
            };

            var results = new List <ValidationResult>();
            var context = new ValidationContext(studentGroupModel);

            // Проверяем правильность данных введеннх пользователем.
            if (!Validator.TryValidateObject(studentGroupModel, context, results, true))
            {
                string err = string.Empty;
                foreach (var error in results)
                {
                    err += $" {error.ErrorMessage} ";
                }
                response.Add(err);
                return(View());
            }

            // Создадим студентов внутри группы.
            for (int i = 0; i < studentGroupModel.StudentsCount; i++)
            {
                studentGroupModel.StudentsList.Add(new StudentModel());
                studentGroupModel.StudentsList[i].CanSendMessagesCount = canSendMessagesList[i];
                studentGroupModel.StudentsList[i].Index = i + 1;
            }

            // Поликарп первым узнал новость.
            studentGroupModel.StudentsList[0].IsGetMessage = true;

            // Сортируем студентов по убыванию количества сообщений, которые они могут послать.
            // Для того, чтобы все студенты могли получить сообщения.
            var sortedList = studentGroupModel.StudentsList.
                             OrderByDescending(o => o.CanSendMessagesCount).
                             ToList().Where(o => o != studentGroupModel.StudentsList[0]).Select(o => o);

            var studentModels = new List <StudentModel>();

            studentModels.Add(studentGroupModel.StudentsList[0]);
            studentModels.AddRange(sortedList.ToList());

            List <StudentModel> ls = sortedList.ToList();

            // Отправка студентами, знающими о зачете, сообщений
            // другим студентам, не знающим о зачете.
            // Проходим циклом по всем студентам.
            for (int i = 0; i < studentModels.Count; i++)
            {
                // Каждый студент отправляет сообщений не больше, чем позволяет его социофобия (ai).
                for (int j = 0;
                     studentModels[i].CanSendMessagesCount != studentModels[i].SentMessagesCount;
                     j++)
                {
                    // Если студент не получал сообщение, то
                    // он его и не может отправить другим.
                    if (!studentModels[i].IsGetMessage)
                    {
                        break;
                    }

                    try
                    {
                        // Отправка сообщения, если студент не получил сообщение.
                        if (!studentModels[i + 1 + j].IsGetMessage)
                        {
                            studentModels[i + 1 + j].IsGetMessage = true;
                            studentModels[i].SentMessagesCount++;

                            response.Add($"{studentModels[i].Index} - {studentModels[i + 1 + j].Index}");
                            studentGroupModel.AllMessagesCounter++;
                        }
                    }
                    catch
                    {
                        break;
                    }
                }
            }

            response.Add($"Всего сообщений отправлено: {studentGroupModel.AllMessagesCounter}");

            // Если невозможно сообщить всем студентам об экзамене.
            foreach (var st in studentModels)
            {
                if (!st.IsGetMessage)
                {
                    response.Clear();
                    response.Add($"-1");
                    response.Add($"Сообщений отправлено: {studentGroupModel.AllMessagesCounter}");
                    response.Add($"Студентов: {studentGroupModel.StudentsCount}");
                }
            }
            ViewData.Add("Response", response);
            return(View());
        }
Example #4
0
        public async Task <IActionResult> RemoveStudentFromGroup(StudentGroupModel studentGroupModel)
        {
            await _studentsService.RemoveStudentFromGroupAsync(studentGroupModel);

            return(NoContent());
        }
Example #5
0
        public async Task <IActionResult> AddStudentToGroup(StudentGroupModel studentGroupModel)
        {
            await _studentsService.AddStudentToGroupAsync(studentGroupModel);

            return(NoContent());
        }