mirror of https://github.com/Chocobozzz/PeerTube
				
				
				
			
		
			
				
	
	
		
			173 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
| import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
 | |
| import { logger } from '../../helpers/logger'
 | |
| import { AccountModel } from '../account/account'
 | |
| import { UserModel } from '../account/user'
 | |
| import { OAuthClientModel } from './oauth-client'
 | |
| 
 | |
| export type OAuthTokenInfo = {
 | |
|   refreshToken: string
 | |
|   refreshTokenExpiresAt: Date,
 | |
|   client: {
 | |
|     id: number
 | |
|   },
 | |
|   user: {
 | |
|     id: number
 | |
|   }
 | |
| }
 | |
| 
 | |
| enum ScopeNames {
 | |
|   WITH_ACCOUNT = 'WITH_ACCOUNT'
 | |
| }
 | |
| 
 | |
| @Scopes({
 | |
|   [ScopeNames.WITH_ACCOUNT]: {
 | |
|     include: [
 | |
|       {
 | |
|         model: () => UserModel,
 | |
|         include: [
 | |
|           {
 | |
|             model: () => AccountModel,
 | |
|             required: true
 | |
|           }
 | |
|         ]
 | |
|       }
 | |
|     ]
 | |
|   }
 | |
| })
 | |
| @Table({
 | |
|   tableName: 'oAuthToken',
 | |
|   indexes: [
 | |
|     {
 | |
|       fields: [ 'refreshToken' ],
 | |
|       unique: true
 | |
|     },
 | |
|     {
 | |
|       fields: [ 'accessToken' ],
 | |
|       unique: true
 | |
|     },
 | |
|     {
 | |
|       fields: [ 'userId' ]
 | |
|     },
 | |
|     {
 | |
|       fields: [ 'oAuthClientId' ]
 | |
|     }
 | |
|   ]
 | |
| })
 | |
| export class OAuthTokenModel extends Model<OAuthTokenModel> {
 | |
| 
 | |
|   @AllowNull(false)
 | |
|   @Column
 | |
|   accessToken: string
 | |
| 
 | |
|   @AllowNull(false)
 | |
|   @Column
 | |
|   accessTokenExpiresAt: Date
 | |
| 
 | |
|   @AllowNull(false)
 | |
|   @Column
 | |
|   refreshToken: string
 | |
| 
 | |
|   @AllowNull(false)
 | |
|   @Column
 | |
|   refreshTokenExpiresAt: Date
 | |
| 
 | |
|   @CreatedAt
 | |
|   createdAt: Date
 | |
| 
 | |
|   @UpdatedAt
 | |
|   updatedAt: Date
 | |
| 
 | |
|   @ForeignKey(() => UserModel)
 | |
|   @Column
 | |
|   userId: number
 | |
| 
 | |
|   @BelongsTo(() => UserModel, {
 | |
|     foreignKey: {
 | |
|       allowNull: false
 | |
|     },
 | |
|     onDelete: 'cascade'
 | |
|   })
 | |
|   User: UserModel
 | |
| 
 | |
|   @ForeignKey(() => OAuthClientModel)
 | |
|   @Column
 | |
|   oAuthClientId: number
 | |
| 
 | |
|   @BelongsTo(() => OAuthClientModel, {
 | |
|     foreignKey: {
 | |
|       allowNull: false
 | |
|     },
 | |
|     onDelete: 'cascade'
 | |
|   })
 | |
|   OAuthClients: OAuthClientModel[]
 | |
| 
 | |
|   static getByRefreshTokenAndPopulateClient (refreshToken: string) {
 | |
|     const query = {
 | |
|       where: {
 | |
|         refreshToken: refreshToken
 | |
|       },
 | |
|       include: [ OAuthClientModel ]
 | |
|     }
 | |
| 
 | |
|     return OAuthTokenModel.findOne(query)
 | |
|       .then(token => {
 | |
|         if (!token) return null
 | |
| 
 | |
|         return {
 | |
|           refreshToken: token.refreshToken,
 | |
|           refreshTokenExpiresAt: token.refreshTokenExpiresAt,
 | |
|           client: {
 | |
|             id: token.oAuthClientId
 | |
|           },
 | |
|           user: {
 | |
|             id: token.userId
 | |
|           }
 | |
|         } as OAuthTokenInfo
 | |
|       })
 | |
|       .catch(err => {
 | |
|         logger.info('getRefreshToken error.', err)
 | |
|         throw err
 | |
|       })
 | |
|   }
 | |
| 
 | |
|   static getByTokenAndPopulateUser (bearerToken: string) {
 | |
|     const query = {
 | |
|       where: {
 | |
|         accessToken: bearerToken
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return OAuthTokenModel.scope(ScopeNames.WITH_ACCOUNT).findOne(query).then(token => {
 | |
|       if (token) token['user'] = token.User
 | |
| 
 | |
|       return token
 | |
|     })
 | |
|   }
 | |
| 
 | |
|   static getByRefreshTokenAndPopulateUser (refreshToken: string) {
 | |
|     const query = {
 | |
|       where: {
 | |
|         refreshToken: refreshToken
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return OAuthTokenModel.scope(ScopeNames.WITH_ACCOUNT)
 | |
|       .findOne(query)
 | |
|       .then(token => {
 | |
|         token['user'] = token.User
 | |
| 
 | |
|         return token
 | |
|       })
 | |
|   }
 | |
| 
 | |
|   static deleteUserToken (userId: number) {
 | |
|     const query = {
 | |
|       where: {
 | |
|         userId
 | |
|       }
 | |
|     }
 | |
| 
 | |
|     return OAuthTokenModel.destroy(query)
 | |
|   }
 | |
| }
 |