Add new follow, mention and user registered notifs
[oweals/peertube.git] / shared / utils / users / users.ts
1 import * as request from 'supertest'
2 import { makePostBodyRequest, makePutBodyRequest, updateAvatarRequest } from '../requests/requests'
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   videosHistoryEnabled?: boolean
174 }) {
175   const path = '/api/v1/users/me'
176
177   const toSend = {}
178   if (options.currentPassword !== undefined && options.currentPassword !== null) toSend['currentPassword'] = options.currentPassword
179   if (options.newPassword !== undefined && options.newPassword !== null) toSend['password'] = options.newPassword
180   if (options.nsfwPolicy !== undefined && options.nsfwPolicy !== null) toSend['nsfwPolicy'] = options.nsfwPolicy
181   if (options.autoPlayVideo !== undefined && options.autoPlayVideo !== null) toSend['autoPlayVideo'] = options.autoPlayVideo
182   if (options.email !== undefined && options.email !== null) toSend['email'] = options.email
183   if (options.description !== undefined && options.description !== null) toSend['description'] = options.description
184   if (options.displayName !== undefined && options.displayName !== null) toSend['displayName'] = options.displayName
185   if (options.videosHistoryEnabled !== undefined && options.videosHistoryEnabled !== null) {
186     toSend['videosHistoryEnabled'] = options.videosHistoryEnabled
187   }
188
189   return makePutBodyRequest({
190     url: options.url,
191     path,
192     token: options.accessToken,
193     fields: toSend,
194     statusCodeExpected: 204
195   })
196 }
197
198 function updateMyAvatar (options: {
199   url: string,
200   accessToken: string,
201   fixture: string
202 }) {
203   const path = '/api/v1/users/me/avatar/pick'
204
205   return updateAvatarRequest(Object.assign(options, { path }))
206 }
207
208 function updateUser (options: {
209   url: string
210   userId: number,
211   accessToken: string,
212   email?: string,
213   emailVerified?: boolean,
214   videoQuota?: number,
215   videoQuotaDaily?: number,
216   role?: UserRole
217 }) {
218   const path = '/api/v1/users/' + options.userId
219
220   const toSend = {}
221   if (options.email !== undefined && options.email !== null) toSend['email'] = options.email
222   if (options.emailVerified !== undefined && options.emailVerified !== null) toSend['emailVerified'] = options.emailVerified
223   if (options.videoQuota !== undefined && options.videoQuota !== null) toSend['videoQuota'] = options.videoQuota
224   if (options.videoQuotaDaily !== undefined && options.videoQuotaDaily !== null) toSend['videoQuotaDaily'] = options.videoQuotaDaily
225   if (options.role !== undefined && options.role !== null) toSend['role'] = options.role
226
227   return makePutBodyRequest({
228     url: options.url,
229     path,
230     token: options.accessToken,
231     fields: toSend,
232     statusCodeExpected: 204
233   })
234 }
235
236 function askResetPassword (url: string, email: string) {
237   const path = '/api/v1/users/ask-reset-password'
238
239   return makePostBodyRequest({
240     url,
241     path,
242     fields: { email },
243     statusCodeExpected: 204
244   })
245 }
246
247 function resetPassword (url: string, userId: number, verificationString: string, password: string, statusCodeExpected = 204) {
248   const path = '/api/v1/users/' + userId + '/reset-password'
249
250   return makePostBodyRequest({
251     url,
252     path,
253     fields: { password, verificationString },
254     statusCodeExpected
255   })
256 }
257
258 function askSendVerifyEmail (url: string, email: string) {
259   const path = '/api/v1/users/ask-send-verify-email'
260
261   return makePostBodyRequest({
262     url,
263     path,
264     fields: { email },
265     statusCodeExpected: 204
266   })
267 }
268
269 function verifyEmail (url: string, userId: number, verificationString: string, statusCodeExpected = 204) {
270   const path = '/api/v1/users/' + userId + '/verify-email'
271
272   return makePostBodyRequest({
273     url,
274     path,
275     fields: { verificationString },
276     statusCodeExpected
277   })
278 }
279
280 // ---------------------------------------------------------------------------
281
282 export {
283   createUser,
284   registerUser,
285   getMyUserInformation,
286   getMyUserVideoRating,
287   deleteMe,
288   getMyUserVideoQuotaUsed,
289   getUsersList,
290   getUsersListPaginationAndSort,
291   removeUser,
292   updateUser,
293   updateMyUser,
294   getUserInformation,
295   blockUser,
296   unblockUser,
297   askResetPassword,
298   resetPassword,
299   updateMyAvatar,
300   askSendVerifyEmail,
301   verifyEmail
302 }