diff options
Diffstat (limited to 'alarm/node_modules/pronote-api/src/server/http.js')
-rw-r--r-- | alarm/node_modules/pronote-api/src/server/http.js | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/alarm/node_modules/pronote-api/src/server/http.js b/alarm/node_modules/pronote-api/src/server/http.js new file mode 100644 index 0000000..66b07a5 --- /dev/null +++ b/alarm/node_modules/pronote-api/src/server/http.js @@ -0,0 +1,57 @@ +/* eslint no-console: off */ + +const polka = require('polka'); +const body = require('body-parser'); + +function start(host, port, handlers) +{ + const server = polka(); + server.use(body.json()); + + server.post('/auth/login', (req, res) => handle(req, res, handlers.login)); + server.post('/auth/logout', (req, res) => handle(req, res, handlers.logout)); + server.post('/graphql', (req, res) => handle(req, res, handlers.graphql)); + + return new Promise((resolve, reject) => { + server.listen(port, host, err => { + if (err) { + return reject(err); + } + + return resolve(); + }) + }); +} + +function handle(req, res, handler) +{ + handler(req.body, req.headers.token) + .then(result => respond(res, 200, result)) + .catch(err => { + console.error('Error during request handling :'); + console.error(err); + + if (err.message) { + delete err.http; + respond(res, err.http || 500, err); + } else { + respond(res, 500, { + message: 'Internal error : ' + err + }); + } + }); +} + +function respond(res, code, obj) +{ + const data = JSON.stringify(obj); + const headers = { + 'Content-Type': 'application/json; charset=utf-8', + 'Content-Length': Buffer.byteLength(data) + }; + + res.writeHead(code, headers); + res.end(data); +} + +module.exports = start; |