1 import { omit } from 'lodash'
2 import { pick } from '@shared/core-utils'
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'
20 export class UsersCommand extends AbstractCommand {
22 askResetPassword (options: OverrideCommandOptions & {
25 const { email } = options
26 const path = '/api/v1/users/ask-reset-password'
28 return this.postBodyRequest({
34 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
38 resetPassword (options: OverrideCommandOptions & {
40 verificationString: string
43 const { userId, verificationString, password } = options
44 const path = '/api/v1/users/' + userId + '/reset-password'
46 return this.postBodyRequest({
50 fields: { password, verificationString },
52 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
56 // ---------------------------------------------------------------------------
58 askSendVerifyEmail (options: OverrideCommandOptions & {
61 const { email } = options
62 const path = '/api/v1/users/ask-send-verify-email'
64 return this.postBodyRequest({
70 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
74 verifyEmail (options: OverrideCommandOptions & {
76 verificationString: string
77 isPendingEmail?: boolean // default false
79 const { userId, verificationString, isPendingEmail = false } = options
80 const path = '/api/v1/users/' + userId + '/verify-email'
82 return this.postBodyRequest({
91 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
95 // ---------------------------------------------------------------------------
97 banUser (options: OverrideCommandOptions & {
101 const { userId, reason } = options
102 const path = '/api/v1/users' + '/' + userId + '/block'
104 return this.postBodyRequest({
110 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
114 unbanUser (options: OverrideCommandOptions & {
117 const { userId } = options
118 const path = '/api/v1/users' + '/' + userId + '/unblock'
120 return this.postBodyRequest({
125 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
129 // ---------------------------------------------------------------------------
131 getMyScopedTokens (options: OverrideCommandOptions = {}) {
132 const path = '/api/v1/users/scoped-tokens'
134 return this.getRequestBody<ScopedToken>({
139 defaultExpectedStatus: HttpStatusCode.OK_200
143 renewMyScopedTokens (options: OverrideCommandOptions = {}) {
144 const path = '/api/v1/users/scoped-tokens'
146 return this.postBodyRequest({
151 defaultExpectedStatus: HttpStatusCode.OK_200
155 // ---------------------------------------------------------------------------
157 create (options: OverrideCommandOptions & {
161 videoQuotaDaily?: number
163 adminFlags?: UserAdminFlag
168 password = 'password',
169 videoQuota = 42000000,
170 videoQuotaDaily = -1,
174 const path = '/api/v1/users'
176 return unwrapBody<{ user: UserCreateResult }>(this.postBodyRequest({
185 email: username + '@example.com',
190 defaultExpectedStatus: HttpStatusCode.OK_200
191 })).then(res => res.user)
194 async generate (username: string) {
195 const password = 'password'
196 const user = await this.create({ username, password })
198 const token = await this.server.login.getAccessToken({ username, password })
200 const me = await this.getMyInfo({ token })
205 userChannelId: me.videoChannels[0].id
209 async generateUserAndToken (username: string) {
210 const password = 'password'
211 await this.create({ username, password })
213 return this.server.login.getAccessToken({ username, password })
216 register (options: OverrideCommandOptions & {
225 const { username, password = 'password', displayName, channel } = options
226 const path = '/api/v1/users/register'
228 return this.postBodyRequest({
235 email: username + '@example.com',
239 implicitToken: false,
240 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
244 // ---------------------------------------------------------------------------
246 getMyInfo (options: OverrideCommandOptions = {}) {
247 const path = '/api/v1/users/me'
249 return this.getRequestBody<MyUser>({
254 defaultExpectedStatus: HttpStatusCode.OK_200
258 getMyQuotaUsed (options: OverrideCommandOptions = {}) {
259 const path = '/api/v1/users/me/video-quota-used'
261 return this.getRequestBody<UserVideoQuota>({
266 defaultExpectedStatus: HttpStatusCode.OK_200
270 getMyRating (options: OverrideCommandOptions & {
271 videoId: number | string
273 const { videoId } = options
274 const path = '/api/v1/users/me/videos/' + videoId + '/rating'
276 return this.getRequestBody<UserVideoRate>({
281 defaultExpectedStatus: HttpStatusCode.OK_200
285 deleteMe (options: OverrideCommandOptions = {}) {
286 const path = '/api/v1/users/me'
288 return this.deleteRequest({
293 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
297 updateMe (options: OverrideCommandOptions & UserUpdateMe) {
298 const path = '/api/v1/users/me'
300 const toSend: UserUpdateMe = omit(options, 'url', 'accessToken')
302 return this.putBodyRequest({
308 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
312 updateMyAvatar (options: OverrideCommandOptions & {
315 const { fixture } = options
316 const path = '/api/v1/users/me/avatar/pick'
318 return this.updateImageRequest({
323 fieldname: 'avatarfile',
326 defaultExpectedStatus: HttpStatusCode.OK_200
330 // ---------------------------------------------------------------------------
332 get (options: OverrideCommandOptions & {
334 withStats?: boolean // default false
336 const { userId, withStats } = options
337 const path = '/api/v1/users/' + userId
339 return this.getRequestBody<User>({
343 query: { withStats },
345 defaultExpectedStatus: HttpStatusCode.OK_200
349 list (options: OverrideCommandOptions & {
356 const path = '/api/v1/users'
358 return this.getRequestBody<ResultList<User>>({
362 query: pick(options, [ 'start', 'count', 'sort', 'search', 'blocked' ]),
364 defaultExpectedStatus: HttpStatusCode.OK_200
368 remove (options: OverrideCommandOptions & {
371 const { userId } = options
372 const path = '/api/v1/users/' + userId
374 return this.deleteRequest({
379 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
383 update (options: OverrideCommandOptions & {
386 emailVerified?: boolean
388 videoQuotaDaily?: number
390 adminFlags?: UserAdminFlag
394 const path = '/api/v1/users/' + options.userId
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
406 return this.putBodyRequest({
412 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204