Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Load the entities list using the view context #37685

Merged
merged 1 commit into from
Jan 17, 2022
Merged

Conversation

youknowriad
Copy link
Contributor

See #37489

Some users have access to "view" entities but not to "edit" theme. These users should be able to use the "core-data" package to fetch these entities. This is not possible sometimes in trunk because the way we "discover" entities is by making an "edit" context request to the /types endpoint.

I think it makes more sense to use the "view" context to discover entities instead. That said, right now we rely on the "singular" label that is not returned in the "view" context. We have a number of options:

  • Accept that we use the "plural" one in some parts of the UI (not ideal)
  • Add the singular label (we already have the "name", we could add a "singlularName") or the entirely "labels" property to the returned value of the "view" context. Not sure if the REST team discussed this.

In this current PR, I'm trying the first approach to check the results.

@youknowriad youknowriad added [Package] Core data /packages/core-data [Type] Bug An existing feature does not function as intended labels Jan 3, 2022
@github-actions
Copy link

github-actions bot commented Jan 3, 2022

Size Change: -8 B (0%)

Total Size: 1.13 MB

Filename Size Change
build/core-data/index.min.js 13.2 kB -8 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 960 B
build/admin-manifest/index.min.js 1.1 kB
build/annotations/index.min.js 2.75 kB
build/api-fetch/index.min.js 2.21 kB
build/autop/index.min.js 2.12 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.28 kB
build/block-directory/style-rtl.css 1.01 kB
build/block-directory/style.css 1.01 kB
build/block-editor/default-editor-styles-rtl.css 378 B
build/block-editor/default-editor-styles.css 378 B
build/block-editor/index.min.js 140 kB
build/block-editor/style-rtl.css 14.6 kB
build/block-editor/style.css 14.6 kB
build/block-library/blocks/archives/editor-rtl.css 61 B
build/block-library/blocks/archives/editor.css 60 B
build/block-library/blocks/archives/style-rtl.css 65 B
build/block-library/blocks/archives/style.css 65 B
build/block-library/blocks/audio/editor-rtl.css 58 B
build/block-library/blocks/audio/editor.css 58 B
build/block-library/blocks/audio/style-rtl.css 111 B
build/block-library/blocks/audio/style.css 111 B
build/block-library/blocks/audio/theme-rtl.css 125 B
build/block-library/blocks/audio/theme.css 125 B
build/block-library/blocks/block/editor-rtl.css 161 B
build/block-library/blocks/block/editor.css 161 B
build/block-library/blocks/button/editor-rtl.css 470 B
build/block-library/blocks/button/editor.css 470 B
build/block-library/blocks/button/style-rtl.css 560 B
build/block-library/blocks/button/style.css 560 B
build/block-library/blocks/buttons/editor-rtl.css 292 B
build/block-library/blocks/buttons/editor.css 292 B
build/block-library/blocks/buttons/style-rtl.css 275 B
build/block-library/blocks/buttons/style.css 275 B
build/block-library/blocks/calendar/style-rtl.css 207 B
build/block-library/blocks/calendar/style.css 207 B
build/block-library/blocks/categories/editor-rtl.css 84 B
build/block-library/blocks/categories/editor.css 83 B
build/block-library/blocks/categories/style-rtl.css 79 B
build/block-library/blocks/categories/style.css 79 B
build/block-library/blocks/code/style-rtl.css 90 B
build/block-library/blocks/code/style.css 90 B
build/block-library/blocks/code/theme-rtl.css 134 B
build/block-library/blocks/code/theme.css 134 B
build/block-library/blocks/columns/editor-rtl.css 210 B
build/block-library/blocks/columns/editor.css 208 B
build/block-library/blocks/columns/style-rtl.css 502 B
build/block-library/blocks/columns/style.css 501 B
build/block-library/blocks/comment-template/style-rtl.css 127 B
build/block-library/blocks/comment-template/style.css 127 B
build/block-library/blocks/comments-pagination-numbers/editor-rtl.css 123 B
build/block-library/blocks/comments-pagination-numbers/editor.css 121 B
build/block-library/blocks/comments-pagination/editor-rtl.css 222 B
build/block-library/blocks/comments-pagination/editor.css 209 B
build/block-library/blocks/comments-pagination/style-rtl.css 235 B
build/block-library/blocks/comments-pagination/style.css 231 B
build/block-library/blocks/cover/editor-rtl.css 546 B
build/block-library/blocks/cover/editor.css 547 B
build/block-library/blocks/cover/style-rtl.css 1.22 kB
build/block-library/blocks/cover/style.css 1.22 kB
build/block-library/blocks/embed/editor-rtl.css 293 B
build/block-library/blocks/embed/editor.css 293 B
build/block-library/blocks/embed/style-rtl.css 417 B
build/block-library/blocks/embed/style.css 417 B
build/block-library/blocks/embed/theme-rtl.css 124 B
build/block-library/blocks/embed/theme.css 124 B
build/block-library/blocks/file/editor-rtl.css 300 B
build/block-library/blocks/file/editor.css 300 B
build/block-library/blocks/file/style-rtl.css 255 B
build/block-library/blocks/file/style.css 255 B
build/block-library/blocks/file/view.min.js 322 B
build/block-library/blocks/freeform/editor-rtl.css 2.44 kB
build/block-library/blocks/freeform/editor.css 2.44 kB
build/block-library/blocks/gallery/editor-rtl.css 966 B
build/block-library/blocks/gallery/editor.css 970 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.6 kB
build/block-library/blocks/gallery/theme-rtl.css 122 B
build/block-library/blocks/gallery/theme.css 122 B
build/block-library/blocks/group/editor-rtl.css 159 B
build/block-library/blocks/group/editor.css 159 B
build/block-library/blocks/group/style-rtl.css 57 B
build/block-library/blocks/group/style.css 57 B
build/block-library/blocks/group/theme-rtl.css 78 B
build/block-library/blocks/group/theme.css 78 B
build/block-library/blocks/heading/style-rtl.css 114 B
build/block-library/blocks/heading/style.css 114 B
build/block-library/blocks/html/editor-rtl.css 332 B
build/block-library/blocks/html/editor.css 333 B
build/block-library/blocks/image/editor-rtl.css 810 B
build/block-library/blocks/image/editor.css 809 B
build/block-library/blocks/image/style-rtl.css 507 B
build/block-library/blocks/image/style.css 511 B
build/block-library/blocks/image/theme-rtl.css 124 B
build/block-library/blocks/image/theme.css 124 B
build/block-library/blocks/latest-comments/style-rtl.css 284 B
build/block-library/blocks/latest-comments/style.css 284 B
build/block-library/blocks/latest-posts/editor-rtl.css 137 B
build/block-library/blocks/latest-posts/editor.css 137 B
build/block-library/blocks/latest-posts/style-rtl.css 528 B
build/block-library/blocks/latest-posts/style.css 527 B
build/block-library/blocks/list/style-rtl.css 94 B
build/block-library/blocks/list/style.css 94 B
build/block-library/blocks/media-text/editor-rtl.css 266 B
build/block-library/blocks/media-text/editor.css 263 B
build/block-library/blocks/media-text/style-rtl.css 493 B
build/block-library/blocks/media-text/style.css 490 B
build/block-library/blocks/more/editor-rtl.css 431 B
build/block-library/blocks/more/editor.css 431 B
build/block-library/blocks/navigation-link/editor-rtl.css 649 B
build/block-library/blocks/navigation-link/editor.css 650 B
build/block-library/blocks/navigation-link/style-rtl.css 94 B
build/block-library/blocks/navigation-link/style.css 94 B
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B
build/block-library/blocks/navigation-submenu/editor.css 299 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.93 kB
build/block-library/blocks/navigation/editor.css 1.94 kB
build/block-library/blocks/navigation/style-rtl.css 1.8 kB
build/block-library/blocks/navigation/style.css 1.79 kB
build/block-library/blocks/navigation/view.min.js 2.82 kB
build/block-library/blocks/nextpage/editor-rtl.css 395 B
build/block-library/blocks/nextpage/editor.css 395 B
build/block-library/blocks/page-list/editor-rtl.css 377 B
build/block-library/blocks/page-list/editor.css 377 B
build/block-library/blocks/page-list/style-rtl.css 172 B
build/block-library/blocks/page-list/style.css 172 B
build/block-library/blocks/paragraph/editor-rtl.css 157 B
build/block-library/blocks/paragraph/editor.css 157 B
build/block-library/blocks/paragraph/style-rtl.css 273 B
build/block-library/blocks/paragraph/style.css 273 B
build/block-library/blocks/post-author/style-rtl.css 175 B
build/block-library/blocks/post-author/style.css 176 B
build/block-library/blocks/post-comments-form/style-rtl.css 446 B
build/block-library/blocks/post-comments-form/style.css 446 B
build/block-library/blocks/post-comments/style-rtl.css 509 B
build/block-library/blocks/post-comments/style.css 509 B
build/block-library/blocks/post-excerpt/editor-rtl.css 73 B
build/block-library/blocks/post-excerpt/editor.css 73 B
build/block-library/blocks/post-excerpt/style-rtl.css 69 B
build/block-library/blocks/post-excerpt/style.css 69 B
build/block-library/blocks/post-featured-image/editor-rtl.css 721 B
build/block-library/blocks/post-featured-image/editor.css 721 B
build/block-library/blocks/post-featured-image/style-rtl.css 153 B
build/block-library/blocks/post-featured-image/style.css 153 B
build/block-library/blocks/post-template/editor-rtl.css 99 B
build/block-library/blocks/post-template/editor.css 98 B
build/block-library/blocks/post-template/style-rtl.css 391 B
build/block-library/blocks/post-template/style.css 392 B
build/block-library/blocks/post-terms/style-rtl.css 73 B
build/block-library/blocks/post-terms/style.css 73 B
build/block-library/blocks/post-title/style-rtl.css 80 B
build/block-library/blocks/post-title/style.css 80 B
build/block-library/blocks/preformatted/style-rtl.css 103 B
build/block-library/blocks/preformatted/style.css 103 B
build/block-library/blocks/pullquote/editor-rtl.css 198 B
build/block-library/blocks/pullquote/editor.css 198 B
build/block-library/blocks/pullquote/style-rtl.css 389 B
build/block-library/blocks/pullquote/style.css 388 B
build/block-library/blocks/pullquote/theme-rtl.css 167 B
build/block-library/blocks/pullquote/theme.css 167 B
build/block-library/blocks/query-pagination-numbers/editor-rtl.css 122 B
build/block-library/blocks/query-pagination-numbers/editor.css 121 B
build/block-library/blocks/query-pagination/editor-rtl.css 221 B
build/block-library/blocks/query-pagination/editor.css 211 B
build/block-library/blocks/query-pagination/style-rtl.css 234 B
build/block-library/blocks/query-pagination/style.css 231 B
build/block-library/blocks/query/editor-rtl.css 131 B
build/block-library/blocks/query/editor.css 132 B
build/block-library/blocks/quote/style-rtl.css 187 B
build/block-library/blocks/quote/style.css 187 B
build/block-library/blocks/quote/theme-rtl.css 223 B
build/block-library/blocks/quote/theme.css 226 B
build/block-library/blocks/rss/editor-rtl.css 202 B
build/block-library/blocks/rss/editor.css 204 B
build/block-library/blocks/rss/style-rtl.css 289 B
build/block-library/blocks/rss/style.css 288 B
build/block-library/blocks/search/editor-rtl.css 165 B
build/block-library/blocks/search/editor.css 165 B
build/block-library/blocks/search/style-rtl.css 397 B
build/block-library/blocks/search/style.css 398 B
build/block-library/blocks/search/theme-rtl.css 64 B
build/block-library/blocks/search/theme.css 64 B
build/block-library/blocks/separator/editor-rtl.css 99 B
build/block-library/blocks/separator/editor.css 99 B
build/block-library/blocks/separator/style-rtl.css 245 B
build/block-library/blocks/separator/style.css 245 B
build/block-library/blocks/separator/theme-rtl.css 172 B
build/block-library/blocks/separator/theme.css 172 B
build/block-library/blocks/shortcode/editor-rtl.css 474 B
build/block-library/blocks/shortcode/editor.css 474 B
build/block-library/blocks/site-logo/editor-rtl.css 744 B
build/block-library/blocks/site-logo/editor.css 744 B
build/block-library/blocks/site-logo/style-rtl.css 181 B
build/block-library/blocks/site-logo/style.css 181 B
build/block-library/blocks/site-tagline/editor-rtl.css 86 B
build/block-library/blocks/site-tagline/editor.css 86 B
build/block-library/blocks/site-title/editor-rtl.css 84 B
build/block-library/blocks/site-title/editor.css 84 B
build/block-library/blocks/social-link/editor-rtl.css 177 B
build/block-library/blocks/social-link/editor.css 177 B
build/block-library/blocks/social-links/editor-rtl.css 670 B
build/block-library/blocks/social-links/editor.css 669 B
build/block-library/blocks/social-links/style-rtl.css 1.32 kB
build/block-library/blocks/social-links/style.css 1.32 kB
build/block-library/blocks/spacer/editor-rtl.css 332 B
build/block-library/blocks/spacer/editor.css 332 B
build/block-library/blocks/spacer/style-rtl.css 48 B
build/block-library/blocks/spacer/style.css 48 B
build/block-library/blocks/table/editor-rtl.css 471 B
build/block-library/blocks/table/editor.css 472 B
build/block-library/blocks/table/style-rtl.css 481 B
build/block-library/blocks/table/style.css 481 B
build/block-library/blocks/table/theme-rtl.css 188 B
build/block-library/blocks/table/theme.css 188 B
build/block-library/blocks/tag-cloud/style-rtl.css 146 B
build/block-library/blocks/tag-cloud/style.css 146 B
build/block-library/blocks/template-part/editor-rtl.css 560 B
build/block-library/blocks/template-part/editor.css 559 B
build/block-library/blocks/template-part/theme-rtl.css 101 B
build/block-library/blocks/template-part/theme.css 101 B
build/block-library/blocks/text-columns/editor-rtl.css 95 B
build/block-library/blocks/text-columns/editor.css 95 B
build/block-library/blocks/text-columns/style-rtl.css 166 B
build/block-library/blocks/text-columns/style.css 166 B
build/block-library/blocks/verse/style-rtl.css 87 B
build/block-library/blocks/verse/style.css 87 B
build/block-library/blocks/video/editor-rtl.css 571 B
build/block-library/blocks/video/editor.css 572 B
build/block-library/blocks/video/style-rtl.css 173 B
build/block-library/blocks/video/style.css 173 B
build/block-library/blocks/video/theme-rtl.css 124 B
build/block-library/blocks/video/theme.css 124 B
build/block-library/common-rtl.css 910 B
build/block-library/common.css 908 B
build/block-library/editor-rtl.css 10.1 kB
build/block-library/editor.css 10.1 kB
build/block-library/index.min.js 165 kB
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 B
build/block-library/style-rtl.css 10.8 kB
build/block-library/style.css 10.9 kB
build/block-library/theme-rtl.css 675 B
build/block-library/theme.css 679 B
build/block-serialization-default-parser/index.min.js 1.09 kB
build/block-serialization-spec-parser/index.min.js 2.79 kB
build/blocks/index.min.js 46.3 kB
build/components/index.min.js 215 kB
build/components/style-rtl.css 15.5 kB
build/components/style.css 15.5 kB
build/compose/index.min.js 11.2 kB
build/customize-widgets/index.min.js 11.4 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 631 B
build/data/index.min.js 7.49 kB
build/date/index.min.js 31.9 kB
build/deprecated/index.min.js 485 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.5 kB
build/edit-navigation/index.min.js 16 kB
build/edit-navigation/style-rtl.css 3.76 kB
build/edit-navigation/style.css 3.76 kB
build/edit-post/classic-rtl.css 492 B
build/edit-post/classic.css 494 B
build/edit-post/index.min.js 29.5 kB
build/edit-post/style-rtl.css 7.16 kB
build/edit-post/style.css 7.16 kB
build/edit-site/index.min.js 36.2 kB
build/edit-site/style-rtl.css 6.63 kB
build/edit-site/style.css 6.62 kB
build/edit-widgets/index.min.js 16.5 kB
build/edit-widgets/style-rtl.css 4.17 kB
build/edit-widgets/style.css 4.18 kB
build/editor/index.min.js 37.9 kB
build/editor/style-rtl.css 3.75 kB
build/editor/style.css 3.74 kB
build/element/index.min.js 3.29 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 6.58 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.63 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.71 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.8 kB
build/keycodes/index.min.js 1.39 kB
build/list-reusable-blocks/index.min.js 1.72 kB
build/list-reusable-blocks/style-rtl.css 838 B
build/list-reusable-blocks/style.css 838 B
build/media-utils/index.min.js 2.92 kB
build/notices/index.min.js 925 B
build/nux/index.min.js 2.08 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.84 kB
build/primitives/index.min.js 924 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/react-refresh-entry/index.min.js 8.44 kB
build/react-refresh-runtime/index.min.js 7.31 kB
build/redux-routine/index.min.js 2.65 kB
build/reusable-blocks/index.min.js 2.22 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 11 kB
build/server-side-render/index.min.js 1.57 kB
build/shortcode/index.min.js 1.49 kB
build/token-list/index.min.js 639 B
build/url/index.min.js 1.9 kB
build/viewport/index.min.js 1.05 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.15 kB
build/widgets/style-rtl.css 1.16 kB
build/widgets/style.css 1.16 kB
build/wordcount/index.min.js 1.04 kB

