PageRenderTime 44ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/Gradebook/Controllers/GradesController.cs

https://bitbucket.org/academium/gradebook
C# | 205 lines | 156 code | 41 blank | 8 comment | 21 complexity | ad55603162d5a2d0cb9b1029a953c35a MD5 | raw file
  1. using System.Security.Permissions;
  2. using AutoMapper;
  3. using Gradebook.Contracts;
  4. using Gradebook.ViewModels;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Net;
  9. using System.Net.Http;
  10. using System.Web.Http;
  11. namespace Gradebook.Controllers
  12. {
  13. public class GradesController : ApiControllerBase
  14. {
  15. public GradesController(IGradebookUow uow) : base(uow) { }
  16. // GET /api/grades
  17. [ActionName("Default")]
  18. public IEnumerable<ViewModels.TaskResult> Get(int? task, int? student = 0)
  19. {
  20. var grades = Unit.Grades.GetAll().AsEnumerable();
  21. if (task.HasValue)
  22. {
  23. if (!Unit.Tasks.Contains(task.Value))
  24. throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
  25. grades = Unit.Grades.GetAllByTask(task.Value);
  26. }
  27. if (student.HasValue && student != 0)
  28. {
  29. if (!Unit.Students.Contains(student.Value))
  30. throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
  31. grades = grades.Where(x => x.StudentId == student.Value);
  32. }
  33. var model = grades.Select(Mapper.Map<Model.Grade, ViewModels.TaskResult>).ToList();
  34. model.ForEach(x =>
  35. {
  36. if (Unit.Grades.Contains(x.TaskId, x.StudentId))
  37. {
  38. x.Rank = Unit.Grades.GetRank(x.TaskId, x.StudentId);
  39. x.Rate = Unit.Grades.GetRate(x.TaskId, x.StudentId);
  40. }
  41. });
  42. return model;
  43. }
  44. // GET /api/grades/{int}
  45. [ActionName("Default")]
  46. public ViewModels.Grade Get(int studentId, int taskId)
  47. {
  48. if (!Unit.Grades.Contains(taskId, studentId))
  49. throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
  50. var grade = Unit.Grades.Read(new { StudentId = studentId, TaskId = taskId });
  51. return Mapper.Map<Model.Grade, ViewModels.Grade>(grade);
  52. }
  53. // POST /api/grades
  54. public HttpResponseMessage Post(ViewModels.Grade model)
  55. {
  56. if (ModelState.IsValid)
  57. {
  58. Unit.Grades.Create(model.TaskId, model.StudentId, model.Value, model.Comments);
  59. Unit.Commit();
  60. var response = Request.CreateResponse(HttpStatusCode.Created, model);
  61. var uri = Url.Link("DefaultApi", new { model.StudentId, model.TaskId });
  62. response.Headers.Location = new Uri(Request.RequestUri, uri);
  63. return response;
  64. }
  65. throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest));
  66. }
  67. // POST /api/grades/list
  68. [ActionName("List")]
  69. public HttpResponseMessage Post(IEnumerable<ViewModels.Grade> grades)
  70. {
  71. if (ModelState.IsValid)
  72. {
  73. foreach (var model in grades)
  74. {
  75. if (Unit.Grades.Contains(model.TaskId, model.StudentId))
  76. {
  77. var grade = Unit.Grades.Read(model.TaskId, model.StudentId);
  78. grade.Value = model.Value;
  79. grade.Comments = model.Comments;
  80. Unit.Grades.Update(grade);
  81. }
  82. else
  83. {
  84. Unit.Grades.Create(model.TaskId, model.StudentId, model.Value, model.Comments);
  85. }
  86. }
  87. Unit.Commit();
  88. return Request.CreateResponse(HttpStatusCode.Created);
  89. }
  90. throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest));
  91. }
  92. // PUT /api/grades/studentId={int}&taskId={int}
  93. public HttpResponseMessage Put(int studentId, int taskId, int value)
  94. {
  95. var grade = Unit.Grades.Read(new { StudentId = studentId, TaskId = taskId });
  96. if (grade == null)
  97. throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
  98. if (ModelState.IsValid)
  99. {
  100. grade.Value = value;
  101. Unit.Grades.Update(grade);
  102. Unit.Commit();
  103. return new HttpResponseMessage(HttpStatusCode.NoContent);
  104. }
  105. throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.BadRequest));
  106. }
  107. // DELETE /api/grades/{int}
  108. public void Delete(int studentId, int taskId)
  109. {
  110. var game = Unit.Grades.Read(new { StudentId = studentId, TaskId = taskId });
  111. if (game == null)
  112. throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
  113. Unit.Grades.Delete(new { StudentId = studentId, TaskId = taskId });
  114. Unit.Commit();
  115. throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotAcceptable));
  116. }
  117. // GET /api/grades/class
  118. [ActionName("Class")]
  119. public IEnumerable<ViewModels.StudentResults> GetByClassCode(int code, int? term = 0, int? type = 0)
  120. {
  121. if (!Unit.ClassCodes.Contains(code))
  122. throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
  123. var grades = Unit.Grades.GetAllByClassCode(code, term.GetValueOrDefault(), type.GetValueOrDefault())
  124. .GroupBy(x => x.StudentId);
  125. foreach (var grade in grades)
  126. {
  127. var taskResults = grade.Select(Mapper.Map<Model.Grade, ViewModels.TaskResult>).ToList();
  128. taskResults.ForEach(x =>
  129. {
  130. if (Unit.Grades.Contains(x.TaskId, x.StudentId))
  131. {
  132. x.Rank = Unit.Grades.GetRank(x.TaskId, x.StudentId);
  133. x.Rate = Unit.Grades.GetRate(x.TaskId, x.StudentId);
  134. }
  135. });
  136. var studentResults = new StudentResults
  137. {
  138. StudentId = taskResults[0].StudentId,
  139. StudentName = taskResults[0].StudentName,
  140. Results = taskResults
  141. };
  142. yield return studentResults;
  143. }
  144. }
  145. // GET /api/grades/student
  146. [ActionName("Student")]
  147. public IEnumerable<ViewModels.TaskResult> GetByStudent(int student, int? code = 0)
  148. {
  149. if (!Unit.Tasks.Contains(student))
  150. throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound));
  151. var grades = Unit.Grades.GetAllByStudent(student, code.GetValueOrDefault());
  152. var model = grades.Select(Mapper.Map<Model.Grade, ViewModels.TaskResult>).ToList();
  153. model.ForEach(x =>
  154. {
  155. if (Unit.Grades.Contains(x.TaskId, x.StudentId))
  156. {
  157. x.Rank = Unit.Grades.GetRank(x.TaskId, x.StudentId);
  158. x.Rate = Unit.Grades.GetRate(x.TaskId, x.StudentId);
  159. }
  160. });
  161. return model;
  162. }
  163. }
  164. }