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 { logger } from '../../helpers/logger'
19 import { AccountModel } from '../account/account'
20 import { UserModel } from '../account/user'
21 import { ActorModel } from '../activitypub/actor'
22 import { OAuthClientModel } from './oauth-client'
24 export type OAuthTokenInfo = {
26 refreshTokenExpiresAt: Date
31 token: MOAuthTokenUser
35 WITH_USER = 'WITH_USER'
39 [ScopeNames.WITH_USER]: {
42 model: UserModel.unscoped(),
47 model: AccountModel.unscoped(),
51 attributes: [ 'id', 'url' ],
52 model: ActorModel.unscoped(),
63 tableName: 'oAuthToken',
66 fields: [ 'refreshToken' ],
70 fields: [ 'accessToken' ],
77 fields: [ 'oAuthClientId' ]
81 export class OAuthTokenModel extends Model {
89 accessTokenExpiresAt: Date
97 refreshTokenExpiresAt: Date
108 @ForeignKey(() => UserModel)
112 @BelongsTo(() => UserModel, {
120 @ForeignKey(() => OAuthClientModel)
122 oAuthClientId: number
124 @BelongsTo(() => OAuthClientModel, {
130 OAuthClients: OAuthClientModel[]
134 static removeTokenCache (token: OAuthTokenModel) {
135 return TokensCache.Instance.clearCacheByToken(token.accessToken)
138 static loadByRefreshToken (refreshToken: string) {
140 where: { refreshToken }
143 return OAuthTokenModel.findOne(query)
146 static getByRefreshTokenAndPopulateClient (refreshToken: string) {
151 include: [ OAuthClientModel ]
154 return OAuthTokenModel.scope(ScopeNames.WITH_USER)
157 if (!token) return null
160 refreshToken: token.refreshToken,
161 refreshTokenExpiresAt: token.refreshTokenExpiresAt,
163 id: token.oAuthClientId
170 logger.error('getRefreshToken error.', { err })
175 static getByTokenAndPopulateUser (bearerToken: string): Promise<MOAuthTokenUser> {
178 accessToken: bearerToken
182 return OAuthTokenModel.scope(ScopeNames.WITH_USER)
185 if (!token) return null
187 return Object.assign(token, { user: token.User })
191 static getByRefreshTokenAndPopulateUser (refreshToken: string): Promise<MOAuthTokenUser> {
198 return OAuthTokenModel.scope(ScopeNames.WITH_USER)
201 if (!token) return undefined
203 return Object.assign(token, { user: token.User })
207 static deleteUserToken (userId: number, t?: Transaction) {
208 TokensCache.Instance.deleteUserToken(userId)
217 return OAuthTokenModel.destroy(query)