]>
Commit | Line | Data |
---|---|---|
e02643f3 C |
1 | import * as Sequelize from 'sequelize' |
2 | ||
74889a71 | 3 | import { logger } from '../../helpers' |
2f372a86 | 4 | |
74889a71 | 5 | import { addMethodsToModel } from '../utils' |
39445ead | 6 | import { OAuthTokenAttributes, OAuthTokenInfo, OAuthTokenInstance, OAuthTokenMethods } from './oauth-token-interface' |
e02643f3 C |
7 | |
8 | let OAuthToken: Sequelize.Model<OAuthTokenInstance, OAuthTokenAttributes> | |
9 | let getByRefreshTokenAndPopulateClient: OAuthTokenMethods.GetByRefreshTokenAndPopulateClient | |
10 | let getByTokenAndPopulateUser: OAuthTokenMethods.GetByTokenAndPopulateUser | |
11 | let getByRefreshTokenAndPopulateUser: OAuthTokenMethods.GetByRefreshTokenAndPopulateUser | |
69b0a27c | 12 | |
127944aa C |
13 | export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) { |
14 | OAuthToken = sequelize.define<OAuthTokenInstance, OAuthTokenAttributes>('OAuthToken', | |
feb4bdfd C |
15 | { |
16 | accessToken: { | |
67bf9b96 C |
17 | type: DataTypes.STRING, |
18 | allowNull: false | |
feb4bdfd C |
19 | }, |
20 | accessTokenExpiresAt: { | |
67bf9b96 C |
21 | type: DataTypes.DATE, |
22 | allowNull: false | |
feb4bdfd C |
23 | }, |
24 | refreshToken: { | |
67bf9b96 C |
25 | type: DataTypes.STRING, |
26 | allowNull: false | |
feb4bdfd C |
27 | }, |
28 | refreshTokenExpiresAt: { | |
67bf9b96 C |
29 | type: DataTypes.DATE, |
30 | allowNull: false | |
feb4bdfd C |
31 | } |
32 | }, | |
33 | { | |
319d072e C |
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 | } | |
e02643f3 | 49 | ] |
feb4bdfd C |
50 | } |
51 | ) | |
52 | ||
e02643f3 C |
53 | const classMethods = [ |
54 | associate, | |
55 | ||
56 | getByRefreshTokenAndPopulateClient, | |
57 | getByTokenAndPopulateUser, | |
39445ead | 58 | getByRefreshTokenAndPopulateUser |
e02643f3 C |
59 | ] |
60 | addMethodsToModel(OAuthToken, classMethods) | |
61 | ||
feb4bdfd | 62 | return OAuthToken |
69b0a27c C |
63 | } |
64 | ||
69b0a27c C |
65 | // --------------------------------------------------------------------------- |
66 | ||
feb4bdfd | 67 | function associate (models) { |
e02643f3 | 68 | OAuthToken.belongsTo(models.User, { |
feb4bdfd C |
69 | foreignKey: { |
70 | name: 'userId', | |
71 | allowNull: false | |
72 | }, | |
73 | onDelete: 'cascade' | |
74 | }) | |
319d072e | 75 | |
e02643f3 | 76 | OAuthToken.belongsTo(models.OAuthClient, { |
319d072e C |
77 | foreignKey: { |
78 | name: 'oAuthClientId', | |
79 | allowNull: false | |
80 | }, | |
81 | onDelete: 'cascade' | |
82 | }) | |
feb4bdfd C |
83 | } |
84 | ||
69818c93 | 85 | getByRefreshTokenAndPopulateClient = function (refreshToken: string) { |
feb4bdfd C |
86 | const query = { |
87 | where: { | |
88 | refreshToken: refreshToken | |
89 | }, | |
e02643f3 | 90 | include: [ OAuthToken['sequelize'].models.OAuthClient ] |
feb4bdfd C |
91 | } |
92 | ||
075f16ca C |
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: { | |
f981dae8 | 101 | id: token.oAuthClientId |
075f16ca C |
102 | }, |
103 | user: { | |
f981dae8 | 104 | id: token.userId |
075f16ca | 105 | } |
371fa093 | 106 | } |
2f372a86 | 107 | |
075f16ca C |
108 | return tokenInfos |
109 | }) | |
110 | .catch(err => { | |
111 | logger.info('getRefreshToken error.', err) | |
112 | throw err | |
113 | }) | |
69b0a27c C |
114 | } |
115 | ||
69818c93 | 116 | getByTokenAndPopulateUser = function (bearerToken: string) { |
feb4bdfd C |
117 | const query = { |
118 | where: { | |
119 | accessToken: bearerToken | |
120 | }, | |
72c7248b C |
121 | include: [ |
122 | { | |
123 | model: OAuthToken['sequelize'].models.User, | |
124 | include: [ | |
125 | { | |
38fa2065 | 126 | model: OAuthToken['sequelize'].models.Account, |
72c7248b C |
127 | required: true |
128 | } | |
129 | ] | |
130 | } | |
131 | ] | |
feb4bdfd C |
132 | } |
133 | ||
075f16ca | 134 | return OAuthToken.findOne(query).then(token => { |
e02643f3 | 135 | if (token) token['user'] = token.User |
feb4bdfd C |
136 | |
137 | return token | |
138 | }) | |
69b0a27c | 139 | } |
2f372a86 | 140 | |
69818c93 | 141 | getByRefreshTokenAndPopulateUser = function (refreshToken: string) { |
feb4bdfd C |
142 | const query = { |
143 | where: { | |
144 | refreshToken: refreshToken | |
145 | }, | |
72c7248b C |
146 | include: [ |
147 | { | |
148 | model: OAuthToken['sequelize'].models.User, | |
149 | include: [ | |
150 | { | |
38fa2065 | 151 | model: OAuthToken['sequelize'].models.Account, |
72c7248b C |
152 | required: true |
153 | } | |
154 | ] | |
155 | } | |
156 | ] | |
feb4bdfd C |
157 | } |
158 | ||
075f16ca | 159 | return OAuthToken.findOne(query).then(token => { |
e02643f3 | 160 | token['user'] = token.User |
feb4bdfd C |
161 | |
162 | return token | |
163 | }) | |
2f372a86 | 164 | } |