]>
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' |
e02643f3 | 6 | import { |
e02643f3 C |
7 | OAuthTokenInstance, |
8 | OAuthTokenAttributes, | |
9 | ||
69818c93 C |
10 | OAuthTokenMethods, |
11 | OAuthTokenInfo | |
e02643f3 C |
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 | |
69b0a27c | 19 | |
127944aa C |
20 | export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) { |
21 | OAuthToken = sequelize.define<OAuthTokenInstance, OAuthTokenAttributes>('OAuthToken', | |
feb4bdfd C |
22 | { |
23 | accessToken: { | |
67bf9b96 C |
24 | type: DataTypes.STRING, |
25 | allowNull: false | |
feb4bdfd C |
26 | }, |
27 | accessTokenExpiresAt: { | |
67bf9b96 C |
28 | type: DataTypes.DATE, |
29 | allowNull: false | |
feb4bdfd C |
30 | }, |
31 | refreshToken: { | |
67bf9b96 C |
32 | type: DataTypes.STRING, |
33 | allowNull: false | |
feb4bdfd C |
34 | }, |
35 | refreshTokenExpiresAt: { | |
67bf9b96 C |
36 | type: DataTypes.DATE, |
37 | allowNull: false | |
feb4bdfd C |
38 | } |
39 | }, | |
40 | { | |
319d072e C |
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 | } | |
e02643f3 | 56 | ] |
feb4bdfd C |
57 | } |
58 | ) | |
59 | ||
e02643f3 C |
60 | const classMethods = [ |
61 | associate, | |
62 | ||
63 | getByRefreshTokenAndPopulateClient, | |
64 | getByTokenAndPopulateUser, | |
65 | getByRefreshTokenAndPopulateUser, | |
66 | removeByUserId | |
67 | ] | |
68 | addMethodsToModel(OAuthToken, classMethods) | |
69 | ||
feb4bdfd | 70 | return OAuthToken |
69b0a27c C |
71 | } |
72 | ||
69b0a27c C |
73 | // --------------------------------------------------------------------------- |
74 | ||
feb4bdfd | 75 | function associate (models) { |
e02643f3 | 76 | OAuthToken.belongsTo(models.User, { |
feb4bdfd C |
77 | foreignKey: { |
78 | name: 'userId', | |
79 | allowNull: false | |
80 | }, | |
81 | onDelete: 'cascade' | |
82 | }) | |
319d072e | 83 | |
e02643f3 | 84 | OAuthToken.belongsTo(models.OAuthClient, { |
319d072e C |
85 | foreignKey: { |
86 | name: 'oAuthClientId', | |
87 | allowNull: false | |
88 | }, | |
89 | onDelete: 'cascade' | |
90 | }) | |
feb4bdfd C |
91 | } |
92 | ||
69818c93 | 93 | getByRefreshTokenAndPopulateClient = function (refreshToken: string) { |
feb4bdfd C |
94 | const query = { |
95 | where: { | |
96 | refreshToken: refreshToken | |
97 | }, | |
e02643f3 | 98 | include: [ OAuthToken['sequelize'].models.OAuthClient ] |
feb4bdfd C |
99 | } |
100 | ||
075f16ca C |
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: { | |
f981dae8 | 109 | id: token.oAuthClientId |
075f16ca C |
110 | }, |
111 | user: { | |
f981dae8 | 112 | id: token.userId |
075f16ca | 113 | } |
371fa093 | 114 | } |
2f372a86 | 115 | |
075f16ca C |
116 | return tokenInfos |
117 | }) | |
118 | .catch(err => { | |
119 | logger.info('getRefreshToken error.', err) | |
120 | throw err | |
121 | }) | |
69b0a27c C |
122 | } |
123 | ||
69818c93 | 124 | getByTokenAndPopulateUser = function (bearerToken: string) { |
feb4bdfd C |
125 | const query = { |
126 | where: { | |
127 | accessToken: bearerToken | |
128 | }, | |
e02643f3 | 129 | include: [ OAuthToken['sequelize'].models.User ] |
feb4bdfd C |
130 | } |
131 | ||
075f16ca | 132 | return OAuthToken.findOne(query).then(token => { |
e02643f3 | 133 | if (token) token['user'] = token.User |
feb4bdfd C |
134 | |
135 | return token | |
136 | }) | |
69b0a27c | 137 | } |
2f372a86 | 138 | |
69818c93 | 139 | getByRefreshTokenAndPopulateUser = function (refreshToken: string) { |
feb4bdfd C |
140 | const query = { |
141 | where: { | |
142 | refreshToken: refreshToken | |
143 | }, | |
e02643f3 | 144 | include: [ OAuthToken['sequelize'].models.User ] |
feb4bdfd C |
145 | } |
146 | ||
075f16ca | 147 | return OAuthToken.findOne(query).then(token => { |
e02643f3 | 148 | token['user'] = token.User |
feb4bdfd C |
149 | |
150 | return token | |
151 | }) | |
2f372a86 | 152 | } |
b81929a0 | 153 | |
6fcd19ba | 154 | removeByUserId = function (userId: number) { |
feb4bdfd C |
155 | const query = { |
156 | where: { | |
157 | userId: userId | |
158 | } | |
159 | } | |
160 | ||
6fcd19ba | 161 | return OAuthToken.destroy(query) |
b81929a0 | 162 | } |