compressed-size-action

@youknowriad youknowriad added the Core REST API Task Task for Core REST API efforts label Jan 3, 2022
@youknowriad
Copy link
Contributor Author

If I'm not wrong, the label change (plural instead of singular) mostly impacts the multi-entity save panel where it's going to show things like "Posts" instead of "Post" as title. I think it's probably a fine tradeoff for an important fix.

If this proves to be something folks are not ok with, we can consider finding a way to access singular labels for users without "edit" context rights.

WDYT?

@youknowriad youknowriad marked this pull request as ready for review January 3, 2022 09:33
@youknowriad youknowriad added the Backport to WP 6.6 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Jan 3, 2022
@mcsf
Copy link
Contributor

mcsf commented Jan 4, 2022

If I'm not wrong, the label change (plural instead of singular) mostly impacts the multi-entity save panel where it's going to show things like "Posts" instead of "Post" as title. I think it's probably a fine tradeoff for an important fix.

Also: the name of the tab in the block sidebar (SettingsHeader) and the breadcrumbs.

The proposal makes sense to me, view seems like a more appropriate context. If the only caveat is the type labels, we should look at those. I found it surprising that they aren't part of the view context — I wonder if there is a real implication there, or if it was just a matter of YAGNI.

@youknowriad
Copy link
Contributor Author

