]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - server/models/oauth/oauth-token.ts
Implement user blocking on server side
[github/Chocobozzz/PeerTube.git] / server / models / oauth / oauth-token.ts
1 import { AllowNull, BelongsTo, Column, CreatedAt, ForeignKey, Model, Scopes, Table, UpdatedAt } from 'sequelize-typescript'
2 import { logger } from '../../helpers/logger'
3 import { AccountModel } from '../account/account'
4 import { UserModel } from '../account/user'
5 import { OAuthClientModel } from './oauth-client'
6 import { Transaction } from 'sequelize'
7
8 export type OAuthTokenInfo = {
9 refreshToken: string
10 refreshTokenExpiresAt: Date,
11 client: {
12 id: number
13 },
14 user: {
15 id: number
16 }
17 }
18
19 enum 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 })
38 @Table({
39 tableName: 'oAuthToken',
40 indexes: [
41 {
42 fields: [ 'refreshToken' ],
43 unique: true
44 },
45 {
46 fields: [ 'accessToken' ],
47 unique: true
48 },
49 {
50 fields: [ 'userId' ]
51 },
52 {
53 fields: [ 'oAuthClientId' ]
54 }
55 ]
56 })
57 export class OAuthTokenModel extends Model<OAuthTokenModel> {
58
59 @AllowNull(false)
60 @Column
61 accessToken: string
62
63 @AllowNull(false)
64 @Column
65 accessTokenExpiresAt: Date
66
67 @AllowNull(false)
68 @Column
69 refreshToken: string
70
71 @AllowNull(false)
72 @Column
73 refreshTokenExpiresAt: Date
74
75 @CreatedAt
76 createdAt: Date
77
78 @UpdatedAt
79 updatedAt: Date
80
81 @ForeignKey(() => UserModel)
82 @Column
83 userId: number
84
85 @BelongsTo(() => UserModel, {
86 foreignKey: {
87 allowNull: false
88 },
89 onDelete: 'cascade'
90 })
91 User: UserModel
92
93 @ForeignKey(() => OAuthClientModel)
94 @Column
95 oAuthClientId: number
96
97 @BelongsTo(() => OAuthClientModel, {
98 foreignKey: {
99 allowNull: false
100 },
101 onDelete: 'cascade'
102 })
103 OAuthClients: OAuthClientModel[]
104
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 => {
129 logger.error('getRefreshToken error.', { err })
130 throw err
131 })
132 }
133
134 static getByTokenAndPopulateUser (bearerToken: string) {
135 const query = {
136 where: {
137 accessToken: bearerToken
138 }
139 }
140
141 return OAuthTokenModel.scope(ScopeNames.WITH_ACCOUNT).findOne(query).then(token => {
142 if (token) token['user'] = token.User
143
144 return token
145 })
146 }
147
148 static getByRefreshTokenAndPopulateUser (refreshToken: string) {
149 const query = {
150 where: {
151 refreshToken: refreshToken
152 }
153 }
154
155 return OAuthTokenModel.scope(ScopeNames.WITH_ACCOUNT)
156 .findOne(query)
157 .then(token => {
158 if (token) {
159 token['user'] = token.User
160 return token
161 } else {
162 return new OAuthTokenModel()
163 }
164 })
165 }
166
167 static deleteUserToken (userId: number, t?: Transaction) {
168 const query = {
169 where: {
170 userId
171 },
172 transaction: t
173 }
174
175 return OAuthTokenModel.destroy(query)
176 }
177 }