2016-04-27 18:36:16 -04:00
|
|
|
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
|
2016-07-15 16:28:35 -04:00
|
|
|
|
2016-04-27 18:36:16 -04:00
|
|
|
if not foundLevelOriginal
|
|
|
|
throw new errors.NotFound('Level original ObjectId not found in that course')
|
2016-07-15 16:28:35 -04:00
|
|
|
|
2016-04-27 18:36:16 -04:00
|
|
|
if not nextLevelOriginal
|
2016-06-17 13:35:22 -04:00
|
|
|
return res.status(200).send({})
|
2016-07-15 16:28:35 -04:00
|
|
|
|
2016-04-27 18:36:16 -04:00
|
|
|
dbq = Level.findOne({original: mongoose.Types.ObjectId(nextLevelOriginal)})
|
2016-07-15 16:28:35 -04:00
|
|
|
|
|
|
|
|
2016-04-27 18:36:16 -04:00
|
|
|
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)
|
2016-07-15 16:28:35 -04:00
|
|
|
|
|
|
|
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)
|
|
|
|
res.send(results)
|