@adamziel @getdave would love a check on this one when you have time. Thank you.

@getdave
Copy link
Contributor

getdave commented Jan 10, 2022

Yeh sorry got distracted last week. Let me take a look!

Copy link
Contributor

@getdave getdave left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In general I couldn't see any major UI bugs resulting from this change. However, I'm sure when I surfaced the issue (and when we chatted) there were other knock on effects for lower permission users such as allowing you to attempt edit requests to entities you cannot edit. Going to dig a little deeper.

The UI continued also continued to function for lower permission users.

Context

I flagged this issue to Riad because I noticed that (on trunk) getEntityRecord will not allow for reading CPTs even if the user has permission to view.

This is because the Types API endpoint only returns those posts with edit permission if you provide the context=edit.

As a result this line of getEntityRecord will short circuit any request by lower permission users to read any post that is not returned by the Types endpoint (even if you pass the context=view in your call to getEntityRecord):

const entities = await dispatch( getKindEntities( kind ) );
const entity = find( entities, { kind, name } );
if ( ! entity || entity?.__experimentalNoFetch ) {
return;
}

Note that the following line makes a request to the Types endpoint with the context set to edit.

const entities = await dispatch( getKindEntities( kind ) );

This PR changes that so that we make the same request but using the view context. Therefore we get all readable Types back which allows us to read Post Types using getEntityRecord.

