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