summaryrefslogtreecommitdiff
path: root/alarm/node_modules/pronote-api/src/server/http.js
blob: 66b07a560be2fd4290b2a9b2ab353337c24a8a0f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
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;