aboutsummaryrefslogtreecommitdiffhomepage
path: root/shared
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2021-07-07 09:16:40 +0200
committerChocobozzz <me@florianbigard.com>2021-07-20 15:27:17 +0200
commitc3d29f694bf8c910f917be655626d0f80871124f (patch)
treec90dfdc1245c8a9aca49e9ea9c71ed8e6b9dd35f /shared
parent883a9019085ff9013079d6b1539b86f2f519175a (diff)
downloadPeerTube-c3d29f694bf8c910f917be655626d0f80871124f.tar.gz
PeerTube-c3d29f694bf8c910f917be655626d0f80871124f.tar.zst
PeerTube-c3d29f694bf8c910f917be655626d0f80871124f.zip
Introduce follows command
Diffstat (limited to 'shared')
-rw-r--r--shared/extra-utils/index.ts5
-rw-r--r--shared/extra-utils/server/follows-command.ts124
-rw-r--r--shared/extra-utils/server/follows.ts131
-rw-r--r--shared/extra-utils/server/index.ts2
-rw-r--r--shared/extra-utils/server/servers.ts3
5 files changed, 135 insertions, 130 deletions
diff --git a/shared/extra-utils/index.ts b/shared/extra-utils/index.ts
index 7b5835e47..48431ed83 100644
--- a/shared/extra-utils/index.ts
+++ b/shared/extra-utils/index.ts
@@ -7,15 +7,14 @@ export * from './miscs'
7export * from './mock-servers' 7export * from './mock-servers'
8export * from './moderation' 8export * from './moderation'
9export * from './overviews' 9export * from './overviews'
10export * from './search'
11export * from './server'
10 12
11export * from './requests/check-api-params' 13export * from './requests/check-api-params'
12export * from './requests/requests' 14export * from './requests/requests'
13 15
14export * from './search'
15
16export * from './server/clients' 16export * from './server/clients'
17export * from './server/config' 17export * from './server/config'
18export * from './server/follows'
19export * from './server/jobs' 18export * from './server/jobs'
20export * from './server/plugins' 19export * from './server/plugins'
21export * from './server/servers' 20export * from './server/servers'
diff --git a/shared/extra-utils/server/follows-command.ts b/shared/extra-utils/server/follows-command.ts
new file mode 100644
index 000000000..aba7bce82
--- /dev/null
+++ b/shared/extra-utils/server/follows-command.ts
@@ -0,0 +1,124 @@
1import { pick } from 'lodash'
2import { ActivityPubActorType, ActorFollow, FollowState, ResultList } from '@shared/models'
3import { HttpStatusCode } from '../../core-utils/miscs/http-error-codes'
4import { AbstractCommand, OverrideCommandOptions } from '../shared'
5import { ServerInfo } from './servers'
6
7export class FollowsCommand extends AbstractCommand {
8
9 getFollowers (options: OverrideCommandOptions & {
10 start: number
11 count: number
12 sort: string
13 search?: string
14 actorType?: ActivityPubActorType
15 state?: FollowState
16 }) {
17 const path = '/api/v1/server/followers'
18
19 const toPick = [ 'start', 'count', 'sort', 'search', 'state', 'actorType' ]
20 const query = pick(options, toPick)
21
22 return this.getRequestBody<ResultList<ActorFollow>>({
23 ...options,
24
25 token: null,
26
27 path,
28 query,
29 defaultExpectedStatus: HttpStatusCode.OK_200
30 })
31 }
32
33 getFollowings (options: OverrideCommandOptions & {
34 start: number
35 count: number
36 sort: string
37 search?: string
38 actorType?: ActivityPubActorType
39 state?: FollowState
40 }) {
41 const path = '/api/v1/server/following'
42
43 const toPick = [ 'start', 'count', 'sort', 'search', 'state', 'actorType' ]
44 const query = pick(options, toPick)
45
46 return this.getRequestBody<ResultList<ActorFollow>>({
47 ...options,
48
49 token: null,
50
51 path,
52 query,
53 defaultExpectedStatus: HttpStatusCode.OK_200
54 })
55 }
56
57 follow (options: OverrideCommandOptions & {
58 targets: string[]
59 }) {
60 const path = '/api/v1/server/following'
61
62 const hosts = options.targets.map(f => f.replace(/^http:\/\//, ''))
63
64 return this.postBodyRequest({
65 ...options,
66
67 path,
68 fields: { hosts },
69 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
70 })
71 }
72
73 async unfollow (options: OverrideCommandOptions & {
74 target: ServerInfo
75 }) {
76 const path = '/api/v1/server/following/' + options.target.host
77
78 return this.deleteRequest({
79 ...options,
80
81 path,
82 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
83 })
84 }
85
86 acceptFollower (options: OverrideCommandOptions & {
87 follower: string
88 }) {
89 const path = '/api/v1/server/followers/' + options.follower + '/accept'
90
91 return this.postBodyRequest({
92 ...options,
93
94 path,
95 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
96 })
97 }
98
99 rejectFollower (options: OverrideCommandOptions & {
100 follower: string
101 }) {
102 const path = '/api/v1/server/followers/' + options.follower + '/reject'
103
104 return this.postBodyRequest({
105 ...options,
106
107 path,
108 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
109 })
110 }
111
112 removeFollower (options: OverrideCommandOptions & {
113 follower: ServerInfo
114 }) {
115 const path = '/api/v1/server/followers/peertube@' + options.follower.host
116
117 return this.deleteRequest({
118 ...options,
119
120 path,
121 defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204
122 })
123 }
124}
diff --git a/shared/extra-utils/server/follows.ts b/shared/extra-utils/server/follows.ts
index 6aae4a31d..c23cebd81 100644
--- a/shared/extra-utils/server/follows.ts
+++ b/shared/extra-utils/server/follows.ts
@@ -1,126 +1,10 @@
1import * as request from 'supertest'
2import { ServerInfo } from './servers'
3import { waitJobs } from './jobs' 1import { waitJobs } from './jobs'
4import { makePostBodyRequest } from '../requests/requests' 2import { ServerInfo } from './servers'
5import { ActivityPubActorType, FollowState } from '@shared/models'
6import { HttpStatusCode } from '../../../shared/core-utils/miscs/http-error-codes'
7
8function getFollowersListPaginationAndSort (options: {
9 url: string
10 start: number
11 count: number
12 sort: string
13 search?: string
14 actorType?: ActivityPubActorType
15 state?: FollowState
16}) {
17 const { url, start, count, sort, search, state, actorType } = options
18 const path = '/api/v1/server/followers'
19
20 const query = {
21 start,
22 count,
23 sort,
24 search,
25 state,
26 actorType
27 }
28
29 return request(url)
30 .get(path)
31 .query(query)
32 .set('Accept', 'application/json')
33 .expect(HttpStatusCode.OK_200)
34 .expect('Content-Type', /json/)
35}
36
37function acceptFollower (url: string, token: string, follower: string, statusCodeExpected = HttpStatusCode.NO_CONTENT_204) {
38 const path = '/api/v1/server/followers/' + follower + '/accept'
39
40 return makePostBodyRequest({
41 url,
42 token,
43 path,
44 statusCodeExpected
45 })
46}
47
48function rejectFollower (url: string, token: string, follower: string, statusCodeExpected = HttpStatusCode.NO_CONTENT_204) {
49 const path = '/api/v1/server/followers/' + follower + '/reject'
50
51 return makePostBodyRequest({
52 url,
53 token,
54 path,
55 statusCodeExpected
56 })
57}
58
59function getFollowingListPaginationAndSort (options: {
60 url: string
61 start: number
62 count: number
63 sort: string
64 search?: string
65 actorType?: ActivityPubActorType
66 state?: FollowState
67}) {
68 const { url, start, count, sort, search, state, actorType } = options
69 const path = '/api/v1/server/following'
70
71 const query = {
72 start,
73 count,
74 sort,
75 search,
76 state,
77 actorType
78 }
79
80 return request(url)
81 .get(path)
82 .query(query)
83 .set('Accept', 'application/json')
84 .expect(HttpStatusCode.OK_200)
85 .expect('Content-Type', /json/)
86}
87
88function follow (follower: string, following: string[], accessToken: string, expectedStatus = HttpStatusCode.NO_CONTENT_204) {
89 const path = '/api/v1/server/following'
90
91 const followingHosts = following.map(f => f.replace(/^http:\/\//, ''))
92 return request(follower)
93 .post(path)
94 .set('Accept', 'application/json')
95 .set('Authorization', 'Bearer ' + accessToken)
96 .send({ hosts: followingHosts })
97 .expect(expectedStatus)
98}
99
100async function unfollow (url: string, accessToken: string, target: ServerInfo, expectedStatus = HttpStatusCode.NO_CONTENT_204) {
101 const path = '/api/v1/server/following/' + target.host
102
103 return request(url)
104 .delete(path)
105 .set('Accept', 'application/json')
106 .set('Authorization', 'Bearer ' + accessToken)
107 .expect(expectedStatus)
108}
109
110function removeFollower (url: string, accessToken: string, follower: ServerInfo, expectedStatus = HttpStatusCode.NO_CONTENT_204) {
111 const path = '/api/v1/server/followers/peertube@' + follower.host
112
113 return request(url)
114 .delete(path)
115 .set('Accept', 'application/json')
116 .set('Authorization', 'Bearer ' + accessToken)
117 .expect(expectedStatus)
118}
119 3
120async function doubleFollow (server1: ServerInfo, server2: ServerInfo) { 4async function doubleFollow (server1: ServerInfo, server2: ServerInfo) {
121 await Promise.all([ 5 await Promise.all([
122 follow(server1.url, [ server2.url ], server1.accessToken), 6 server1.followsCommand.follow({ targets: [ server2.url ] }),
123 follow(server2.url, [ server1.url ], server2.accessToken) 7 server2.followsCommand.follow({ targets: [ server1.url ] })
124 ]) 8 ])
125 9
126 // Wait request propagation 10 // Wait request propagation
@@ -132,12 +16,5 @@ async function doubleFollow (server1: ServerInfo, server2: ServerInfo) {
132// --------------------------------------------------------------------------- 16// ---------------------------------------------------------------------------
133 17
134export { 18export {
135 getFollowersListPaginationAndSort, 19 doubleFollow
136 getFollowingListPaginationAndSort,
137 unfollow,
138 removeFollower,
139 follow,
140 doubleFollow,
141 acceptFollower,
142 rejectFollower
143} 20}
diff --git a/shared/extra-utils/server/index.ts b/shared/extra-utils/server/index.ts
index f0071ba72..258084623 100644
--- a/shared/extra-utils/server/index.ts
+++ b/shared/extra-utils/server/index.ts
@@ -1,2 +1,4 @@
1export * from './contact-form-command' 1export * from './contact-form-command'
2export * from './debug-command' 2export * from './debug-command'
3export * from './follows-command'
4export * from './follows'
diff --git a/shared/extra-utils/server/servers.ts b/shared/extra-utils/server/servers.ts
index 30e712ab8..7ac80cea0 100644
--- a/shared/extra-utils/server/servers.ts
+++ b/shared/extra-utils/server/servers.ts
@@ -18,6 +18,7 @@ import { makeGetRequest } from '../requests/requests'
18import { SearchCommand } from '../search' 18import { SearchCommand } from '../search'
19import { ContactFormCommand } from './contact-form-command' 19import { ContactFormCommand } from './contact-form-command'
20import { DebugCommand } from './debug-command' 20import { DebugCommand } from './debug-command'
21import { FollowsCommand } from './follows-command'
21 22
22interface ServerInfo { 23interface ServerInfo {
23 app: ChildProcess 24 app: ChildProcess
@@ -81,6 +82,7 @@ interface ServerInfo {
81 searchCommand?: SearchCommand 82 searchCommand?: SearchCommand
82 contactFormCommand?: ContactFormCommand 83 contactFormCommand?: ContactFormCommand
83 debugCommand?: DebugCommand 84 debugCommand?: DebugCommand
85 followsCommand?: FollowsCommand
84} 86}
85 87
86function parallelTests () { 88function parallelTests () {
@@ -296,6 +298,7 @@ async function runServer (server: ServerInfo, configOverrideArg?: any, args = []
296 server.searchCommand = new SearchCommand(server) 298 server.searchCommand = new SearchCommand(server)
297 server.contactFormCommand = new ContactFormCommand(server) 299 server.contactFormCommand = new ContactFormCommand(server)
298 server.debugCommand = new DebugCommand(server) 300 server.debugCommand = new DebugCommand(server)
301 server.followsCommand = new FollowsCommand(server)
299 302
300 res(server) 303 res(server)
301 }) 304 })