]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blame - server/models/oauth/oauth-token.ts
rename manifest
[github/Chocobozzz/PeerTube.git] / server / models / oauth / oauth-token.ts
CommitLineData
d48ff09d 1import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
da854ddd 2import { logger } from '../../helpers/logger'
3fd3ab2d
C
3import { AccountModel } from '../account/account'
4import { UserModel } from '../account/user'
5import { OAuthClientModel } from './oauth-client'
e6921918 6import { Transaction } from 'sequelize'
3fd3ab2d
C
7
8export type OAuthTokenInfo = {
9 refreshToken: string
10 refreshTokenExpiresAt: Date,
11 client: {
12 id: number
13 },
14 user: {
15 id: number
16 }
17}
2f372a86 18
d48ff09d
C
19enum ScopeNames {
20 WITH_ACCOUNT = 'WITH_ACCOUNT'
21}
22
23@Scopes({
24 [ScopeNames.WITH_ACCOUNT]: {
25 include: [
26 {
27 model: () => UserModel,
28 include: [
29 {
30 model: () => AccountModel,
31 required: true
32 }
33 ]
34 }
35 ]
36 }
37})
3fd3ab2d
C
38@Table({
39 tableName: 'oAuthToken',
40 indexes: [
feb4bdfd 41 {
3fd3ab2d
C
42 fields: [ 'refreshToken' ],
43 unique: true
feb4bdfd
C
44 },
45 {
3fd3ab2d
C
46 fields: [ 'accessToken' ],
47 unique: true
48 },
49 {
50 fields: [ 'userId' ]
51 },
52 {
53 fields: [ 'oAuthClientId' ]
feb4bdfd 54 }
3fd3ab2d
C
55 ]
56})
57export class OAuthTokenModel extends Model<OAuthTokenModel> {
feb4bdfd 58
3fd3ab2d
C
59 @AllowNull(false)
60 @Column
61 accessToken: string
e02643f3 62
3fd3ab2d
C
63 @AllowNull(false)
64 @Column
65 accessTokenExpiresAt: Date
e02643f3 66
3fd3ab2d
C
67 @AllowNull(false)
68 @Column
69 refreshToken: string
69b0a27c 70
3fd3ab2d
C
71 @AllowNull(false)
72 @Column
73 refreshTokenExpiresAt: Date
69b0a27c 74
3fd3ab2d
C
75 @CreatedAt
76 createdAt: Date
77
78 @UpdatedAt
79 updatedAt: Date
80
81 @ForeignKey(() => UserModel)
82 @Column
83 userId: number
84
85 @BelongsTo(() => UserModel, {
feb4bdfd 86 foreignKey: {
feb4bdfd
C
87 allowNull: false
88 },
89 onDelete: 'cascade'
90 })
3fd3ab2d 91 User: UserModel
319d072e 92
3fd3ab2d
C
93 @ForeignKey(() => OAuthClientModel)
94 @Column
95 oAuthClientId: number
96
97 @BelongsTo(() => OAuthClientModel, {
319d072e 98 foreignKey: {
319d072e
C
99 allowNull: false
100 },
101 onDelete: 'cascade'
102 })
3fd3ab2d 103 OAuthClients: OAuthClientModel[]
feb4bdfd 104
3fd3ab2d
C
105 static getByRefreshTokenAndPopulateClient (refreshToken: string) {
106 const query = {
107 where: {
108 refreshToken: refreshToken
109 },
110 include: [ OAuthClientModel ]
111 }
112
113 return OAuthTokenModel.findOne(query)
114 .then(token => {
115 if (!token) return null
116
117 return {
118 refreshToken: token.refreshToken,
119 refreshTokenExpiresAt: token.refreshTokenExpiresAt,
120 client: {
121 id: token.oAuthClientId
122 },
123 user: {
124 id: token.userId
125 }
126 } as OAuthTokenInfo
127 })
128 .catch(err => {
e6921918 129 logger.error('getRefreshToken error.', { err })
3fd3ab2d
C
130 throw err
131 })
feb4bdfd
C
132 }
133
3fd3ab2d
C
134 static getByTokenAndPopulateUser (bearerToken: string) {
135 const query = {
136 where: {
137 accessToken: bearerToken
d48ff09d 138 }
3fd3ab2d 139 }
2f372a86 140
d48ff09d 141 return OAuthTokenModel.scope(ScopeNames.WITH_ACCOUNT).findOne(query).then(token => {
3fd3ab2d 142 if (token) token['user'] = token.User
69b0a27c 143
3fd3ab2d
C
144 return token
145 })
feb4bdfd
C
146 }
147
3fd3ab2d
C
148 static getByRefreshTokenAndPopulateUser (refreshToken: string) {
149 const query = {
150 where: {
151 refreshToken: refreshToken
d48ff09d 152 }
3fd3ab2d 153 }
feb4bdfd 154
d48ff09d
C
155 return OAuthTokenModel.scope(ScopeNames.WITH_ACCOUNT)
156 .findOne(query)
157 .then(token => {
c1e791ba
RK
158 if (token) {
159 token['user'] = token.User
160 return token
161 } else {
162 return new OAuthTokenModel()
163 }
d48ff09d 164 })
feb4bdfd 165 }
f8b8c36b 166
e6921918 167 static deleteUserToken (userId: number, t?: Transaction) {
f8b8c36b
C
168 const query = {
169 where: {
170 userId
e6921918
C
171 },
172 transaction: t
f8b8c36b
C
173 }
174
175 return OAuthTokenModel.destroy(query)
176 }
2f372a86 177}