learn.js 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  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. date: Date
  60. }
  61. redirects to edited lecture
  62. */
  63. createLecture: function(req, res){
  64. Course.findOne({_id: req.body.course})
  65. .populate("owner")
  66. .then((course)=>{
  67. if(course === null) throw "noCourse";
  68. if(req.body.uploader !== course.owner._id.toString()) throw "badOwner";
  69. if(req.body.password !== course.owner.password) throw "badPass";
  70. let exercises = req.body.exercises.split("\r\n");
  71. exercises.splice(exercises.length - 1, 1);
  72. let furtherReading = req.body.furtherReading.split("\r\n");
  73. furtherReading.splice(furtherReading.length-1, 1);
  74. let readings = [];
  75. for(let i = 0; i < furtherReading.length; i+=2){
  76. readings.push({
  77. text: furtherReading[i],
  78. link: furtherReading[i+1]
  79. });
  80. }
  81. let lecture = new Lecture({
  82. course: course._id,
  83. title: req.body.title,
  84. video: req.body.video,
  85. description: req.body.description,
  86. furtherReading: readings,
  87. exercises: exercises,
  88. documents: [],
  89. createdDate: new Date(req.body.date)
  90. });
  91. if(req.files !== null){
  92. let files = req.files.documents;
  93. if(files.length === undefined){
  94. let fileId = createId(25);
  95. let fileParts = files.name.split(".");
  96. let fileString = `/documents/${fileId}.${fileParts[1]}`;
  97. files.mv(`${__dirname}/..${fileString}`);
  98. lecture.documents.push({
  99. name: fileParts[0],
  100. link: fileString
  101. })
  102. }else{
  103. for(let i = 0; i < files.length; i++){
  104. let fileId = createId(25);
  105. let fileParts = files[i].name.split(".");
  106. let fileString = `/documents/${fileId}.${fileParts[1]}`;
  107. files[i].mv(`${__dirname}/..${fileString}`);
  108. lecture.documents.push({
  109. name: fileParts[0],
  110. link: fileString
  111. });
  112. }
  113. }
  114. }
  115. return lecture.save();
  116. })
  117. .then((lecture)=>{
  118. return res.redirect(`/learn/lectures/${lecture._id}`);
  119. })
  120. .catch((err)=>{
  121. if(err === "noCourse") return res.json("Course does not exist");
  122. if(err === "badOwner") return res.json("You do not own this course");
  123. if(err === "badPass") return res.json("Incorrect password");
  124. return res.redirect("/");
  125. });
  126. },
  127. /*
  128. POST: updates a lecture
  129. req.body = {
  130. uploader: String,
  131. password: String
  132. title: String
  133. video: String
  134. description: String
  135. furtherReading: String (\r\n delimited)
  136. exercises; String (\r\n delimited)
  137. date: Date
  138. }
  139. req.params.id = String (lecture id)
  140. redirects to updated lecture
  141. */
  142. updateLecture: function(req, res){
  143. Lecture.findOne({_id: req.params.id})
  144. .then((lecture)=>{
  145. if(lecture === null) throw "notFound";
  146. let furtherReading = req.body.furtherReading.split("\r\n");
  147. furtherReading.splice(furtherReading.length - 1, 1);
  148. let readings = [];
  149. for(let i = 0; i < furtherReading.length; i+=2){
  150. readings.push({
  151. text: furtherReading[i],
  152. link: furtherReading[i+1]
  153. });
  154. }
  155. let exercises = req.body.exercises.split("\r\n");
  156. exercises.splice(exercises.length - 1, 1);
  157. lecture.title = req.body.title;
  158. lecture.video = req.body.video;
  159. lecture.description = req.body.description;
  160. lecture.furtherReading = readings;
  161. lecture.exercises = exercises;
  162. lecture.updatedDate = new Date(req.body.date);
  163. return lecture.save();
  164. })
  165. .then((lecture)=>{
  166. return res.redirect(`/learn/lectures/${lecture._id}`);
  167. })
  168. .catch((err)=>{
  169. return res.redirect(`/learn/lectures/edit/${lecture._id}`);
  170. });
  171. },
  172. /*
  173. DELETE: remove the lecture
  174. req.params.id = lecture to remove
  175. redirects to home
  176. */
  177. removeLecture: function(req, res){
  178. Lecture.deleteOne({_id: req.params.id})
  179. .then((lecture)=>{
  180. return res.redirect("/");
  181. })
  182. .catch((err)=>{
  183. return res.redirect(`/learn/lectures/edit/${req.params.id}`);
  184. })
  185. },
  186. getCourses: function(req, res){
  187. Course.find()
  188. .then((courses)=>{
  189. return res.json(courses);
  190. })
  191. .catch((err)=>{
  192. return res.json("Could not retrieve courses");
  193. });
  194. },
  195. /*
  196. GET: get a list of lectures from a course
  197. req.params.id = String (course id)
  198. response = {
  199. course: Course,
  200. lectures: [Lecture]
  201. }
  202. */
  203. getLectures: function(req, res){
  204. let course = Course.findOne({_id: req.params.id});
  205. let lectures = Lecture.find({course: req.params.id});
  206. Promise.all([course, lectures])
  207. .then((response)=>{
  208. return res.json({course: response[0], lectures: response[1]});
  209. })
  210. .catch((err)=>{
  211. return res.json("Could not retrieve lectures");
  212. });
  213. },
  214. /*
  215. GET: get data for a single lecture
  216. req.params.id = String (lecture id)
  217. response = Lecture
  218. */
  219. getLecture: function(req, res){
  220. Lecture.findOne({_id: req.params.id})
  221. .populate("course")
  222. .then((lecture)=>{
  223. return res.json(lecture);
  224. })
  225. .catch((err)=>{
  226. return res.json("Could not retrieve lecture");
  227. });
  228. }
  229. }