Singular vs Plural Lables

@mcsf mentioned the labels in the multi-entity panel are now plural rather than singular. To me that doesn't seem so bad.

However, it could be good to amend the <EntityTypeList> component to use the singular / plural version of the Post label depending on the length of the results. That would however, require amending the Types API as suggested in my review comments. The wp_template already does this manually

const entityLabel =
name === 'wp_template_part'
? _n( 'Template Part', 'Template Parts', list.length )
: entity.label;

label: postType.labels.singular_name,
label: postType.name,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change is going to be difficult to test and the results could be unexpected (although likely relatively minor).

Ideally we would modify the Types API endpoint to provide access to the singular label as that will avoid this change cause knock on effects to UI labels (some of which may be handled in 3rd party plugins).

@spacedmonkey
Copy link
Member

In my testing, I was getting a auth error see screenshot.
Screenshot 2022-01-10 at 11 12 36

Steps to replicate.

  1. Login as a contributor.
  2. Create a post
  3. Add a navigation block.

The reason you are getting the auth error here, is the context of edit is being passed to endpoint where the user do not have access to the edit the entities. I noted all of this here.

This line needs to change

baseURLParams: { context: 'edit' },

Based on if the user do / does not have access edit the entity or not.

Solutions.

  1. Do one request /wp/v2/types?context=edit and another to /wp/v2/types?context=view. If the post type / taxonomy appears in edit response, set the default context to edit or fallback to view.
  2. Add a new field of default_context to the REST API for post type / taxonomy and read these values in here.
  3. Do a options request on every post type / taxonomy to see if user has edit capaibility

