'use strict'; const passport = require('koa-passport'); const compose = require('koa-compose'); const { validateRegistrationInput } = require('../validation/authentication'); module.exports = { login: compose([ (ctx, next) => { return passport.authenticate('local', { session: false }, (err, user, info) => { if (err) { return ctx.badImplementation(); } if (!user) { return ctx.badRequest(info.message); } ctx.state.user = user; return next(); })(ctx, next); }, ctx => { const { user } = ctx.state; ctx.body = { data: { token: strapi.admin.services.token.createJwtToken(user), user: strapi.admin.services.user.sanitizeUser(ctx.state.user), // TODO: fetch more detailed info }, }; }, ]), renewToken(ctx) { const { token } = ctx.request.body; if (token === undefined) { return ctx.badRequest('Missing token'); } const { isValid, payload } = strapi.admin.services.token.decodeJwtToken(token); if (!isValid) { return ctx.badRequest('Invalid token'); } ctx.body = { data: { token: strapi.admin.services.token.createJwtToken(payload.id), }, }; }, async registrationInfo(ctx) { const { registrationToken } = ctx.request.query; if (registrationToken === undefined) { return ctx.badRequest('Missing registrationToken'); } const registrationInfo = await strapi.admin.services.user.findRegistrationInfo( registrationToken ); if (!registrationInfo) { return ctx.badRequest('Invalid registrationToken'); } ctx.body = { data: registrationInfo }; }, async register(ctx) { const input = ctx.request.body; try { await validateRegistrationInput(input); } catch (err) { return ctx.badRequest('ValidationError', err); } const user = await strapi.admin.services.user.register(input); ctx.body = { data: { token: strapi.admin.services.token.createJwtToken(user), user: strapi.admin.services.user.sanitizeUser(user), }, }; }, };