diff --git a/backend/routes.coffee b/backend/routes.coffee index 2f6edcc..8979f03 100644 --- a/backend/routes.coffee +++ b/backend/routes.coffee @@ -1,118 +1,24 @@ -# node libraries -(require 'debug').enable 'routes' -logger = (require 'logging').default 'routes' +# local libraries +# (require 'debug').enable 'routes' path = (require 'path') -# my libraries -FFTCGDB = (require './db') -FFTCGSESSION = (require './session') +# shared libraries +SHARE = + logger: (require 'logging').default 'routes' + jsonschemas: + user: (require './routes/schema/user.schema')() -# open fftcg.db (persistent data) -fftcgdb = new FFTCGDB path.resolve(__dirname, 'fftcg.db'), true -# open session storage (volatile data) -session = new FFTCGSESSION - -JSONSCHEMA = - user: -> - body: - login: type: 'string' - password: type: 'string' - - response: - 200: - type: 'object' - required: ['success'] - properties: - success: type: 'boolean' - err: type: 'string' - user: - type: 'object' - required: ['user', 'login'] - properties: - user: type: 'number' - login: type: 'string' - # user is required iff success - # err is required otherwise - if: - properties: - success: - const: true - then: - required: ['user'] - else: - required: ['err'] + # fftcg.db (persistent data) + fftcgdb: new (require './db') path.resolve(__dirname, 'fftcg.db'), true + # session storage (volatile data) + session: new (require './session') module.exports = [ -# test - url: '/test' - method: 'POST' - handler: (request, reply) -> - logger.info 'Cookies', request.cookies - logger.info 'Body', request.body - logger.info 'Query', request.query - logger.info 'Params', request.params - - reply.setCookie 'foo', 'foo' - reply.send - hello: 'world' -, -# register user - url: '/user/register' - method: 'POST' - schema: JSONSCHEMA.user() - - handler: (request, reply) -> - fftcgdb.register(request.body.login, request.body.password) - .then (user) -> - logger.info "OK registration '#{request.body.login}'" - reply.send - success: true - user: user - return - - .catch (err) -> - logger.debug "FAIL registration '#{request.body.login}'" - reply.send - success: false - err: err -, -# log in user - url: '/user/login' - method: 'POST' - schema: JSONSCHEMA.user() - - handler: (request, reply) -> - session_id = request.cookies.session ? '' - - new Promise (resolve) -> - session.check session_id - .then (user) -> - # active session found - logger.debug "OK '#{user.login}' resumed session '#{session_id}'" - resolve user - - .catch -> - fftcgdb.login request.body.login, request.body.password - .then (user) -> - # login successful: start new session - session.start user - .then (session_id) -> - logger.info "OK '#{user.login}' created session '#{session_id}'" - reply.setCookie 'session', session_id - resolve user - - .catch (err) -> - # login failed - logger.info "FAIL login for '#{request.body.login}'" - reply.send - success: false - err: err - - .then (user) -> - # tell about the user who logged in - reply.send - success: true - user: user -, + # test + (require './routes/test') SHARE + # register user + (require './routes/user/register') SHARE + # log in user + (require './routes/user/login') SHARE ] diff --git a/backend/routes/schema/user.schema.coffee b/backend/routes/schema/user.schema.coffee new file mode 100644 index 0000000..0c05989 --- /dev/null +++ b/backend/routes/schema/user.schema.coffee @@ -0,0 +1,28 @@ +module.exports = -> + body: + login: type: 'string' + password: type: 'string' + + response: + 200: + type: 'object' + required: ['success'] + properties: + success: type: 'boolean' + err: type: 'string' + user: + type: 'object' + required: ['user', 'login'] + properties: + user: type: 'number' + login: type: 'string' + # user is required iff success + # err is required otherwise + if: + properties: + success: + const: true + then: + required: ['user'] + else: + required: ['err'] diff --git a/backend/routes/test.coffee b/backend/routes/test.coffee new file mode 100644 index 0000000..e73dddb --- /dev/null +++ b/backend/routes/test.coffee @@ -0,0 +1,12 @@ +module.exports = (SHARE) -> + url: '/test' + method: 'POST' + handler: (request, reply) -> + logger.info 'Cookies', request.cookies + logger.info 'Body', request.body + logger.info 'Query', request.query + logger.info 'Params', request.params + + reply.setCookie 'foo', 'foo' + reply.send + hello: 'world' diff --git a/backend/routes/user/login.coffee b/backend/routes/user/login.coffee new file mode 100644 index 0000000..1dcf365 --- /dev/null +++ b/backend/routes/user/login.coffee @@ -0,0 +1,37 @@ +module.exports = (SHARE) -> + url: '/user/login' + method: 'POST' + schema: SHARE.jsonschemas.user + + handler: (request, reply) -> + session_id = request.cookies.session ? '' + + new Promise (resolve) -> + SHARE.session.check session_id + .then (user) -> + # active session found + SHARE.logger.debug "OK '#{user.login}' resumed session '#{session_id}'" + resolve user + + .catch -> + SHARE.fftcgdb.login request.body.login, request.body.password + .then (user) -> + # login successful: start new session + SHARE.session.start user + .then (session_id) -> + logger.info "OK '#{user.login}' created session '#{session_id}'" + reply.setCookie 'session', session_id + resolve user + + .catch (err) -> + # login failed + SHARE.logger.info "FAIL login for '#{request.body.login}'" + reply.send + success: false + err: err + + .then (user) -> + # tell about the user who logged in + reply.send + success: true + user: user diff --git a/backend/routes/user/register.coffee b/backend/routes/user/register.coffee new file mode 100644 index 0000000..39a70c7 --- /dev/null +++ b/backend/routes/user/register.coffee @@ -0,0 +1,19 @@ +module.exports = (SHARE) -> + url: '/user/register' + method: 'POST' + schema: SHARE.jsonschemas.user + + handler: (request, reply) -> + SHARE.fftcgdb.register(request.body.login, request.body.password) + .then (user) -> + SHARE.logger.info "OK registration '#{request.body.login}'" + reply.send + success: true + user: user + return + + .catch (err) -> + SHARE.logger.debug "FAIL registration '#{request.body.login}'" + reply.send + success: false + err: err