]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/models/oauth/oauth-token.ts
Add follow tabs
[github/Chocobozzz/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.Account,
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.Account,
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 }