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

Fix preloading middleware referencing stale data for OPTIONS requests #35527

Merged

Conversation

anton-vlasenko
Copy link
Contributor

@anton-vlasenko anton-vlasenko commented Oct 11, 2021

Description

The goal of this PR is to fix stale middleware data for OPTIONS type requests.
Please check out that PR first to better understand the purpose of the fix.

Steps to reproduce the bug.

  1. Go to the Gutenberg -> Experiments page and enable the Navigation screen feature.
  2. Save the changes.
  3. Open the Gutenberg -> Navigation page.
  4. Open the console, run the following code:
wp.apiFetch.use(wp.apiFetch.createPreloadingMiddleware(
	{
		"OPTIONS": {
			"/someUrl": {
				'body': 'From middleware',
				'headers': {}
			}
		}
	}));
  1. Run the following code in the console:
wp.apiFetch( {
	path: "/someUrl",
	method: 'OPTIONS',
} ).then( res  => {
	console.log( res );
} );
  1. You should see From middleware string in the console the first time you run this request. This is the response we are getting from the middleware and not the actual REST API response.
  2. Run the code mentioned in step 5 again.

Expected result:

You shouldn't see From middleware string in the console when you execute the request the second time.
That request should be made to the actual REST API endpoint. Middleware should only be used once.

Actual result:

You will see From middleware every time you run the code mentioned in step 5.

Steps to test this PR.

  1. Repeat steps 1-7 from Steps to reproduce this bug.
  2. You should see From middleware string only once (when you run the request for the first time).

Screenshots

Screenshot 2021-10-12 at 12 40 23

Types of changes

Bug fix.

Checklist:

  • My code is tested.
  • My code follows the WordPress code style.
  • My code follows the accessibility standards.
  • I've tested my changes with keyboard and screen readers.
  • My code has proper inline documentation.
  • I've included developer documentation if appropriate.
  • I've updated all React Native files affected by any refactorings/renamings in this PR (please manually search all *.native.js files for terms that need renaming or removal).

@github-actions
Copy link

github-actions bot commented Oct 11, 2021

Size Change: +254 B (0%)

Total Size: 1.07 MB

