codecombat/server/middleware/courses.coffee

61 lines
2.1 KiB
CoffeeScript

errors = require '../commons/errors'
wrap = require 'co-express'
database = require '../commons/database'
mongoose = require 'mongoose'
Campaign = require '../models/Campaign'
CourseInstance = require '../models/CourseInstance'
Classroom = require '../models/Classroom'
Course = require '../models/Course'
User = require '../models/User'
Level = require '../models/Level'
parse = require '../commons/parse'
module.exports =
fetchNextLevel: wrap (req, res) ->
levelOriginal = req.params.levelOriginal
if not database.isID(levelOriginal)
throw new errors.UnprocessableEntity('Invalid level original ObjectId')
course = yield database.getDocFromHandle(req, Course)
if not course
throw new errors.NotFound('Course Instance not found.')
campaign = yield Campaign.findById course.get('campaignID')
if not campaign
throw new errors.NotFound('Campaign not found.')
levels = _.values(campaign.get('levels'))
levels = _.sortBy(levels, 'campaignIndex')
nextLevelOriginal = null
foundLevelOriginal = false
for level, index in levels
if level.original.toString() is levelOriginal
foundLevelOriginal = true
nextLevelOriginal = levels[index+1]?.original
break
if not foundLevelOriginal
throw new errors.NotFound('Level original ObjectId not found in that course')
if not nextLevelOriginal
return res.status(200).send({})
dbq = Level.findOne({original: mongoose.Types.ObjectId(nextLevelOriginal)})
dbq.sort({ 'version.major': -1, 'version.minor': -1 })
dbq.select(parse.getProjectFromReq(req))
level = yield dbq
level = level.toObject({req: req})
res.status(200).send(level)
get: (Model, options={}) -> wrap (req, res) ->
# Don't use standard rest middleware get, because we want to filter out adminOnly courses for non-admins
query = {}
query = {adminOnly: {$ne: true}} unless req.user?.isAdmin()
dbq = Model.find(query)
dbq.select(parse.getProjectFromReq(req))
results = yield database.viewSearch(dbq, req)
results = Course.sortCourses results
res.send(results)