feat: add populate property to Local / REST API (#8969)

### What?
Adds `populate` property to Local API and REST API operations that can
be used to specify `select` for a specific collection when it's
populated
```ts
const result = await payload.findByID({
  populate: {
   // type safe if you have generated types
    posts: {
      text: true,
    },
  },
  collection: 'pages',
  depth: 1,
  id: aboutPage.id,
})

result.relatedPost // only has text and id properties
``` 

```ts
fetch('https://localhost:3000/api/pages?populate[posts][text]=true') // highlight-line
  .then((res) => res.json())
  .then((data) => console.log(data))
```

It also overrides
[`defaultPopulate`](https://github.com/payloadcms/payload/pull/8934)

Ensures `defaultPopulate` doesn't affect GraphQL.

### How?
Implements the property for all operations that have the `depth`
argument.
This commit is contained in:
Sasha
2024-11-06 20:50:19 +02:00
committed by GitHub
parent 147d28e62c
commit a22c0e62fa
67 changed files with 487 additions and 47 deletions

View File

@@ -1,4 +1,4 @@
import type { Field, PayloadRequest } from 'payload'
import type { Field, PayloadRequest, PopulateType } from 'payload'
import { fieldAffectsData, fieldHasSubFields, fieldIsArrayType, tabHasName } from 'payload/shared'
@@ -12,6 +12,7 @@ type NestedRichTextFieldsArgs = {
draft: boolean
fields: Field[]
overrideAccess: boolean
populateArg?: PopulateType
populationPromises: Promise<void>[]
req: PayloadRequest
showHiddenFields: boolean
@@ -24,6 +25,7 @@ export const recurseNestedFields = ({
draft,
fields,
overrideAccess = false,
populateArg,
populationPromises,
req,
showHiddenFields,
@@ -48,7 +50,8 @@ export const recurseNestedFields = ({
key: i,
overrideAccess,
req,
select: collection.config.defaultPopulate,
select:
populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate,
showHiddenFields,
}),
)
@@ -70,7 +73,8 @@ export const recurseNestedFields = ({
key: i,
overrideAccess,
req,
select: collection.config.defaultPopulate,
select:
populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate,
showHiddenFields,
}),
)
@@ -96,7 +100,7 @@ export const recurseNestedFields = ({
key: 'value',
overrideAccess,
req,
select: collection.config.defaultPopulate,
select: populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate,
showHiddenFields,
}),
)
@@ -117,7 +121,7 @@ export const recurseNestedFields = ({
key: field.name,
overrideAccess,
req,
select: collection.config.defaultPopulate,
select: populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate,
showHiddenFields,
}),
)
@@ -131,6 +135,7 @@ export const recurseNestedFields = ({
draft,
fields: field.fields,
overrideAccess,
populateArg,
populationPromises,
req,
showHiddenFields,
@@ -143,6 +148,7 @@ export const recurseNestedFields = ({
draft,
fields: field.fields,
overrideAccess,
populateArg,
populationPromises,
req,
showHiddenFields,
@@ -157,6 +163,7 @@ export const recurseNestedFields = ({
draft,
fields: tab.fields,
overrideAccess,
populateArg,
populationPromises,
req,
showHiddenFields,
@@ -174,6 +181,7 @@ export const recurseNestedFields = ({
draft,
fields: block.fields,
overrideAccess,
populateArg,
populationPromises,
req,
showHiddenFields,
@@ -191,6 +199,7 @@ export const recurseNestedFields = ({
draft,
fields: field.fields,
overrideAccess,
populateArg,
populationPromises,
req,
showHiddenFields,

View File

@@ -1,4 +1,10 @@
import type { PayloadRequest, RichTextAdapter, RichTextField } from 'payload'
import type {
CollectionConfig,
PayloadRequest,
PopulateType,
RichTextAdapter,
RichTextField,
} from 'payload'
import type { AdapterArguments } from '../types.js'
@@ -16,6 +22,7 @@ type RecurseRichTextArgs = {
draft: boolean
field: RichTextField<any[], any, any>
overrideAccess: boolean
populateArg?: PopulateType
populationPromises: Promise<void>[]
req: PayloadRequest
showHiddenFields: boolean
@@ -28,6 +35,7 @@ export const recurseRichText = ({
draft,
field,
overrideAccess = false,
populateArg,
populationPromises,
req,
showHiddenFields,
@@ -54,7 +62,10 @@ export const recurseRichText = ({
key: 'value',
overrideAccess,
req,
select: collection.config.defaultPopulate,
select:
req.payloadAPI !== 'GraphQL'
? (populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate)
: undefined,
showHiddenFields,
}),
)
@@ -70,6 +81,7 @@ export const recurseRichText = ({
draft,
fields: field.admin.upload.collections[element.relationTo].fields,
overrideAccess,
populateArg,
populationPromises,
req,
showHiddenFields,
@@ -94,7 +106,10 @@ export const recurseRichText = ({
key: 'value',
overrideAccess,
req,
select: collection.config.defaultPopulate,
select:
req.payloadAPI !== 'GraphQL'
? (populateArg?.[collection.config.slug] ?? collection.config.defaultPopulate)
: undefined,
showHiddenFields,
}),
)
@@ -109,6 +124,7 @@ export const recurseRichText = ({
draft,
fields: field.admin?.link?.fields,
overrideAccess,
populateArg,
populationPromises,
req,
showHiddenFields,
@@ -124,6 +140,7 @@ export const recurseRichText = ({
draft,
field,
overrideAccess,
populateArg,
populationPromises,
req,
showHiddenFields,
@@ -139,6 +156,7 @@ export const richTextRelationshipPromise = ({
draft,
field,
overrideAccess,
populateArg,
populationPromises,
req,
showHiddenFields,
@@ -151,6 +169,7 @@ export const richTextRelationshipPromise = ({
draft,
field,
overrideAccess,
populateArg,
populationPromises,
req,
showHiddenFields,

View File

@@ -159,6 +159,7 @@ export function slateEditor(
findMany,
flattenLocales,
overrideAccess,
populate,
populationPromises,
req,
showHiddenFields,
@@ -182,6 +183,7 @@ export function slateEditor(
findMany,
flattenLocales,
overrideAccess,
populateArg: populate,
populationPromises,
req,
showHiddenFields,