Skip to content

Commit 686e48d

Browse files
authored
feat: consolidates REST API handling, decouple from next.js (#10466)
This PR improves how we handle REST API. Problems before: * `packages/next/src/routes/rest/*` had a huge amount of code that didn't depend on next.js at all. * `packages/next/src/routes/rest/index.ts` itself was not only huge but also really hard to follow. Every method (`GET`, `POST` etc. was almost full copy of another). * `packages/next/src/utilities` had some utilities like `headersWithCors` or `createPayloadRequest` that again, weren't depend on next.js and potentially can be used outside of next.js. Now: All the logic that's not related to next.js now is inside `packages/payload`, `packages/next/src/routes/rest/index.ts` now is only _40_ lines instead of 900+ Functions like `headersWithCors` are now implemented and exported in `payload`. To keep bc, we re-export them from the same path but marked as `@deprecated`. You can attach Payload REST API to any backend framework that uses Fetch API (like Remix / SolidStart / Bun / Hono) if you don't need the admin panel in your server instance, but you still want to have REST API. The main function [`handleEndpoints` ](https://github.com/payloadcms/payload/pull/10466/files#diff-82e97630068f9fc40256f3f46e06226215ab150d16012281810586b51b0cfd51R28) accepts `Request` and returns `Response`. It's also doable with Express, but you'd have to convert node.js' req/res to fetch.
1 parent ae1542b commit 686e48d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+1309
-1592
lines changed
Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,67 @@
11
// NOTICE: Server-only utilities, do not import anything client-side here.
2-
export { addDataAndFileToRequest } from '../utilities/addDataAndFileToRequest.js'
3-
export { addLocalesToRequestFromData, sanitizeLocales } from '../utilities/addLocalesToRequest.js'
4-
export { createPayloadRequest } from '../utilities/createPayloadRequest.js'
2+
53
export { getNextRequestI18n } from '../utilities/getNextRequestI18n.js'
64
export { getPayloadHMR } from '../utilities/getPayloadHMR.js'
7-
export { headersWithCors } from '../utilities/headersWithCors.js'
8-
export { mergeHeaders } from '../utilities/mergeHeaders.js'
5+
6+
import {
7+
addDataAndFileToRequest as _addDataAndFileToRequest,
8+
addLocalesToRequestFromData as _addLocalesToRequestFromData,
9+
createPayloadRequest as _createPayloadRequest,
10+
headersWithCors as _headersWithCors,
11+
mergeHeaders as _mergeHeaders,
12+
sanitizeLocales as _sanitizeLocales,
13+
} from 'payload'
14+
15+
/**
16+
* Use:
17+
* ```ts
18+
* import { mergeHeaders } from 'payload'
19+
* ```
20+
* @deprecated
21+
*/
22+
export const mergeHeaders = _mergeHeaders
23+
24+
/**
25+
* @deprecated
26+
* Use:
27+
* ```ts
28+
* import { headersWithCors } from 'payload'
29+
* ```
30+
*/
31+
export const headersWithCors = _headersWithCors
32+
33+
/**
34+
* @deprecated
35+
* Use:
36+
* ```ts
37+
* import { createPayloadRequest } from 'payload'
38+
* ```
39+
*/
40+
export const createPayloadRequest = _createPayloadRequest
41+
42+
/**
43+
* @deprecated
44+
* Use:
45+
* ```ts
46+
* import { addDataAndFileToRequest } from 'payload'
47+
* ```
48+
*/
49+
export const addDataAndFileToRequest = _addDataAndFileToRequest
50+
51+
/**
52+
* @deprecated
53+
* Use:
54+
* ```ts
55+
* import { sanitizeLocales } from 'payload'
56+
* ```
57+
*/
58+
export const sanitizeLocales = _sanitizeLocales
59+
60+
/**
61+
* @deprecated
62+
* Use:
63+
* ```ts
64+
* import { addLocalesToRequestFromData } from 'payload'
65+
* ```
66+
*/
67+
export const addLocalesToRequestFromData = _addLocalesToRequestFromData

packages/next/src/layouts/Root/index.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,10 @@ import { rtlLanguages } from '@payloadcms/translations'
55
import { RootProvider } from '@payloadcms/ui'
66
import { getClientConfig } from '@payloadcms/ui/utilities/getClientConfig'
77
import { headers as getHeaders, cookies as nextCookies } from 'next/headers.js'
8-
import { getPayload, parseCookies } from 'payload'
8+
import { getPayload, getRequestLanguage, parseCookies } from 'payload'
99
import React from 'react'
1010

1111
import { getNavPrefs } from '../../elements/Nav/getNavPrefs.js'
12-
import { getRequestLanguage } from '../../utilities/getRequestLanguage.js'
1312
import { getRequestLocale } from '../../utilities/getRequestLocale.js'
1413
import { getRequestTheme } from '../../utilities/getRequestTheme.js'
1514
import { initReq } from '../../utilities/initReq.js'

packages/next/src/routes/graphql/handler.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import type { APIError, Payload, PayloadRequest, SanitizedConfig } from 'payload
44
import { configToSchema } from '@payloadcms/graphql'
55
import { createHandler } from 'graphql-http/lib/use/fetch'
66
import httpStatus from 'http-status'
7-
import { logError } from 'payload'
8-
9-
import { addDataAndFileToRequest } from '../../utilities/addDataAndFileToRequest.js'
10-
import { addLocalesToRequestFromData } from '../../utilities/addLocalesToRequest.js'
11-
import { createPayloadRequest } from '../../utilities/createPayloadRequest.js'
12-
import { headersWithCors } from '../../utilities/headersWithCors.js'
13-
import { mergeHeaders } from '../../utilities/mergeHeaders.js'
7+
import {
8+
addDataAndFileToRequest,
9+
addLocalesToRequestFromData,
10+
createPayloadRequest,
11+
headersWithCors,
12+
logError,
13+
mergeHeaders,
14+
} from 'payload'
1415

1516
const handleError = async ({
1617
err,

packages/next/src/routes/graphql/playground.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
1-
import type { SanitizedConfig } from 'payload'
2-
31
import { renderPlaygroundPage } from 'graphql-playground-html'
4-
5-
import { createPayloadRequest } from '../../utilities/createPayloadRequest.js'
2+
import { createPayloadRequest, type SanitizedConfig } from 'payload'
63

74
export const GET = (config: Promise<SanitizedConfig>) => async (request: Request) => {
85
const req = await createPayloadRequest({

packages/next/src/routes/rest/auth/init.ts

Lines changed: 0 additions & 22 deletions
This file was deleted.

packages/next/src/routes/rest/auth/verifyEmail.ts

Lines changed: 0 additions & 28 deletions
This file was deleted.

packages/next/src/routes/rest/checkEndpoints.ts

Lines changed: 0 additions & 20 deletions
This file was deleted.

packages/next/src/routes/rest/collections/count.ts

Lines changed: 0 additions & 22 deletions
This file was deleted.

packages/next/src/routes/rest/collections/docAccess.ts

Lines changed: 0 additions & 22 deletions
This file was deleted.

packages/next/src/routes/rest/collections/findByID.ts

Lines changed: 0 additions & 49 deletions
This file was deleted.

0 commit comments

Comments
 (0)