public IActionResult Update([FromBody] ExamRequest examRequest)
        {
            Exam exam = Mapper.Map <Exam>(examRequest);

            Exam updated = _examManager.UpdateExam(exam);

            ExamResponse response = Mapper.Map <Exam, ExamResponse>(updated);

            return(Ok(response));
        }
        public IActionResult Delete(int id)
        {
            Exam deletedExam = _examManager.DeleteExam(id);

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

            ExamResponse response = Mapper.Map <Exam, ExamResponse>(deletedExam);

            return(Ok(response));
        }
        public IActionResult Get(int id)
        {
            Exam exam = _examManager.GetExam(id);

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

            ExamResponse response = Mapper.Map <ExamResponse>(exam);

            return(Json(response));
        }
        public IActionResult Create(ExamRequest examRequest)
        {
            Exam exam = Mapper.Map <Exam>(examRequest);

            Exam examResult = _examManager.AddExam(exam);

            if (examResult == null)
            {
                return(BadRequest());
            }

            ExamResponse response = Mapper.Map <ExamResponse>(examResult);

            return(Ok(response));
        }
        public async Task <IActionResult> AddExamAsync([FromBody] ExamRequest examRequest)
        {
            ExamResponse examResponse = new ExamResponse();

            try
            {
                User user = await examRequest.GetRequestedUserAsync(_dbContext);

                Exam exam = examRequest.Exam;
                exam.Marks          = 0F;
                exam.LecturerUserId = user.Id;

                if (exam.Questions != null)
                {
                    foreach (Question q in exam.Questions)
                    {
                        if (q == null)
                        {
                            continue;
                        }

                        exam.Marks += q.Marks;
                    }
                }

                await _dbContext.Exams.AddAsync(exam);

                await _dbContext.SaveChangesAsync();

                examResponse.Exams = new List <Exam>()
                {
                    await _dbContext.Exams
                    .Include(e => e.LecturerUser)
                    .Include(e => e.Questions)
                    .SingleOrDefaultAsync(e => e.Id == exam.Id)
                };

                examResponse.IsSuccess = true;
            }
            catch (Exception ex)
            {
                examResponse.Message = ex.Message;
            }

            return(StatusCode(examResponse.Status, examResponse));
        }
        public async Task <IActionResult> UpdateExamAsync([FromBody] ExamRequest examRequest)
        {
            ExamResponse examResponse = new ExamResponse();

            try
            {
                User user = await examRequest.GetRequestedUserAsync(_dbContext);

                Exam updatedExam = examRequest.Exam;
                updatedExam.LecturerUserId = user.Id;

                Exam exam = await _dbContext.Exams
                            .FirstOrDefaultAsync(e => e.Id == updatedExam.Id);

                if (exam == null)
                {
                    throw new Exception("Exam not found");
                }

                exam.Name              = updatedExam.Name;
                exam.Description       = updatedExam.Description;
                exam.GivenTimeSeconds  = updatedExam.GivenTimeSeconds;
                exam.IsPublish         = updatedExam.IsPublish;
                exam.EffectiveDateTime = updatedExam.EffectiveDateTime;
                exam.ExpireDateTime    = updatedExam.ExpireDateTime;

                await _dbContext.SaveChangesAsync();

                examResponse.Exams = new List <Exam>()
                {
                    await _dbContext.Exams
                    .Include(e => e.LecturerUser)
                    .Include(e => e.Questions)
                    .SingleOrDefaultAsync(e => e.Id == exam.Id)
                };

                examResponse.IsSuccess = true;
            }
            catch (Exception ex)
            {
                examResponse.Message = ex.Message;
            }

            return(StatusCode(examResponse.Status, examResponse));
        }
        public async Task <IActionResult> GetAllExamsAsync()
        {
            ExamResponse examResponse = new ExamResponse();

            try
            {
                examResponse.Exams = await _dbContext.Exams
                                     .Include(e => e.LecturerUser)
                                     .ToListAsync();

                examResponse.IsSuccess = true;
            }
            catch (Exception ex)
            {
                examResponse.Message = ex.Message;
            }

            return(StatusCode(examResponse.Status, examResponse));
        }
        public async Task <IActionResult> GetAllPublishedExamsAsync()
        {
            ExamResponse examResponse = new ExamResponse();

            try
            {
                examResponse.Exams = await _dbContext.Exams
                                     .Include(e => e.LecturerUser)
                                     .Where(e => e.IsPublish && DateTime.Now >= e.EffectiveDateTime && DateTime.Now < e.ExpireDateTime)
                                     .ToListAsync();

                examResponse.IsSuccess = true;
            }
            catch (Exception ex)
            {
                examResponse.Message = ex.Message;
            }

            return(StatusCode(examResponse.Status, examResponse));
        }
        public async Task <IActionResult> GetExamByIdAsync(int id)
        {
            ExamResponse examResponse = new ExamResponse();

            try
            {
                examResponse.Exams = new List <Exam>()
                {
                    await _dbContext.Exams
                    .Include(e => e.LecturerUser)
                    .Include(e => e.Questions)
                    .SingleOrDefaultAsync(e => e.Id == id)
                };

                examResponse.IsSuccess = true;
            }
            catch (Exception ex)
            {
                examResponse.Message = ex.Message;
            }

            return(StatusCode(examResponse.Status, examResponse));
        }