Begin activitypub
[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.oAuthClientId
110         },
111         user: {
112           id: token.userId
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: [
130       {
131         model: OAuthToken['sequelize'].models.User,
132         include: [
133           {
134             model: OAuthToken['sequelize'].models.Author,
135             required: true
136           }
137         ]
138       }
139     ]
140   }
141
142   return OAuthToken.findOne(query).then(token => {
143     if (token) token['user'] = token.User
144
145     return token
146   })
147 }
148
149 getByRefreshTokenAndPopulateUser = function (refreshToken: string) {
150   const query = {
151     where: {
152       refreshToken: refreshToken
153     },
154     include: [
155       {
156         model: OAuthToken['sequelize'].models.User,
157         include: [
158           {
159             model: OAuthToken['sequelize'].models.Author,
160             required: true
161           }
162         ]
163       }
164     ]
165   }
166
167   return OAuthToken.findOne(query).then(token => {
168     token['user'] = token.User
169
170     return token
171   })
172 }
173
174 removeByUserId = function (userId: number) {
175   const query = {
176     where: {
177       userId: userId
178     }
179   }
180
181   return OAuthToken.destroy(query)
182 }