Propagate old comment on new follow
[oweals/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
7 export type OAuthTokenInfo = {
8   refreshToken: string
9   refreshTokenExpiresAt: Date,
10   client: {
11     id: number
12   },
13   user: {
14     id: number
15   }
16 }
17
18 enum ScopeNames {
19   WITH_ACCOUNT = 'WITH_ACCOUNT'
20 }
21
22 @Scopes({
23   [ScopeNames.WITH_ACCOUNT]: {
24     include: [
25       {
26         model: () => UserModel,
27         include: [
28           {
29             model: () => AccountModel,
30             required: true
31           }
32         ]
33       }
34     ]
35   }
36 })
37 @Table({
38   tableName: 'oAuthToken',
39   indexes: [
40     {
41       fields: [ 'refreshToken' ],
42       unique: true
43     },
44     {
45       fields: [ 'accessToken' ],
46       unique: true
47     },
48     {
49       fields: [ 'userId' ]
50     },
51     {
52       fields: [ 'oAuthClientId' ]
53     }
54   ]
55 })
56 export class OAuthTokenModel extends Model<OAuthTokenModel> {
57
58   @AllowNull(false)
59   @Column
60   accessToken: string
61
62   @AllowNull(false)
63   @Column
64   accessTokenExpiresAt: Date
65
66   @AllowNull(false)
67   @Column
68   refreshToken: string
69
70   @AllowNull(false)
71   @Column
72   refreshTokenExpiresAt: Date
73
74   @CreatedAt
75   createdAt: Date
76
77   @UpdatedAt
78   updatedAt: Date
79
80   @ForeignKey(() => UserModel)
81   @Column
82   userId: number
83
84   @BelongsTo(() => UserModel, {
85     foreignKey: {
86       allowNull: false
87     },
88     onDelete: 'cascade'
89   })
90   User: UserModel
91
92   @ForeignKey(() => OAuthClientModel)
93   @Column
94   oAuthClientId: number
95
96   @BelongsTo(() => OAuthClientModel, {
97     foreignKey: {
98       allowNull: false
99     },
100     onDelete: 'cascade'
101   })
102   OAuthClients: OAuthClientModel[]
103
104   static getByRefreshTokenAndPopulateClient (refreshToken: string) {
105     const query = {
106       where: {
107         refreshToken: refreshToken
108       },
109       include: [ OAuthClientModel ]
110     }
111
112     return OAuthTokenModel.findOne(query)
113       .then(token => {
114         if (!token) return null
115
116         return {
117           refreshToken: token.refreshToken,
118           refreshTokenExpiresAt: token.refreshTokenExpiresAt,
119           client: {
120             id: token.oAuthClientId
121           },
122           user: {
123             id: token.userId
124           }
125         } as OAuthTokenInfo
126       })
127       .catch(err => {
128         logger.info('getRefreshToken error.', err)
129         throw err
130       })
131   }
132
133   static getByTokenAndPopulateUser (bearerToken: string) {
134     const query = {
135       where: {
136         accessToken: bearerToken
137       }
138     }
139
140     return OAuthTokenModel.scope(ScopeNames.WITH_ACCOUNT).findOne(query).then(token => {
141       if (token) token['user'] = token.User
142
143       return token
144     })
145   }
146
147   static getByRefreshTokenAndPopulateUser (refreshToken: string) {
148     const query = {
149       where: {
150         refreshToken: refreshToken
151       }
152     }
153
154     return OAuthTokenModel.scope(ScopeNames.WITH_ACCOUNT)
155       .findOne(query)
156       .then(token => {
157         token['user'] = token.User
158
159         return token
160       })
161   }
162 }