You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
143 lines
3.3 KiB
143 lines
3.3 KiB
import * as Router from 'koa-router'; |
|
|
|
import * as AnalyticUnit from '../models/analytic_unit'; |
|
|
|
import { runLearning } from '../services/analytics_service' |
|
import { saveTargets } from '../services/metrics'; |
|
|
|
async function sendStatus(ctx: Router.IRouterContext) { |
|
try { |
|
let id = ctx.request.query.id; |
|
let name = ctx.request.query.name; |
|
|
|
if(id === undefined) { |
|
throw new Error('Id is undefined'); |
|
} |
|
let unit = AnalyticUnit.findById(id); |
|
|
|
if(unit.status === undefined) { |
|
throw new Error('No status for ' + name); |
|
} |
|
ctx.response.body = { status: unit.status, errorMessage: unit.error }; |
|
} catch(e) { |
|
console.error(e); |
|
// TODO: better send 404 when we know than isn`t found |
|
ctx.response.status = 500; |
|
ctx.response.body = { error: 'Can`t return anything' }; |
|
} |
|
|
|
} |
|
|
|
async function findItem(ctx: Router.IRouterContext) { |
|
try { |
|
let id = ctx.request.query.id; |
|
|
|
if(id === undefined) { |
|
throw new Error('No id param in query'); |
|
} |
|
|
|
let unit: AnalyticUnit.AnalyticUnit = AnalyticUnit.findById(id); |
|
|
|
ctx.response.body = { |
|
name: unit.name, |
|
metric: unit.metric, |
|
status: unit.status |
|
}; |
|
|
|
} catch(e) { |
|
console.error(e); |
|
// TODO: better send 404 when we know than isn`t found |
|
ctx.response.status = 500; |
|
ctx.response.body = 'Can`t find anything'; |
|
} |
|
} |
|
|
|
async function createItem(ctx: Router.IRouterContext) { |
|
try { |
|
|
|
let body = ctx.request.body; |
|
|
|
if(body.type === undefined) { |
|
throw new Error(`Missing field: type`); |
|
} |
|
if(body.name === undefined) { |
|
throw new Error(`Missing field: name`); |
|
} |
|
if(body.panelUrl === undefined) { |
|
throw new Error(`Missing field: panelUrl`); |
|
} |
|
if(body.metric === undefined) { |
|
throw new Error(`Missing field: datasource`); |
|
} |
|
if(body.metric.datasource === undefined) { |
|
throw new Error(`Missing field: metric.datasource`); |
|
} |
|
if(body.metric.targets === undefined) { |
|
throw new Error(`Missing field: metric.targets`); |
|
} |
|
|
|
const metric: AnalyticUnit.Metric = { |
|
datasource: body.metric.datasource, |
|
targets: saveTargets(body.metric.targets) |
|
}; |
|
|
|
const unit: AnalyticUnit.AnalyticUnit = { |
|
name: body.name, |
|
panelUrl: body.panelUrl, |
|
type: body.type, |
|
datasource: body.datasource, |
|
metric: metric, |
|
status: 'learning', |
|
lastPredictionTime: 0, |
|
nextId: 0 |
|
}; |
|
|
|
let newId = AnalyticUnit.createItem(unit); |
|
if(newId === null) { |
|
ctx.response.status = 403; |
|
ctx.response.body = { |
|
code: 403, |
|
message: 'Item exists' |
|
}; |
|
} |
|
|
|
ctx.response.body = { id: newId }; |
|
|
|
runLearning(newId); |
|
} catch(e) { |
|
ctx.response.status = 500; |
|
ctx.response.body = { |
|
code: 500, |
|
message: `Creation error: ${e.message}` |
|
}; |
|
} |
|
} |
|
|
|
function deleteItem(ctx: Router.IRouterContext) { |
|
try { |
|
let id = ctx.request.query.id; |
|
|
|
if(id !== undefined) { |
|
AnalyticUnit.remove(id); |
|
} |
|
|
|
ctx.response.body = { |
|
code: 200, |
|
message: 'Success' |
|
}; |
|
} catch(e) { |
|
ctx.response.status = 500; |
|
ctx.response.body = { |
|
code: 500, |
|
message: `Deletion error: ${e.message}` |
|
}; |
|
} |
|
} |
|
|
|
|
|
export var router = new Router(); |
|
|
|
router.get('/status', sendStatus); |
|
router.get('/', findItem); |
|
router.post('/', createItem); |
|
router.delete('/', deleteItem);
|
|
|