I recommend option 2.

Willing to work on the PHP if required.

@youknowriad
Copy link
Contributor Author

A new API to solve that particular navigation issue is not necessary, we can already pass "context: view" in specific getEntityRecords calls. The main issue we had before is that it was not possible because the "navigation" entity was not there at all (which the current PR solves)

@Mamaduka
Copy link
Member

I found it surprising that they aren't part of the view context — I wonder if there is a real implication there, or if it was just a matter of YAGNI.

I'm also curious about this.

@spacedmonkey, do you happen to know why labels are limited to edit context?

@spacedmonkey
Copy link
Member

A new API to solve that particular navigation issue is not necessary,

What new api are you talking about here? I don't see reference to a new api anywhere in this thread.

@spacedmonkey, do you happen to know why labels are limited to edit context?

This data isn't public as it is only shown in the admin. But don't see the harm in showing in the view context.

@spacedmonkey spacedmonkey mentioned this pull request Jan 10, 2022
8 tasks
@spacedmonkey
Copy link
Member

@youknowriad Hey, I have created a breakout PR, with improved handling of context, if user does not have permission to access the post type or taxonomy. #37838

@youknowriad
Copy link
Contributor Author

What new api are you talking about here? I don't see reference to a new api anywhere in this thread.

I'm talking about adding a "defaultContext" information. We don't really need it. We can just pass the context to the getEntityRecords call that is causing the auth error. @getdave should be able to tell us which one is that.

