smart-home
Version:
Netbeast dashboard, IoT apps manager
123 lines (105 loc) • 3.23 kB
JavaScript
var path = require('path')
var express = require('express')
var fs = require('fs-extra')
var App = require('../models/app')
var Activity = require('../models/activity')
var installer = require('../middleware/installer')
var ApiError = require('../util/api-error')
var router = module.exports = express.Router()
router.route('/apps')
.post(installer.upload, installer.process)
.get(function (req, res, next) {
App.all(function (err, files) {
if (err) return next(err)
res.json(files)
})
})
router.route('/apps/:name')
.get(function (req, res, next) {
App.getPackageJson(req.params.name, function (err, packageJson) {
if (err) return next(err)
res.json(packageJson)
})
})
.put(function (req, res, next) {
const file = path.join(process.env.APPS_DIR, req.params.name, 'package.json')
fs.writeJson(file, req.body, function (err) {
if (err) {
next(new ApiError(422, 'Not a valid package.json'))
} else {
res.status(204).end()
}
})
})
.delete(function (req, res, next) {
Activity.stop(req.params.name, function (err) {
if (err) {
return next(new Error('Activity could not stop ' + req.params.name))
} else {
App.delete(req.params.name, function (err) {
if (err && err.code === 404) {
return next(new ApiError(404))
} else if (err) {
return next(err)
} else {
res.status(204).end()
}
})
}
})
})
router.get('/apps/:name/logo', function (req, res) {
const pkgJson = path.join(process.env.APPS_DIR, req.params.name, 'package.json')
var app = {}
var isPlugin = false
try {
app = fs.readJsonSync(pkgJson) // kamikaze line
isPlugin = app.netbeast && app.netbeast.type === 'plugin'
const appLogo = path.resolve(process.env.APPS_DIR, app.name, app.logo)
res.sendFile(appLogo)
} catch (e) {
console.error(e)
if (isPlugin) res.sendFile(path.resolve(process.env.PUBLIC_DIR, 'img/plugin.png'))
else res.sendFile(path.resolve(process.env.PUBLIC_DIR, 'img/dflt.png'))
}
})
router.get('/apps/:name/port?', function (req, res) {
const app = Activity.get(req.params.name)
if (app) {
res.json(app.port)
} else {
res.status(403).send('App not running')
}
})
router.get('/apps/:name/readme', function (req, res, next) {
const readme = path.join(process.env.APPS_DIR, req.params.name, 'README.md')
if (!fs.existsSync(readme)) {
return res.status(404).send('This app does not have a README.md')
}
res.sendFile(readme)
})
router.get('/apps/:name/package', function (req, res, next) {
App.getPackageJson(req.params.name, function (err, data) {
if (err) return next(err)
res.header('Content-Type', 'text/plain')
res.send('' + data)
})
})
router.route('/plugins').get(function (req, res, next) {
App.plugins(function (err, plugins) {
if (err) return next(err)
res.json(plugins)
})
})
router.route('/modules').get(function (req, res, next) {
App.modules(function (err, plugins) {
if (err) return next(err)
res.json(plugins)
})
})
router.get('/topics', function (req, res, next) {
App.find({ topic: 'lights' }, function (err, apps) {
if (err) return next(err)
res.json(apps)
})
})