Move utils to /shared
[oweals/peertube.git] / shared / utils / users / users.ts
1 import * as request from 'supertest'
2 import { makePostBodyRequest, makePutBodyRequest, updateAvatarRequest } from '../'
3
4 import { UserRole } from '../../index'
5 import { NSFWPolicyType } from '../../models/videos/nsfw-policy.type'
6
7 function createUser (
8   url: string,
9   accessToken: string,
10   username: string,
11   password: string,
12   videoQuota = 1000000,
13   videoQuotaDaily = -1,
14   role: UserRole = UserRole.USER,
15   specialStatus = 200
16 ) {
17   const path = '/api/v1/users'
18   const body = {
19     username,
20     password,
21     role,
22     email: username + '@example.com',
23     videoQuota,
24     videoQuotaDaily
25   }
26
27   return request(url)
28           .post(path)
29           .set('Accept', 'application/json')
30           .set('Authorization', 'Bearer ' + accessToken)
31           .send(body)
32           .expect(specialStatus)
33 }
34
35 function registerUser (url: string, username: string, password: string, specialStatus = 204) {
36   const path = '/api/v1/users/register'
37   const body = {
38     username,
39     password,
40     email: username + '@example.com'
41   }
42
43   return request(url)
44           .post(path)
45           .set('Accept', 'application/json')
46           .send(body)
47           .expect(specialStatus)
48 }
49
50 function getMyUserInformation (url: string, accessToken: string, specialStatus = 200) {
51   const path = '/api/v1/users/me'
52
53   return request(url)
54           .get(path)
55           .set('Accept', 'application/json')
56           .set('Authorization', 'Bearer ' + accessToken)
57           .expect(specialStatus)
58           .expect('Content-Type', /json/)
59 }
60
61 function deleteMe (url: string, accessToken: string, specialStatus = 204) {
62   const path = '/api/v1/users/me'
63
64   return request(url)
65     .delete(path)
66     .set('Accept', 'application/json')
67     .set('Authorization', 'Bearer ' + accessToken)
68     .expect(specialStatus)
69 }
70
71 function getMyUserVideoQuotaUsed (url: string, accessToken: string, specialStatus = 200) {
72   const path = '/api/v1/users/me/video-quota-used'
73
74   return request(url)
75           .get(path)
76           .set('Accept', 'application/json')
77           .set('Authorization', 'Bearer ' + accessToken)
78           .expect(specialStatus)
79           .expect('Content-Type', /json/)
80 }
81
82 function getUserInformation (url: string, accessToken: string, userId: number) {
83   const path = '/api/v1/users/' + userId
84
85   return request(url)
86     .get(path)
87     .set('Accept', 'application/json')
88     .set('Authorization', 'Bearer ' + accessToken)
89     .expect(200)
90     .expect('Content-Type', /json/)
91 }
92
93 function getMyUserVideoRating (url: string, accessToken: string, videoId: number | string, specialStatus = 200) {
94   const path = '/api/v1/users/me/videos/' + videoId + '/rating'
95
96   return request(url)
97           .get(path)
98           .set('Accept', 'application/json')
99           .set('Authorization', 'Bearer ' + accessToken)
100           .expect(specialStatus)
101           .expect('Content-Type', /json/)
102 }
103
104 function getUsersList (url: string, accessToken: string) {
105   const path = '/api/v1/users'
106
107   return request(url)
108           .get(path)
109           .set('Accept', 'application/json')
110           .set('Authorization', 'Bearer ' + accessToken)
111           .expect(200)
112           .expect('Content-Type', /json/)
113 }
114
115 function getUsersListPaginationAndSort (url: string, accessToken: string, start: number, count: number, sort: string, search?: string) {
116   const path = '/api/v1/users'
117
118   return request(url)
119           .get(path)
120           .query({ start })
121           .query({ count })
122           .query({ sort })
123           .query({ search })
124           .set('Accept', 'application/json')
125           .set('Authorization', 'Bearer ' + accessToken)
126           .expect(200)
127           .expect('Content-Type', /json/)
128 }
129
130 function removeUser (url: string, userId: number | string, accessToken: string, expectedStatus = 204) {
131   const path = '/api/v1/users'
132
133   return request(url)
134           .delete(path + '/' + userId)
135           .set('Accept', 'application/json')
136           .set('Authorization', 'Bearer ' + accessToken)
137           .expect(expectedStatus)
138 }
139
140 function blockUser (url: string, userId: number | string, accessToken: string, expectedStatus = 204, reason?: string) {
141   const path = '/api/v1/users'
142   let body: any
143   if (reason) body = { reason }
144
145   return request(url)
146     .post(path + '/' + userId + '/block')
147     .send(body)
148     .set('Accept', 'application/json')
149     .set('Authorization', 'Bearer ' + accessToken)
150     .expect(expectedStatus)
151 }
152
153 function unblockUser (url: string, userId: number | string, accessToken: string, expectedStatus = 204) {
154   const path = '/api/v1/users'
155
156   return request(url)
157     .post(path + '/' + userId + '/unblock')
158     .set('Accept', 'application/json')
159     .set('Authorization', 'Bearer ' + accessToken)
160     .expect(expectedStatus)
161 }
162
163 function updateMyUser (options: {
164   url: string
165   accessToken: string,
166   currentPassword?: string,
167   newPassword?: string,
168   nsfwPolicy?: NSFWPolicyType,
169   email?: string,
170   autoPlayVideo?: boolean
171   displayName?: string,
172   description?: string
173 }) {
174   const path = '/api/v1/users/me'
175
176   const toSend = {}
177   if (options.currentPassword !== undefined && options.currentPassword !== null) toSend['currentPassword'] = options.currentPassword
178   if (options.newPassword !== undefined && options.newPassword !== null) toSend['password'] = options.newPassword
179   if (options.nsfwPolicy !== undefined && options.nsfwPolicy !== null) toSend['nsfwPolicy'] = options.nsfwPolicy
180   if (options.autoPlayVideo !== undefined && options.autoPlayVideo !== null) toSend['autoPlayVideo'] = options.autoPlayVideo
181   if (options.email !== undefined && options.email !== null) toSend['email'] = options.email
182   if (options.description !== undefined && options.description !== null) toSend['description'] = options.description
183   if (options.displayName !== undefined && options.displayName !== null) toSend['displayName'] = options.displayName
184
185   return makePutBodyRequest({
186     url: options.url,
187     path,
188     token: options.accessToken,
189     fields: toSend,
190     statusCodeExpected: 204
191   })
192 }
193
194 function updateMyAvatar (options: {
195   url: string,
196   accessToken: string,
197   fixture: string
198 }) {
199   const path = '/api/v1/users/me/avatar/pick'
200
201   return updateAvatarRequest(Object.assign(options, { path }))
202 }
203
204 function updateUser (options: {
205   url: string
206   userId: number,
207   accessToken: string,
208   email?: string,
209   videoQuota?: number,
210   videoQuotaDaily?: number,
211   role?: UserRole
212 }) {
213   const path = '/api/v1/users/' + options.userId
214
215   const toSend = {}
216   if (options.email !== undefined && options.email !== null) toSend['email'] = options.email
217   if (options.videoQuota !== undefined && options.videoQuota !== null) toSend['videoQuota'] = options.videoQuota
218   if (options.videoQuotaDaily !== undefined && options.videoQuotaDaily !== null) toSend['videoQuotaDaily'] = options.videoQuotaDaily
219   if (options.role !== undefined && options.role !== null) toSend['role'] = options.role
220
221   return makePutBodyRequest({
222     url: options.url,
223     path,
224     token: options.accessToken,
225     fields: toSend,
226     statusCodeExpected: 204
227   })
228 }
229
230 function askResetPassword (url: string, email: string) {
231   const path = '/api/v1/users/ask-reset-password'
232
233   return makePostBodyRequest({
234     url,
235     path,
236     fields: { email },
237     statusCodeExpected: 204
238   })
239 }
240
241 function resetPassword (url: string, userId: number, verificationString: string, password: string, statusCodeExpected = 204) {
242   const path = '/api/v1/users/' + userId + '/reset-password'
243
244   return makePostBodyRequest({
245     url,
246     path,
247     fields: { password, verificationString },
248     statusCodeExpected
249   })
250 }
251
252 function askSendVerifyEmail (url: string, email: string) {
253   const path = '/api/v1/users/ask-send-verify-email'
254
255   return makePostBodyRequest({
256     url,
257     path,
258     fields: { email },
259     statusCodeExpected: 204
260   })
261 }
262
263 function verifyEmail (url: string, userId: number, verificationString: string, statusCodeExpected = 204) {
264   const path = '/api/v1/users/' + userId + '/verify-email'
265
266   return makePostBodyRequest({
267     url,
268     path,
269     fields: { verificationString },
270     statusCodeExpected
271   })
272 }
273
274 // ---------------------------------------------------------------------------
275
276 export {
277   createUser,
278   registerUser,
279   getMyUserInformation,
280   getMyUserVideoRating,
281   deleteMe,
282   getMyUserVideoQuotaUsed,
283   getUsersList,
284   getUsersListPaginationAndSort,
285   removeUser,
286   updateUser,
287   updateMyUser,
288   getUserInformation,
289   blockUser,
290   unblockUser,
291   askResetPassword,
292   resetPassword,
293   updateMyAvatar,
294   askSendVerifyEmail,
295   verifyEmail
296 }