Skip to content

Commit 9c8be5c

Browse files
authored
perf(next): avoid re-calculating permissions in some server functions, pass missing args (#15428)
Requires #15427 to be merged first. This PR avoids re-calculating permissions in certain server functions, since through #15427, they are now available in server functions due to an `initReq` that we already ran. It also passes some missing properties to `serverProps` and render handles that are now available.
1 parent dec0ea7 commit 9c8be5c

10 files changed

Lines changed: 47 additions & 74 deletions

File tree

‎packages/next/src/views/Document/handleServerFunction.tsx‎

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,23 @@ import type { RenderDocumentServerFunction } from '@payloadcms/ui'
22
importtype{DocumentPreferences,VisibleEntities}from'payload'
33

44
import{getClientConfig}from'@payloadcms/ui/utilities/getClientConfig'
5-
import{headersasgetHeaders}from'next/headers.js'
6-
import{canAccessAdmin,getAccessResults,isEntityHidden,parseCookies}from'payload'
5+
import{canAccessAdmin,isEntityHidden}from'payload'
76
import{applyLocaleFiltering}from'payload/shared'
87

98
import{renderDocument}from'./index.js'
109

1110
exportconstrenderDocumentHandler: RenderDocumentServerFunction=async(args)=>{
1211
const{
1312
collectionSlug,
13+
cookies,
1414
disableActions,
1515
docID,
1616
drawerSlug,
1717
initialData,
1818
locale,
1919
overrideEntityVisibility,
2020
paramsOverride,
21+
permissions,
2122
redirectAfterCreate,
2223
redirectAfterDelete,
2324
redirectAfterDuplicate,
@@ -32,10 +33,6 @@ export const renderDocumentHandler: RenderDocumentServerFunction = async (args)
3233
versions,
3334
}=args
3435

35-
constheaders=awaitgetHeaders()
36-
37-
constcookies=parseCookies(headers)
38-
3936
awaitcanAccessAdmin({ req })
4037

4138
constclientConfig=getClientConfig({
@@ -88,10 +85,6 @@ export const renderDocumentHandler: RenderDocumentServerFunction = async (args)
8885
.filter(Boolean),
8986
}
9087

91-
constpermissions=awaitgetAccessResults({
92-
req,
93-
})
94-
9588
const{ data, Document }=awaitrenderDocument({
9689
clientConfig,
9790
disableActions,
@@ -112,11 +105,13 @@ export const renderDocumentHandler: RenderDocumentServerFunction = async (args)
112105
translations: undefined,// TODO
113106
visibleEntities,
114107
},
108+
locale,
115109
overrideEntityVisibility,
116110
params: paramsOverride??{
117111
segments: ['collections',collectionSlug,String(docID)],
118112
},
119113
payload,
114+
permissions,
120115
redirectAfterCreate,
121116
redirectAfterDelete,
122117
redirectAfterDuplicate,

‎packages/next/src/views/Document/index.tsx‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,6 @@ export const renderDocument = async ({
9595
config,
9696
config: {
9797
routes: {admin: adminRoute,api: apiRoute},
98-
serverURL,
9998
},
10099
},
101100
user,
@@ -357,7 +356,8 @@ export const renderDocument = async ({
357356
collectionConfig,
358357
globalConfig,
359358
hasSavePermission,
360-
permissions: docPermissions,
359+
locale,
360+
permissions,
361361
req,
362362
})
363363

‎packages/next/src/views/Document/renderDocumentSlots.tsx‎

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@ import type {
22
BeforeDocumentControlsServerPropsOnly,
33
DocumentSlots,
44
EditMenuItemsServerPropsOnly,
5+
Locale,
56
PayloadRequest,
67
PreviewButtonServerPropsOnly,
78
PublishButtonServerPropsOnly,
89
SanitizedCollectionConfig,
9-
SanitizedDocumentPermissions,
1010
SanitizedGlobalConfig,
11+
SanitizedPermissions,
1112
SaveButtonServerPropsOnly,
1213
SaveDraftButtonServerPropsOnly,
1314
ServerFunction,
@@ -29,10 +30,11 @@ export const renderDocumentSlots: (args: {
2930
globalConfig?: SanitizedGlobalConfig
3031
hasSavePermission: boolean
3132
id?: number|string
32-
permissions: SanitizedDocumentPermissions
33+
locale: Locale
34+
permissions: SanitizedPermissions
3335
req: PayloadRequest
3436
})=>DocumentSlots=(args)=>{
35-
const{ id, collectionConfig, globalConfig, hasSavePermission, req }=args
37+
const{ id, collectionConfig, globalConfig, hasSavePermission,locale, permissions,req }=args
3638

3739
constcomponents: DocumentSlots={}asDocumentSlots
3840

@@ -43,7 +45,9 @@ export const renderDocumentSlots: (args: {
4345
constserverProps: ServerProps={
4446
id,
4547
i18n: req.i18n,
48+
locale,
4649
payload: req.payload,
50+
permissions,
4751
user: req.user,
4852
// TODO: Add remaining serverProps
4953
}
@@ -212,15 +216,16 @@ export const renderDocumentSlotsHandler: ServerFunction<{
212216
collectionSlug: string
213217
id?: number|string
214218
}>=async(args)=>{
215-
const{ id, collectionSlug, req }=args
219+
const{ id, collectionSlug,locale, permissions,req }=args
216220

217221
constcollectionConfig=req.payload.collections[collectionSlug]?.config
218222

219223
if(!collectionConfig){
220224
thrownewError(req.t('error:incorrectCollection'))
221225
}
222226

223-
const{ docPermissions, hasSavePermission }=awaitgetDocumentPermissions({
227+
const{ hasSavePermission }=awaitgetDocumentPermissions({
228+
id,
224229
collectionConfig,
225230
data: {},
226231
req,
@@ -230,7 +235,8 @@ export const renderDocumentSlotsHandler: ServerFunction<{
230235
id,
231236
collectionConfig,
232237
hasSavePermission,
233-
permissions: docPermissions,
238+
locale,
239+
permissions,
234240
req,
235241
})
236242
}

‎packages/next/src/views/List/handleServerFunction.tsx‎

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,7 @@ import type { RenderListServerFnArgs, RenderListServerFnReturnType } from '@payl
22
importtype{CollectionPreferences,ServerFunction,VisibleEntities}from'payload'
33

44
import{getClientConfig}from'@payloadcms/ui/utilities/getClientConfig'
5-
import{headersasgetHeaders}from'next/headers.js'
6-
import{
7-
canAccessAdmin,
8-
getAccessResults,
9-
isEntityHidden,
10-
parseCookies,
11-
UnauthorizedError,
12-
}from'payload'
5+
import{canAccessAdmin,isEntityHidden,UnauthorizedError}from'payload'
136
import{applyLocaleFiltering}from'payload/shared'
147

158
import{renderListView}from'./index.js'
@@ -20,13 +13,16 @@ export const renderListHandler: ServerFunction<
2013
>=async(args)=>{
2114
const{
2215
collectionSlug,
16+
cookies,
2317
disableActions,
2418
disableBulkDelete,
2519
disableBulkEdit,
2620
disableQueryPresets,
2721
drawerSlug,
2822
enableRowSelections,
23+
locale,
2924
overrideEntityVisibility,
25+
permissions,
3026
query,
3127
redirectAfterDelete,
3228
redirectAfterDuplicate,
@@ -43,10 +39,6 @@ export const renderListHandler: ServerFunction<
4339
thrownewUnauthorizedError()
4440
}
4541

46-
constheaders=awaitgetHeaders()
47-
48-
constcookies=parseCookies(headers)
49-
5042
awaitcanAccessAdmin({ req })
5143

5244
constclientConfig=getClientConfig({
@@ -95,10 +87,6 @@ export const renderListHandler: ServerFunction<
9587
.filter(Boolean),
9688
}
9789

98-
constpermissions=awaitgetAccessResults({
99-
req,
100-
})
101-
10290
const{ List }=awaitrenderListView({
10391
clientConfig,
10492
disableActions,
@@ -114,16 +102,19 @@ export const renderListHandler: ServerFunction<
114102
cookies,
115103
globalConfig: payload.config.globals.find((global)=>global.slug===collectionSlug),
116104
languageOptions: undefined,// TODO
105+
locale,
117106
permissions,
118107
req,
119108
translations: undefined,// TODO
120109
visibleEntities,
121110
},
111+
locale,
122112
overrideEntityVisibility,
123113
params: {
124114
segments: ['collections',collectionSlug],
125115
},
126116
payload,
117+
permissions,
127118
query,
128119
redirectAfterDelete,
129120
redirectAfterDuplicate,

‎packages/payload/src/admin/functions/index.ts‎

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,6 @@ export type BuildTableStateArgs = {
127127
}
128128
query?: ListQuery
129129
renderRowTypes?: boolean
130-
req: PayloadRequest
131130
tableAppearance?: 'condensed'|'default'
132131
}
133132

‎packages/ui/src/elements/DocumentDrawer/DrawerContent.tsx‎

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import type { DocumentDrawerProps } from './types.js'
88

99
import{LoadingOverlay}from'../../elements/Loading/index.js'
1010
import{useConfig}from'../../providers/Config/index.js'
11-
import{useLocale}from'../../providers/Locale/index.js'
1211
import{useServerFunctions}from'../../providers/ServerFunctions/index.js'
1312
import{useTranslation}from'../../providers/Translation/index.js'
1413
import{abortAndIgnore,handleAbortRef}from'../../utilities/abortAndIgnore.js'
@@ -30,7 +29,6 @@ export const DocumentDrawerContent: React.FC<DocumentDrawerProps> = ({
3029
redirectAfterRestore,
3130
})=>{
3231
const{ getEntityConfig }=useConfig()
33-
constlocale=useLocale()
3432

3533
const[collectionConfig]=useState(()=>getEntityConfig({ collectionSlug }))
3634

@@ -62,7 +60,6 @@ export const DocumentDrawerContent: React.FC<DocumentDrawerProps> = ({
6260
docID,
6361
drawerSlug,
6462
initialData,
65-
locale,
6663
overrideEntityVisibility,
6764
redirectAfterCreate,
6865
redirectAfterDelete: redirectAfterDelete!==undefined ? redirectAfterDelete : false,
@@ -99,7 +96,6 @@ export const DocumentDrawerContent: React.FC<DocumentDrawerProps> = ({
9996
closeModal,
10097
overrideEntityVisibility,
10198
t,
102-
locale,
10399
],
104100
)
105101

‎packages/ui/src/elements/PublishButton/ScheduleDrawer/index.tsx‎

Lines changed: 4 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ export const ScheduleDrawer: React.FC<Props> = ({ slug, defaultType, schedulePub
5959
},
6060
localization,
6161
routes: { api },
62-
serverURL,
6362
},
6463
}=useConfig()
6564
const{ id, collectionSlug, globalSlug }=useDocumentInfo()
@@ -158,18 +157,7 @@ export const ScheduleDrawer: React.FC<Props> = ({ slug, defaultType, schedulePub
158157
}),
159158
)
160159
setUpcoming(docs)
161-
},[
162-
collectionSlug,
163-
globalSlug,
164-
serverURL,
165-
api,
166-
i18n,
167-
dateFormat,
168-
localization,
169-
supportedTimezones,
170-
t,
171-
id,
172-
])
160+
},[collectionSlug,globalSlug,api,i18n,dateFormat,localization,supportedTimezones,t,id])
173161

174162
constdeleteHandler=React.useCallback(
175163
async(id: number|string)=>{
@@ -198,10 +186,10 @@ export const ScheduleDrawer: React.FC<Props> = ({ slug, defaultType, schedulePub
198186

199187
setProcessing(true)
200188

201-
letpublishSpecificLocale: string
189+
letlocaleToPublish: string
202190

203191
if(typeoflocale==='object'&&locale.value!=='all'&&type==='publish'){
204-
publishSpecificLocale=locale.value
192+
localeToPublish=locale.value
205193
}
206194

207195
try{
@@ -215,7 +203,7 @@ export const ScheduleDrawer: React.FC<Props> = ({ slug, defaultType, schedulePub
215203
}
216204
: undefined,
217205
global: globalSlug||undefined,
218-
locale: publishSpecificLocale,
206+
localeToPublish,
219207
timezone,
220208
})
221209

‎packages/ui/src/providers/ServerFunctions/index.tsx‎

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import type {
77
DocumentSlots,
88
FormState,
99
GetFolderResultsComponentAndDataArgs,
10-
Locale,
1110
Params,
1211
RenderDocumentVersionsProperties,
1312
ServerFunction,
@@ -68,7 +67,6 @@ type RenderDocumentBaseArgs = {
6867
drawerSlug?: string
6968
initialData?: Data
7069
initialState?: FormState
71-
locale?: Locale
7270
overrideEntityVisibility?: boolean
7371
paramsOverride?: AdminViewServerPropsOnly['params']
7472
redirectAfterCreate?: boolean
@@ -162,10 +160,10 @@ export const ServerFunctionsProvider: React.FC<{
162160

163161
try{
164162
if(!remoteSignal?.aborted){
165-
constresult=(awaitserverFunction({
163+
constresult=awaitserverFunction({
166164
name: 'schedule-publish',
167165
args: { ...rest},
168-
}))asAwaited<ReturnType<typeofschedulePublishHandler>>// TODO: infer this type when `strictNullChecks` is enabled
166+
})
169167

170168
if(!remoteSignal?.aborted){
171169
returnresult

‎packages/ui/src/utilities/buildTableState.ts‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import type {
1111
Where,
1212
}from'payload'
1313

14-
import{APIError,canAccessAdmin,formatErrors,getAccessResults}from'payload'
14+
import{APIError,canAccessAdmin,formatErrors}from'payload'
1515
import{applyLocaleFiltering,isNumber}from'payload/shared'
1616

1717
import{getClientConfig}from'./getClientConfig.js'
@@ -69,16 +69,18 @@ export const buildTableStateHandler: ServerFunction<
6969
}
7070
}
7171

72-
constbuildTableState=async(
73-
args: BuildTableStateArgs,
74-
): Promise<BuildTableStateSuccessResult>=>{
72+
constbuildTableState: ServerFunction<
73+
BuildTableStateArgs,
74+
Promise<BuildTableStateSuccessResult>
75+
>=async(args)=>{
7576
const{
7677
collectionSlug,
7778
columns: columnsFromArgs,
7879
data: dataFromArgs,
7980
enableRowSelections,
8081
orderableFieldName,
8182
parent,
83+
permissions,
8284
query,
8385
renderRowTypes,
8486
req,
@@ -102,8 +104,6 @@ const buildTableState = async (
102104

103105
awaitapplyLocaleFiltering({ clientConfig, config, req })
104106

105-
constpermissions=awaitgetAccessResults({ req })
106-
107107
letcollectionConfig: SanitizedCollectionConfig
108108
letclientCollectionConfig: ClientCollectionConfig
109109

@@ -221,6 +221,7 @@ const buildTableState = async (
221221
payload,
222222
query,
223223
renderRowTypes,
224+
req,
224225
tableAppearance,
225226
useAsTitle: Array.isArray(collectionSlug)
226227
? payload.collections[collectionSlug[0]]?.config?.admin?.useAsTitle

0 commit comments

Comments
 (0)