Filename Size Change
build/api-fetch/index.min.js 2.21 kB +1 B (0%)
build/block-editor/index.min.js 134 kB +29 B (0%)
build/block-library/blocks/navigation-submenu/editor-rtl.css 299 B -1 B (0%)
build/block-library/blocks/navigation/style-rtl.css 1.68 kB +35 B (+2%)
build/block-library/blocks/navigation/style.css 1.67 kB +31 B (+2%)
build/block-library/blocks/quote/theme-rtl.css 223 B +3 B (+1%)
build/block-library/blocks/quote/theme.css 226 B +4 B (+2%)
build/block-library/blocks/site-logo/editor-rtl.css 770 B +1 B (0%)
build/block-library/blocks/site-logo/editor.css 770 B +1 B (0%)
build/block-library/editor-rtl.css 9.65 kB +1 B (0%)
build/block-library/editor.css 9.65 kB +3 B (0%)
build/block-library/index.min.js 148 kB +135 B (0%)
build/block-library/style-rtl.css 10.3 kB +35 B (0%)
build/block-library/style.css 10.3 kB +36 B (0%)
build/block-library/theme-rtl.css 668 B +3 B (0%)
build/block-library/theme.css 673 B +4 B (+1%)
build/components/index.min.js 212 kB -26 B (0%)
build/edit-post/index.min.js 29.4 kB +45 B (0%)
build/edit-post/style-rtl.css 7.12 kB -102 B (-1%)
build/edit-post/style.css 7.12 kB -102 B (-1%)
build/edit-site/index.min.js 30 kB +7 B (0%)
build/editor/index.min.js 37.6 kB +111 B (0%)
ℹ️ View Unchanged
Filename Size
build/a11y/index.min.js 931 B
build/admin-manifest/index.min.js 1.09 kB
build/annotations/index.min.js 2.7 kB
build/autop/index.min.js 2.08 kB
build/blob/index.min.js 459 B
build/block-directory/index.min.js 6.2 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/style-rtl.css 13.9 kB
build/block-editor/style.css 13.9 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 549 B
build/block-library/blocks/button/style.css 549 B
build/block-library/blocks/buttons/editor-rtl.css 309 B
build/block-library/blocks/buttons/editor.css 309 B
build/block-library/blocks/buttons/style-rtl.css 317 B
build/block-library/blocks/buttons/style.css 317 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 131 B
build/block-library/blocks/code/theme.css 131 B
build/block-library/blocks/columns/editor-rtl.css 206 B
build/block-library/blocks/columns/editor.css 205 B
build/block-library/blocks/columns/style-rtl.css 497 B
build/block-library/blocks/columns/style.css 496 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.17 kB
build/block-library/blocks/cover/style.css 1.17 kB
build/block-library/blocks/embed/editor-rtl.css 488 B
build/block-library/blocks/embed/editor.css 488 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 977 B
build/block-library/blocks/gallery/editor.css 982 B
build/block-library/blocks/gallery/style-rtl.css 1.6 kB
build/block-library/blocks/gallery/style.css 1.59 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/home-link/style-rtl.css 247 B
build/block-library/blocks/home-link/style.css 247 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 731 B
build/block-library/blocks/image/editor.css 730 B
build/block-library/blocks/image/style-rtl.css 502 B
build/block-library/blocks/image/style.css 505 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 568 B
build/block-library/blocks/navigation-link/editor.css 570 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.css 299 B
build/block-library/blocks/navigation-submenu/style-rtl.css 195 B
build/block-library/blocks/navigation-submenu/style.css 195 B
build/block-library/blocks/navigation-submenu/view.min.js 343 B
build/block-library/blocks/navigation/editor-rtl.css 1.71 kB
build/block-library/blocks/navigation/editor.css 1.71 kB
build/block-library/blocks/navigation/view.min.js 2.74 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 198 B
build/block-library/blocks/page-list/style.css 198 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 140 B
build/block-library/blocks/post-comments-form/style.css 140 B
build/block-library/blocks/post-comments/style-rtl.css 360 B
build/block-library/blocks/post-comments/style.css 359 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 396 B
build/block-library/blocks/post-featured-image/editor.css 397 B
build/block-library/blocks/post-featured-image/style-rtl.css 156 B
build/block-library/blocks/post-featured-image/style.css 156 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 60 B
build/block-library/blocks/post-title/style.css 60 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 378 B
build/block-library/blocks/pullquote/style.css 378 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 262 B
build/block-library/blocks/query-pagination/editor.css 255 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/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 374 B
build/block-library/blocks/search/style.css 375 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 250 B
build/block-library/blocks/separator/style.css 250 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/style-rtl.css 165 B
build/block-library/blocks/site-logo/style.css 165 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 824 B
build/block-library/blocks/social-links/editor.css 823 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 307 B
build/block-library/blocks/spacer/editor.css 307 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 815 B
build/block-library/common.css 812 B
build/block-library/reset-rtl.css 474 B
build/block-library/reset.css 474 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 kB
build/components/style-rtl.css 15.3 kB
build/components/style.css 15.3 kB
build/compose/index.min.js 10.4 kB
build/core-data/index.min.js 12.4 kB
build/customize-widgets/index.min.js 11.2 kB
build/customize-widgets/style-rtl.css 1.5 kB
build/customize-widgets/style.css 1.49 kB
build/data-controls/index.min.js 614 B
build/data/index.min.js 7.1 kB
build/date/index.min.js 31.5 kB
build/deprecated/index.min.js 428 B
build/dom-ready/index.min.js 304 B
build/dom/index.min.js 4.46 kB
build/edit-navigation/index.min.js 15.4 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-site/style-rtl.css 5.56 kB
build/edit-site/style.css 5.56 kB
build/edit-widgets/index.min.js 15.8 kB
build/edit-widgets/style-rtl.css 4.12 kB
build/edit-widgets/style.css 4.13 kB
build/editor/style-rtl.css 3.78 kB
build/editor/style.css 3.77 kB
build/element/index.min.js 3.21 kB
build/escape-html/index.min.js 517 B
build/format-library/index.min.js 5.93 kB
build/format-library/style-rtl.css 571 B
build/format-library/style.css 571 B
build/hooks/index.min.js 1.55 kB
build/html-entities/index.min.js 424 B
build/i18n/index.min.js 3.6 kB
build/is-shallow-equal/index.min.js 501 B
build/keyboard-shortcuts/index.min.js 1.72 kB
build/keycodes/index.min.js 1.3 kB
build/list-reusable-blocks/index.min.js 1.85 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 845 B
build/nux/index.min.js 2.03 kB
build/nux/style-rtl.css 747 B
build/nux/style.css 743 B
build/plugins/index.min.js 1.83 kB
build/primitives/index.min.js 921 B
build/priority-queue/index.min.js 582 B
build/react-i18n/index.min.js 671 B
build/redux-routine/index.min.js 2.63 kB
build/reusable-blocks/index.min.js 2.19 kB
build/reusable-blocks/style-rtl.css 256 B
build/reusable-blocks/style.css 256 B
build/rich-text/index.min.js 10.6 kB
build/server-side-render/index.min.js 1.52 kB
build/shortcode/index.min.js 1.48 kB
build/token-list/index.min.js 562 B
build/url/index.min.js 1.74 kB
build/viewport/index.min.js 1.02 kB
build/warning/index.min.js 248 B
build/widgets/index.min.js 7.11 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

