Remove "function" in favor of () => {}
[oweals/peertube.git] / server / models / oauth / oauth-token.ts
1 import * as Sequelize from 'sequelize'
2
3 import { logger } from '../../helpers'
4
5 import { addMethodsToModel } from '../utils'
6 import {
7   OAuthTokenInstance,
8   OAuthTokenAttributes,
9
10   OAuthTokenMethods,
11   OAuthTokenInfo
12 } from './oauth-token-interface'
13
14 let OAuthToken: Sequelize.Model<OAuthTokenInstance, OAuthTokenAttributes>
15 let getByRefreshTokenAndPopulateClient: OAuthTokenMethods.GetByRefreshTokenAndPopulateClient
16 let getByTokenAndPopulateUser: OAuthTokenMethods.GetByTokenAndPopulateUser
17 let getByRefreshTokenAndPopulateUser: OAuthTokenMethods.GetByRefreshTokenAndPopulateUser
18 let removeByUserId: OAuthTokenMethods.RemoveByUserId
19
20 export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) {
21   OAuthToken = sequelize.define<OAuthTokenInstance, OAuthTokenAttributes>('OAuthToken',
22     {
23       accessToken: {
24         type: DataTypes.STRING,
25         allowNull: false
26       },
27       accessTokenExpiresAt: {
28         type: DataTypes.DATE,
29         allowNull: false
30       },
31       refreshToken: {
32         type: DataTypes.STRING,
33         allowNull: false
34       },
35       refreshTokenExpiresAt: {
36         type: DataTypes.DATE,
37         allowNull: false
38       }
39     },
40     {
41       indexes: [
42         {
43           fields: [ 'refreshToken' ],
44           unique: true
45         },
46         {
47           fields: [ 'accessToken' ],
48           unique: true
49         },
50         {
51           fields: [ 'userId' ]
52         },
53         {
54           fields: [ 'oAuthClientId' ]
55         }
56       ]
57     }
58   )
59
60   const classMethods = [
61     associate,
62
63     getByRefreshTokenAndPopulateClient,
64     getByTokenAndPopulateUser,
65     getByRefreshTokenAndPopulateUser,
66     removeByUserId
67   ]
68   addMethodsToModel(OAuthToken, classMethods)
69
70   return OAuthToken
71 }
72
73 // ---------------------------------------------------------------------------
74
75 function associate (models) {
76   OAuthToken.belongsTo(models.User, {
77     foreignKey: {
78       name: 'userId',
79       allowNull: false
80     },
81     onDelete: 'cascade'
82   })
83
84   OAuthToken.belongsTo(models.OAuthClient, {
85     foreignKey: {
86       name: 'oAuthClientId',
87       allowNull: false
88     },
89     onDelete: 'cascade'
90   })
91 }
92
93 getByRefreshTokenAndPopulateClient = function (refreshToken: string) {
94   const query = {
95     where: {
96       refreshToken: refreshToken
97     },
98     include: [ OAuthToken['sequelize'].models.OAuthClient ]
99   }
100
101   return OAuthToken.findOne(query)
102     .then(token => {
103       if (!token) return null
104
105       const tokenInfos: OAuthTokenInfo = {
106         refreshToken: token.refreshToken,
107         refreshTokenExpiresAt: token.refreshTokenExpiresAt,
108         client: {
109           id: token['client'].id
110         },
111         user: {
112           id: token['user']
113         }
114       }
115
116       return tokenInfos
117     })
118     .catch(err => {
119       logger.info('getRefreshToken error.', err)
120       throw err
121     })
122 }
123
124 getByTokenAndPopulateUser = function (bearerToken: string) {
125   const query = {
126     where: {
127       accessToken: bearerToken
128     },
129     include: [ OAuthToken['sequelize'].models.User ]
130   }
131
132   return OAuthToken.findOne(query).then(token => {
133     if (token) token['user'] = token.User
134
135     return token
136   })
137 }
138
139 getByRefreshTokenAndPopulateUser = function (refreshToken: string) {
140   const query = {
141     where: {
142       refreshToken: refreshToken
143     },
144     include: [ OAuthToken['sequelize'].models.User ]
145   }
146
147   return OAuthToken.findOne(query).then(token => {
148     token['user'] = token.User
149
150     return token
151   })
152 }
153
154 removeByUserId = function (userId: number) {
155   const query = {
156     where: {
157       userId: userId
158     }
159   }
160
161   return OAuthToken.destroy(query)
162 }