]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/models/oauth/oauth-token.ts
Split types and typings
[github/Chocobozzz/PeerTube.git] / server / models / oauth / oauth-token.ts
index e3de9468e1536738da90ecd827e638868350a7b4..7f2313dad169588ca1f8a875acf438e7c3f729b9 100644 (file)
-import * as Sequelize from 'sequelize'
-
-import { logger } from '../../helpers'
-
-import { addMethodsToModel } from '../utils'
 import {
-  OAuthTokenInstance,
-  OAuthTokenAttributes,
-
-  OAuthTokenMethods,
-  OAuthTokenInfo
-} from './oauth-token-interface'
+  AfterDestroy,
+  AfterUpdate,
+  AllowNull,
+  BelongsTo,
+  Column,
+  CreatedAt,
+  ForeignKey,
+  Model,
+  Scopes,
+  Table,
+  UpdatedAt
+} from 'sequelize-typescript'
+import { logger } from '../../helpers/logger'
+import { UserModel } from '../account/user'
+import { OAuthClientModel } from './oauth-client'
+import { Transaction } from 'sequelize'
+import { AccountModel } from '../account/account'
+import { ActorModel } from '../activitypub/actor'
+import { clearCacheByToken } from '../../lib/oauth-model'
+import * as Bluebird from 'bluebird'
+import { MOAuthTokenUser } from '@server/types/models/oauth/oauth-token'
+
+export type OAuthTokenInfo = {
+  refreshToken: string
+  refreshTokenExpiresAt: Date
+  client: {
+    id: number
+  }
+  user: {
+    id: number
+  }
+  token: MOAuthTokenUser
+}
 
-let OAuthToken: Sequelize.Model<OAuthTokenInstance, OAuthTokenAttributes>
-let getByRefreshTokenAndPopulateClient: OAuthTokenMethods.GetByRefreshTokenAndPopulateClient
-let getByTokenAndPopulateUser: OAuthTokenMethods.GetByTokenAndPopulateUser
-let getByRefreshTokenAndPopulateUser: OAuthTokenMethods.GetByRefreshTokenAndPopulateUser
-let removeByUserId: OAuthTokenMethods.RemoveByUserId
+enum ScopeNames {
+  WITH_USER = 'WITH_USER'
+}
 