@anton-vlasenko anton-vlasenko added the [Type] Bug An existing feature does not function as intended label Oct 12, 2021
@gziolo gziolo added the REST API Interaction Related to REST API label Oct 12, 2021
@anton-vlasenko anton-vlasenko changed the title [WIP] Fix preloading middleware referencing stale data Fix preloading middleware referencing stale data Oct 12, 2021
@anton-vlasenko anton-vlasenko added this to the Gutenberg 11.8 milestone Oct 12, 2021
@anton-vlasenko anton-vlasenko changed the title Fix preloading middleware referencing stale data Fix preloading middleware referencing stale data for OPTIONS requests Oct 12, 2021
);
const cacheData = cache[ method ][ path ];

// Unsetting the cache key ensures that the data is only preloaded a single time
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
// Unsetting the cache key ensures that the data is only preloaded a single time
// Unsetting the cache key ensures that the preloaded data is only used a single time

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Good catch!
Fixed in 8f41aaa
This text is not mine (I copied it from the code above), but I could have checked it.

Copy link
Contributor

@adamziel adamziel left a comment

Choose a reason for hiding this comment

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

I was worried it would trigger additional OPTIONS requests during the initial load in cases when the editor calls apiFetch multiple times, but it didn't happen. The number of requests during loading is the same with and without this PR for all the editors I checked (site, post, navigation, widgets). LGTM 👍

@anton-vlasenko
Copy link
Contributor Author

anton-vlasenko commented Oct 12, 2021

I was worried it would trigger additional OPTIONS requests during the initial load in cases when the editor calls apiFetch multiple times, but it didn't happen. The number of requests during loading is the same with and without this PR for all the editors I checked (site, post, navigation, widgets). LGTM 👍

Thank you for checking site, post, navigation and widgets editors.
I would assume we still want to use preloaded data a single time (to avoid stale data) even if it affects the quantity of the requests? Or do we?

@anton-vlasenko anton-vlasenko added the [Package] API fetch /packages/api-fetch label Oct 12, 2021
@gziolo
Copy link
Member

gziolo commented Oct 13, 2021

What if the same API call is requested several times on the initial page load?

I see this PR mirrors the behavior with how GET requests are handled.

It probably would make more sense to disable the preloading middleware completely after the page is completely rendered. The current approach won't help with stale data issues when the request wasn't called during the initial page load.

@adamziel
Copy link
Contributor

adamziel commented Oct 13, 2021

What if the same API call is requested several times on the initial page load?

That was my concern too, but it doesn't seem to be happening.

It probably would make more sense to disable the preloading middleware completely after the page is completely rendered. The current approach won't help with stale data issues when the request wasn't called during the initial page load.

+1

@anton-vlasenko
Copy link
Contributor Author

