40 lines
1.0 KiB
JavaScript
40 lines
1.0 KiB
JavaScript
import Staff from '../staff/model'
|
|
import Jwt from '../jwt'
|
|
import * as google from './google'
|
|
|
|
export default class AuthRoutes {
|
|
constructor(opts = {}) {
|
|
Object.assign(this, {
|
|
Staff: opts.Staff || Staff,
|
|
jwt: opts.jwt || new Jwt(),
|
|
google: opts.google || google,
|
|
})
|
|
}
|
|
|
|
/*
|
|
* POST /api/login - Authenticate a user using social login
|
|
*
|
|
* @body {string} token - The google token to authenticate
|
|
* @returns
|
|
*
|
|
* { token: 'Authentication token' }
|
|
*/
|
|
async login(ctx) {
|
|
let output = await google.getProfile(ctx.request.body.token)
|
|
|
|
if (output.email_verified !== 'true') ctx.throw(422, 'Email was not verified with google')
|
|
if (!output.email) ctx.throw(422, 'Email was missing from google response')
|
|
|
|
let level = 1
|
|
let staff = await this.Staff
|
|
.query({ where: { email: output.email }})
|
|
.fetch({ require: false })
|
|
|
|
if (staff && staff.id && staff.get('level')) {
|
|
level = staff.get('level')
|
|
}
|
|
|
|
ctx.body = { token: this.jwt.createToken(output.email, level) }
|
|
}
|
|
}
|