dgf-prototype/backend/index.js

53 lines
1.2 KiB
JavaScript

const express = require('express');
const { Level } = require('level');
const {
createHash,
} = require('node:crypto');
require('dotenv').config();
const app = express();
const port = process.env.PORT || 3000;
const dataDir = process.env.DATA_DIR || 'data';
const db = new Level(`${dataDir}/forum`, { valueEncoding: 'json' });
app.use(express.json());
app.post('/write', async (req, res) => {
const { body: data } = req;
// TODO: Require author signature
// Compute content hash
const hash = createHash('sha256').update(JSON.stringify(data)).digest('base64url');
console.log('write', hash);
// Store content
db.put(hash, data);
// Return hash
res.send(hash);
});
app.get('/read/:hash', async (req, res) => {
// Fetch content
const { hash } = req.params;
let data;
try {
data = await db.get(req.params.hash);
} catch (e) {
console.log('read error:', e.message, hash);
res.status(e.status).end();
return;
}
console.log('read', hash);
// Return content
res.json(data);
});
app.get('*', (req, res) => {
console.log(`req.path: ${req.path}`);
res.send('Hello World!');
});
app.listen(port, () => {
console.log(`Listening on port ${port}`);
});