netbeast-cli
Version:
Netbeast OS dashboard, IoT apps manager
165 lines (135 loc) • 4.57 kB
JavaScript
// require sistema
// modules
var express = require('express')
var Promise = require('bluebird')
// librerias propias
var Resource = require('../models/resource')
var broker = require('../helpers/broker')
var ApiError = require('../util/api-error')
var request = require('superagent-bluebird-promise')
var router = module.exports = express.Router()
const APP_PROXY = 'http://' + process.env.IPs + ':' + process.env.PORT + '/i/'
router.route('/resources')
.get(function (req, res, next) {
Resource.find(req.query, function (err, resources) {
if (err && err.statusCode !== 404) return next(err)
res.json(resources || {})
})
})
.post(function (req, res, next) {
Resource.findOne(req.body, function (err, resource) {
if (err && err.statusCode !== 404) return next(err)
if (resource) return res.json(resource)
Resource.create(req.body, function (err, item) {
if (err) return next(err)
return res.json(item)
})
})
})
.patch(function (req, res, next) {
Resource.findOne(req.query, function (err, resource) {
if (err) return next(err)
Resource.update(req.query, req.body, function (err) {
if (err) return next(err)
return res.status(204).end()
})
})
})
.delete(function (req, res, next) {
Resource.destroy(req.query, function (err, resources) {
if (err) return next(err)
return res.status(204).end()
})
})
broker.client.on('#api/resources/post', function (query) {
console.log('#api/resources/post')
console.log(query)
Resource.findOne(query, function (err, resource) {
if (err && err.statusCode !== 404) return console.trace(err)
if (resource) return // resource already exist
Resource.create(query, function (err, item) {
if (err) return console.trace(err)
})
})
})
broker.client.on('#api/resources/delete', function (query) {
console.log('#api/resources/delete')
console.log(query)
Resource.destroy(query, function (err, resources) {
if (err && err.statusCode !== 404) return console.trace(err)
})
})
router.route('/resources/:key/:value')
.get(function (req, res, next) {
req.query[req.params.key] = req.params.value
for (var key in req.query) {
if (req.query[key] === '') delete req.query[key]
}
Resource.find(req.query, function (err, resources) {
if (err) return next(err)
Promise.map(resources, function (item, done) {
return request.get(APP_PROXY + item.app + item.hook)
.then(function (res) {
item.result = (Object.keys(res.body).length) ? res.body : res.text
return item
})
}).then(function (data) {
res.json(data)
}).catch(next)
})
})
.post(function (req, res, next) {
req.query[req.params.key] = req.params.value
Resource.find(req.query, function (err, resources) {
if (err) return next(err)
Promise.map(resources, function (item, done) {
return request.post(APP_PROXY + item.app + item.hook).send(req.body)
.then(function (res) {
item.result = (Object.keys(res.body).length) ? res.body : res.text
return item
})
}).then(function (data) {
res.json(data)
}).catch(next)
})
})
router.route('/resources/update')
.post(function (req, res, next) {
if (!req.body.hook || !req.body.topic || !req.body.app) return res.json(new ApiError(404))
else {
if (typeof req.body.hook === 'string') req.body.hook = [req.body.hook]
Resource.find({app: req.body.app, topic: req.body.topic}, function (err, resources) {
if (err && err.statusCode !== 404) return next(err)
var objects = []
if (resources && resources.length > 0) {
resources.forEach(function (device) {
if (objects.indexOf(device.hook) < 0) objects.push(device.hook)
})
}
req.body.hook.forEach(function (id) {
var indx = objects.indexOf(id)
if (indx >= 0) objects.splice(indx, 1)
else {
var device = {
app: req.body.app,
topic: req.body.topic,
hook: id
}
Resource.findOne(device, function (err, resource) {
if (err && err.statusCode !== 404) return next(err)
Resource.create(device, function (err, item) {
if (err) return next(err)
})
})
}
})
if (objects.length > 0) {
objects.forEach(function (hook) {
Resource.destroy({ hook: hook }, function (err, resources) {
if (err) return next(err)
})
})
} return res.status(204).end()
})
}
})