@getdave
Copy link
Contributor

getdave commented Jan 11, 2022

To summarize:

  • Jonny says we're making API calls using the incorrect context based on what the user has permission to do.
  • This is due to the fact that we end up with getEntityRecord calls defaulting to using the edit context.
  • Moreover many contributors are probably not clear on what the context field does (I feel a Make Post coming on...). so they never alter it
  • Riad says we have an API available now to allow us to pass the correct context to getEntityRecords. This is correct but is only part of the problem as more often that not we don't know which context the user has permission on which post type.
  • Jonny explains that we need to have a default context per post type which should be determined dynamically based on the response form the Types endpoint. This would ensure we default all API calls to the correct context based on the user's permissions.

I think Jonny is on to something here. Riad is correct that we can manually pass a view context but we should automatically default to the correct context based on user permissions. This data should come from the Types endpoint rather than being hard coded.

If a developer wants to override that on a case by case basis then that's still fine, but in general the data API should pick the correct defaults.

We can just pass the context to the getEntityRecords call that is causing the auth error. @getdave should be able to tell us which one is that.

I believe it would be this one

@youknowriad
Copy link
Contributor Author

"defaultContext" is very weird for me. What is the default context for any entity if not "view"? why does it need to be a property.

I disagree with the fact that we don't know the context we want on the component level, we know that we want to show a list of pages and not edit them, so that should be "view" context, we know that we want to edit a page, that should be "edit" context...

