learn.js 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. const Uploader = require("../models/uploader.js");
  2. const Course = require("../models/course.js");
  3. const {Lecture, Question, Answer} = require("../models/lecture.js");
  4. const createId = require("./createId.js");
  5. const axios = require("axios");
  6. const queryString = require("querystring");
  7. module.exports = {
  8. /*
  9. POST: create a new course
  10. req.body = {
  11. uploaderId: String,
  12. password: String,
  13. title: String
  14. thumbNail: String,
  15. description: String
  16. }
  17. redirect to home
  18. */
  19. createCourse: function(req, res){
  20. Uploader.findOne({_id: req.body.uploaderId})
  21. .then((uploader)=>{
  22. if(uploader === null) throw "uploader";
  23. if(req.body.password !== uploader.password) throw "pass";
  24. let imgString = `/thumbNails/${req.files.thumbNail.name}`;
  25. req.files.thumbNail.mv(`${__dirname}/..${imgString}`);
  26. let course = new Course({
  27. owner: uploader._id,
  28. title: req.body.title,
  29. thumbNail: imgString,
  30. description: req.body.description
  31. });
  32. return course.save();
  33. })
  34. .then((course)=>{
  35. return res.redirect("/");
  36. })
  37. .catch((err)=>{
  38. if(err === "uploader") return res.json("Uploader doesn't exist");
  39. if(err === "pass") return res.json("Incorrect password");
  40. return res.json("Something went wrong on the backend");
  41. });
  42. },
  43. /*
  44. POST: create a new lecture
  45. req.body = {
  46. uploader: String
  47. password: String
  48. course: String
  49. title: String
  50. video: String
  51. description: String
  52. furtherReading: [{
  53. text: String
  54. link: String
  55. }]
  56. exercises: [String]
  57. documents: [{
  58. title: String
  59. link: String
  60. }],
  61. date: Date
  62. }
  63. redirects to edited lecture
  64. */
  65. createLecture: function(req, res){
  66. Course.findOne({_id: req.body.course})
  67. .populate("owner")
  68. .then((course)=>{
  69. if(course === null) throw "noCourse";
  70. if(req.body.uploader !== course.owner._id.toString()) throw "badOwner";
  71. if(req.body.password !== course.owner.password) throw "badPass";
  72. let exercises = req.body.exercises.split("\r\n");
  73. exercises.splice(exercises.length - 1, 1);
  74. let furtherReading = req.body.furtherReading.split("\r\n");
  75. furtherReading.splice(furtherReading.length-1, 1);
  76. let readings = [];
  77. for(let i = 0; i < furtherReading.length; i+=2){
  78. readings.push({
  79. text: furtherReading[i],
  80. link: furtherReading[i+1]
  81. });
  82. }
  83. let lecture = new Lecture({
  84. course: course._id,
  85. title: req.body.title,
  86. video: req.body.video,
  87. description: req.body.description,
  88. furtherReading: readings,
  89. exercises: exercises,
  90. documents: [],
  91. createdDate: new Date(req.body.date)
  92. });
  93. if(req.files !== null){
  94. let files = req.files.documents;
  95. if(files.length === undefined){
  96. let fileId = createId(25);
  97. let fileParts = files.name.split(".");
  98. let fileString = `/documents/${fileId}.${fileParts[1]}`;
  99. files.mv(`${__dirname}/..${fileString}`);
  100. lecture.documents.push({
  101. name: files.name,
  102. link: fileString
  103. })
  104. }else{
  105. for(let i = 0; i < files.length; i++){
  106. let fileId = createId(25);
  107. let fileParts = files[i].name.split(".");
  108. let fileString = `/documents/${fileId}.${fileParts[1]}`;
  109. files[i].mv(`${__dirname}/..${fileString}`);
  110. lecture.documents.push({
  111. name: files[i].name,
  112. link: fileString
  113. });
  114. }
  115. }
  116. }
  117. return lecture.save();
  118. })
  119. .then((lecture)=>{
  120. return res.redirect(`/learn/lectures/${lecture._id}`);
  121. })
  122. .catch((err)=>{
  123. if(err === "noCourse") return res.json("Course does not exist");
  124. if(err === "badOwner") return res.json("You do not own this course");
  125. if(err === "badPass") return res.json("Incorrect password");
  126. return res.redirect("/");
  127. });
  128. },
  129. /*
  130. POST: updates a lecture
  131. req.body = {
  132. uploader: String,
  133. password: String
  134. title: String
  135. video: String
  136. description: String
  137. furtherReading: String (\r\n delimited)
  138. exercises; String (\r\n delimited)
  139. date: Date
  140. }
  141. req.params.id = String (lecture id)
  142. redirects to updated lecture
  143. */
  144. updateLecture: function(req, res){
  145. Lecture.findOne({_id: req.params.id})
  146. .then((lecture)=>{
  147. if(lecture === null) throw "notFound";
  148. let furtherReading = req.body.furtherReading.split("\r\n");
  149. furtherReading.splice(furtherReading.length - 1, 1);
  150. let readings = [];
  151. for(let i = 0; i < furtherReading.length; i+=2){
  152. readings.push({
  153. text: furtherReading[i],
  154. link: furtherReading[i+1]
  155. });
  156. }
  157. let exercises = req.body.exercises.split("\r\n");
  158. exercises.splice(exercises.length - 1, 1);
  159. lecture.title = req.body.title;
  160. lecture.video = req.body.video;
  161. lecture.description = req.body.description;
  162. lecture.furtherReading = readings;
  163. lecture.exercises = exercises;
  164. lecture.updatedDate = new Date(req.body.date);
  165. return lecture.save();
  166. })
  167. .then((lecture)=>{
  168. return res.redirect(`/learn/lectures/${lecture._id}`);
  169. })
  170. .catch((err)=>{
  171. return res.redirect(`/learn/lectures/edit/${lecture._id}`);
  172. });
  173. },
  174. /*
  175. DELETE: remove the lecture
  176. req.params.id = lecture to remove
  177. redirects to home
  178. */
  179. removeLecture: function(req, res){
  180. Lecture.deleteOne({_id: req.params.id})
  181. .then((lecture)=>{
  182. return res.redirect("/");
  183. })
  184. .catch((err)=>{
  185. return res.redirect(`/learn/lectures/edit/${req.params.id}`);
  186. })
  187. },
  188. getCourses: function(req, res){
  189. Course.find()
  190. .then((courses)=>{
  191. return res.json(courses);
  192. })
  193. .catch((err)=>{
  194. return res.json("Could not retrieve courses");
  195. });
  196. },
  197. /*
  198. GET: get a list of lectures from a course
  199. req.params.id = String (course id)
  200. response = {
  201. course: Course,
  202. lectures: [Lecture]
  203. }
  204. */
  205. getLectures: function(req, res){
  206. let course = Course.findOne({_id: req.params.id});
  207. let lectures = Lecture.find({course: req.params.id});
  208. Promise.all([course, lectures])
  209. .then((response)=>{
  210. return res.json({course: response[0], lectures: response[1]});
  211. })
  212. .catch((err)=>{
  213. return res.json("Could not retrieve lectures");
  214. });
  215. },
  216. /*
  217. GET: get data for a single lecture
  218. req.params.id = String (lecture id)
  219. response = Lecture
  220. */
  221. getLecture: function(req, res){
  222. Lecture.findOne({_id: req.params.id})
  223. .populate("course")
  224. .then((lecture)=>{
  225. return res.json(lecture);
  226. })
  227. .catch((err)=>{
  228. return res.json("Could not retrieve lecture");
  229. });
  230. },
  231. /*
  232. POST: create a new question
  233. req.body = {
  234. lecture: String (Lecture id)
  235. name: String
  236. title: String
  237. content: String
  238. }
  239. response: Question
  240. */
  241. createQuestion: function(req, res){
  242. let question = new Question({
  243. name: req.body.name,
  244. title: req.body.title,
  245. content: req.body.content,
  246. answers: []
  247. });
  248. Lecture.findOne({_id: req.body.lecture})
  249. .then((lecture)=>{
  250. lecture.questions.push(question);
  251. axios({
  252. method: "post",
  253. url: "https://api.mailgun.net/v3/mg.leemorgan.io/messages",
  254. headers: {
  255. "Content-Type": "application/x-www-form-urlencoded"
  256. },
  257. auth: {
  258. username: "api",
  259. password: process.env.MG_PERSONAL_APIKEY
  260. },
  261. data: queryString.stringify({
  262. from: "Lee Morgan <learn@leemorgan.io>",
  263. to: "me@leemorgan.io",
  264. subject: question.title,
  265. text: question.content
  266. })
  267. })
  268. .catch((err)=>{
  269. console.error(err);
  270. });
  271. lecture.save();
  272. })
  273. .then((lecture)=>{
  274. return res.json(question);
  275. })
  276. .catch((err)=>{
  277. console.error(err);
  278. return res.json("ERROR: unable to save the question");
  279. });
  280. }
  281. }