Source: controllers/coursecontroller.js

/** Module providing course implementation for routes
 * @module controllers/coursecontroller
 */

const Course = require("../models/course");
const User = require("../models/user");
const Search = require("../services/search");
const mongoose = require("mongoose");

const courseController = {};

/**
 * functionality for adding a course
 * @name course
 * @function
 * @alias module:/controllers/coursecontroller
 * @property {request} request - course information
 * @returns {string} response - success or failure
 */
courseController.addCourse = async function (req, res) {
  if (req.user.type == User.Type.EDUCATOR) {
    let course = new Course({});
    // iterates through given information to add to course
    Object.keys(req.body).forEach(function (key) {
      course[key] = req.body[key];
    });
    try {
      let profile = await req.user.getProfile();
      await course.setOrganization(profile.organization.name);
      course.save(function (err) {
        if (err) {
          res.status(400).send(err);
          return;
        }
        res.status(200).send("Successfully created course.");
      });
    } catch (error) {
      if (error instanceof mongoose.Error.CastError) {
        res.status(400).send("Error adding skills.");
        return;
      }
      res.status(400).send("Error on course creation.");
    }
  } else {
    res.status(400).send("Invalid usertype.");
  }
};

/**
 * functionality for updating a course
 * @name course
 * @function
 * @alias module:/controllers/coursecontroller
 * @property {request} request - course information
 * @returns {string} response - success or failure
 */
courseController.updateCourse = async function (req, res) {
  if (req.user.type == User.Type.EDUCATOR) {
    try {
      let profile = await req.user.getProfile();
      let course = await Course.findById(req.body._id);
      if (
        profile.organization._id.toString() !=
        course.organization._id.toString()
      ) {
        res.status(400).send("User does not own this course.");
        return;
      }
      // iterates through given information to add to course
      Object.keys(req.body).forEach(function (key) {
        if (key != "_id") {
          course[key] = req.body[key];
        }
      });
      course.save(function (err) {
        if (err) {
          res.status(400).send(err);
          return;
        }
        res.status(200).send("Successfully updated course.");
      });
    } catch (error) {
      res.status(400).send("Error editing course.");
    }
  } else {
    res.status(400).send("Invalid usertype.");
  }
};

/**
 * functionality for deleting a course
 * @name course
 * @function
 * @alias module:/controllers/coursecontroller
 * @property {request} request - course id
 * @returns {string} response - success or failure
 */
courseController.deleteCourse = async function (req, res) {
  if (req.user.type == User.Type.EDUCATOR) {
    try {
      let profile = await req.user.getProfile();
      let course = await Course.findById(req.body._id);
      if (
        profile.organization._id.toString() !=
        course.organization._id.toString()
      ) {
        res.status(400).send("User does not own this course.");
        return;
      }
      await (await Course.findById(req.body._id)).remove();
      res.status(200).send("Successfully deleted course.");
    } catch (error) {
      res.status(400).send("Error deleting course.");
      return;
    }
  } else {
    res.status(400).send("Invalid usertype.");
  }
};

/**
 * functionality for viewing educator user's courses
 * @name course
 * @function
 * @alias module:/controllers/coursecontroller
 * @property {request} request - nothing
 * @returns {string} response - list of courses
 */
courseController.viewCourses = async function (req, res) {
  if (req.user.type == User.Type.EDUCATOR) {
    try {
      let profile = await req.user.getProfile();
      courses = await Course.find({
        organization: profile.organization._id,
      }).exec();
      res.status(200).send(courses);
    } catch (error) {
      res.status(400).send("Error getting courses.");
    }
  } else {
    res.status(400).send("Invalid usertype.");
  }
};

/**
 * functionality for searching courses
 * @name course/search
 * @function
 * @alias module:/controllers/coursecontroller
 * @property {request} request - nothing
 * @returns {string} response - list of courses
 */
courseController.searchCourses = async function (req, res) {
  try {
    let searchResults = await Search.findCoursesBySkills(
      JSON.parse(req.query.skills),
      req.query.searchValue
    );
    if (searchResults == null) {
      res.status(400).send("No results");
      return;
    }
    res.status(200).send(searchResults);
  } catch (e) {
    console.log(e);
    res.status(400).send("Unable to search for courses.");
  }
};

module.exports = courseController;