getMenus( ...menusParameters ),

so changing this to context: 'view' to that menuParameters should solve this issue. (in addition to the current PR)

@getdave
Copy link
Contributor

getdave commented Jan 11, 2022

I disagree with the fact that we don't know the context we want on the component level

What I think you're saying is that as a developer we should know what type of request is being made - are we looking to read or write the data.

Currently we default to edit but if we defaulted all entities to view then that would ensure that developers are forced to set the context correctly based on what they are trying to achieve.

As a result, we wouldn't need to include the default context because we can simply default to the lowest permission (i.e. view) and that will be ok.

so changing this to context: 'view' to that menuParameters should solve this issue. (in addition to the current PR)

Happy to spin that one up.

@youknowriad
Copy link
Contributor Author

Currently we default to edit but if we defaulted all entities to view then that would ensure that developers are forced to set the context correctly based on what they are trying to achieve.

yes, the problem here is that the data package has been built originally for the post editor (editing posts) so we defaulted to edit and now we're stuck with this forever (backward compatibility)

@getdave
Copy link
Contributor

getdave commented Jan 11, 2022

and now we're stuck with this forever (backward compatibility)

...oh. So you're saying that in fact we cannot default to view.

Could we introduce some new APIs such as getViewableEntityRecords and getEditableEntityRecords which set the context parameter accordingly and then proxy to the main getEntityRecords?

@spacedmonkey
Copy link
Member

spacedmonkey commented Jan 11, 2022

Sadly we can't just default to using view for all calls. For a couple of reason.

  1. Fields like title.raw and content.raw will not be returned response.
  2. This is breaking change.
  3. There maybe other fields that developers are expecting in context=edit based responses.

Not having title.raw or content.raw would break things down stream, as this at the fields that are needed to used to editor. Without these fields, you can not edit the raw values. Title and content returned rendered version, which is useless in editing context.

I'm talking about adding a "defaultContext" information.

