You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

71 lines
1.9 KiB

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<LoginToken> {
public static async forUser(user: User): Promise<LoginToken> {
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<LoginToken>()
.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<User>()
.where('user_id', '=', this.userId)
.limit(1)
.get()
.first()
}
async redeem(): Promise<AccessToken> {
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<AccessToken>()
.where('token', '=', tokenValue)
.first()
}
}