13 } from 'sequelize-typescript'
14 import { logger } from '../../helpers/logger'
15 import { UserModel } from '../account/user'
16 import { OAuthClientModel } from './oauth-client'
17 import { Transaction } from 'sequelize'
18 import { AccountModel } from '../account/account'
19 import { ActorModel } from '../activitypub/actor'
20 import { clearCacheByToken } from '../../lib/oauth-model'
21 import * as Bluebird from 'bluebird'
22 import { MOAuthTokenUser } from '@server/types/models/oauth/oauth-token'
24 export type OAuthTokenInfo = {
26 refreshTokenExpiresAt: Date
33 token: MOAuthTokenUser
37 WITH_USER = 'WITH_USER'
41 [ScopeNames.WITH_USER]: {
44 model: UserModel.unscoped(),
49 model: AccountModel.unscoped(),
53 attributes: [ 'id', 'url' ],
54 model: ActorModel.unscoped(),
65 tableName: 'oAuthToken',
68 fields: [ 'refreshToken' ],
72 fields: [ 'accessToken' ],
79 fields: [ 'oAuthClientId' ]
83 export class OAuthTokenModel extends Model<OAuthTokenModel> {
91 accessTokenExpiresAt: Date
99 refreshTokenExpiresAt: Date
110 @ForeignKey(() => UserModel)
114 @BelongsTo(() => UserModel, {
122 @ForeignKey(() => OAuthClientModel)
124 oAuthClientId: number
126 @BelongsTo(() => OAuthClientModel, {
132 OAuthClients: OAuthClientModel[]
136 static removeTokenCache (token: OAuthTokenModel) {
137 return clearCacheByToken(token.accessToken)
140 static loadByRefreshToken (refreshToken: string) {
142 where: { refreshToken }
145 return OAuthTokenModel.findOne(query)
148 static getByRefreshTokenAndPopulateClient (refreshToken: string) {
153 include: [ OAuthClientModel ]
156 return OAuthTokenModel.scope(ScopeNames.WITH_USER)
159 if (!token) return null
162 refreshToken: token.refreshToken,
163 refreshTokenExpiresAt: token.refreshTokenExpiresAt,
165 id: token.oAuthClientId
172 logger.error('getRefreshToken error.', { err })
177 static getByTokenAndPopulateUser (bearerToken: string): Bluebird<MOAuthTokenUser> {
180 accessToken: bearerToken
184 return OAuthTokenModel.scope(ScopeNames.WITH_USER)
187 if (!token) return null
189 return Object.assign(token, { user: token.User })
193 static getByRefreshTokenAndPopulateUser (refreshToken: string): Bluebird<MOAuthTokenUser> {
200 return OAuthTokenModel.scope(ScopeNames.WITH_USER)
203 if (!token) return undefined
205 return Object.assign(token, { user: token.User })
209 static deleteUserToken (userId: number, t?: Transaction) {
217 return OAuthTokenModel.destroy(query)