mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-24 08:08:15 -05:00
83 lines
3.8 KiB
CoffeeScript
83 lines
3.8 KiB
CoffeeScript
log = require 'winston'
|
|
errors = require '../commons/errors'
|
|
handlers = require('../commons/mapping').handlers
|
|
handlerUrlOverrides = require('../commons/mapping').handlerUrlOverrides
|
|
mongoose = require 'mongoose'
|
|
hipchat = require '../hipchat'
|
|
|
|
module.exports.setup = (app) ->
|
|
# This is hacky and should probably get moved somewhere else, I dunno
|
|
app.get '/db/cla.submissions', (req, res) ->
|
|
return errors.unauthorized(res, 'You must be an admin to view that information') unless req.user?.isAdmin() or ('github' in (req.user?.get('permissions') ? []))
|
|
res.setHeader('Content-Type', 'application/json')
|
|
collection = mongoose.connection.db.collection 'cla.submissions', (err, collection) ->
|
|
return log.error "Couldn't fetch CLA submissions because #{err}" if err
|
|
resultCursor = collection.find {}
|
|
resultCursor.toArray (err, docs) ->
|
|
return log.error "Couldn't fetch distinct CLA submissions because #{err}" if err
|
|
unless req.user?.isAdmin()
|
|
delete doc.email for doc in docs
|
|
res.send docs
|
|
res.end
|
|
|
|
bindHandler = (name, module) ->
|
|
routeHandler = (req, res) ->
|
|
res.setHeader('Content-Type', 'application/json')
|
|
|
|
parts = req.path[4..].split('/')
|
|
|
|
|
|
if (not req.user) and req.route.method isnt 'get'
|
|
return errors.unauthorized(res, 'Must have an identity to do anything with the db. Do you have cookies enabled?')
|
|
|
|
try
|
|
handler = require('../' + name)
|
|
return handler.getLatestVersion(req, res, parts[1], parts[3]) if parts[2] is 'version'
|
|
return handler.versions(req, res, parts[1]) if parts[2] is 'versions'
|
|
return handler.files(req, res, parts[1]) if parts[2] is 'files'
|
|
return handler.getNamesByIDs(req, res) if req.route.method in ['get', 'post'] and parts[1] is 'names'
|
|
return handler.getByRelationship(req, res, parts[1..]...) if parts.length > 2
|
|
return handler.getById(req, res, parts[1]) if req.route.method is 'get' and parts[1]?
|
|
return handler.patch(req, res, parts[1]) if req.route.method is 'patch' and parts[1]?
|
|
handler[req.route.method](req, res, parts[1..]...)
|
|
catch error
|
|
errorMessage = "Error trying db method #{req?.route?.method} route #{parts} from #{name}: #{error}"
|
|
if req.user?
|
|
userInfo = req.user.getUserInfo()
|
|
errorMessage += "\n-- User Info Id: #{userInfo.id} #{if req.user.isAnonymous() then '' else 'Email:'} #{userInfo.email}"
|
|
log.error(errorMessage)
|
|
log.error(error)
|
|
log.error(error.stack)
|
|
# TODO: Generally ignore this error: error: Error trying db method get route analytics.log.event from undefined: Error: Cannot find module '../undefined'
|
|
unless "#{parts}" in ['analytics.users.active']
|
|
hipchat.sendHipChatMessage errorMessage, ['tower'], papertrail: true
|
|
errors.notFound(res, "Route #{req?.path} not found.")
|
|
|
|
app.all '/db/' + moduleName + '/*', routeHandler
|
|
app.all '/db/' + moduleName, routeHandler
|
|
|
|
app.get '/db/:module/schema', (req, res) ->
|
|
res.setHeader('Content-Type', 'application/json')
|
|
getSchema req, res, req.params.module
|
|
|
|
for moduleNameUnder of handlers
|
|
name = handlers[moduleNameUnder]
|
|
moduleName = handlerUrlOverrides[moduleNameUnder] or moduleNameUnder
|
|
bindHandler name, moduleName
|
|
|
|
# Fall back for URLs that start with /db/ but dont map to a handler.
|
|
app.all '/db/*', (req, res) ->
|
|
res.setHeader('Content-Type', 'text/plain')
|
|
errors.notFound(res, "Route #{req?.path} not found.")
|
|
|
|
getSchema = (req, res, moduleName) ->
|
|
try
|
|
name = moduleName.replace '.', '_'
|
|
schema = require('../../app/schemas/models/' + name)
|
|
|
|
res.send(JSON.stringify(schema, null, '\t'))
|
|
res.end()
|
|
|
|
catch error
|
|
log.error("Error trying to grab schema from #{name}: #{error}")
|
|
errors.notFound(res, "Schema #{moduleName} not found.")
|