learn.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. const Uploader = require("../models/uploader.js");
  2. const Course = require("../models/course.js");
  3. const Lecture = require("../models/lecture.js");
  4. const createId = require("./createId.js");
  5. module.exports = {
  6. /*
  7. POST: create a new course
  8. req.body = {
  9. uploaderId: String,
  10. password: String,
  11. title: String
  12. thumbNail: String,
  13. description: String
  14. }
  15. redirect to home
  16. */
  17. createCourse: function(req, res){
  18. Uploader.findOne({_id: req.body.uploaderId})
  19. .then((uploader)=>{
  20. if(uploader === null) throw "uploader";
  21. if(req.body.password !== uploader.password) throw "pass";
  22. let imgString = `/thumbNails/${req.files.thumbNail.name}`;
  23. req.files.thumbNail.mv(`${__dirname}/..${imgString}`);
  24. let course = new Course({
  25. owner: uploader._id,
  26. title: req.body.title,
  27. thumbNail: imgString,
  28. description: req.body.description
  29. });
  30. return course.save();
  31. })
  32. .then((course)=>{
  33. return res.redirect("/");
  34. })
  35. .catch((err)=>{
  36. if(err === "uploader") return res.json("Uploader doesn't exist");
  37. if(err === "pass") return res.json("Incorrect password");
  38. return res.json("Something went wrong on the backend");
  39. });
  40. },
  41. /*
  42. POST: create a new lecture
  43. req.body = {
  44. uploader: String
  45. password: String
  46. course: String
  47. title: String
  48. video: String
  49. description: String
  50. furtherReading: [{
  51. text: String
  52. link: String
  53. }]
  54. exercises: [String]
  55. documents: [{
  56. title: String
  57. link: String
  58. }]
  59. }
  60. redirects to home
  61. */
  62. createLecture: function(req, res){
  63. Course.findOne({_id: req.body.course})
  64. .populate("owner")
  65. .then((course)=>{
  66. if(course === null) throw "noCourse";
  67. if(req.body.uploader !== course.owner._id.toString()) throw "badOwner";
  68. if(req.body.password !== course.owner.password) throw "badPass";
  69. let exercises = req.body.exercises.split("\r\n");
  70. exercises.splice(exercises.length - 1, 1);
  71. let furtherReading = req.body.furtherReading.split("\r\n");
  72. furtherReading.splice(furtherReading.length-1, 1);
  73. let readings = [];
  74. for(let i = 0; i < furtherReading.length; i+=2){
  75. readings.push({
  76. text: furtherReading[i],
  77. link: furtherReading[i+1]
  78. });
  79. }
  80. let lecture = new Lecture({
  81. course: course._id,
  82. title: req.body.title,
  83. video: req.body.video,
  84. description: req.body.description,
  85. furtherReading: readings,
  86. exercises: exercises,
  87. documents: []
  88. });
  89. if(req.files !== null){
  90. let files = req.files.documents;
  91. if(files.length === undefined){
  92. let fileId = createId(25);
  93. let fileParts = files.name.split(".");
  94. let fileString = `/documents/${fileId}.${fileParts[1]}`;
  95. files.mv(`${__dirname}/..${fileString}`);
  96. lecture.documents.push({
  97. name: fileParts[0],
  98. link: fileString
  99. })
  100. }else{
  101. for(let i = 0; i < files.length; i++){
  102. let fileId = createId(25);
  103. let fileParts = files[i].name.split(".");
  104. let fileString = `/documents/${fileId}.${fileParts[1]}`;
  105. files[i].mv(`${__dirname}/..${fileString}`);
  106. lecture.documents.push({
  107. name: fileParts[0],
  108. link: fileString
  109. });
  110. }
  111. }
  112. }
  113. return lecture.save();
  114. })
  115. .then((lecture)=>{
  116. return res.redirect(`/learn/lectures/${lecture._id}`);
  117. })
  118. .catch((err)=>{
  119. if(err === "noCourse") return res.json("Course does not exist");
  120. if(err === "badOwner") return res.json("You do not own this course");
  121. if(err === "badPass") return res.json("Incorrect password");
  122. return res.redirect("/");
  123. });
  124. },
  125. /*
  126. POST: updates a lecture
  127. req.body = {
  128. course: String (id)
  129. title: String
  130. video: String
  131. description: String
  132. furtherReading: String (\r\n delimited)
  133. exercises; String (\r\n delimited)
  134. date: Date
  135. }
  136. req.params.id = String (lecture id)
  137. */
  138. updateLecture: function(req, res){
  139. Lecture.findOne({_id: req.params.id})
  140. .then((lecture)=>{
  141. if(lecture === null) throw "notFound";
  142. let furtherReading = req.body.furtherReading.split("\r\n");
  143. furtherReading.splice(furtherReading.length - 1, 1);
  144. let readings = [];
  145. for(let i = 0; i < furtherReading.length; i+=2){
  146. readings.push({
  147. text: furtherReading[i],
  148. link: furtherReading[i+1]
  149. });
  150. }
  151. let exercises = req.body.exercises.split("\r\n");
  152. exercises.splice(exercises.length - 1, 1);
  153. lecture.course = req.body.course;
  154. lecture.title = req.body.title;
  155. lecture.video = req.body.video;
  156. lecture.description = req.body.description;
  157. lecture.furtherReading = readings;
  158. lecture.exercises = exercises;
  159. lecture.date = new Date(req.body.date);
  160. return lecture.save();
  161. })
  162. .then((lecture)=>{
  163. return res.redirect(`/learn/lectures/${lecture._id}`);
  164. })
  165. .catch((err)=>{
  166. return res.redirect(`/learn/lectures/edit/${lecture._id}`);
  167. });
  168. },
  169. getCourses: function(req, res){
  170. Course.find()
  171. .then((courses)=>{
  172. return res.json(courses);
  173. })
  174. .catch((err)=>{
  175. return res.json("Could not retrieve courses");
  176. });
  177. },
  178. /*
  179. GET: get a list of lectures from a course
  180. req.params.id = String (course id)
  181. response = {
  182. course: Course,
  183. lectures: [Lecture]
  184. }
  185. */
  186. getLectures: function(req, res){
  187. let course = Course.findOne({_id: req.params.id});
  188. let lectures = Lecture.find({course: req.params.id});
  189. Promise.all([course, lectures])
  190. .then((response)=>{
  191. return res.json({course: response[0], lectures: response[1]});
  192. })
  193. .catch((err)=>{
  194. return res.json("Could not retrieve lectures");
  195. });
  196. },
  197. /*
  198. GET: get data for a single lecture
  199. req.params.id = String (lecture id)
  200. response = Lecture
  201. */
  202. getLecture: function(req, res){
  203. Lecture.findOne({_id: req.params.id})
  204. .populate("course")
  205. .then((lecture)=>{
  206. return res.json(lecture);
  207. })
  208. .catch((err)=>{
  209. return res.json("Could not retrieve lecture");
  210. });
  211. }
  212. }