const fs = require('fs') const express = require('express') const http = require('http') const bodyParser = require('body-parser') const path = require('path') const multer = require('multer') const upload = multer({ dest: 'uploads/' }) const Loader = require('../vendor/Loader') let app, server const db = require('../db') const site = module.exports = {} site.init = function(bridge){ app = express() app.use(express.static(path.join(__dirname, '../../public'))) app.use(bodyParser.json()) app.use(bodyParser.urlencoded({ extended: false })) app.use(express.query()) server = http.createServer(app).listen(process.env.PORT, function () { console.log('Cortex listening at http://localhost:%s', server.address().port) }) const api_folders = crud(app, 'folder', db.Folder, { afterCreate: (folder) => { fs.mkdir('data/' + folder.get('id') + '/', function(){ console.log('created folder', folder.get('id'), folder.get('name')) }) } }) const api_files = crud(app, 'file', db.File) const api_jobs = crud(app, 'job', db.Job) const api_tasks = crud(app, 'task', db.Task, { hasOne: { content_file_id: db.File, style_file_id: db.File } }) app.get('/devices', (req, res) => { res.json( bridge.devices ) }) app.post('/folders/:id', upload.array('file'), (req, res) => { if ( ! req.files ) return; let data = {} let loader = new Loader() loader.onReady( () => { if (Object.keys(data).some( el => !! el )) { res.json( Object.keys(data).map(k=>data[k]).sort((a,b) => { b.id - a.id }) ) } bridge.process() }) loader.register('upload') const files = req.files || [] files.forEach( (file) => { const fn = file.originalname data[fn] = false loader.register(fn) fs.rename(file.path, 'data/' + req.params.id + '/' + fn, function(err){ api_files.create({ // table.string('username') 'folder_id': req.params.id, 'name': fn, 'size': file.size, 'generated': false, 'processed': false, }).then( (file) => { data[fn] = file.toJSON() loader.ready(fn) }).catch( (err) => { console.warn(err) res.sendStatus(500) }) }) }) loader.ready('upload') }) function crud(app, type_s, model, callbacks){ callbacks = callbacks || {} const type = '/' + type_s + 's/' const type_id = type + ':id' const crud = db.crud(model) // index app.get(type, (req, res) => { console.log('index', type) crud.index(req.query).then( (data) => { if (! callbacks.hasOne) { res.json(data ? data.toJSON() : []) } else { let recs = data.toJSON() const loader = new Loader () loader.onReady( () => { console.log(type, 'ready') res.json(recs) }) console.log('hasOne') loader.register('hasOne') Object.keys(callbacks.hasOne).forEach( (key,i) => { loader.register(key) console.log('key') const type = callbacks.hasOne[key] const id_lookup = {} recs.forEach(r => { const id = r[key] id_lookup[id] = id_lookup[id] || [] id_lookup[id].push(r) }) console.log(key, recs.length, Object.keys(id_lookup).length) db.crud(type).show_ids(Object.keys(id_lookup)).then( (sub_recs) => { console.log(key, 'sub_recs', sub_recs) const short_key = key.replace('_id','') sub_recs.toJSON().forEach(rec => { id_lookup[rec.id].forEach( parent_rec => parent_rec[short_key] = rec ) }) loader.ready(key) }) }) loader.ready('hasOne') } }) // }).catch( () => res.sendStatus(500) ) }) // show app.get(type_id, (req, res) => { console.log('show', type, req.params.id) crud.show(req.params.id).then( (data) => { if (! callbacks.hasOne) { res.json(data.toJSON()) } else { rec = data.toJSON() const loader = new Loader () loader.onReady( () => { res.json(rec) }) loader.register('hasOne') Object.keys(callbacks.hasOne).forEach( (key,i) => { loader.register(key) const type = callbacks.hasOne[key] db.crud(type).show(rec[key]).then( (sub_rec) => { rec[key] = sub_rec loader.ready(key) }) }) loader.ready('hasOne') } }) // .catch( (err) => res.sendStatus(500) ) }) // create app.post(type, (req, res) => { console.log('create', type) crud.create(req.body).then( (data) => { res.json(data.toJSON()) callbacks.afterCreate && callbacks.afterCreate(data) })// .catch( () => res.sendStatus(500) ) }) // update app.put(type_id, (req, res) => { console.log('update', type, req.params.id) crud.update(req.body.id, req.body).then( (data) => { res.json(data.toJSON()) })// .catch( () => res.sendStatus(500) ) }) // destroy app.delete(type_id, (req, res) => { console.log('destroy', type, req.params.id) crud.destroy(req.params.id).then( (data) => { res.json(data.toJSON()) })// .catch( () => res.sendStatus(500) ) }) return crud } }