Skip to content

Commit 4548404

Browse files
committed
feat: implement centralized route dispatcher for API request handling
1 parent 2bc5c25 commit 4548404

3 files changed

Lines changed: 81 additions & 75 deletions

File tree

api/[...route].js

Lines changed: 2 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,3 @@
1-
import bugReportHandler from './_lib/routes/bug-report.js'
2-
import feedbackIssueHandler from './_lib/routes/feedback-issue.js'
3-
import issueCommentHandler from './_lib/routes/issue-comment.js'
4-
import issueDetailHandler from './_lib/routes/issue-detail.js'
5-
import issueDraftHandler from './_lib/routes/issue-draft.js'
6-
import issueRedirectHandler from './_lib/routes/issue-redirect.js'
7-
import issueUpdatesHandler from './_lib/routes/issue-updates.js'
8-
import latestJsonHandler from './_lib/routes/latest-json.js'
9-
import libraryLinkHandler from './_lib/routes/library-link.js'
10-
import libraryLinksDataHandler from './_lib/routes/library-links-data.js'
11-
import liveryPatternsDataHandler from './_lib/routes/livery-patterns-data.js'
12-
import outputCleanupItemSubmissionHandler from './_lib/routes/output-cleanup-item-submission.js'
13-
import outputCleanupItemsDataHandler from './_lib/routes/output-cleanup-items-data.js'
14-
import releaseRedirectHandler from './_lib/routes/release-redirect.js'
15-
import updateReleaseHandler from './_lib/routes/update-release.js'
1+
import routeDispatcher from './_lib/route-dispatcher.js'
162

17-
const handlers = {
18-
'bug-report': bugReportHandler,
19-
'feedback-issue': feedbackIssueHandler,
20-
'issue-comment': issueCommentHandler,
21-
'issue-detail': issueDetailHandler,
22-
'issue-draft': issueDraftHandler,
23-
'issue-redirect': issueRedirectHandler,
24-
'issue-updates': issueUpdatesHandler,
25-
'latest-json': latestJsonHandler,
26-
'library-link': libraryLinkHandler,
27-
'library-links-data': libraryLinksDataHandler,
28-
'livery-patterns-data': liveryPatternsDataHandler,
29-
'output-cleanup-item-submission': outputCleanupItemSubmissionHandler,
30-
'output-cleanup-items-data': outputCleanupItemsDataHandler,
31-
'release-redirect': releaseRedirectHandler,
32-
'update-release': updateReleaseHandler,
33-
}
34-
35-
function getRouteSegments(req) {
36-
if (typeof req.url === 'string' && req.url.length > 0) {
37-
const pathname = new URL(req.url, 'https://x-fast-manager.vercel.app').pathname
38-
const segments = pathname.split('/').filter(Boolean)
39-
40-
if (segments[0] === 'api') {
41-
return segments.slice(1)
42-
}
43-
44-
return segments
45-
}
46-
47-
const route = req.query?.route
48-
49-
if (Array.isArray(route)) {
50-
return route
51-
}
52-
53-
if (typeof route === 'string' && route.length > 0) {
54-
return [route]
55-
}
56-
57-
return []
58-
}
59-
60-
export default async function handler(req, res) {
61-
const segments = getRouteSegments(req)
62-
if (segments.length !== 1) {
63-
return res.status(404).json({ error: 'Not found' })
64-
}
65-
66-
const target = handlers[segments[0]]
67-
if (!target) {
68-
return res.status(404).json({ error: 'Not found' })
69-
}
70-
71-
if (req.query && Object.prototype.hasOwnProperty.call(req.query, 'route')) {
72-
delete req.query.route
73-
}
74-
75-
return target(req, res)
76-
}
3+
export default routeDispatcher

api/_lib/route-dispatcher.js

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import bugReportHandler from './routes/bug-report.js'
2+
import feedbackIssueHandler from './routes/feedback-issue.js'
3+
import issueCommentHandler from './routes/issue-comment.js'
4+
import issueDetailHandler from './routes/issue-detail.js'
5+
import issueDraftHandler from './routes/issue-draft.js'
6+
import issueRedirectHandler from './routes/issue-redirect.js'
7+
import issueUpdatesHandler from './routes/issue-updates.js'
8+
import latestJsonHandler from './routes/latest-json.js'
9+
import libraryLinkHandler from './routes/library-link.js'
10+
import libraryLinksDataHandler from './routes/library-links-data.js'
11+
import liveryPatternsDataHandler from './routes/livery-patterns-data.js'
12+
import outputCleanupItemSubmissionHandler from './routes/output-cleanup-item-submission.js'
13+
import outputCleanupItemsDataHandler from './routes/output-cleanup-items-data.js'
14+
import releaseRedirectHandler from './routes/release-redirect.js'
15+
import updateReleaseHandler from './routes/update-release.js'
16+
17+
const handlers = {
18+
'bug-report': bugReportHandler,
19+
'feedback-issue': feedbackIssueHandler,
20+
'issue-comment': issueCommentHandler,
21+
'issue-detail': issueDetailHandler,
22+
'issue-draft': issueDraftHandler,
23+
'issue-redirect': issueRedirectHandler,
24+
'issue-updates': issueUpdatesHandler,
25+
'latest-json': latestJsonHandler,
26+
'library-link': libraryLinkHandler,
27+
'library-links-data': libraryLinksDataHandler,
28+
'livery-patterns-data': liveryPatternsDataHandler,
29+
'output-cleanup-item-submission': outputCleanupItemSubmissionHandler,
30+
'output-cleanup-items-data': outputCleanupItemsDataHandler,
31+
'release-redirect': releaseRedirectHandler,
32+
'update-release': updateReleaseHandler,
33+
}
34+
35+
function getRouteSegments(req) {
36+
if (typeof req.url === 'string' && req.url.length > 0) {
37+
const pathname = new URL(req.url, 'https://x-fast-manager.vercel.app').pathname
38+
const segments = pathname.split('/').filter(Boolean)
39+
40+
if (segments[0] === 'api') {
41+
return segments.slice(1)
42+
}
43+
44+
return segments
45+
}
46+
47+
const route = req.query?.route
48+
49+
if (Array.isArray(route)) {
50+
return route
51+
}
52+
53+
if (typeof route === 'string' && route.length > 0) {
54+
return [route]
55+
}
56+
57+
return []
58+
}
59+
60+
export default async function routeDispatcher(req, res) {
61+
const segments = getRouteSegments(req)
62+
if (segments.length !== 1) {
63+
return res.status(404).json({ error: 'Not found' })
64+
}
65+
66+
const target = handlers[segments[0]]
67+
if (!target) {
68+
return res.status(404).json({ error: 'Not found' })
69+
}
70+
71+
if (req.query && Object.prototype.hasOwnProperty.call(req.query, 'route')) {
72+
delete req.query.route
73+
}
74+
75+
return target(req, res)
76+
}

api/api/[...route].js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import routeDispatcher from '../_lib/route-dispatcher.js'
2+
3+
export default routeDispatcher

0 commit comments

Comments
 (0)