PeerTube/shared/extra-utils/users/users.ts

401 lines
11 KiB
TypeScript
Raw Normal View History

2020-11-25 11:04:18 +01:00
import { omit } from 'lodash'
2017-09-04 21:21:47 +02:00
import * as request from 'supertest'
2020-11-25 11:04:18 +01:00
import { UserUpdateMe } from '../../models/users'
2019-04-15 10:49:46 +02:00
import { UserAdminFlag } from '../../models/users/user-flag.model'
import { UserRegister } from '../../models/users/user-register.model'
import { UserRole } from '../../models/users/user-role'
2020-11-25 11:04:18 +01:00
import { makeGetRequest, makePostBodyRequest, makePutBodyRequest, updateAvatarRequest } from '../requests/requests'
import { ServerInfo } from '../server/servers'
import { userLogin } from './login'
import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
2017-10-27 17:27:06 +02:00
2019-12-06 15:59:12 +01:00
type CreateUserArgs = {
2020-01-31 16:56:52 +01:00
url: string
accessToken: string
username: string
password: string
videoQuota?: number
videoQuotaDaily?: number
role?: UserRole
adminFlags?: UserAdminFlag
2019-04-15 10:49:46 +02:00
specialStatus?: number
}
function createUser (parameters: CreateUserArgs) {
const {
url,
accessToken,
username,
adminFlags,
password = 'password',
videoQuota = 1000000,
videoQuotaDaily = -1,
role = UserRole.USER,
specialStatus = HttpStatusCode.OK_200
2019-04-15 10:49:46 +02:00
} = parameters
2017-09-04 21:21:47 +02:00
const path = '/api/v1/users'
const body = {
username,
password,
2017-10-27 17:27:06 +02:00
role,
2019-04-15 10:49:46 +02:00
adminFlags,
2017-09-05 22:09:16 +02:00
email: username + '@example.com',
videoQuota,
videoQuotaDaily
2017-09-04 21:21:47 +02:00
}
return request(url)
.post(path)
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
.send(body)
.expect(specialStatus)
}
2019-03-05 10:58:44 +01:00
async function generateUserAccessToken (server: ServerInfo, username: string) {
const password = 'my super password'
2019-04-15 10:49:46 +02:00
await createUser({ url: server.url, accessToken: server.accessToken, username: username, password: password })
2019-03-05 10:58:44 +01:00
return userLogin(server, { username, password })
}
function registerUser (url: string, username: string, password: string, specialStatus = HttpStatusCode.NO_CONTENT_204) {
2017-09-04 21:21:47 +02:00
const path = '/api/v1/users/register'
const body = {
username,
password,
email: username + '@example.com'
}
return request(url)
.post(path)
.set('Accept', 'application/json')
.send(body)
.expect(specialStatus)
}
function registerUserWithChannel (options: {
2020-01-31 16:56:52 +01:00
url: string
user: { username: string, password: string, displayName?: string }
channel: { name: string, displayName: string }
}) {
const path = '/api/v1/users/register'
const body: UserRegister = {
username: options.user.username,
password: options.user.password,
email: options.user.username + '@example.com',
channel: options.channel
}
if (options.user.displayName) {
Object.assign(body, { displayName: options.user.displayName })
}
return makePostBodyRequest({
url: options.url,
path,
fields: body,
statusCodeExpected: HttpStatusCode.NO_CONTENT_204
})
}
function getMyUserInformation (url: string, accessToken: string, specialStatus = HttpStatusCode.OK_200) {
2017-09-04 21:21:47 +02:00
const path = '/api/v1/users/me'
return request(url)
.get(path)
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
2017-12-28 15:25:31 +01:00
.expect(specialStatus)
2017-09-04 21:21:47 +02:00
.expect('Content-Type', /json/)
}
function getUserScopedTokens (url: string, token: string, statusCodeExpected = HttpStatusCode.OK_200) {
const path = '/api/v1/users/scoped-tokens'
2020-11-25 11:04:18 +01:00
return makeGetRequest({
url,
path,
token,
statusCodeExpected
})
}
function renewUserScopedTokens (url: string, token: string, statusCodeExpected = HttpStatusCode.OK_200) {
2020-11-25 11:04:18 +01:00
const path = '/api/v1/users/scoped-tokens'
return makePostBodyRequest({
url,
path,
token,
statusCodeExpected
})
}
function deleteMe (url: string, accessToken: string, specialStatus = HttpStatusCode.NO_CONTENT_204) {
2018-08-08 10:55:27 +02:00
const path = '/api/v1/users/me'
return request(url)
.delete(path)
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
.expect(specialStatus)
}
function getMyUserVideoQuotaUsed (url: string, accessToken: string, specialStatus = HttpStatusCode.OK_200) {
2018-01-08 12:53:09 +01:00
const path = '/api/v1/users/me/video-quota-used'
return request(url)
.get(path)
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
.expect(specialStatus)
.expect('Content-Type', /json/)
}
function getUserInformation (url: string, accessToken: string, userId: number, withStats = false) {
2017-09-05 22:09:16 +02:00
const path = '/api/v1/users/' + userId
return request(url)
.get(path)
.query({ withStats })
2017-09-05 22:09:16 +02:00
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
.expect(HttpStatusCode.OK_200)
2017-09-05 22:09:16 +02:00
.expect('Content-Type', /json/)
}
function getMyUserVideoRating (url: string, accessToken: string, videoId: number | string, specialStatus = HttpStatusCode.OK_200) {
2017-09-04 21:21:47 +02:00
const path = '/api/v1/users/me/videos/' + videoId + '/rating'
return request(url)
.get(path)
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
2017-12-28 15:25:31 +01:00
.expect(specialStatus)
2017-09-04 21:21:47 +02:00
.expect('Content-Type', /json/)
}
function getUsersList (url: string, accessToken: string) {
2017-09-04 21:21:47 +02:00
const path = '/api/v1/users'
return request(url)
.get(path)
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
.expect(HttpStatusCode.OK_200)
2017-09-04 21:21:47 +02:00
.expect('Content-Type', /json/)
}
function getUsersListPaginationAndSort (
url: string,
accessToken: string,
start: number,
count: number,
sort: string,
search?: string,
blocked?: boolean
) {
2017-09-04 21:21:47 +02:00
const path = '/api/v1/users'
2019-06-06 15:39:11 +02:00
const query = {
start,
count,
sort,
search,
blocked
2019-06-06 15:39:11 +02:00
}
2017-09-04 21:21:47 +02:00
return request(url)
.get(path)
2019-06-06 15:39:11 +02:00
.query(query)
2017-09-04 21:21:47 +02:00
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
.expect(HttpStatusCode.OK_200)
2017-09-04 21:21:47 +02:00
.expect('Content-Type', /json/)
}
function removeUser (url: string, userId: number | string, accessToken: string, expectedStatus = HttpStatusCode.NO_CONTENT_204) {
2017-09-04 21:21:47 +02:00
const path = '/api/v1/users'
return request(url)
.delete(path + '/' + userId)
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
.expect(expectedStatus)
}
function blockUser (
url: string,
userId: number | string,
accessToken: string,
expectedStatus = HttpStatusCode.NO_CONTENT_204,
reason?: string
) {
2018-08-08 14:58:21 +02:00
const path = '/api/v1/users'
2018-08-08 17:36:10 +02:00
let body: any
if (reason) body = { reason }
2018-08-08 14:58:21 +02:00
return request(url)
.post(path + '/' + userId + '/block')
2018-08-08 17:36:10 +02:00
.send(body)
2018-08-08 14:58:21 +02:00
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
.expect(expectedStatus)
}
function unblockUser (url: string, userId: number | string, accessToken: string, expectedStatus = HttpStatusCode.NO_CONTENT_204) {
2018-08-08 14:58:21 +02:00
const path = '/api/v1/users'
return request(url)
.post(path + '/' + userId + '/unblock')
.set('Accept', 'application/json')
.set('Authorization', 'Bearer ' + accessToken)
.expect(expectedStatus)
}
function updateMyUser (options: { url: string, accessToken: string, statusCodeExpected?: HttpStatusCode } & UserUpdateMe) {
2017-09-05 22:09:16 +02:00
const path = '/api/v1/users/me'
2017-09-04 21:21:47 +02:00
2019-08-28 14:40:06 +02:00
const toSend: UserUpdateMe = omit(options, 'url', 'accessToken')
2017-12-28 15:25:31 +01:00
return makePutBodyRequest({
url: options.url,
path,
token: options.accessToken,
fields: toSend,
statusCodeExpected: options.statusCodeExpected || HttpStatusCode.NO_CONTENT_204
2017-12-28 15:25:31 +01:00
})
2017-09-05 22:09:16 +02:00
}
2017-12-29 19:10:13 +01:00
function updateMyAvatar (options: {
2020-01-31 16:56:52 +01:00
url: string
accessToken: string
2017-12-29 19:10:13 +01:00
fixture: string
}) {
const path = '/api/v1/users/me/avatar/pick'
return updateAvatarRequest(Object.assign(options, { path }))
2017-12-29 19:10:13 +01:00
}
2017-12-28 15:25:31 +01:00
function updateUser (options: {
url: string
2020-01-31 16:56:52 +01:00
userId: number
accessToken: string
email?: string
emailVerified?: boolean
videoQuota?: number
videoQuotaDaily?: number
password?: string
adminFlags?: UserAdminFlag
2021-02-01 15:39:13 +01:00
pluginAuth?: string
2017-12-28 15:25:31 +01:00
role?: UserRole
}) {
const path = '/api/v1/users/' + options.userId
2017-09-05 22:09:16 +02:00
const toSend = {}
if (options.password !== undefined && options.password !== null) toSend['password'] = options.password
2017-12-28 15:25:31 +01:00
if (options.email !== undefined && options.email !== null) toSend['email'] = options.email
if (options.emailVerified !== undefined && options.emailVerified !== null) toSend['emailVerified'] = options.emailVerified
2017-12-28 15:25:31 +01:00
if (options.videoQuota !== undefined && options.videoQuota !== null) toSend['videoQuota'] = options.videoQuota
if (options.videoQuotaDaily !== undefined && options.videoQuotaDaily !== null) toSend['videoQuotaDaily'] = options.videoQuotaDaily
2017-12-28 15:25:31 +01:00
if (options.role !== undefined && options.role !== null) toSend['role'] = options.role
2019-04-15 10:49:46 +02:00
if (options.adminFlags !== undefined && options.adminFlags !== null) toSend['adminFlags'] = options.adminFlags
2021-02-01 15:39:13 +01:00
if (options.pluginAuth !== undefined) toSend['pluginAuth'] = options.pluginAuth
2017-12-28 15:25:31 +01:00
return makePutBodyRequest({
url: options.url,
path,
token: options.accessToken,
fields: toSend,
statusCodeExpected: HttpStatusCode.NO_CONTENT_204
2017-12-28 15:25:31 +01:00
})
2017-09-04 21:21:47 +02:00
}
2018-01-30 15:16:24 +01:00
function askResetPassword (url: string, email: string) {
const path = '/api/v1/users/ask-reset-password'
return makePostBodyRequest({
url,
path,
fields: { email },
statusCodeExpected: HttpStatusCode.NO_CONTENT_204
2018-01-30 15:16:24 +01:00
})
}
function resetPassword (
url: string,
userId: number,
verificationString: string,
password: string,
statusCodeExpected = HttpStatusCode.NO_CONTENT_204
) {
2018-01-30 15:16:24 +01:00
const path = '/api/v1/users/' + userId + '/reset-password'
return makePostBodyRequest({
url,
path,
fields: { password, verificationString },
statusCodeExpected
})
}
function askSendVerifyEmail (url: string, email: string) {
const path = '/api/v1/users/ask-send-verify-email'
return makePostBodyRequest({
url,
path,
fields: { email },
statusCodeExpected: HttpStatusCode.NO_CONTENT_204
})
}
function verifyEmail (
url: string,
userId: number,
verificationString: string,
isPendingEmail = false,
statusCodeExpected = HttpStatusCode.NO_CONTENT_204
) {
const path = '/api/v1/users/' + userId + '/verify-email'
return makePostBodyRequest({
url,
path,
2019-06-11 11:54:33 +02:00
fields: {
verificationString,
isPendingEmail
},
statusCodeExpected
})
}
2017-09-04 21:21:47 +02:00
// ---------------------------------------------------------------------------
export {
createUser,
registerUser,
2017-09-05 22:09:16 +02:00
getMyUserInformation,
2017-12-28 15:25:31 +01:00
getMyUserVideoRating,
2018-08-08 10:55:27 +02:00
deleteMe,
registerUserWithChannel,
2018-01-08 12:53:09 +01:00
getMyUserVideoQuotaUsed,
2017-09-04 21:21:47 +02:00
getUsersList,
getUsersListPaginationAndSort,
removeUser,
2017-09-05 22:09:16 +02:00
updateUser,
updateMyUser,
2017-12-29 19:10:13 +01:00
getUserInformation,
2018-08-08 14:58:21 +02:00
blockUser,
unblockUser,
2018-01-30 15:16:24 +01:00
askResetPassword,
resetPassword,
2020-11-25 11:04:18 +01:00
renewUserScopedTokens,
updateMyAvatar,
askSendVerifyEmail,
2019-03-05 10:58:44 +01:00
generateUserAccessToken,
verifyEmail,
getUserScopedTokens
2017-09-04 21:21:47 +02:00
}