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

chore(sentryapp): new SentryAppWebhookRequestsEndpoint control endpoint #81676

Open
wants to merge 13 commits into
base: master
Choose a base branch
from

Conversation

ameliahsu
Copy link
Member

We need a new control endpoint in order to fetch sentry app requests from all regions.

Note:
Since installation requests are stored in control, we also have to fetch requests from the control buffer. We specifically query the region buffers for non-installation event requests to avoid duplicate requests (in case a region shares the same buffer as control).

@ameliahsu ameliahsu requested review from a team as code owners December 4, 2024 18:14
@github-actions github-actions bot added the Scope: Backend Automatically applied to PRs that change backend components label Dec 4, 2024
Copy link

codecov bot commented Dec 4, 2024

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
32305 1 32304 293
View the top 1 failed tests by shortest run time
tests.snuba.tagstore.test_tagstore_backend.TagStorageTest::test_get_top_group_tag_values_generic
Stack Traces | 7.02s run time
#x1B[1m#x1B[.../snuba/tagstore/test_tagstore_backend.py#x1B[0m:367: in test_get_top_group_tag_values_generic
    resp = self.ts.get_top_group_tag_values(
#x1B[1m#x1B[.../tagstore/snuba/backend.py#x1B[0m:607: in get_top_group_tag_values
    tag = self.__get_tag_key_and_top_values(
#x1B[1m#x1B[.../tagstore/snuba/backend.py#x1B[0m:163: in __get_tag_key_and_top_values
    raise TagKeyNotFound if group is None else GroupTagKeyNotFound
#x1B[1m#x1B[31mE   sentry.tagstore.exceptions.GroupTagKeyNotFound#x1B[0m

To view more test analytics, go to the Test Analytics Dashboard
📢 Thoughts on this report? Let us know!

Copy link
Member

@cathteng cathteng left a comment

Choose a reason for hiding this comment

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

i think there is some opportunity to condense code here

publish_status = {
"GET": ApiPublishStatus.UNKNOWN,
}
permission_classes = (SentryAppStatsPermission,)
Copy link
Member

Choose a reason for hiding this comment

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

should this be SentryAppPermission?

Copy link
Contributor

Choose a reason for hiding this comment

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

SentryAppStatsPermission is the one to use for this endpoint, since we only want the integrator org to be able to get the requests/stats.

Copy link
Member

Choose a reason for hiding this comment

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

there seems to only be a GET for this endpoint, so only the GET scopes would apply. the PARANOID_GET scopes from SentryAppPermission applies to anyone with member and above permissions which also seems appropriate

src/sentry/api/urls.py Outdated Show resolved Hide resolved
src/sentry/sentry_apps/api/serializers/request_v2.py Outdated Show resolved Hide resolved
src/sentry/sentry_apps/api/serializers/request_v2.py Outdated Show resolved Hide resolved
@github-actions github-actions bot added the Scope: Frontend Automatically applied to PRs that change frontend components label Dec 6, 2024
Copy link
Contributor

github-actions bot commented Dec 6, 2024

🚨 Warning: This pull request contains Frontend and Backend changes!

It's discouraged to make changes to Sentry's Frontend and Backend in a single pull request. The Frontend and Backend are not atomically deployed. If the changes are interdependent of each other, they must be separated into two pull requests and be made forward or backwards compatible, such that the Backend or Frontend can be safely deployed independently.

Have questions? Please ask in the #discuss-dev-infra channel.

Copy link

codecov bot commented Dec 6, 2024

Bundle Report

Changes will decrease total bundle size by 3.8kB (-0.01%) ⬇️. This is within the configured threshold ✅

Detailed changes
Bundle name Size Change
app-webpack-bundle-array-push 33.42MB -3.8kB (-0.01%) ⬇️

Affected Assets, Files, and Routes:

view changes for bundle: app-webpack-bundle-array-push

Assets Changed:

Asset Name Size Change Total Size Change (%)
chunks/vendors-node_modules_emotion_styled_base_dist_emotion-styled-base_browser_esm_js-node_modules-db80c6.*.js (New) 1.55MB 1.55MB 100.0% 🚀
chunks/app_actionCreators_discoverHomepageQueries_tsx-app_bootstrap_initializeApp_tsx-app_components-ce23d2.*.js -3.28kB 1.24MB -0.26%
chunks/app_components_charts_components_markLine_tsx-app_components_container_flex_tsx-app_component-a69ceb.*.js -44 bytes 1.22MB -0.0%
chunks/vendors-node_modules_emotion_react_jsx-runtime_dist_emotion-react-jsx-runtime_browser_esm_js--106b1c.*.js (New) 962.93kB 962.93kB 100.0% 🚀
chunks/vendors-node_modules_base64-arraybuffer_dist_base64-arraybuffer_es5_js-node_modules_date-fns_-ec6384.*.js (New) 663.27kB 663.27kB 100.0% 🚀
chunks/vendors-node_modules_echarts_lib_component_markPoint_js-node_modules_focus-trap_dist_focus-tr-713ef9.*.js (New) 642.75kB 642.75kB 100.0% 🚀
chunks/app_actionCreators_onboardingTasks_tsx-app_actionCreators_pageFilters_tsx-app_actionCreators_-08e79f.*.js -39 bytes 483.91kB -0.01%
chunks/app_components_breadcrumbs_tsx-app_utils_performance_quickTrace_quickTraceQuery_tsx-app_utils-976178.*.js -496 bytes 380.94kB -0.13%
chunks/vendors-node_modules_lodash_difference_js-node_modules_lodash_identity_js-node_modules_lodash-d2fda8.*.js (New) 307.68kB 307.68kB 100.0% 🚀
chunks/app_views_dashboards_dashboard_tsx-app_views_insights_common_queries_useSpansQuery_tsx-data_i-805c3b.*.js -33 bytes 285.58kB -0.01%
chunks/app_actionCreators_guides_tsx-app_actionCreators_preferences_tsx-app_components_avatar_userAv-b5476e.*.js -655 bytes 263.12kB -0.25%
chunks/app_components_panels_panelHeader_tsx-app_utils_profiling_hooks_useVirtualizedTree_useVirtual-888b54.*.js -350 bytes 156.99kB -0.22%
chunks/app_data_timezones_tsx-app_utils_useUserTeams_tsx-app_views_alerts_builder_builderBreadCrumbs-f50fa4.*.js 13 bytes 116.97kB 0.01%
chunks/app_views_explore_charts_confidenceFooter_tsx-app_views_insights_database_utils_getIntervalFo-e39af7.*.js 1.55kB 111.15kB 1.41%
entrypoints/app.js 113 bytes 99.94kB 0.11%
chunks/app_components_profiling_flamegraph_flamegraphChart_tsx-app_components_profiling_flamegraph_f-767eed.*.js 10 bytes 93.65kB 0.01%
chunks/app_actionCreators_discoverHomepageQueries_tsx-app_components_commitLink_tsx-app_components_e-2d8438.*.js -44 bytes 93.47kB -0.05%
chunks/app_components_alerts_onDemandMetricAlert_tsx-app_views_alerts_utils_index_tsx-app_views_dash-64ce1b.*.js 12 bytes 88.51kB 0.01%
chunks/app_components_metrics_queryFieldGroup_tsx-app_components_modals_metricWidgetViewerModal_quer-3f429f.*.js -343 bytes 66.86kB -0.51%
chunks/app_utils_metrics_useMetricsTags_tsx-app_views_dashboards_metrics_utils_tsx-app_views_metrics-14963d.*.js -590 bytes 64.62kB -0.9%
chunks/app_views_performance_transactionSummary_pageLayout_tsx.*.js 8 bytes 56.07kB 0.01%
chunks/app_components_charts_eventsRequest_tsx-app_components_gridEditable_sortLink_tsx-app_types_al-b47848.*.js -408 bytes 46.36kB -0.87%
chunks/app_components_alerts_onDemandMetricAlert_tsx-app_components_modals_widgetViewerModal_tsx-app-a870a6.*.js 12 bytes 39.03kB 0.03%
chunks/app_components_charts_eventsRequest_tsx-app_components_feedback_widget_us*kWidget_tsx--64a49b.45138a0117b27471228b.js (New) 38.13kB 38.13kB 100.0% 🚀
chunks/app_components_feedback_widget_us*kWidget_tsx-app_views_performance_transactionSummary-51d702.59306c3619df3c4e0004.js (New) 37.66kB 37.66kB 100.0% 🚀
chunks/app_components_feedback_widget_us*kWidget_tsx-app_views_insights_common_components_cha-d2aaf9.51e6d5d190ce1accfc7d.js (New) 31.63kB 31.63kB 100.0% 🚀
chunks/app_utils_discover_discoverQuery_tsx-app_views_performance_transactionSummary_transactionTags-d69236.*.js 12 bytes 31.07kB 0.04%
chunks/vendors-node_modules_moment-timezone_index_js-node_modules_query-string_index_js-node_modules-c3aedd.*.js 589 bytes 29.59kB 2.03%
chunks/app_components_feedback_widget_us*kWidget_tsx-app_views_insights_uptime_views_overview-bd2aa0.31f2fa4459c084b428e6.js (New) 26.74kB 26.74kB 100.0% 🚀
chunks/app_components_feedback_widget_us*kWidget_tsx-app_components_performance_transactionSe-feae7d.9075f1deb5cae4a33396.js (New) 24.5kB 24.5kB 100.0% 🚀
chunks/app_views_settings_projectMetrics_index_tsx.*.js -136 bytes 20.33kB -0.66%
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.528acbba672c102c9234.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.cb2724024357667d8086.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.926fab0239bc0df3cc99.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.9536238373391e4f3099.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.1cf9775369dac26cda95.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.df61ed62d4aaa81c72ac.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.52bb9e597b8e6c367811.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.75ec59da641ba2da85bd.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.0d21ef7568afb497e43e.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.3d406f0960a08ff47184.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.c12d7d039601dcff1eb5.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.1487c808609ad4349cdc.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.d2dda59213c0b26b1a69.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.20dffad85cc8618fe360.js (New) 19.9kB 19.9kB 100.0% 🚀
chunks/app_components_feedback_widget_us*kWidget_tsx-app_utils_discover_discoverQuery_tsx-app-c5fefe.662706b052a26876f623.js (New) 17.35kB 17.35kB 100.0% 🚀
chunks/app_components_events_eventReplay_staticReplayPreview_tsx-app_components_replays_alerts_missi-76dba4.*.js -283 bytes 16.81kB -1.66%
chunks/app_components_feedback_widget_us*kWidget_tsx-app_components_gridEditable_sortLink_tsx-d372f4.facaf2a02f9348c84d6a.js (New) 16.57kB 16.57kB 100.0% 🚀
chunks/app_components_feedback_widget_us*kWidget_tsx-app_components_performance_transactionSe-f61270.050697f402cf7d4e39d9.js (New) 13.69kB 13.69kB 100.0% 🚀
chunks/app_components_forms_fields_textareaField_tsx-app_views_integrationOrganizationLink_index_tsx.*.js 12 bytes 13.23kB 0.09%
chunks/app_components_charts_lineChart_tsx-app_components_feedback_widget_us*kWidget_tsx-app_-26fc43.4164d24bad3f44079749.js (New) 12.56kB 12.56kB 100.0% 🚀
chunks/app_views_insights_browser_resources_components_sampleImages_tsx.*.js -235 bytes 9.49kB -2.42%
chunks/app_components_assigneeBadge_stories_tsx.*.js 10 bytes 5.47kB 0.18%
chunks/app_components_nav_secondary_stories_tsx.*.js -2.61kB 5.03kB -34.13%
chunks/app_views_explore_navigation_tsx.*.js (New) 3.77kB 3.77kB 100.0% 🚀
chunks/app_views_insights_navigation_tsx.*.js (New) 2.72kB 2.72kB 100.0% 🚀
chunks/vendors-node_modules_emotion_styled_base_dist_emotion-styled-base_browser_esm_js-node_modules-f9bb7f.*.js (Deleted) -1.54MB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_emotion_react_jsx-runtime_dist_emotion-react-jsx-runtime_browser_esm_js--b0e097.*.js (Deleted) -963.53kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_base64-arraybuffer_dist_base64-arraybuffer_es5_js-node_modules_date-fns_-2226bb.*.js (Deleted) -668.7kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_echarts_lib_component_markPoint_js-node_modules_focus-trap_dist_focus-tr-5baf34.*.js (Deleted) -639.83kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_lodash_identity_js-node_modules_lodash-84e5f1.*.js (Deleted) -308.75kB 0 bytes -100.0% 🗑️
chunks/app_components_charts_eventsRequest_tsx-app_components_feedback_widget_us*kWidget_tsx--64a49b.09a2733d20a893d417e6.js (Deleted) -38.13kB 0 bytes -100.0% 🗑️
chunks/app_components_feedback_widget_us*kWidget_tsx-app_views_performance_transactionSummary-51d702.eff04c9f9d14ee16c9d3.js (Deleted) -37.66kB 0 bytes -100.0% 🗑️
chunks/app_components_feedback_widget_us*kWidget_tsx-app_views_insights_common_components_cha-d2aaf9.762c39f249de7db8b0aa.js (Deleted) -31.63kB 0 bytes -100.0% 🗑️
chunks/app_components_feedback_widget_us*kWidget_tsx-app_views_insights_uptime_views_overview-bd2aa0.03ea715966c6fb1fb437.js (Deleted) -26.74kB 0 bytes -100.0% 🗑️
chunks/app_components_feedback_widget_us*kWidget_tsx-app_components_performance_transactionSe-feae7d.148ab4ac38488769e037.js (Deleted) -24.5kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.ede6d16b9bfbd7488c80.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.423b70fd579d84a92b0f.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.d0eacab2f9f3538335e3.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.234407573332d97cdd82.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.b4c06a9758b37cf7c2ca.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.1839f0106060e6a4203e.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.ae252fc3bcc1346301da.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.6be3bb09b869d66adfff.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.d515118d2028f68b6edb.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.93f40bec95c9571cf73f.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.0c7cc06f6ff086f253e3.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.ee3631e5aef2a2fa6a35.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.bd3a6e5066fbfac6d94f.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/vendors-node_modules_lodash_difference_js-node_modules_react-virtualized_dist_es_CellMeasurer-*.ce3025b0aa2e99d73d7a.js (Deleted) -19.9kB 0 bytes -100.0% 🗑️
chunks/app_components_feedback_widget_us*kWidget_tsx-app_utils_discover_discoverQuery_tsx-app-c5fefe.077fb43eec927e506fe5.js (Deleted) -17.35kB 0 bytes -100.0% 🗑️
chunks/app_components_feedback_widget_us*kWidget_tsx-app_components_gridEditable_sortLink_tsx-d372f4.3366c08dd8edd050a7d6.js (Deleted) -16.57kB 0 bytes -100.0% 🗑️
chunks/app_components_feedback_widget_us*kWidget_tsx-app_components_performance_transactionSe-f61270.758a72ce64909cd3a9b6.js (Deleted) -13.69kB 0 bytes -100.0% 🗑️
chunks/app_components_charts_lineChart_tsx-app_components_feedback_widget_us*kWidget_tsx-app_-26fc43.d2b295ca982d1d9981a7.js (Deleted) -12.56kB 0 bytes -100.0% 🗑️

Files in chunks/app_actionCreators_onboardingTasks_tsx-app_actionCreators_pageFilters_tsx-app_actionCreators_-08e79f.*.js:

  • ./app/data/controlsiloUrlPatterns.ts → Total Size: 9.22kB

@ameliahsu ameliahsu changed the title chore(sentry app): new SentryAppRequestsEndpointV2 control endpoint chore(sentryapp): new SentryAppWebhookRequestsEndpoint control endpoint Dec 6, 2024
Copy link
Member

@iamrajjoshi iamrajjoshi left a comment

Choose a reason for hiding this comment

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

looks good, good job!

@iamrajjoshi iamrajjoshi requested a review from a team December 18, 2024 17:05
Copy link
Contributor

@Christinarlong Christinarlong left a comment

Choose a reason for hiding this comment

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

UHHH I FORGOT TO CLICK SUBMIT. I did this on monday so it may be out of date

Copy link
Member

@sentaur-athena sentaur-athena left a comment

Choose a reason for hiding this comment

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

I started reviewing but then I realized there are multiple open questions that I also have too. Can you address them and ping the channel again?

@getsantry
Copy link
Contributor

getsantry bot commented Jan 11, 2025

This pull request has gone three weeks without activity. In another week, I will close it.

But! If you comment or otherwise update it, I will reset the clock, and if you add the label WIP, I will leave it alone unless WIP is removed ... forever!


"A weed is but an unloved flower." ― Ella Wheeler Wilcox 🥀

@getsantry getsantry bot added Stale and removed Stale labels Jan 11, 2025
@ameliahsu ameliahsu added the WIP label Jan 15, 2025
Copy link
Contributor

@Christinarlong Christinarlong left a comment

Choose a reason for hiding this comment

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

overall lgtm, just some Qs. I will rerequest

src/sentry/sentry_apps/api/utils/webhook_requests.py Outdated Show resolved Hide resolved
@@ -100,18 +113,26 @@ def _get_all_from_buffer(
else:
return self.client.lrange(buffer_key, 0, BUFFER_SIZE - 1)

def _get_requests(self, event: str | None = None, error: bool = False) -> list[dict[str, Any]]:
def _get_requests(
self, event: str | list[str] | None = None, error: bool = False
Copy link
Contributor

Choose a reason for hiding this comment

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

How hard would it be to make event only be a list of strings so we don't have to the check to see if it's one or multiple ? Also idk if there was a discussion or anything about this already

Copy link
Member Author

@ameliahsu ameliahsu Jan 28, 2025

Choose a reason for hiding this comment

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

mmm I think we can get rid of the str | once we get rid of the old endpoint, I'd rather not modify the old endpoint rn

Copy link
Contributor

Choose a reason for hiding this comment

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

ohh gotchas, rip

tests/sentry/sentry_apps/tasks/test_sentry_apps.py Outdated Show resolved Hide resolved
Comment on lines +87 to +88
filter: SentryAppRequestFilterArgs,
datetime_org_filter: DatetimeOrganizationFilterArgs,
Copy link
Contributor

Choose a reason for hiding this comment

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

Curious Q: why are the datetime and event filters applied in different places ? (it's not a big deal but was just wondering if there was some context behind it ?)

Copy link
Member Author

Choose a reason for hiding this comment

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

event filtering is done within buffer.get_requests inside of get_buffer_requests_for_region, while the datetime and org filtering is done to the results of that call

for req in buffer.get_requests(event=event, errors_only=errors_only)

@Christinarlong Christinarlong requested a review from a team January 28, 2025 23:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Scope: Backend Automatically applied to PRs that change backend components Scope: Frontend Automatically applied to PRs that change frontend components WIP
Projects
None yet
Development

Successfully merging this pull request may close these issues.

6 participants