1 import { Transaction } from 'sequelize'
14 } from 'sequelize-typescript'
15 import { TokensCache } from '@server/lib/auth/tokens-cache'
16 import { MUserAccountId } from '@server/types/models'
17 import { MOAuthTokenUser } from '@server/types/models/oauth/oauth-token'
18 import { AttributesOnly } from '@shared/typescript-utils'
19 import { logger } from '../../helpers/logger'
20 import { AccountModel } from '../account/account'
21 import { ActorModel } from '../actor/actor'
22 import { UserModel } from '../user/user'
23 import { OAuthClientModel } from './oauth-client'
25 export type OAuthTokenInfo = {
27 refreshTokenExpiresAt: Date
32 token: MOAuthTokenUser
36 WITH_USER = 'WITH_USER'
40 [ScopeNames.WITH_USER]: {
43 model: UserModel.unscoped(),
48 model: AccountModel.unscoped(),
52 attributes: [ 'id', 'url' ],
53 model: ActorModel.unscoped(),
64 tableName: 'oAuthToken',
67 fields: [ 'refreshToken' ],
71 fields: [ 'accessToken' ],
78 fields: [ 'oAuthClientId' ]
82 export class OAuthTokenModel extends Model<Partial<AttributesOnly<OAuthTokenModel>>> {
90 accessTokenExpiresAt: Date
98 refreshTokenExpiresAt: Date
109 @ForeignKey(() => UserModel)
113 @BelongsTo(() => UserModel, {
121 @ForeignKey(() => OAuthClientModel)
123 oAuthClientId: number
125 @BelongsTo(() => OAuthClientModel, {
131 OAuthClients: OAuthClientModel[]
135 static removeTokenCache (token: OAuthTokenModel) {
136 return TokensCache.Instance.clearCacheByToken(token.accessToken)
139 static loadByRefreshToken (refreshToken: string) {
141 where: { refreshToken }
144 return OAuthTokenModel.findOne(query)
147 static getByRefreshTokenAndPopulateClient (refreshToken: string) {
152 include: [ OAuthClientModel ]
155 return OAuthTokenModel.scope(ScopeNames.WITH_USER)
158 if (!token) return null
161 refreshToken: token.refreshToken,
162 refreshTokenExpiresAt: token.refreshTokenExpiresAt,
164 id: token.oAuthClientId
171 logger.error('getRefreshToken error.', { err })
176 static getByTokenAndPopulateUser (bearerToken: string): Promise<MOAuthTokenUser> {
179 accessToken: bearerToken
183 return OAuthTokenModel.scope(ScopeNames.WITH_USER)
186 if (!token) return null
188 return Object.assign(token, { user: token.User })
192 static getByRefreshTokenAndPopulateUser (refreshToken: string): Promise<MOAuthTokenUser> {
199 return OAuthTokenModel.scope(ScopeNames.WITH_USER)
202 if (!token) return undefined
204 return Object.assign(token, { user: token.User })
208 static deleteUserToken (userId: number, t?: Transaction) {
209 TokensCache.Instance.deleteUserToken(userId)
218 return OAuthTokenModel.destroy(query)