diff options
Diffstat (limited to 'shared/server-commands/videos/comments-command.ts')
-rw-r--r-- | shared/server-commands/videos/comments-command.ts | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/shared/server-commands/videos/comments-command.ts b/shared/server-commands/videos/comments-command.ts new file mode 100644 index 000000000..f0d163a07 --- /dev/null +++ b/shared/server-commands/videos/comments-command.ts | |||
@@ -0,0 +1,152 @@ | |||
1 | import { pick } from 'lodash' | ||
2 | import { HttpStatusCode, ResultList, VideoComment, VideoCommentThreads, VideoCommentThreadTree } from '@shared/models' | ||
3 | import { unwrapBody } from '../requests' | ||
4 | import { AbstractCommand, OverrideCommandOptions } from '../shared' | ||
5 | |||
6 | export class CommentsCommand extends AbstractCommand { | ||
7 | |||
8 | private lastVideoId: number | string | ||
9 | private lastThreadId: number | ||
10 | private lastReplyId: number | ||
11 | |||
12 | listForAdmin (options: OverrideCommandOptions & { | ||
13 | start?: number | ||
14 | count?: number | ||
15 | sort?: string | ||
16 | isLocal?: boolean | ||
17 | search?: string | ||
18 | searchAccount?: string | ||
19 | searchVideo?: string | ||
20 | } = {}) { | ||
21 | const { sort = '-createdAt' } = options | ||
22 | const path = '/api/v1/videos/comments' | ||
23 | |||
24 | const query = { sort, ...pick(options, [ 'start', 'count', 'isLocal', 'search', 'searchAccount', 'searchVideo' ]) } | ||
25 | |||
26 | return this.getRequestBody<ResultList<VideoComment>>({ | ||
27 | ...options, | ||
28 | |||
29 | path, | ||
30 | query, | ||
31 | implicitToken: true, | ||
32 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
33 | }) | ||
34 | } | ||
35 | |||
36 | listThreads (options: OverrideCommandOptions & { | ||
37 | videoId: number | string | ||
38 | start?: number | ||
39 | count?: number | ||
40 | sort?: string | ||
41 | }) { | ||
42 | const { start, count, sort, videoId } = options | ||
43 | const path = '/api/v1/videos/' + videoId + '/comment-threads' | ||
44 | |||
45 | return this.getRequestBody<VideoCommentThreads>({ | ||
46 | ...options, | ||
47 | |||
48 | path, | ||
49 | query: { start, count, sort }, | ||
50 | implicitToken: false, | ||
51 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
52 | }) | ||
53 | } | ||
54 | |||
55 | getThread (options: OverrideCommandOptions & { | ||
56 | videoId: number | string | ||
57 | threadId: number | ||
58 | }) { | ||
59 | const { videoId, threadId } = options | ||
60 | const path = '/api/v1/videos/' + videoId + '/comment-threads/' + threadId | ||
61 | |||
62 | return this.getRequestBody<VideoCommentThreadTree>({ | ||
63 | ...options, | ||
64 | |||
65 | path, | ||
66 | implicitToken: false, | ||
67 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
68 | }) | ||
69 | } | ||
70 | |||
71 | async createThread (options: OverrideCommandOptions & { | ||
72 | videoId: number | string | ||
73 | text: string | ||
74 | }) { | ||
75 | const { videoId, text } = options | ||
76 | const path = '/api/v1/videos/' + videoId + '/comment-threads' | ||
77 | |||
78 | const body = await unwrapBody<{ comment: VideoComment }>(this.postBodyRequest({ | ||
79 | ...options, | ||
80 | |||
81 | path, | ||
82 | fields: { text }, | ||
83 | implicitToken: true, | ||
84 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
85 | })) | ||
86 | |||
87 | this.lastThreadId = body.comment?.id | ||
88 | this.lastVideoId = videoId | ||
89 | |||
90 | return body.comment | ||
91 | } | ||
92 | |||
93 | async addReply (options: OverrideCommandOptions & { | ||
94 | videoId: number | string | ||
95 | toCommentId: number | ||
96 | text: string | ||
97 | }) { | ||
98 | const { videoId, toCommentId, text } = options | ||
99 | const path = '/api/v1/videos/' + videoId + '/comments/' + toCommentId | ||
100 | |||
101 | const body = await unwrapBody<{ comment: VideoComment }>(this.postBodyRequest({ | ||
102 | ...options, | ||
103 | |||
104 | path, | ||
105 | fields: { text }, | ||
106 | implicitToken: true, | ||
107 | defaultExpectedStatus: HttpStatusCode.OK_200 | ||
108 | })) | ||
109 | |||
110 | this.lastReplyId = body.comment?.id | ||
111 | |||
112 | return body.comment | ||
113 | } | ||
114 | |||
115 | async addReplyToLastReply (options: OverrideCommandOptions & { | ||
116 | text: string | ||
117 | }) { | ||
118 | return this.addReply({ ...options, videoId: this.lastVideoId, toCommentId: this.lastReplyId }) | ||
119 | } | ||
120 | |||
121 | async addReplyToLastThread (options: OverrideCommandOptions & { | ||
122 | text: string | ||
123 | }) { | ||
124 | return this.addReply({ ...options, videoId: this.lastVideoId, toCommentId: this.lastThreadId }) | ||
125 | } | ||
126 | |||
127 | async findCommentId (options: OverrideCommandOptions & { | ||
128 | videoId: number | string | ||
129 | text: string | ||
130 | }) { | ||
131 | const { videoId, text } = options | ||
132 | const { data } = await this.listThreads({ videoId, count: 25, sort: '-createdAt' }) | ||
133 | |||
134 | return data.find(c => c.text === text).id | ||
135 | } | ||
136 | |||
137 | delete (options: OverrideCommandOptions & { | ||
138 | videoId: number | string | ||
139 | commentId: number | ||
140 | }) { | ||
141 | const { videoId, commentId } = options | ||
142 | const path = '/api/v1/videos/' + videoId + '/comments/' + commentId | ||
143 | |||
144 | return this.deleteRequest({ | ||
145 | ...options, | ||
146 | |||
147 | path, | ||
148 | implicitToken: true, | ||
149 | defaultExpectedStatus: HttpStatusCode.NO_CONTENT_204 | ||
150 | }) | ||
151 | } | ||
152 | } | ||