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
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()
|
|
}
|
|
}
|