conveyal/modeify

View on GitHub
lib/location/index.js

Summary

Maintainability
A
3 hrs
Test Coverage

const {adminRequired, authenticateUser} = require('../auth0')
const CommuterLocation = require('../commuter-locations/model')
const createRouter = require('../model-router')
const Location = require('./model')

/**
 * Expose `router`
 */

module.exports = createRouter({
  model: Location
}, function (router, byId) {
  /**
   * Create
   */

  router.get('/:id', (req, res) => {
    Location
      .findById(req.params.id)
      .exec()
      .then((loc) => {
        CommuterLocation.getCommuterCount(loc._id).then(count => {
          loc.commuter_count = count
          res.status(201).send(loc)
        })
      }, (err) => {
        res.status(400).send(err)
      })
  })

  router.post('/', (req, res) => {
    const coord = req.body.coordinate
    const data = {
      category: req.body.category,
      created_by: req.body.created_by || (req.user ? req.user.id : null),
      name: req.body.name
    }

    if (req.body.address) data.address = req.body.address
    if (coord && coord.lat && coord.lng) data.coordinate = coord

    Location.create(data, (err, location) => {
      if (err) {
        res.status(400).send(err)
      } else {
        res.status(201).send(location)
      }
    })
  })

  router.get('/created_by/:id', authenticateUser, (req, res) => {
    Location
      .find()
      .where('created_by', req.params.id)
      .exec()
      .then((locations) => {
        Promise.all(locations.map(loc => CommuterLocation.getCommuterCount(loc._id))).then(counts => {
          locations.forEach((loc, k) => {
            loc.commuter_count = counts[k]
          })
          res.status(200).send(locations || [])
        })
      }, (err) => {
        res.status(400).send(err)
      })
  })

  /**
   * Update
   */

  router.put('/:id', authenticateUser, adminRequired, byId, (req, res) => {
    req.location.category = req.body.category
    req.location.name = req.body.name
    req.location.match_radius = req.body.match_radius
    req.location.rideshare_manager = req.body.rideshare_manager
    req.location.save(function (err, location) {
      if (err) {
        res.status(400).send(err)
      } else {
        res.status(200).send(location)
      }
    })
  })

  /**
   * Analysis for this location
   */

  router.get('/:id/analysis', authenticateUser, adminRequired, (req, res) => {
    // run the analysis for this location
    CommuterLocation
      .analyze(req.params.id)
      .then((results) => {
        // or job id?
        res.status(200).send(results)
      }, (err) => {
        res.status(400).send(err)
      })
  })
})