diff options
Diffstat (limited to 'alarm/node_modules/pronote-api/src/server/index.js')
-rw-r--r-- | alarm/node_modules/pronote-api/src/server/index.js | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/alarm/node_modules/pronote-api/src/server/index.js b/alarm/node_modules/pronote-api/src/server/index.js new file mode 100644 index 0000000..1693e1c --- /dev/null +++ b/alarm/node_modules/pronote-api/src/server/index.js @@ -0,0 +1,47 @@ +const { graphql } = require('graphql'); + +const http = require('./http'); +const context = require('./context'); +const getSchemas = require('./schemas'); +const { login, logout, getSession } = require('./auth'); + +async function start(host, port) +{ + const schemas = await getSchemas(); + + await http(host, port, { + graphql: ({ query, variables }, token) => handle(token, schemas, query, context, variables), + login: params => login(params), + logout: (_, token) => logout(token) + }); +} + +async function handle(token, schemas, query, context, variables) +{ + if (!token) { + throw { + http: 401, + message: 'Missing \'Token\' header' + }; + } + + if (!query) { + throw { + http: 400, + message: 'Missing \'query\' field or \'Content-Type: application/json\' header' + }; + } + + const session = getSession(token); + if (!session) { + throw { + http: 401, + message: 'Unknown session token' + }; + } + + const schema = schemas[session.type.name]; + return await graphql(schema, query, context(session), null, variables); +} + +module.exports = start; |