First version with PostgreSQL
[oweals/peertube.git] / server / models / oauth-token.js
1 const logger = require('../helpers/logger')
2
3 // ---------------------------------------------------------------------------
4
5 module.exports = function (sequelize, DataTypes) {
6   const OAuthToken = sequelize.define('OAuthToken',
7     {
8       accessToken: {
9         type: DataTypes.STRING
10       },
11       accessTokenExpiresAt: {
12         type: DataTypes.DATE
13       },
14       refreshToken: {
15         type: DataTypes.STRING
16       },
17       refreshTokenExpiresAt: {
18         type: DataTypes.DATE
19       }
20     },
21     {
22       classMethods: {
23         associate,
24
25         getByRefreshTokenAndPopulateClient,
26         getByTokenAndPopulateUser,
27         getByRefreshTokenAndPopulateUser,
28         removeByUserId
29       }
30     }
31   )
32
33   return OAuthToken
34 }
35
36 // TODO: validation
37 // OAuthTokenSchema.path('accessToken').required(true)
38 // OAuthTokenSchema.path('client').required(true)
39 // OAuthTokenSchema.path('user').required(true)
40
41 // ---------------------------------------------------------------------------
42
43 function associate (models) {
44   this.belongsTo(models.User, {
45     foreignKey: {
46       name: 'userId',
47       allowNull: false
48     },
49     onDelete: 'cascade'
50   })
51 }
52
53 function getByRefreshTokenAndPopulateClient (refreshToken) {
54   const query = {
55     where: {
56       refreshToken: refreshToken
57     },
58     include: [ this.associations.OAuthClient ]
59   }
60
61   return this.findOne(query).then(function (token) {
62     if (!token) return token
63
64     const tokenInfos = {
65       refreshToken: token.refreshToken,
66       refreshTokenExpiresAt: token.refreshTokenExpiresAt,
67       client: {
68         id: token.client.id
69       },
70       user: {
71         id: token.user
72       }
73     }
74
75     return tokenInfos
76   }).catch(function (err) {
77     logger.info('getRefreshToken error.', { error: err })
78   })
79 }
80
81 function getByTokenAndPopulateUser (bearerToken) {
82   const query = {
83     where: {
84       accessToken: bearerToken
85     },
86     include: [ this.sequelize.models.User ]
87   }
88
89   return this.findOne(query).then(function (token) {
90     if (token) token.user = token.User
91
92     return token
93   })
94 }
95
96 function getByRefreshTokenAndPopulateUser (refreshToken) {
97   const query = {
98     where: {
99       refreshToken: refreshToken
100     },
101     include: [ this.sequelize.models.User ]
102   }
103
104   return this.findOne(query).then(function (token) {
105     token.user = token.User
106
107     return token
108   })
109 }
110
111 function removeByUserId (userId, callback) {
112   const query = {
113     where: {
114       userId: userId
115     }
116   }
117
118   return this.destroy(query).asCallback(callback)
119 }