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