To be clear, this is not a new api, this is just a new field in two existing apis. See #37838. I too don't love adding a new field, but it is being done for backwards compatibility reasons. This way, all the entities that currect are listed with context=edit, remain the same and entities that user can only view, are added to this list with the context of view. This fixes the issue without breaking / changing very much. Please take the time to test my PR and understand why I have requested this change.

@youknowriad
Copy link
Contributor Author

Could we introduce some new APIs such as getViewableEntityRecords and getEditableEntityRecords which set the context parameter accordingly and then proxy to the main getEntityRecords?

I think the current workaround (pass "context": "view") when we only need "view" fields and we want access for contributors is good enough IMO

@spacedmonkey
Copy link
Member

What about ?

Fields like title.raw and content.raw will not be returned response.

@youknowriad
Copy link
Contributor Author

youknowriad commented Jan 11, 2022

Fields like title.raw and content.raw will not be returned response.

The root API doesn't change getEntityRecords, if you call it without arguments, it will still default to edit to return all fields but for the navigation block where we only want to "read" menus we pass the extra context argument to switch to "view" context explicitly (which was supposed to work already btw if not the entity discovery relying on edit context and solved here)

@spacedmonkey
Copy link
Member

@youknowriad If that is the case, then why am I seeing this error

Screenshot 2022-01-10 at 11 12 36

@youknowriad
Copy link
Contributor Author

@spacedmonkey I didn't touch the navigation blocks getEntityRecords call yet here, I'm just fixing the framework issue that was preventing us from making that change. I don't know that block enough to make the change myself. I'd prefer to leave this for folks already familiar with it like @getdave or @adamziel

@getdave
Copy link
Contributor

getdave commented Jan 11, 2022

I'll spin up a PR I've spun up a PR so we can talk about a specific example of this change in the context of the Nav block and fetching Menus.

It's difficult (at least for me) to discuss this in abstract so perhaps that will help.

I will get to that shortly spinning off this PR as a base.

Copy link
Contributor

@getdave getdave left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My instinct is that this is ok to merge but we should follow up on the Types endpoint to provide full access to labels.

@noisysocks
Copy link
Member

Hi! 👋 Friendly nudge that today (Monday) is the last day for this PR to be merged if it is to ship in WP 5.9. I'll begin backporting merged PRs on Tuesday morning Australian Eastern time.

@youknowriad youknowriad removed the Backport to WP 6.6 Beta/RC Pull request that needs to be backported to the WordPress major release that's currently in beta label Jan 17, 2022
@youknowriad
Copy link
Contributor Author

I'm not entirely sure this needs backporting, I'll leave it to you all (Navigation block experts) but I feel like if we can wait it's better (due to the labels change).

@youknowriad youknowriad merged commit 1e0a3cf into trunk Jan 17, 2022
@youknowriad youknowriad deleted the update/entities-fetch branch January 17, 2022 08:31
@github-actions github-actions bot added this to the Gutenberg 12.5 milestone Jan 17, 2022
@getdave
Copy link
Contributor

getdave commented Jan 17, 2022

I'll leave it to you all (Navigation block experts)

Let me check this out now - I'll report back with a view shortly.

@getdave
Copy link
Contributor

getdave commented Jan 17, 2022

I don't think we should backport this PR. For two reasons.

Firstly, the problem it's intended to unblock is currently a non-starter because we now no longer allow lower permission users to create menus from classic Menus via the Navigation block. This is because that requires the ability to create wp_navigation posts which is something lower permissions users (intentionally) don't have the capability to do. There is #37884 but that now just avoids a 403 error in the console rather than anything in the UI change.

Secondly, this is a potentially major change and we're in RC. We should probably avoid unless it's critical - as Im sure you all agree.

So let's leave it out of WP 5.9.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Core REST API Task Task for Core REST API efforts [Package] Core data /packages/core-data [Type] Bug An existing feature does not function as intended
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

6 participants