anton-vlasenko commented Oct 13, 2021

I don't mind if we disable the preloading middleware when the page is loaded (in the scope of another PR of course).
But how do we detect when the page is completely rendered?

What if the same API call is requested several times on the initial page load?

If the same API call is issued several times on the initial page load, we probably need to refactor a code that makes a duplicate request. There must be very good reasons to request the same chunk of information twice.

@anton-vlasenko anton-vlasenko force-pushed the fix/clear-cache-when-preloading-options-requests branch from 8f41aaa to ee11c3d Compare October 15, 2021 15:58
Copy link
Member

@kevin940726 kevin940726 left a comment

Choose a reason for hiding this comment

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

Makes sense to me 👍. Should we add some unit tests for this though?

@anton-vlasenko
Copy link
Contributor Author

@kevin940726 Thank you for the review.

Makes sense to me 👍. Should we add some unit tests for this though?

I've implemented a unit test (just FYI). I'm going to merge this PR then.

@anton-vlasenko
Copy link
Contributor Author

We need to add this PR to the Gutenberg 11.8 release notes.
It's IMPORTANT.

@anton-vlasenko anton-vlasenko merged commit 9799046 into trunk Oct 19, 2021
@anton-vlasenko anton-vlasenko deleted the fix/clear-cache-when-preloading-options-requests branch October 19, 2021 15:28
@adamziel
Copy link
Contributor

We need to add this PR to the Gutenberg 11.8 release notes. It's IMPORTANT.

cc @priethor

@priethor
Copy link
Contributor

Hi @anton-vlasenko ! Given the not-too-technical orientation of the Gutenberg release posts, could you help draft a short explanation for the release post that helps put this change in context given the previous PR and convey its importance? 🙏

@anton-vlasenko
Copy link
Contributor Author

anton-vlasenko commented Oct 27, 2021

@priethor
I'm not sure what the best way to explain it is. Maybe this will do:

Fixed preloading on the Navigation Editor page; now cache gets deleted after the first cache hit for OPTIONS requests (currently, it works the same way for GET requests).

A few notes from me: It's important because we change how preloading works. It's very unlikely, but it could affect some 3rd party plugins. This is just a bug fix.
Please let me know if this explanation works.

@Mamaduka
Copy link
Member

I was worried it would trigger additional OPTIONS requests during the initial load...

I just came across this case when working on different PR.

If Editor root calls canUser( 'create', 'pages' ) and then you try to call canUser( 'read', 'pages' ) or canUser( 'update', 'pages' ) somewhere down the tree they will make additional API requests.

It was a bit unexpected since I know OPTIONS for this resource are preloaded.

While I understand the reasoning behind the #25550, how likely is it that prefetched OPTIONS values become stale during the sessions?

@adamziel
Copy link
Contributor

While I understand the reasoning behind the #25550, how likely is it that prefetched OPTIONS values become stale during the sessions?

@Mamaduka It will happen sometimes for sure but I wouldn't expect it to happen often. It would be great to have a consistent way of handling all such cases.

@Mamaduka
Copy link
Member

Thanks, @adamziel.

Currently, I can think of two options for avoiding extra API calls when checking different action permissions for the same resource.

  1. Revert this change and rely on the fact that prefetched OPTIONS values state the same during the session.
  2. Try to resolve all the allowed actions for the resource when the first selector runs. Something like Resolve per-entity resolvers after receiving a list of records #26575.

Cc @swissspidy, @spacedmonkey.

@swissspidy
Copy link
Member

I don't think I am the right person to chime in here. Reverting this change sounds like the wrong choice though

@spacedmonkey
Copy link
Member

@adamziel

If I understand you correctly, calls options and calls to type definitions should always be caches right? As options / performation checks, so not changed in a session, this seems reasonable. Also types, like post types and taxonomines are very unlikely to change and also seem to reason to cache. I could get behind that change.

@Mamaduka
Copy link
Member

The issue is more visible with the block that checks multiple permissions for a resource, like the Navigation block. Which uses useResourcePermissions under the hood to check create, update and delete permissions.

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

Successfully merging this pull request may close these issues.

8 participants