import {uuid_v4} from '@extollo/util' import {Field, FieldType, Model} from '@extollo/orm' import {Injectable} from '@extollo/di' import {AccessToken} from './AccessToken.model' import {User} from './User.model' /** * LoginToken Model */ @Injectable() export class LoginToken extends Model { public static async forUser(user: User): Promise { const token = new LoginToken() const tokenValue = uuid_v4() token.userId = user.key() token.token = tokenValue token.redeemed = false await token.save() // @ts-ignore // FIXME - once @extollo/orm#3 is resolved, remove this return LoginToken.query() .where('token', '=', tokenValue) .first() } protected static table = 'login_token' protected static key = 'login_token_id' @Field(FieldType.serial) public login_token_id!: number // FIXME when @extollo/orm#2 is fixed, change to camelCase @Field(FieldType.int4, 'user_id') public userId!: number @Field(FieldType.varchar) public token!: string @Field(FieldType.boolean) public redeemed!: boolean user() { return User.query() .where('user_id', '=', this.userId) .limit(1) .get() .first() } async redeem(): Promise { const accessToken = new AccessToken() const user = await this.user() const tokenValue = (uuid_v4() + uuid_v4()).replace(/-/g, '') accessToken.userId = user?.key() accessToken.token = tokenValue accessToken.active = true await accessToken.save() this.redeemed = true await this.save() // @ts-ignore // FIXME - once @extollo/orm#3 is resolved, remove this return AccessToken.query() .where('token', '=', tokenValue) .first() } }