130 lines
4.0 KiB
TypeScript
130 lines
4.0 KiB
TypeScript
import express from 'express';
|
|
import bodyParser from 'body-parser';
|
|
|
|
import ModelFileModel from '../models/model_file';
|
|
import ModelModel from '../models/model';
|
|
import _ from 'lodash';
|
|
import ModelValidate from './validate/model';
|
|
import res400 from './validate/res400';
|
|
import db from '../db';
|
|
|
|
const router = express.Router();
|
|
|
|
router.get('/model/groups', (req, res, next) => {
|
|
if (!req.auth(res, ['read', 'write', 'dev', 'admin'], 'basic')) return;
|
|
|
|
ModelModel.find().lean().exec((err, data) => {
|
|
if (err) return next(err);
|
|
|
|
// validate all and filter null values from validation errors
|
|
res.json(_.compact(data.map(e => ModelValidate.output(e))));
|
|
});
|
|
});
|
|
|
|
router.post('/model/:group', (req, res, next) => {
|
|
if (!req.auth(res, ['dev', 'admin'], 'basic')) return;
|
|
|
|
const {error, value: model} = ModelValidate.input(req.body);
|
|
console.log(error);
|
|
if (error) return res400(error, res);
|
|
|
|
ModelModel.findOne({group: req.params.group}).lean().exec((err, data) => {
|
|
if (err) return next(err);
|
|
|
|
if (data) { // group exists
|
|
if (data.models.find(e => e.name === model.name)) { // name exists, overwrite
|
|
ModelModel.findOneAndUpdate(
|
|
{$and: [{group: req.params.group}, {'models.name': model.name}]},
|
|
{'models.$': model},
|
|
{upsert: true}).log(req).lean().exec(err => {
|
|
if (err) return next(err);
|
|
res.json({status: 'OK'})
|
|
});
|
|
}
|
|
else { // create new
|
|
ModelModel.findOneAndUpdate(
|
|
{group: req.params.group},
|
|
{$push: {models: model as never}}
|
|
).log(req).lean().exec(err => {
|
|
if (err) return next(err);
|
|
res.json({status: 'OK'})
|
|
});
|
|
}
|
|
}
|
|
else { // create new group
|
|
new ModelModel({group: req.params.group, models: [model]}).save((err, data) => {
|
|
if (err) return next(err);
|
|
db.log(req, 'models', {_id: data._id}, data.toObject());
|
|
res.json({status: 'OK'})
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
router.delete('/model/:group(((?!file)[^\\/]+?))/:name', (req, res, next) => {
|
|
if (!req.auth(res, ['dev', 'admin'], 'basic')) return;
|
|
|
|
ModelModel.findOne({group: req.params.group}).lean().exec((err, data) => {
|
|
if (err) return next(err);
|
|
|
|
if (!data || !data.models.find(e => e.name === req.params.name)) {
|
|
return res.status(404).json({status: 'Not found'});
|
|
}
|
|
if (data.models.length > 1) { // only remove model
|
|
ModelModel.findOneAndUpdate(
|
|
{group: req.params.group},
|
|
{$pull: {models: data.models.find(e => e.name === req.params.name) as never}}
|
|
).log(req).lean().exec(err => {
|
|
if (err) return next(err);
|
|
res.json({status: 'OK'})
|
|
});
|
|
}
|
|
else { // remove document
|
|
ModelModel.findOneAndDelete({group: req.params.group}).log(req).lean().exec(err => {
|
|
if (err) return next(err);
|
|
res.json({status: 'OK'})
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
router.get('/model/file/:name', (req, res, next) => {
|
|
if (!req.auth(res, ['dev', 'admin'], 'all')) return;
|
|
|
|
ModelFileModel.findOne({name: req.params.name}).lean().exec((err, data) => {
|
|
if (err) return next(err);
|
|
if (data) {
|
|
res.set('Content-Type', 'application/octet-stream');
|
|
res.send(data.data.buffer);
|
|
}
|
|
else {
|
|
res.status(404).json({status: 'Not found'});
|
|
}
|
|
});
|
|
});
|
|
|
|
router.post('/model/file/:name', bodyParser.raw({limit: '5mb'}), (req, res, next) => {
|
|
if (!req.auth(res, ['dev', 'admin'], 'all')) return;
|
|
|
|
ModelFileModel.replaceOne({name: req.params.name}, {name: req.params.name, data: req.body}).setOptions({upsert: true})
|
|
.lean().exec(err => {
|
|
if (err) return next(err);
|
|
res.json({status: 'OK'});
|
|
});
|
|
});
|
|
|
|
router.delete('/model/file/:name', (req, res, next) => {
|
|
if (!req.auth(res, ['dev', 'admin'], 'basic')) return;
|
|
|
|
ModelFileModel.findOneAndDelete({name: req.params.name}).lean().exec((err, data) => {
|
|
if (err) return next(err);
|
|
if (data) {
|
|
res.json({status: 'OK'});
|
|
}
|
|
else {
|
|
res.status(404).json({status: 'Not found'});
|
|
}
|
|
});
|
|
});
|
|
|
|
module.exports = router; |