]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/blob - shared/extra-utils/users/users-command.ts
Split check user params tests
[github/Chocobozzz/PeerTube.git] / shared / extra-utils / users / users-command.ts
1 import { omit } from 'lodash'
2 import { pick } from '@shared/core-utils'
3 import {
4 HttpStatusCode,
5 MyUser,
6 ResultList,
7 User,
8 UserAdminFlag,
9 UserCreateResult,
10 UserRole,
11 UserUpdate,
12 UserUpdateMe,
13 UserVideoQuota,
14 UserVideoRate
15 } from '@shared/models'
16 import { ScopedToken } from '@shared/models/users/user-scoped-token'
17 import { unwrapBody } from '../requests'
18 import { AbstractCommand, OverrideCommandOptions } from '../shared'
19
20 export class UsersCommand extends AbstractCommand {
21
22 askResetPassword (options: OverrideCommandOptions & {
23 email: string
24 }) {
25 const { email } = options
26 const path = '/api/v1/users/ask-reset-password'
27
28 return this.postBodyRequest({
29 ...options,
30
31 path,
32 fields: { email },
33 implicitToken: false,
34 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
35 })
36 }
37
38 resetPassword (options: OverrideCommandOptions & {
39 userId: number
40 verificationString: string
41 password: string
42 }) {
43 const { userId, verificationString, password } = options
44 const path = '/api/v1/users/' + userId + '/reset-password'
45
46 return this.postBodyRequest({
47 ...options,
48
49 path,
50 fields: { password, verificationString },
51 implicitToken: false,
52 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
53 })
54 }
55
56 // ---------------------------------------------------------------------------
57
58 askSendVerifyEmail (options: OverrideCommandOptions & {
59 email: string
60 }) {
61 const { email } = options
62 const path = '/api/v1/users/ask-send-verify-email'
63
64 return this.postBodyRequest({
65 ...options,
66
67 path,
68 fields: { email },
69 implicitToken: false,
70 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
71 })
72 }
73
74 verifyEmail (options: OverrideCommandOptions & {
75 userId: number
76 verificationString: string
77 isPendingEmail?: boolean // default false
78 }) {
79 const { userId, verificationString, isPendingEmail = false } = options
80 const path = '/api/v1/users/' + userId + '/verify-email'
81
82 return this.postBodyRequest({
83 ...options,
84
85 path,
86 fields: {
87 verificationString,
88 isPendingEmail
89 },
90 implicitToken: false,
91 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
92 })
93 }
94
95 // ---------------------------------------------------------------------------
96
97 banUser (options: OverrideCommandOptions & {
98 userId: number
99 reason?: string
100 }) {
101 const { userId, reason } = options
102 const path = '/api/v1/users' + '/' + userId + '/block'
103
104 return this.postBodyRequest({
105 ...options,
106
107 path,
108 fields: { reason },
109 implicitToken: true,
110 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
111 })
112 }
113
114 unbanUser (options: OverrideCommandOptions & {
115 userId: number
116 }) {
117 const { userId } = options
118 const path = '/api/v1/users' + '/' + userId + '/unblock'
119
120 return this.postBodyRequest({
121 ...options,
122
123 path,
124 implicitToken: true,
125 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
126 })
127 }
128
129 // ---------------------------------------------------------------------------
130
131 getMyScopedTokens (options: OverrideCommandOptions = {}) {
132 const path = '/api/v1/users/scoped-tokens'
133
134 return this.getRequestBody<ScopedToken>({
135 ...options,
136
137 path,
138 implicitToken: true,
139 defaultExpectedStatus: HttpStatusCode.OK_200
140 })
141 }
142
143 renewMyScopedTokens (options: OverrideCommandOptions = {}) {
144 const path = '/api/v1/users/scoped-tokens'
145
146 return this.postBodyRequest({
147 ...options,
148
149 path,
150 implicitToken: true,
151 defaultExpectedStatus: HttpStatusCode.OK_200
152 })
153 }
154
155 // ---------------------------------------------------------------------------
156
157 create (options: OverrideCommandOptions & {
158 username: string
159 password?: string
160 videoQuota?: number
161 videoQuotaDaily?: number
162 role?: UserRole
163 adminFlags?: UserAdminFlag
164 }) {
165 const {
166 username,
167 adminFlags,
168 password = 'password',
169 videoQuota = 42000000,
170 videoQuotaDaily = -1,
171 role = UserRole.USER
172 } = options
173
174 const path = '/api/v1/users'
175
176 return unwrapBody<{ user: UserCreateResult }>(this.postBodyRequest({
177 ...options,
178
179 path,
180 fields: {
181 username,
182 password,
183 role,
184 adminFlags,
185 email: username + '@example.com',
186 videoQuota,
187 videoQuotaDaily
188 },
189 implicitToken: true,
190 defaultExpectedStatus: HttpStatusCode.OK_200
191 })).then(res => res.user)
192 }
193
194 async generate (username: string, role?: UserRole) {
195 const password = 'password'
196 const user = await this.create({ username, password, role })
197
198 const token = await this.server.login.getAccessToken({ username, password })
199
200 const me = await this.getMyInfo({ token })
201
202 return {
203 token,
204 userId: user.id,
205 userChannelId: me.videoChannels[0].id
206 }
207 }
208
209 async generateUserAndToken (username: string, role?: UserRole) {
210 const password = 'password'
211 await this.create({ username, password, role })
212
213 return this.server.login.getAccessToken({ username, password })
214 }
215
216 register (options: OverrideCommandOptions & {
217 username: string
218 password?: string
219 displayName?: string
220 channel?: {
221 name: string
222 displayName: string
223 }
224 }) {
225 const { username, password = 'password', displayName, channel } = options
226 const path = '/api/v1/users/register'
227
228 return this.postBodyRequest({
229 ...options,
230
231 path,
232 fields: {
233 username,
234 password,
235 email: username + '@example.com',
236 displayName,
237 channel
238 },
239 implicitToken: false,
240 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
241 })
242 }
243
244 // ---------------------------------------------------------------------------
245
246 getMyInfo (options: OverrideCommandOptions = {}) {
247 const path = '/api/v1/users/me'
248
249 return this.getRequestBody<MyUser>({
250 ...options,
251
252 path,
253 implicitToken: true,
254 defaultExpectedStatus: HttpStatusCode.OK_200
255 })
256 }
257
258 getMyQuotaUsed (options: OverrideCommandOptions = {}) {
259 const path = '/api/v1/users/me/video-quota-used'
260
261 return this.getRequestBody<UserVideoQuota>({
262 ...options,
263
264 path,
265 implicitToken: true,
266 defaultExpectedStatus: HttpStatusCode.OK_200
267 })
268 }
269
270 getMyRating (options: OverrideCommandOptions & {
271 videoId: number | string
272 }) {
273 const { videoId } = options
274 const path = '/api/v1/users/me/videos/' + videoId + '/rating'
275
276 return this.getRequestBody<UserVideoRate>({
277 ...options,
278
279 path,
280 implicitToken: true,
281 defaultExpectedStatus: HttpStatusCode.OK_200
282 })
283 }
284
285 deleteMe (options: OverrideCommandOptions = {}) {
286 const path = '/api/v1/users/me'
287
288 return this.deleteRequest({
289 ...options,
290
291 path,
292 implicitToken: true,
293 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
294 })
295 }
296
297 updateMe (options: OverrideCommandOptions & UserUpdateMe) {
298 const path = '/api/v1/users/me'
299
300 const toSend: UserUpdateMe = omit(options, 'url', 'accessToken')
301
302 return this.putBodyRequest({
303 ...options,
304
305 path,
306 fields: toSend,
307 implicitToken: true,
308 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
309 })
310 }
311
312 updateMyAvatar (options: OverrideCommandOptions & {
313 fixture: string
314 }) {
315 const { fixture } = options
316 const path = '/api/v1/users/me/avatar/pick'
317
318 return this.updateImageRequest({
319 ...options,
320
321 path,
322 fixture,
323 fieldname: 'avatarfile',
324
325 implicitToken: true,
326 defaultExpectedStatus: HttpStatusCode.OK_200
327 })
328 }
329
330 // ---------------------------------------------------------------------------
331
332 get (options: OverrideCommandOptions & {
333 userId: number
334 withStats?: boolean // default false
335 }) {
336 const { userId, withStats } = options
337 const path = '/api/v1/users/' + userId
338
339 return this.getRequestBody<User>({
340 ...options,
341
342 path,
343 query: { withStats },
344 implicitToken: true,
345 defaultExpectedStatus: HttpStatusCode.OK_200
346 })
347 }
348
349 list (options: OverrideCommandOptions & {
350 start?: number
351 count?: number
352 sort?: string
353 search?: string
354 blocked?: boolean
355 } = {}) {
356 const path = '/api/v1/users'
357
358 return this.getRequestBody<ResultList<User>>({
359 ...options,
360
361 path,
362 query: pick(options, [ 'start', 'count', 'sort', 'search', 'blocked' ]),
363 implicitToken: true,
364 defaultExpectedStatus: HttpStatusCode.OK_200
365 })
366 }
367
368 remove (options: OverrideCommandOptions & {
369 userId: number
370 }) {
371 const { userId } = options
372 const path = '/api/v1/users/' + userId
373
374 return this.deleteRequest({
375 ...options,
376
377 path,
378 implicitToken: true,
379 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
380 })
381 }
382
383 update (options: OverrideCommandOptions & {
384 userId: number
385 email?: string
386 emailVerified?: boolean
387 videoQuota?: number
388 videoQuotaDaily?: number
389 password?: string
390 adminFlags?: UserAdminFlag
391 pluginAuth?: string
392 role?: UserRole
393 }) {
394 const path = '/api/v1/users/' + options.userId
395
396 const toSend: UserUpdate = {}
397 if (options.password !== undefined && options.password !== null) toSend.password = options.password
398 if (options.email !== undefined && options.email !== null) toSend.email = options.email
399 if (options.emailVerified !== undefined && options.emailVerified !== null) toSend.emailVerified = options.emailVerified
400 if (options.videoQuota !== undefined && options.videoQuota !== null) toSend.videoQuota = options.videoQuota
401 if (options.videoQuotaDaily !== undefined && options.videoQuotaDaily !== null) toSend.videoQuotaDaily = options.videoQuotaDaily
402 if (options.role !== undefined && options.role !== null) toSend.role = options.role
403 if (options.adminFlags !== undefined && options.adminFlags !== null) toSend.adminFlags = options.adminFlags
404 if (options.pluginAuth !== undefined) toSend.pluginAuth = options.pluginAuth
405
406 return this.putBodyRequest({
407 ...options,
408
409 path,
410 fields: toSend,
411 implicitToken: true,
412 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
413 })
414 }
415 }