Advertisement
Guest User

Untitled

a guest
Mar 29th, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 20.10 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Data.Entity;
  4. using System.Data.Entity.Infrastructure;
  5. using System.Data.Entity.Migrations;
  6. using System.Linq;
  7. using System.Net;
  8. using System.Net.Http;
  9. using System.Threading.Tasks;
  10. using System.Web;
  11. using System.Web.Http;
  12. using System.Web.Http.Description;
  13. using Dyntell.OnlineExam.Controllers.Model;
  14. using Dyntell.OnlineExam.DAL;
  15. using Dyntell.OnlineExam.DAL.ExamQuestions;
  16. using Dyntell.OnlineExam.DAL.Exams;
  17. using Dyntell.OnlineExam.DAL.Migrations;
  18. using Dyntell.OnlineExam.DAL.Models.Account.Identity;
  19. using Dyntell.OnlineExam.DAL.Questions;
  20. using Dyntell.OnlineExam.Enums;
  21. using Dyntell.OnlineExam.Models.Email;
  22. using Dyntell.OnlineExam.Models.QueryFilter;
  23. using Microsoft.AspNet.Identity;
  24. using Microsoft.AspNet.Identity.Owin;
  25. using Quartz.Util;
  26. using Dyntell.OnlineExam.Services;
  27.  
  28. namespace Dyntell.OnlineExam.Controllers.API
  29. {
  30.     class ExamResponse
  31.     {
  32.         public List<ExamModel> Exams { get; set; }
  33.         public int TotalCount { get; set; }
  34.     }
  35.  
  36.     [Authorize(Roles = "Admin, Examinee, Examiner")]
  37.     [RoutePrefix("api/Exam")]
  38.     public class ExamController : ApiController
  39.     {
  40.         private static List<int> _questionIds = new List<int>();
  41.         private static DateTime _staticDate = new DateTime(2000,1,1);
  42.  
  43.         private readonly IOnlineExamContext _dbContext;
  44.         private readonly IExamQuestionService _examQuestionService;
  45.         private readonly IQuestionService _questionService;
  46.         private readonly EmailService _emailService = new EmailService();
  47.  
  48.         public ExamController(IOnlineExamContext dbContext
  49.             , IExamQuestionService examQuestionService
  50.             , IQuestionService questionService
  51.             )
  52.         {
  53.             _dbContext = dbContext;
  54.             _examQuestionService = examQuestionService;
  55.             _questionService = questionService;
  56.         }
  57.  
  58.         // GET: api/Exam
  59.         [System.Web.Http.HttpPost]
  60.         [Route("ExamQueryFilter")]
  61.         [ResponseType(typeof(ExamResponse))]
  62.         public async Task<IHttpActionResult> GetExams(ExamQueryFilter examQueryFilter)
  63.         {
  64.             var userId = User.Identity.GetUserId();
  65.             var userManager = Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
  66.             var role = userManager.GetRolesAsync(userId).Result.FirstOrDefault();
  67.             if (role == "Admin")
  68.             {
  69.                 /*var exams = _dbContext.Exams
  70.                     .Include(e => e.User)
  71.                     .Include(e => e.CreatedBy).OrderByDescending(e => e.Created)
  72.                     .ToList();*/
  73.                 //TODO ezt valahogy meg kellene csinálni hogy csak a szükséges cloumokat includálja LZS
  74.                 var exams = _dbContext.Exams.Select(e =>
  75.                     new ExamModel()
  76.                     {
  77.                         ID = e.ID,
  78.                         Activated = e.Activated,
  79.                         Attempt = e.Attempt,
  80.                         Auto = e.Auto,
  81.                         BrakeTime = e.BrakeTime,
  82.                         Break = e.Break,
  83.                         Count = e.Count,
  84.                         Created = e.Created,
  85.                         CreatedBy = null,
  86.                         Duration = e.Duration,
  87.                         CreatedById = e.CreatedById,
  88.                         ExamDate = e.ExamDate,
  89.                         Repeatable = e.Repeatable,
  90.                         Status = e.Status,
  91.                         User = null,
  92.                         UserId = e.UserId,
  93.                         Title = e.Title,
  94.                         TotalScore = e.TotalScore,
  95.                         TotalTimeUsed = e.TotalTimeUsed,
  96.                         LastOrder = e.LastOrder
  97.                     }).ToList();
  98.  
  99.                 foreach (var exam in exams)
  100.                 {
  101.                     exam.User = _dbContext.Users.FirstOrDefault(u => u.Id == exam.UserId);
  102.                     exam.CreatedBy = _dbContext.Users.FirstOrDefault(u => u.Id == exam.CreatedById);
  103.                 }
  104.  
  105.                 exams = FilterExams(exams, examQueryFilter);
  106.                 var totalCount = exams.Count;
  107.  
  108.                 exams = OrderExams(exams, examQueryFilter.ExamOrder, examQueryFilter.IsReverse);
  109.                 exams = exams.Skip((examQueryFilter.PageIndex - 1) * examQueryFilter.PageSize).Take(examQueryFilter.PageSize).ToList();
  110.                 return Ok(new ExamResponse() {Exams = exams.ToList(), TotalCount = totalCount});
  111.             }
  112.             else
  113.             {
  114.                 /*var exams = _dbContext.Exams.Where(e => e.CreatedById == userId)
  115.                     .Include(e => e.User)
  116.                     .Include(e => e.CreatedBy).OrderByDescending(e => e.Created)
  117.                     .ToList();*/
  118.                 //TODO ezt valahogy meg kellene csinálni hogy csak a szükséges cloumokat includálja LZS
  119.                 var exams = _dbContext.Exams.Select(e =>
  120.                     new ExamModel()
  121.                     {
  122.                         ID = e.ID,
  123.                         Activated = e.Activated,
  124.                         Attempt = e.Attempt,
  125.                         Auto = e.Auto,
  126.                         BrakeTime = e.BrakeTime,
  127.                         Break = e.Break,
  128.                         Count = e.Count,
  129.                         Created = e.Created,
  130.                         CreatedBy = null,
  131.                         Duration = e.Duration,
  132.                         CreatedById = e.CreatedById,
  133.                         ExamDate = e.ExamDate,
  134.                         Repeatable = e.Repeatable,
  135.                         Status = e.Status,
  136.                         User = null,
  137.                         UserId = e.UserId,
  138.                         Title = e.Title,
  139.                         TotalScore = e.TotalScore,
  140.                         TotalTimeUsed = e.TotalTimeUsed,
  141.                         LastOrder = e.LastOrder
  142.                     }).Where(e => e.CreatedById == userId).ToList();
  143.  
  144.                 foreach (var exam in exams)
  145.                 {
  146.                     exam.User = _dbContext.Users.FirstOrDefault(u => u.Id == exam.UserId);
  147.                     exam.CreatedBy = _dbContext.Users.FirstOrDefault(u => u.Id == exam.CreatedById);
  148.                 }
  149.  
  150.                 var totalCount = exams.Count;
  151.  
  152.                 exams = FilterExams(exams, examQueryFilter);
  153.                 exams = OrderExams(exams, examQueryFilter.ExamOrder, examQueryFilter.IsReverse);
  154.                 exams = exams.Skip((examQueryFilter.PageIndex - 1) * examQueryFilter.PageSize).Take(examQueryFilter.PageSize).ToList();
  155.                 return Ok(new ExamResponse() { Exams = exams.ToList(), TotalCount = totalCount });
  156.             }
  157.         }
  158.  
  159.         // GET: api/Exam/5
  160.         [ResponseType(typeof(Exam))]
  161.         public async Task<IHttpActionResult> GetExam(Guid id)
  162.         {
  163.             Exam exam = await _dbContext.Exams.Where(e => e.ID == id).FirstOrDefaultAsync();
  164.  
  165.             if (exam == null)
  166.             {
  167.                 return NotFound();
  168.             }
  169.            
  170.             return Ok(exam);
  171.         }
  172.  
  173.         // PUT: api/Exam/5
  174.         [ResponseType(typeof(void))]
  175.         public async Task<IHttpActionResult> PutExam(Guid id, Exam exam)
  176.         {
  177.             if (!ModelState.IsValid)
  178.             {
  179.                 return BadRequest(ModelState);
  180.             }
  181.  
  182.             if (id != exam.ID)
  183.             {
  184.                 return BadRequest();
  185.             }
  186.             /*var questions = _dbContext.ExamQuestions.Where(e => e.Exam.ID == id);
  187.  
  188.             int timeUsedMinutes=0;
  189.             int timeUsedSeconds=0;
  190.             //exam.TotalTimeUsed
  191.             foreach (var q in questions)
  192.             {
  193.                 timeUsedMinutes += q.TimeUsed.Minutes;
  194.                 timeUsedSeconds += q.TimeUsed.Seconds;
  195.             }
  196.            
  197.             exam.TotalTimeUsed = new TimeSpan(0, timeUsedMinutes, timeUsedSeconds);
  198.             */
  199.             _dbContext.Exams.AddOrUpdate(exam);
  200.            
  201.             try
  202.             {
  203.                 await _dbContext.SaveChangesAsync();
  204.             }
  205.             catch (DbUpdateConcurrencyException)
  206.             {
  207.                 if (!ExamExists(id))
  208.                 {
  209.                     return NotFound();
  210.                 }
  211.                 else
  212.                 {
  213.                     throw;
  214.                 }
  215.             }
  216.  
  217.             return StatusCode(HttpStatusCode.NoContent);
  218.         }
  219.  
  220.         // POST: api/Exam
  221.         [ResponseType(typeof(Exam))]
  222.         public async Task<IHttpActionResult> PostExam(Exam exam)
  223.         {
  224.             if (!ModelState.IsValid)
  225.             {
  226.                 return BadRequest(ModelState);
  227.             }
  228.  
  229.             var createdBy = _dbContext.Users.FirstOrDefault(u => u.UserName == exam.CreatedById);
  230.             var candidate = _dbContext.Users.FirstOrDefault(u => u.Id == exam.UserId);
  231.  
  232.             exam.CreatedBy = createdBy;
  233.             exam.CreatedById = createdBy.Id;
  234.             exam.User = candidate;
  235.             exam.UserId = candidate.Id;
  236.             exam.ExamDate = exam.ExamDate.ToLocalTime();
  237.             exam.ID = Guid.NewGuid();
  238.             exam.Attempt = 3;
  239.             exam.LastOrder = 1;
  240.             exam.BrakeTime = new TimeSpan(0,30,0);
  241.  
  242.             _dbContext.Exams.Add(exam);
  243.             await _dbContext.SaveChangesAsync();
  244.             try
  245.             {
  246.                 //  A selectedmodules alapján a generálás elvégzése és a generált vizsgakérdések db-be mentése
  247.                 var examQuestions = new ExamGenerator(_questionService,_dbContext).GenerateExamQuestions(exam);
  248.                 if (exam.Created != _staticDate)
  249.                 {
  250.  
  251.                 }
  252.                 else
  253.                 {
  254.                     var counter = 1;
  255.                     examQuestions = new List<ExamQuestion>();
  256.                     var questions = _dbContext.ExamQuestions.Include(q => q.Module).Include(q => q.Choices);
  257.                     foreach (var id in _questionIds)
  258.                     {
  259.                         var question = _dbContext.ExamQuestions.Include(q => q.Module).Include(q => q.Choices).Where(q => q.ID == id).FirstOrDefault();
  260.                         var module = _dbContext.Modules.Where(m => m.ID == question.Module.ID).FirstOrDefault();
  261.                         var choices = _dbContext.Choices.Include(c => c.ExamQuestion).Where(c => c.ExamQuestion.ID == question.ID).ToList();
  262.                        
  263.                         examQuestions.Add(Convert(question, exam));
  264.                     }
  265.                 }
  266.  
  267.                 var examLengthSum = examQuestions.Sum(e => e.Duration.TotalSeconds);
  268.                 if (examLengthSum > exam.Duration.TotalSeconds || exam.Duration.TotalSeconds <= 0)
  269.                 {
  270.                     throw new InvalidOperationException("Kérdések idejének összhossza meghaladja a teljes vizsga idejét");
  271.                 }
  272.  
  273.                 //ezt valahogy belekellene irni a exam generatorba
  274.                 int i = 1;
  275.                 foreach (var examQuestion in examQuestions)
  276.                 {
  277.                     examQuestion.Order=i;
  278.                     i++;
  279.                     if (examQuestion.QuestionType == 0) exam.Auto = false;
  280.                 }
  281.                 //
  282.                 exam.Count = examQuestions.Count;
  283.                 if (examQuestions.Count > 0)
  284.                 {
  285.                     _dbContext.ExamQuestions.AddRange(examQuestions);
  286.                     exam.TotalTimeUsed = new TimeSpan(examQuestions.Sum(x => x.Duration.Ticks));
  287.                     exam.Duration = new TimeSpan(examQuestions.Sum(x => x.Duration.Ticks));
  288.                     _dbContext.Entry(exam).State = EntityState.Modified;
  289.                     await _dbContext.SaveChangesAsync();
  290.                     if (exam.Created != _staticDate)
  291.                     {
  292.                         _staticDate = exam.Created;
  293.                         _questionIds = new List<int>();
  294.                         foreach (var eq in examQuestions)
  295.                         {
  296.                             _questionIds.Add(eq.ID);
  297.                         }
  298.                     }
  299.                 }
  300.                
  301.             }
  302.             catch (DbUpdateException)
  303.             {
  304.                 if (ExamExists(exam.ID))
  305.                 {
  306.                     return Conflict();
  307.                 }
  308.                 throw;
  309.             }
  310.             catch (InvalidOperationException ex)
  311.             {
  312.                 _dbContext.Exams.Remove(exam);
  313.                 await _dbContext.SaveChangesAsync();
  314.                 return BadRequest(ex.Message);
  315.             }
  316.             if (_dbContext.EmailNotifications.Where(n => n.Period == 0).FirstOrDefault().IsActive)
  317.             {
  318.                 Email email = new Email()
  319.                 {
  320.                     From = "dyntellonlineexam@gmail.com",
  321.                     To = exam.User.Email,
  322.                     Host = "smtp.gmail.com",
  323.                     Password = "AdminEbv3fv",
  324.                     Subject = _emailService.GetCreatedMailSubject(),
  325.                     Body = _emailService.GetCreatedEmailBody(exam.User.Name, exam.Title, exam.ExamDate, exam.CreatedBy.Name, exam.Duration)
  326.                 };
  327.                 _emailService.SendEmail(email);
  328.             }
  329.             return CreatedAtRoute("DefaultApi", new { id = exam.ID }, exam);
  330.         }
  331.  
  332.         // DELETE: api/Exam/5
  333.         [ResponseType(typeof(Exam))]
  334.         public async Task<IHttpActionResult> DeleteExam(Guid id)
  335.         {
  336.             Exam exam = await _dbContext.Exams.FindAsync(id);
  337.             var examinee = _dbContext.Users.Where(u => u.Id == exam.UserId).Select(u => new {u.Name, u.Email}).FirstOrDefault();
  338.             if (exam == null)
  339.             {
  340.                 return NotFound();
  341.             }
  342.  
  343.             _dbContext.Exams.Remove(exam);
  344.             await _dbContext.SaveChangesAsync();
  345.  
  346.             Email email = new Email()
  347.             {
  348.                 From = "dyntellonlineexam@gmail.com",
  349.                 To = examinee.Email,
  350.                 Host = "smtp.gmail.com",
  351.                 Password = "AdminEbv3fv",
  352.                 Subject = _emailService.GetDeletedMailSubject(),
  353.                 Body = _emailService.GetDeletedEmailBody(examinee.Name, exam.Title, exam.ExamDate)
  354.             };
  355.             _emailService.SendEmail(email);
  356.             return Ok(exam);
  357.         }
  358.  
  359.         protected override void Dispose(bool disposing)
  360.         {
  361.             if (disposing)
  362.             {
  363.                 _dbContext.Dispose();
  364.             }
  365.             base.Dispose(disposing);
  366.         }
  367.  
  368.         private bool ExamExists(Guid id)
  369.         {
  370.             return _dbContext.Exams.Count(e => e.ID == id) > 0;
  371.         }
  372.  
  373.         private ExamQuestion Convert(ExamQuestion question, Exam exam)
  374.         {
  375.             var list = question.Choices;
  376.             if (question.Choices != null)
  377.             {
  378.                 list = new List<Choice>();
  379.                 foreach (var choice in question.Choices)
  380.                 {
  381.                     list.Add(new Choice()
  382.                     {
  383.                         IsAnswer = choice.IsAnswer,
  384.                         Text = choice.Text,
  385.                         RightAnswer = choice.RightAnswer
  386.                     });
  387.                 }
  388.             }
  389.             return new ExamQuestion
  390.             {
  391.                 Module = _dbContext.Modules.Single(m => m.ID == question.Module.ID),
  392.                 Duration = question.Duration,
  393.                 Exam = exam,
  394.                 QuestionType = question.QuestionType,
  395.                 Text = question.Text,
  396.                 Weight = question.Weight,
  397.                 Order = question.Order,
  398.                 ImageUrl = question.ImageUrl,
  399.                 Choices = list,
  400.                 Comment = question.Comment,
  401.                 Justification = question.Justification
  402.             };
  403.         }
  404.  
  405.  
  406.         private List<ExamModel> OrderExams(List<ExamModel> exams, ExamOrderEnum orderBy, bool isReverse)
  407.         {
  408.             switch (orderBy)
  409.             {
  410.                 case ExamOrderEnum.Title:
  411.                     exams = isReverse ? exams.OrderBy(e => e.Title).ToList() : exams.OrderByDescending(e => e.Title).ToList();
  412.                     break;
  413.                 case ExamOrderEnum.ExaminerName:
  414.                     exams = isReverse ? exams.OrderBy(e => e.User.Name).ToList() : exams.OrderByDescending(e => e.User.Name).ToList();
  415.                     break;
  416.                 case ExamOrderEnum.ExamDate:
  417.                     exams = !isReverse ? exams.OrderBy(e => e.ExamDate).ToList() : exams.OrderByDescending(e => e.ExamDate).ToList();
  418.                     break;
  419.                 case ExamOrderEnum.Duration:
  420.                     exams = isReverse ? exams.OrderBy(e => e.Duration).ToList() : exams.OrderByDescending(e => e.Duration).ToList();
  421.                     break;
  422.                 case ExamOrderEnum.CreatedDate:
  423.                     exams = !isReverse ? exams.OrderBy(e => e.Created).ToList() : exams.OrderByDescending(e => e.Created).ToList();
  424.                     break;
  425.                 case ExamOrderEnum.CreatedBy:
  426.                     exams = isReverse ? exams.OrderBy(e => e.CreatedBy).ToList() : exams.OrderByDescending(e => e.CreatedBy).ToList();
  427.                     break;
  428.                 case ExamOrderEnum.IsActive:
  429.                     exams = isReverse ? exams.OrderBy(e => e.Activated).ToList() : exams.OrderByDescending(e => e.Activated).ToList();
  430.                     break;
  431.                 case ExamOrderEnum.TotalScore:
  432.                     exams = isReverse ? exams.OrderBy(e => e.TotalScore).ToList() : exams.OrderByDescending(e => e.TotalScore).ToList();
  433.                     break;
  434.                 case ExamOrderEnum.Status:
  435.                     exams = isReverse ? exams.OrderBy(e => e.Status).ToList() : exams.OrderByDescending(e => e.Status).ToList();
  436.                     break;
  437.                 case ExamOrderEnum.FullRemainingTime:
  438.                     exams = isReverse ? exams.OrderBy(e => e.TotalTimeUsed).ToList() : exams.OrderByDescending(e => e.TotalTimeUsed).ToList();
  439.                     break;
  440.             }
  441.             return exams;
  442.         }
  443.  
  444.         private List<ExamModel> FilterExams(List<ExamModel> exams, ExamQueryFilter examQueryFilter)
  445.         {
  446.             if (!examQueryFilter.TitleFilter.IsNullOrWhiteSpace())
  447.                 exams = exams.Where(e => e.Title.ToLower().Contains(examQueryFilter.TitleFilter.ToLower())).ToList();
  448.             if (!examQueryFilter.ExamineeFilter.IsNullOrWhiteSpace())
  449.                 exams = exams.Where(e => e.User.Name.ToLower().Contains(examQueryFilter.ExamineeFilter.ToLower())).ToList();
  450.             if (examQueryFilter.ExamDateFilter.HasValue)
  451.                 exams = exams.Where(e => e.ExamDate.Date == examQueryFilter.ExamDateFilter.Value.ToLocalTime().Date).ToList();
  452.             if (examQueryFilter.DurationFilter.HasValue)
  453.                 exams = exams.Where(q => q.Duration.Ticks == examQueryFilter.DurationFilter.Value.Ticks - 621355932000000000).ToList();
  454.             if (examQueryFilter.CreatedDateFilter.HasValue)
  455.                 exams = exams.Where(e => e.Created.Date == examQueryFilter.CreatedDateFilter.Value.ToLocalTime().Date).ToList();
  456.             if (!examQueryFilter.CreatedByFilter.IsNullOrWhiteSpace())
  457.                 exams = exams.Where(e => e.CreatedBy.Name.ToLower().Contains(examQueryFilter.CreatedByFilter.ToLower())).ToList();
  458.             if (examQueryFilter.IsActiveFilter.HasValue)
  459.                 exams = exams.Where(e => e.Activated == examQueryFilter.IsActiveFilter).ToList();
  460.             if (examQueryFilter.TotalScoreFilter.HasValue)
  461.                 exams = exams.Where(e => e.TotalScore == examQueryFilter.TotalScoreFilter).ToList();
  462.             if (!examQueryFilter.StatusFilter.IsNullOrWhiteSpace())
  463.                 exams = exams.Where(e => e.Status.ToLower().Contains(examQueryFilter.StatusFilter.ToLower())).ToList();
  464.             if (examQueryFilter.FullRemainingTimeFilter.HasValue)
  465.                 exams = exams.Where(e => e.TotalTimeUsed.Value.Ticks == examQueryFilter.FullRemainingTimeFilter.Value.Ticks - 621355932000000000).ToList();
  466.             return exams;
  467.         }
  468.     }
  469. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement