diff options
author | Rigel Kent <sendmemail@rigelk.eu> | 2021-06-01 01:36:53 +0200 |
---|---|---|
committer | Chocobozzz <chocobozzz@cpy.re> | 2021-06-02 16:57:07 +0200 |
commit | 76148b27f7501bac061992136852be4303370c8d (patch) | |
tree | fc0559253e833c9252fa14ebaec5321d88bfb4e8 /server/helpers | |
parent | 5ed25fb76e920dac364cb9ef46f14ec4bd372949 (diff) | |
download | PeerTube-76148b27f7501bac061992136852be4303370c8d.tar.gz PeerTube-76148b27f7501bac061992136852be4303370c8d.tar.zst PeerTube-76148b27f7501bac061992136852be4303370c8d.zip |
refactor API errors to standard error format
Diffstat (limited to 'server/helpers')
-rw-r--r-- | server/helpers/custom-validators/video-comments.ts | 39 | ||||
-rw-r--r-- | server/helpers/custom-validators/video-imports.ts | 8 | ||||
-rw-r--r-- | server/helpers/custom-validators/video-ownership.ts | 15 | ||||
-rw-r--r-- | server/helpers/express-utils.ts | 32 | ||||
-rw-r--r-- | server/helpers/middlewares/abuses.ts | 6 | ||||
-rw-r--r-- | server/helpers/middlewares/accounts.ts | 16 | ||||
-rw-r--r-- | server/helpers/middlewares/video-blacklists.ts | 8 | ||||
-rw-r--r-- | server/helpers/middlewares/video-captions.ts | 7 | ||||
-rw-r--r-- | server/helpers/middlewares/video-channels.ts | 7 | ||||
-rw-r--r-- | server/helpers/middlewares/video-playlists.ts | 8 | ||||
-rw-r--r-- | server/helpers/middlewares/videos.ts | 40 |
11 files changed, 106 insertions, 80 deletions
diff --git a/server/helpers/custom-validators/video-comments.ts b/server/helpers/custom-validators/video-comments.ts index 8d3ce580e..5c88447ad 100644 --- a/server/helpers/custom-validators/video-comments.ts +++ b/server/helpers/custom-validators/video-comments.ts | |||
@@ -16,26 +16,20 @@ async function doesVideoCommentThreadExist (idArg: number | string, video: MVide | |||
16 | const videoComment = await VideoCommentModel.loadById(id) | 16 | const videoComment = await VideoCommentModel.loadById(id) |
17 | 17 | ||
18 | if (!videoComment) { | 18 | if (!videoComment) { |
19 | res.status(HttpStatusCode.NOT_FOUND_404) | 19 | res.fail({ |
20 | .json({ error: 'Video comment thread not found' }) | 20 | status: HttpStatusCode.NOT_FOUND_404, |
21 | .end() | 21 | message: 'Video comment thread not found' |
22 | 22 | }) | |
23 | return false | 23 | return false |
24 | } | 24 | } |
25 | 25 | ||
26 | if (videoComment.videoId !== video.id) { | 26 | if (videoComment.videoId !== video.id) { |
27 | res.status(HttpStatusCode.BAD_REQUEST_400) | 27 | res.fail({ message: 'Video comment is not associated to this video.' }) |
28 | .json({ error: 'Video comment is not associated to this video.' }) | ||
29 | .end() | ||
30 | |||
31 | return false | 28 | return false |
32 | } | 29 | } |
33 | 30 | ||
34 | if (videoComment.inReplyToCommentId !== null) { | 31 | if (videoComment.inReplyToCommentId !== null) { |
35 | res.status(HttpStatusCode.BAD_REQUEST_400) | 32 | res.fail({ message: 'Video comment is not a thread.' }) |
36 | .json({ error: 'Video comment is not a thread.' }) | ||
37 | .end() | ||
38 | |||
39 | return false | 33 | return false |
40 | } | 34 | } |
41 | 35 | ||
@@ -48,18 +42,15 @@ async function doesVideoCommentExist (idArg: number | string, video: MVideoId, r | |||
48 | const videoComment = await VideoCommentModel.loadByIdAndPopulateVideoAndAccountAndReply(id) | 42 | const videoComment = await VideoCommentModel.loadByIdAndPopulateVideoAndAccountAndReply(id) |
49 | 43 | ||
50 | if (!videoComment) { | 44 | if (!videoComment) { |
51 | res.status(HttpStatusCode.NOT_FOUND_404) | 45 | res.fail({ |
52 | .json({ error: 'Video comment thread not found' }) | 46 | status: HttpStatusCode.NOT_FOUND_404, |
53 | .end() | 47 | message: 'Video comment thread not found' |
54 | 48 | }) | |
55 | return false | 49 | return false |
56 | } | 50 | } |
57 | 51 | ||
58 | if (videoComment.videoId !== video.id) { | 52 | if (videoComment.videoId !== video.id) { |
59 | res.status(HttpStatusCode.BAD_REQUEST_400) | 53 | res.fail({ message: 'Video comment is not associated to this video.' }) |
60 | .json({ error: 'Video comment is not associated to this video.' }) | ||
61 | .end() | ||
62 | |||
63 | return false | 54 | return false |
64 | } | 55 | } |
65 | 56 | ||
@@ -72,14 +63,14 @@ async function doesCommentIdExist (idArg: number | string, res: express.Response | |||
72 | const videoComment = await VideoCommentModel.loadByIdAndPopulateVideoAndAccountAndReply(id) | 63 | const videoComment = await VideoCommentModel.loadByIdAndPopulateVideoAndAccountAndReply(id) |
73 | 64 | ||
74 | if (!videoComment) { | 65 | if (!videoComment) { |
75 | res.status(HttpStatusCode.NOT_FOUND_404) | 66 | res.fail({ |
76 | .json({ error: 'Video comment thread not found' }) | 67 | status: HttpStatusCode.NOT_FOUND_404, |
77 | 68 | message: 'Video comment thread not found' | |
69 | }) | ||
78 | return false | 70 | return false |
79 | } | 71 | } |
80 | 72 | ||
81 | res.locals.videoCommentFull = videoComment | 73 | res.locals.videoCommentFull = videoComment |
82 | |||
83 | return true | 74 | return true |
84 | } | 75 | } |
85 | 76 | ||
diff --git a/server/helpers/custom-validators/video-imports.ts b/server/helpers/custom-validators/video-imports.ts index 0063d3337..3ad7a4648 100644 --- a/server/helpers/custom-validators/video-imports.ts +++ b/server/helpers/custom-validators/video-imports.ts | |||
@@ -36,10 +36,10 @@ async function doesVideoImportExist (id: number, res: express.Response) { | |||
36 | const videoImport = await VideoImportModel.loadAndPopulateVideo(id) | 36 | const videoImport = await VideoImportModel.loadAndPopulateVideo(id) |
37 | 37 | ||
38 | if (!videoImport) { | 38 | if (!videoImport) { |
39 | res.status(HttpStatusCode.NOT_FOUND_404) | 39 | res.fail({ |
40 | .json({ error: 'Video import not found' }) | 40 | status: HttpStatusCode.NOT_FOUND_404, |
41 | .end() | 41 | message: 'Video import not found' |
42 | 42 | }) | |
43 | return false | 43 | return false |
44 | } | 44 | } |
45 | 45 | ||
diff --git a/server/helpers/custom-validators/video-ownership.ts b/server/helpers/custom-validators/video-ownership.ts index ee3cebe10..21a6b7203 100644 --- a/server/helpers/custom-validators/video-ownership.ts +++ b/server/helpers/custom-validators/video-ownership.ts | |||
@@ -9,10 +9,10 @@ export async function doesChangeVideoOwnershipExist (idArg: number | string, res | |||
9 | const videoChangeOwnership = await VideoChangeOwnershipModel.load(id) | 9 | const videoChangeOwnership = await VideoChangeOwnershipModel.load(id) |
10 | 10 | ||
11 | if (!videoChangeOwnership) { | 11 | if (!videoChangeOwnership) { |
12 | res.status(HttpStatusCode.NOT_FOUND_404) | 12 | res.fail({ |
13 | .json({ error: 'Video change ownership not found' }) | 13 | status: HttpStatusCode.NOT_FOUND_404, |
14 | .end() | 14 | message: 'Video change ownership not found' |
15 | 15 | }) | |
16 | return false | 16 | return false |
17 | } | 17 | } |
18 | 18 | ||
@@ -25,8 +25,9 @@ export function checkUserCanTerminateOwnershipChange (user: MUserId, videoChange | |||
25 | return true | 25 | return true |
26 | } | 26 | } |
27 | 27 | ||
28 | res.status(HttpStatusCode.FORBIDDEN_403) | 28 | res.fail({ |
29 | .json({ error: 'Cannot terminate an ownership change of another user' }) | 29 | status: HttpStatusCode.FORBIDDEN_403, |
30 | .end() | 30 | message: 'Cannot terminate an ownership change of another user' |
31 | }) | ||
31 | return false | 32 | return false |
32 | } | 33 | } |
diff --git a/server/helpers/express-utils.ts b/server/helpers/express-utils.ts index 010c6961a..e3ff93cdd 100644 --- a/server/helpers/express-utils.ts +++ b/server/helpers/express-utils.ts | |||
@@ -8,6 +8,7 @@ import { isArray } from './custom-validators/misc' | |||
8 | import { logger } from './logger' | 8 | import { logger } from './logger' |
9 | import { deleteFileAndCatch, generateRandomString } from './utils' | 9 | import { deleteFileAndCatch, generateRandomString } from './utils' |
10 | import { getExtFromMimetype } from './video' | 10 | import { getExtFromMimetype } from './video' |
11 | import { ProblemDocument, ProblemDocumentExtension } from 'http-problem-details' | ||
11 | 12 | ||
12 | function buildNSFWFilter (res?: express.Response, paramNSFW?: string) { | 13 | function buildNSFWFilter (res?: express.Response, paramNSFW?: string) { |
13 | if (paramNSFW === 'true') return true | 14 | if (paramNSFW === 'true') return true |
@@ -125,6 +126,34 @@ function getCountVideos (req: express.Request) { | |||
125 | return req.query.skipCount !== true | 126 | return req.query.skipCount !== true |
126 | } | 127 | } |
127 | 128 | ||
129 | // helpers added in server.ts and used in subsequent controllers used | ||
130 | const apiResponseHelpers = (req, res: express.Response, next = null) => { | ||
131 | res.fail = (options) => { | ||
132 | const { data, status, message, title, type, docs, instance } = { | ||
133 | data: null, | ||
134 | status: HttpStatusCode.BAD_REQUEST_400, | ||
135 | ...options | ||
136 | } | ||
137 | |||
138 | const extension = new ProblemDocumentExtension({ | ||
139 | ...data, | ||
140 | docs: docs || res.docs | ||
141 | }) | ||
142 | |||
143 | res.status(status) | ||
144 | res.setHeader('Content-Type', 'application/problem+json') | ||
145 | res.json(new ProblemDocument({ | ||
146 | status, | ||
147 | title, | ||
148 | instance, | ||
149 | type: type && '' + type, | ||
150 | detail: message | ||
151 | }, extension)) | ||
152 | } | ||
153 | |||
154 | if (next !== null) next() | ||
155 | } | ||
156 | |||
128 | // --------------------------------------------------------------------------- | 157 | // --------------------------------------------------------------------------- |
129 | 158 | ||
130 | export { | 159 | export { |
@@ -134,5 +163,6 @@ export { | |||
134 | badRequest, | 163 | badRequest, |
135 | createReqFiles, | 164 | createReqFiles, |
136 | cleanUpReqFiles, | 165 | cleanUpReqFiles, |
137 | getCountVideos | 166 | getCountVideos, |
167 | apiResponseHelpers | ||
138 | } | 168 | } |
diff --git a/server/helpers/middlewares/abuses.ts b/server/helpers/middlewares/abuses.ts index c53bd9efd..f0b1caba8 100644 --- a/server/helpers/middlewares/abuses.ts +++ b/server/helpers/middlewares/abuses.ts | |||
@@ -6,8 +6,10 @@ async function doesAbuseExist (abuseId: number | string, res: Response) { | |||
6 | const abuse = await AbuseModel.loadByIdWithReporter(parseInt(abuseId + '', 10)) | 6 | const abuse = await AbuseModel.loadByIdWithReporter(parseInt(abuseId + '', 10)) |
7 | 7 | ||
8 | if (!abuse) { | 8 | if (!abuse) { |
9 | res.status(HttpStatusCode.NOT_FOUND_404) | 9 | res.fail({ |
10 | .json({ error: 'Abuse not found' }) | 10 | status: HttpStatusCode.NOT_FOUND_404, |
11 | message: 'Abuse not found' | ||
12 | }) | ||
11 | 13 | ||
12 | return false | 14 | return false |
13 | } | 15 | } |
diff --git a/server/helpers/middlewares/accounts.ts b/server/helpers/middlewares/accounts.ts index 5addd3e1a..7db79bc48 100644 --- a/server/helpers/middlewares/accounts.ts +++ b/server/helpers/middlewares/accounts.ts | |||
@@ -27,15 +27,15 @@ async function doesAccountExist (p: Promise<MAccountDefault>, res: Response, sen | |||
27 | 27 | ||
28 | if (!account) { | 28 | if (!account) { |
29 | if (sendNotFound === true) { | 29 | if (sendNotFound === true) { |
30 | res.status(HttpStatusCode.NOT_FOUND_404) | 30 | res.fail({ |
31 | .json({ error: 'Account not found' }) | 31 | status: HttpStatusCode.NOT_FOUND_404, |
32 | message: 'Account not found' | ||
33 | }) | ||
32 | } | 34 | } |
33 | |||
34 | return false | 35 | return false |
35 | } | 36 | } |
36 | 37 | ||
37 | res.locals.account = account | 38 | res.locals.account = account |
38 | |||
39 | return true | 39 | return true |
40 | } | 40 | } |
41 | 41 | ||
@@ -43,14 +43,14 @@ async function doesUserFeedTokenCorrespond (id: number, token: string, res: Resp | |||
43 | const user = await UserModel.loadByIdWithChannels(parseInt(id + '', 10)) | 43 | const user = await UserModel.loadByIdWithChannels(parseInt(id + '', 10)) |
44 | 44 | ||
45 | if (token !== user.feedToken) { | 45 | if (token !== user.feedToken) { |
46 | res.status(HttpStatusCode.FORBIDDEN_403) | 46 | res.fail({ |
47 | .json({ error: 'User and token mismatch' }) | 47 | status: HttpStatusCode.FORBIDDEN_403, |
48 | 48 | message: 'User and token mismatch' | |
49 | }) | ||
49 | return false | 50 | return false |
50 | } | 51 | } |
51 | 52 | ||
52 | res.locals.user = user | 53 | res.locals.user = user |
53 | |||
54 | return true | 54 | return true |
55 | } | 55 | } |
56 | 56 | ||
diff --git a/server/helpers/middlewares/video-blacklists.ts b/server/helpers/middlewares/video-blacklists.ts index eda1324d3..3494fd6b0 100644 --- a/server/helpers/middlewares/video-blacklists.ts +++ b/server/helpers/middlewares/video-blacklists.ts | |||
@@ -6,10 +6,10 @@ async function doesVideoBlacklistExist (videoId: number, res: Response) { | |||
6 | const videoBlacklist = await VideoBlacklistModel.loadByVideoId(videoId) | 6 | const videoBlacklist = await VideoBlacklistModel.loadByVideoId(videoId) |
7 | 7 | ||
8 | if (videoBlacklist === null) { | 8 | if (videoBlacklist === null) { |
9 | res.status(HttpStatusCode.NOT_FOUND_404) | 9 | res.fail({ |
10 | .json({ error: 'Blacklisted video not found' }) | 10 | status: HttpStatusCode.NOT_FOUND_404, |
11 | .end() | 11 | message: 'Blacklisted video not found' |
12 | 12 | }) | |
13 | return false | 13 | return false |
14 | } | 14 | } |
15 | 15 | ||
diff --git a/server/helpers/middlewares/video-captions.ts b/server/helpers/middlewares/video-captions.ts index 226d3c5f8..2a12c4813 100644 --- a/server/helpers/middlewares/video-captions.ts +++ b/server/helpers/middlewares/video-captions.ts | |||
@@ -7,9 +7,10 @@ async function doesVideoCaptionExist (video: MVideoId, language: string, res: Re | |||
7 | const videoCaption = await VideoCaptionModel.loadByVideoIdAndLanguage(video.id, language) | 7 | const videoCaption = await VideoCaptionModel.loadByVideoIdAndLanguage(video.id, language) |
8 | 8 | ||
9 | if (!videoCaption) { | 9 | if (!videoCaption) { |
10 | res.status(HttpStatusCode.NOT_FOUND_404) | 10 | res.fail({ |
11 | .json({ error: 'Video caption not found' }) | 11 | status: HttpStatusCode.NOT_FOUND_404, |
12 | 12 | message: 'Video caption not found' | |
13 | }) | ||
13 | return false | 14 | return false |
14 | } | 15 | } |
15 | 16 | ||
diff --git a/server/helpers/middlewares/video-channels.ts b/server/helpers/middlewares/video-channels.ts index 602555921..f5ed5ef0f 100644 --- a/server/helpers/middlewares/video-channels.ts +++ b/server/helpers/middlewares/video-channels.ts | |||
@@ -31,9 +31,10 @@ export { | |||
31 | 31 | ||
32 | function processVideoChannelExist (videoChannel: MChannelBannerAccountDefault, res: express.Response) { | 32 | function processVideoChannelExist (videoChannel: MChannelBannerAccountDefault, res: express.Response) { |
33 | if (!videoChannel) { | 33 | if (!videoChannel) { |
34 | res.status(HttpStatusCode.NOT_FOUND_404) | 34 | res.fail({ |
35 | .json({ error: 'Video channel not found' }) | 35 | status: HttpStatusCode.NOT_FOUND_404, |
36 | 36 | message: 'Video channel not found' | |
37 | }) | ||
37 | return false | 38 | return false |
38 | } | 39 | } |
39 | 40 | ||
diff --git a/server/helpers/middlewares/video-playlists.ts b/server/helpers/middlewares/video-playlists.ts index d2dd80a35..3faeab677 100644 --- a/server/helpers/middlewares/video-playlists.ts +++ b/server/helpers/middlewares/video-playlists.ts | |||
@@ -28,10 +28,10 @@ export { | |||
28 | 28 | ||
29 | function handleVideoPlaylist (videoPlaylist: MVideoPlaylist, res: express.Response) { | 29 | function handleVideoPlaylist (videoPlaylist: MVideoPlaylist, res: express.Response) { |
30 | if (!videoPlaylist) { | 30 | if (!videoPlaylist) { |
31 | res.status(HttpStatusCode.NOT_FOUND_404) | 31 | res.fail({ |
32 | .json({ error: 'Video playlist not found' }) | 32 | status: HttpStatusCode.NOT_FOUND_404, |
33 | .end() | 33 | message: 'Video playlist not found' |
34 | 34 | }) | |
35 | return false | 35 | return false |
36 | } | 36 | } |
37 | 37 | ||
diff --git a/server/helpers/middlewares/videos.ts b/server/helpers/middlewares/videos.ts index 403cae092..52b934eb7 100644 --- a/server/helpers/middlewares/videos.ts +++ b/server/helpers/middlewares/videos.ts | |||
@@ -21,10 +21,10 @@ async function doesVideoExist (id: number | string, res: Response, fetchType: Vi | |||
21 | const video = await fetchVideo(id, fetchType, userId) | 21 | const video = await fetchVideo(id, fetchType, userId) |
22 | 22 | ||
23 | if (video === null) { | 23 | if (video === null) { |
24 | res.status(HttpStatusCode.NOT_FOUND_404) | 24 | res.fail({ |
25 | .json({ error: 'Video not found' }) | 25 | status: HttpStatusCode.NOT_FOUND_404, |
26 | .end() | 26 | message: 'Video not found' |
27 | 27 | }) | |
28 | return false | 28 | return false |
29 | } | 29 | } |
30 | 30 | ||
@@ -55,10 +55,10 @@ async function doesVideoExist (id: number | string, res: Response, fetchType: Vi | |||
55 | 55 | ||
56 | async function doesVideoFileOfVideoExist (id: number, videoIdOrUUID: number | string, res: Response) { | 56 | async function doesVideoFileOfVideoExist (id: number, videoIdOrUUID: number | string, res: Response) { |
57 | if (!await VideoFileModel.doesVideoExistForVideoFile(id, videoIdOrUUID)) { | 57 | if (!await VideoFileModel.doesVideoExistForVideoFile(id, videoIdOrUUID)) { |
58 | res.status(HttpStatusCode.NOT_FOUND_404) | 58 | res.fail({ |
59 | .json({ error: 'VideoFile matching Video not found' }) | 59 | status: HttpStatusCode.NOT_FOUND_404, |
60 | .end() | 60 | message: 'VideoFile matching Video not found' |
61 | 61 | }) | |
62 | return false | 62 | return false |
63 | } | 63 | } |
64 | 64 | ||
@@ -69,9 +69,7 @@ async function doesVideoChannelOfAccountExist (channelId: number, user: MUserAcc | |||
69 | const videoChannel = await VideoChannelModel.loadAndPopulateAccount(channelId) | 69 | const videoChannel = await VideoChannelModel.loadAndPopulateAccount(channelId) |
70 | 70 | ||
71 | if (videoChannel === null) { | 71 | if (videoChannel === null) { |
72 | res.status(HttpStatusCode.BAD_REQUEST_400) | 72 | res.fail({ message: 'Unknown video "video channel" for this instance.' }) |
73 | .json({ error: 'Unknown video "video channel" for this instance.' }) | ||
74 | |||
75 | return false | 73 | return false |
76 | } | 74 | } |
77 | 75 | ||
@@ -82,9 +80,9 @@ async function doesVideoChannelOfAccountExist (channelId: number, user: MUserAcc | |||
82 | } | 80 | } |
83 | 81 | ||
84 | if (videoChannel.Account.id !== user.Account.id) { | 82 | if (videoChannel.Account.id !== user.Account.id) { |
85 | res.status(HttpStatusCode.BAD_REQUEST_400) | 83 | res.fail({ |
86 | .json({ error: 'Unknown video "video channel" for this account.' }) | 84 | message: 'Unknown video "video channel" for this account.' |
87 | 85 | }) | |
88 | return false | 86 | return false |
89 | } | 87 | } |
90 | 88 | ||
@@ -95,9 +93,10 @@ async function doesVideoChannelOfAccountExist (channelId: number, user: MUserAcc | |||
95 | function checkUserCanManageVideo (user: MUser, video: MVideoAccountLight, right: UserRight, res: Response, onlyOwned = true) { | 93 | function checkUserCanManageVideo (user: MUser, video: MVideoAccountLight, right: UserRight, res: Response, onlyOwned = true) { |
96 | // Retrieve the user who did the request | 94 | // Retrieve the user who did the request |
97 | if (onlyOwned && video.isOwned() === false) { | 95 | if (onlyOwned && video.isOwned() === false) { |
98 | res.status(HttpStatusCode.FORBIDDEN_403) | 96 | res.fail({ |
99 | .json({ error: 'Cannot manage a video of another server.' }) | 97 | status: HttpStatusCode.FORBIDDEN_403, |
100 | .end() | 98 | message: 'Cannot manage a video of another server.' |
99 | }) | ||
101 | return false | 100 | return false |
102 | } | 101 | } |
103 | 102 | ||
@@ -106,9 +105,10 @@ function checkUserCanManageVideo (user: MUser, video: MVideoAccountLight, right: | |||
106 | // Or if s/he is the video's account | 105 | // Or if s/he is the video's account |
107 | const account = video.VideoChannel.Account | 106 | const account = video.VideoChannel.Account |
108 | if (user.hasRight(right) === false && account.userId !== user.id) { | 107 | if (user.hasRight(right) === false && account.userId !== user.id) { |
109 | res.status(HttpStatusCode.FORBIDDEN_403) | 108 | res.fail({ |
110 | .json({ error: 'Cannot manage a video of another user.' }) | 109 | status: HttpStatusCode.FORBIDDEN_403, |
111 | .end() | 110 | message: 'Cannot manage a video of another user.' |
111 | }) | ||
112 | return false | 112 | return false |
113 | } | 113 | } |
114 | 114 | ||