an experiment in putting together a wiki and an object-oriented mud.
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.
the-forest/server/server.js

112 lines
3.2 KiB

const express = require('express');
const showdown = require('showdown');
const db_url = 'http://localhost:8000'
const port = process.env.PORT || 3001; // Use the port provided by the host or default to 3000
const app = express();
app.use(express.json());
app.use(function (req, res, next) {
res.setHeader("Access-Control-Allow-Origin", "*");
res.setHeader('Access-Control-Allow-Methods', '*');
res.setHeader("Access-Control-Allow-Headers", "*");
next();
});
const converter = new showdown.Converter();
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});
// Define a route to handle incoming requests
app.post('/', (req, res) => {
res.send('Hello, Express!');
});
app.get('/pages', (req, res) => {
fetch(db_url, {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
statements: ['select id from pages']
})
}).then((rsp) => rsp.json())
.then((data) => data[0].results.rows)
.then((rows) => rows.map(([id]) => id))
.then((ids) => res.json(ids))
.catch((error) => res.status(500).json({"error": error}));
});
app.post('/page/new', (req, res) => {
fetch(db_url, {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
statements: [{
q: 'insert into pages (title, description) values (?, ?) returning id',
params: ["new page", "this page is new!"]
}]
})
}).then((rsp) => rsp.json())
.then((data) => data[0].results.rows[0][0])
.then((row) => res.status(200).json({id: row}))
.catch((error) => res.status(500).json({"error": error}))
});
app.get('/page/:id', (req, res) => {
fetch(db_url, {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
statements: [{
q: 'select * from pages where id=?',
params: [req.params.id]
}]
})
}).then((rsp) => rsp.json())
.then((data) => {
if (data[0].results.rows.length == 0) return res.status(404).json({"error": "page not found in db"});
return data[0].results.rows[0];
}).then((row) => res.status(200).json(row))
.catch((error) => res.status(500).json({"error": error}));
});
app.post('/page/:id', (req, res) => {
console.log(`got a post for /page/${req.params.id}`, req.body);
console.log(`rendering new input ${req.params.id}`);
const html = converter.makeHtml(req.body.description);
console.log(`the output was ${html}`)
console.log("done rendering");
fetch(db_url, {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
statements: [{
q: 'replace into pages (id, title, description, html) values (?, ?, ?, ?)',
params: [Number(req.params.id), req.body.title, req.body.description, html],
}]
})
}).then(() => res.status(200).json({}))
.catch((error) => res.status(500).json({"error": error}));
});
app.delete('/page/:id', (req, res) => {
console.log(`deleting page #${req.params.id}`);
fetch(db_url, {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
statements: [{
q: 'delete from pages where id = ?',
params: [Number(req.params.id)]
}]
})
}).then(() => res.status(200).json({id: req.params.id}))
.catch((error) => res.status(500).json({"error": error}))
})