Implement user blocking on server side
[oweals/peertube.git] / server / models / oauth / oauth-token.ts
1 import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
2 import { logger } from '../../helpers/logger'
3 import { AccountModel } from '../account/account'
4 import { UserModel } from '../account/user'
5 import { OAuthClientModel } from './oauth-client'
6 import { Transaction } from 'sequelize'
7
8 export type OAuthTokenInfo = {
9   refreshToken: string
10   refreshTokenExpiresAt: Date,
11   client: {
12     id: number
13   },
14   user: {
15     id: number
16   }
17 }
18
19 enum ScopeNames {
20   WITH_ACCOUNT = 'WITH_ACCOUNT'
21 }
22
23 @Scopes({
24   [ScopeNames.WITH_ACCOUNT]: {
25     include: [
26       {
27         model: () => UserModel,
28         include: [
29           {
30             model: () => AccountModel,
31             required: true
32           }
33         ]
34       }
35     ]
36   }
37 })
38 @Table({
39   tableName: 'oAuthToken',
40   indexes: [
41     {
42       fields: [ 'refreshToken' ],
43       unique: true
44     },
45     {
46       fields: [ 'accessToken' ],
47       unique: true
48     },
49     {
50       fields: [ 'userId' ]
51     },
52     {
53       fields: [ 'oAuthClientId' ]
54     }
55   ]
56 })
57 export class OAuthTokenModel extends Model<OAuthTokenModel> {
58
59   @AllowNull(false)
60   @Column
61   accessToken: string
62
63   @AllowNull(false)
64   @Column
65   accessTokenExpiresAt: Date
66
67   @AllowNull(false)
68   @Column
69   refreshToken: string
70
71   @AllowNull(false)
72   @Column
73   refreshTokenExpiresAt: Date
74
75   @CreatedAt
76   createdAt: Date
77
78   @UpdatedAt
79   updatedAt: Date
80
81   @ForeignKey(() => UserModel)
82   @Column
83   userId: number
84
85   @BelongsTo(() => UserModel, {
86     foreignKey: {
87       allowNull: false
88     },
89     onDelete: 'cascade'
90   })
91   User: UserModel
92
93   @ForeignKey(() => OAuthClientModel)
94   @Column
95   oAuthClientId: number
96
97   @BelongsTo(() => OAuthClientModel, {
98     foreignKey: {
99       allowNull: false
100     },
101     onDelete: 'cascade'
102   })
103   OAuthClients: OAuthClientModel[]
104
105   static getByRefreshTokenAndPopulateClient (refreshToken: string) {
106     const query = {
107       where: {
108         refreshToken: refreshToken
109       },
110       include: [ OAuthClientModel ]
111     }
112
113     return OAuthTokenModel.findOne(query)
114       .then(token => {
115         if (!token) return null
116
117         return {
118           refreshToken: token.refreshToken,
119           refreshTokenExpiresAt: token.refreshTokenExpiresAt,
120           client: {
121             id: token.oAuthClientId
122           },
123           user: {
124             id: token.userId
125           }
126         } as OAuthTokenInfo
127       })
128       .catch(err => {
129         logger.error('getRefreshToken error.', { err })
130         throw err
131       })
132   }
133
134   static getByTokenAndPopulateUser (bearerToken: string) {
135     const query = {
136       where: {
137         accessToken: bearerToken
138       }
139     }
140
141     return OAuthTokenModel.scope(ScopeNames.WITH_ACCOUNT).findOne(query).then(token => {
142       if (token) token['user'] = token.User
143
144       return token
145     })
146   }
147
148   static getByRefreshTokenAndPopulateUser (refreshToken: string) {
149     const query = {
150       where: {
151         refreshToken: refreshToken
152       }
153     }
154
155     return OAuthTokenModel.scope(ScopeNames.WITH_ACCOUNT)
156       .findOne(query)
157       .then(token => {
158         if (token) {
159           token['user'] = token.User
160           return token
161         } else {
162           return new OAuthTokenModel()
163         }
164       })
165   }
166
167   static deleteUserToken (userId: number, t?: Transaction) {
168     const query = {
169       where: {
170         userId
171       },
172       transaction: t
173     }
174
175     return OAuthTokenModel.destroy(query)
176   }
177 }