]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blobdiff - server/models/oauth/oauth-token.ts
Merge branch 'release/2.1.0' into develop
[github/Chocobozzz/PeerTube.git] / server / models / oauth / oauth-token.ts
index 0d21c42fd26a31f02cca7718fdd73d27af5d0b87..d2101ce86f9cb4ddfa668890537cc7ac313357f3 100644 (file)
@@ -1,20 +1,65 @@
-import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, Model, Table, UpdatedAt } from 'sequelize-typescript'
-import { logger } from '../../helpers'
-import { AccountModel } from '../account/account'
+import {
+  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/typings/models/oauth/oauth-token'
 
 export type OAuthTokenInfo = {
   refreshToken: string
-  refreshTokenExpiresAt: Date,
+  refreshTokenExpiresAt: Date
   client: {
     id: number
-  },
+  }
   user: {
     id: number
   }
 }
 
+enum ScopeNames {
+  WITH_USER = 'WITH_USER'
+}
+
+@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: [
@@ -82,6 +127,12 @@ export class OAuthTokenModel extends Model<OAuthTokenModel> {
   })
   OAuthClients: OAuthClientModel[]
 
+  @AfterUpdate
+  @AfterDestroy
+  static removeTokenCache (token: OAuthTokenModel) {
+    return clearCacheByToken(token.accessToken)
+  }
+
   static getByRefreshTokenAndPopulateClient (refreshToken: string) {
     const query = {
       where: {
@@ -106,58 +157,51 @@ export class OAuthTokenModel extends Model<OAuthTokenModel> {
         } as OAuthTokenInfo
       })
       .catch(err => {
-        logger.info('getRefreshToken error.', err)
+        logger.error('getRefreshToken error.', { err })
         throw err
       })
   }
 
-  static getByTokenAndPopulateUser (bearerToken: string) {
+  static getByTokenAndPopulateUser (bearerToken: string): Bluebird<MOAuthTokenUser> {
     const query = {
       where: {
         accessToken: bearerToken
-      },
-      include: [
-        {
-          model: UserModel,
-          include: [
-            {
-              model: AccountModel,
-              required: true
-            }
-          ]
-        }
-      ]
+      }
     }
 
-    return OAuthTokenModel.findOne(query).then(token => {
-      if (token) token['user'] = token.User
+    return OAuthTokenModel.scope(ScopeNames.WITH_USER)
+                          .findOne(query)
+                          .then(token => {
+                            if (!token) return null
 
-      return token
-    })
+                            return Object.assign(token, { user: token.User })
+                          })
   }
 
-  static getByRefreshTokenAndPopulateUser (refreshToken: string) {
+  static getByRefreshTokenAndPopulateUser (refreshToken: string): Bluebird<MOAuthTokenUser> {
     const query = {
       where: {
         refreshToken: refreshToken
-      },
-      include: [
-        {
-          model: UserModel,
-          include: [
-            {
-              model: AccountModel,
-              required: true
-            }
-          ]
-        }
-      ]
+      }
     }
 
-    return OAuthTokenModel.findOne(query).then(token => {
-      token['user'] = token.User
+    return OAuthTokenModel.scope(ScopeNames.WITH_USER)
+      .findOne(query)
+      .then(token => {
+        if (!token) return new OAuthTokenModel()
+
+        return Object.assign(token, { user: token.User })
+      })
+  }
+
+  static deleteUserToken (userId: number, t?: Transaction) {
+    const query = {
+      where: {
+        userId
+      },
+      transaction: t
+    }
 
-      return token
-    })
+    return OAuthTokenModel.destroy(query)
   }
 }