split per app

This commit is contained in:
Timo Hocker 2020-08-16 11:48:06 +02:00
parent d3a19c953a
commit c5be16963d
12 changed files with 126 additions and 14 deletions

10
lib/api/get-app.js Normal file
View File

@ -0,0 +1,10 @@
'use strict';
const db = require ('../db');
const { http } = require ('@sapphirecode/consts');
module.exports = async (req, res) => {
const apps = await db.app.get_all ();
res.status (http.status_ok)
.json (apps);
};

View File

@ -4,6 +4,15 @@ const db = require ('../db');
const { http } = require ('@sapphirecode/consts'); const { http } = require ('@sapphirecode/consts');
module.exports = async (req, res) => { module.exports = async (req, res) => {
res.status (http.status_ok) if (
.json (await db.get_all ()); typeof req.headers.app_id === 'undefined'
|| isNaN (parseInt (req.headers.app_id))
) {
res.status (http.status_bad_request)
.end ();
}
else {
res.status (http.status_ok)
.json (await db.log.get_all (parseInt (req.headers.app_id)));
}
}; };

View File

@ -4,5 +4,6 @@ const router = require ('express')
.Router (); .Router ();
router.get ('/log', require ('./get-log')); router.get ('/log', require ('./get-log'));
router.get ('/app', require ('./get-app'));
module.exports = router; module.exports = router;

9
lib/db/app.js Normal file
View File

@ -0,0 +1,9 @@
'use strict';
module.exports = (get_db) => ({
get_all () {
const knex = get_db ();
return knex ('app')
.select ();
}
});

View File

@ -18,9 +18,11 @@ async function init (use_fake_seed) {
await db.seed.run ({ specific: 'fake.js' }); await db.seed.run ({ specific: 'fake.js' });
} }
function get_all () { function get_db () {
return db ('log') return db;
.select ();
} }
module.exports = { init, get_all }; const log = require ('./log') (get_db);
const app = require ('./app') (get_db);
module.exports = { init, log, app };

15
lib/db/log.js Normal file
View File

@ -0,0 +1,15 @@
'use strict';
module.exports = (get_db) => ({
get_all (app_id) {
const knex = get_db ();
return knex.select (
'id',
'message',
'data',
'timestamp'
)
.from ('log')
.where ({ app_id });
}
});

View File

@ -1,15 +1,29 @@
'use strict'; 'use strict';
async function up (knex) { async function create_app (knex) {
await knex.schema.createTable ('app', (table) => {
table.increments ('id');
table.string ('name');
});
}
async function create_log (knex) {
await knex.schema.createTable ('log', (table) => { await knex.schema.createTable ('log', (table) => {
table.increments ('id'); table.increments ('id');
table.string ('app'); table.integer ('app_id')
.references ('id')
.inTable ('app');
table.string ('message'); table.string ('message');
table.json ('data'); table.json ('data');
table.timestamp ('timestamp'); table.timestamp ('timestamp');
}); });
} }
async function up (knex) {
await create_app (knex);
await create_log (knex);
}
function down () { function down () {
// noop // noop
} }

View File

@ -3,6 +3,16 @@
const faker = require ('faker'); const faker = require ('faker');
const sn = require ('simplex-noise'); const sn = require ('simplex-noise');
const apps = [];
async function create_app (knex) {
const [ id ] = await knex ('app')
.insert (
{ name: faker.random.word () }
);
apps.push (id);
}
function create_log (index, simplex) { function create_log (index, simplex) {
const data = { const data = {
num1: faker.random.number (), num1: faker.random.number (),
@ -10,7 +20,7 @@ function create_log (index, simplex) {
num3: simplex.noise2D (index * 0.1, 1000) num3: simplex.noise2D (index * 0.1, 1000)
}; };
return { return {
app: faker.random.word (), app_id: faker.random.arrayElement (apps),
message: faker.random.words (), message: faker.random.words (),
data: JSON.stringify (data), data: JSON.stringify (data),
timestamp: faker.date.recent () timestamp: faker.date.recent ()
@ -18,14 +28,21 @@ function create_log (index, simplex) {
} }
async function seed (knex) { async function seed (knex) {
await knex ('log')
.del ();
await knex ('app')
.del ();
// eslint-disable-next-line no-console // eslint-disable-next-line no-console
console.log ('creating seeds'); console.log ('creating seeds');
for (let i = 0; i < 5; i++)
// eslint-disable-next-line no-await-in-loop
await create_app (knex);
const simplex = (new sn); const simplex = (new sn);
const log = (Array (20)) const log = (Array (20))
.fill (() => null) .fill (() => null)
.map ((a, index) => create_log (index, simplex)); .map ((a, index) => create_log (index, simplex));
await knex ('log')
.del ();
await knex.batchInsert ('log', log, 10); await knex.batchInsert ('log', log, 10);
} }

View File

@ -11,10 +11,16 @@ import Vue from 'vue';
import VueRouter from 'vue-router'; import VueRouter from 'vue-router';
import AppView from '../views/AppView.vue'; import AppView from '../views/AppView.vue';
import NotFound from '../views/NotFound.vue'; import NotFound from '../views/NotFound.vue';
import Home from '../views/Home.vue';
Vue.use (VueRouter); Vue.use (VueRouter);
const routes = [ const routes = [
{
path: '/',
name: 'Home',
component: Home
},
{ {
path: '/app/:id', path: '/app/:id',
name: 'AppView', name: 'AppView',

View File

@ -18,8 +18,8 @@ export default new Vuex.Store ({
} }
}, },
actions: { actions: {
async get_log ({ commit }) { async get_log ({ commit }, { app_id }) {
const log = await fetch ('/log') const log = await fetch ('/log', { headers: { app_id } })
.then ((res) => res.json ()); .then ((res) => res.json ());
commit ('set_log', log); commit ('set_log', log);
} }

View File

@ -42,7 +42,7 @@ export default {
...Vuex.mapState ({ log: (state) => state.log }) ...Vuex.mapState ({ log: (state) => state.log })
}, },
mounted () { mounted () {
this.get_log (); this.get_log ({ app_id: this.$route.params.id });
document.body.addEventListener ('keydown', (ev) => { document.body.addEventListener ('keydown', (ev) => {
if (ev.key === 's' && ev.ctrlKey) { if (ev.key === 's' && ev.ctrlKey) {
this.save_config (); this.save_config ();

29
src/views/Home.vue Normal file
View File

@ -0,0 +1,29 @@
<template>
<ul>
<li
v-for="(app,key) in apps"
:key="key"
>
<a
:href="'/app/' + app.id"
v-text="app.name"
/>
</li>
</ul>
</template>
<script>
export default {
data () {
return { apps: [] };
},
async mounted () {
this.apps = await fetch ('/app')
.then ((res) => res.json ());
}
};
</script>
<style>
</style>