-export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) {
-  OAuthToken = sequelize.define<OAuthTokenInstance, OAuthTokenAttributes>('OAuthToken',
-    {
-      accessToken: {
-        type: DataTypes.STRING,
-        allowNull: false
-      },
-      accessTokenExpiresAt: {
-        type: DataTypes.DATE,
-        allowNull: false
-      },
-      refreshToken: {
-        type: DataTypes.STRING,
-        allowNull: false
-      },
-      refreshTokenExpiresAt: {
-        type: DataTypes.DATE,
-        allowNull: false
+@Scopes(() => ({
+  [ScopeNames.WITH_USER]: {
+    include: [
+      {
+        model: UserModel.unscoped(),
+        required: true,
+        include: [
+          {
+            attributes: [ 'id' ],
+            model: AccountModel.unscoped(),
+            required: true,
+            include: [
+              {
+                attributes: [ 'id', 'url' ],
+                model: ActorModel.unscoped(),
+                required: true
+              }
+            ]
+          }
+        ]
       }
+    ]
+  }
+}))
+@Table({
+  tableName: 'oAuthToken',
+  indexes: [
+    {
+      fields: [ 'refreshToken' ],
+      unique: true
     },
     {
-      indexes: [
-        {
-          fields: [ 'refreshToken' ],
-          unique: true
-        },
-        {
-          fields: [ 'accessToken' ],
-          unique: true
-        },
-        {
-          fields: [ 'userId' ]
-        },
-        {
-          fields: [ 'oAuthClientId' ]
-        }
-      ]
+      fields: [ 'accessToken' ],
+      unique: true
+    },
+    {
+      fields: [ 'userId' ]
+    },
+    {
+      fields: [ 'oAuthClientId' ]
     }
-  )
+  ]
+})
+export class OAuthTokenModel extends Model<OAuthTokenModel> {
 
-  const classMethods = [
-    associate,
+  @AllowNull(false)
+  @Column
+  accessToken: string
 
-    getByRefreshTokenAndPopulateClient,
-    getByTokenAndPopulateUser,
-    getByRefreshTokenAndPopulateUser,
-    removeByUserId
-  ]
-  addMethodsToModel(OAuthToken, classMethods)
+  @AllowNull(false)
+  @Column
+  accessTokenExpiresAt: Date
 
-  return OAuthToken
-}
+  @AllowNull(false)
+  @Column
+  refreshToken: string
+
+  @AllowNull(false)
+  @Column
+  refreshTokenExpiresAt: Date
+
+  @Column
+  authName: string
 
-// ---------------------------------------------------------------------------
+  @CreatedAt
+  createdAt: Date
 
-function associate (models) {
-  OAuthToken.belongsTo(models.User, {
+  @UpdatedAt
+  updatedAt: Date
+
+  @ForeignKey(() => UserModel)
+  @Column
+  userId: number
+
+  @BelongsTo(() => UserModel, {
     foreignKey: {
-      name: 'userId',
       allowNull: false
     },
     onDelete: 'cascade'
   })
+  User: UserModel
+
+  @ForeignKey(() => OAuthClientModel)
+  @Column
+  oAuthClientId: number
 
-  OAuthToken.belongsTo(models.OAuthClient, {
+  @BelongsTo(() => OAuthClientModel, {
     foreignKey: {
-      name: 'oAuthClientId',
       allowNull: false
     },
     onDelete: 'cascade'
   })
-}
+  OAuthClients: OAuthClientModel[]
 
-getByRefreshTokenAndPopulateClient = function (refreshToken: string) {
-  const query = {
-    where: {
-      refreshToken: refreshToken
-    },
-    include: [ OAuthToken['sequelize'].models.OAuthClient ]
+  @AfterUpdate
+  @AfterDestroy
+  static removeTokenCache (token: OAuthTokenModel) {
+    return clearCacheByToken(token.accessToken)
   }
 
-  return OAuthToken.findOne(query)
-    .then(token => {
-      if (!token) return null
-
-      const tokenInfos: OAuthTokenInfo = {
-        refreshToken: token.refreshToken,
-        refreshTokenExpiresAt: token.refreshTokenExpiresAt,
-        client: {
-          id: token.oAuthClientId
-        },
-        user: {
-          id: token.userId
-        }
-      }
+  static loadByRefreshToken (refreshToken: string) {
+    const query = {
+      where: { refreshToken }
+    }
 
-      return tokenInfos
-    })
-    .catch(err => {
-      logger.info('getRefreshToken error.', err)
-      throw err
-    })
-}
+    return OAuthTokenModel.findOne(query)
+  }
 
-getByTokenAndPopulateUser = function (bearerToken: string) {
-  const query = {
-    where: {
-      accessToken: bearerToken
-    },
-    include: [ OAuthToken['sequelize'].models.User ]
+  static getByRefreshTokenAndPopulateClient (refreshToken: string) {
+    const query = {
+      where: {
+        refreshToken
+      },
+      include: [ OAuthClientModel ]
+    }
+
+    return OAuthTokenModel.scope(ScopeNames.WITH_USER)
+                          .findOne(query)
+                          .then(token => {
+                            if (!token) return null
+
+                            return {
+                              refreshToken: token.refreshToken,
+                              refreshTokenExpiresAt: token.refreshTokenExpiresAt,
+                              client: {
+                                id: token.oAuthClientId
+                              },
+                              user: token.User,
+                              token
+                            } as OAuthTokenInfo
+                          })
+                          .catch(err => {
+                            logger.error('getRefreshToken error.', { err })
+                            throw err
+                          })
   }
 
-  return OAuthToken.findOne(query).then(token => {
-    if (token) token['user'] = token.User
+  static getByTokenAndPopulateUser (bearerToken: string): Bluebird<MOAuthTokenUser> {
+    const query = {
+      where: {
+        accessToken: bearerToken
+      }
+    }
 
-    return token
-  })
-}
+    return OAuthTokenModel.scope(ScopeNames.WITH_USER)
+                          .findOne(query)
+                          .then(token => {
+                            if (!token) return null
 
-getByRefreshTokenAndPopulateUser = function (refreshToken: string) {
-  const query = {
-    where: {
-      refreshToken: refreshToken
-    },
-    include: [ OAuthToken['sequelize'].models.User ]
+                            return Object.assign(token, { user: token.User })
+                          })
   }
 
-  return OAuthToken.findOne(query).then(token => {
-    token['user'] = token.User
+  static getByRefreshTokenAndPopulateUser (refreshToken: string): Bluebird<MOAuthTokenUser> {
+    const query = {
+      where: {
+        refreshToken
+      }
+    }
 
-    return token
-  })
-}
+    return OAuthTokenModel.scope(ScopeNames.WITH_USER)
+      .findOne(query)
+      .then(token => {
+        if (!token) return undefined
 
-removeByUserId = function (userId: number) {
-  const query = {
-    where: {
-      userId: userId
-    }
+        return Object.assign(token, { user: token.User })
+      })
   }
 
-  return OAuthToken.destroy(query)
+  static deleteUserToken (userId: number, t?: Transaction) {
+    const query = {
+      where: {
+        userId
+      },
+      transaction: t
+    }
+
+    return OAuthTokenModel.destroy(query)
+  }
 }