## Description
- Implement Etag caching for consolidated api in view mode.
- Generate Etag for consolidated api in view mode
- compare the if none match header with the computed etag and respond
with either a 304 or 200
- add span for generate etag fn
- Remove prefetching and caching of static assets in service worker
```mermaid
sequenceDiagram
Client->>Server: Request Consolidated API
Server-->>Server: Compute ETag
Server-->>Client: Respond with ETag, Cache-Control
Client->>Server: Subsequent Request with If-None-Match
alt ETag Matches
Server-->>Client: 304 Not Modified
else ETag Different
Server-->>Client: Full Response with New ETag
end
```
## Automation
/ok-to-test tags="@tag.All"
### 🔍 Cypress test results
<!-- This is an auto-generated comment: Cypress test results -->
> [!TIP]
> 🟢 🟢 🟢 All cypress tests have passed! 🎉 🎉 🎉
> Workflow run:
<https://github.com/appsmithorg/appsmith/actions/runs/13046610688>
> Commit: c14d58da8a59b3bbfb10c7e308b518d2cd8e3b7d
> <a
href="https://internal.appsmith.com/app/cypress-dashboard/rundetails-65890b3c81d7400d08fa9ee5?branch=master&workflowId=13046610688&attempt=1"
target="_blank">Cypress dashboard</a>.
> Tags: `@tag.All`
> Spec:
> <hr>Thu, 30 Jan 2025 07:14:21 UTC
<!-- end of auto-generated comment: Cypress test results -->
## Communication
Should the DevRel and Marketing teams inform users about this change?
- [ ] Yes
- [x] No
<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit
- **New Features**
- Added ETag support for consolidated API responses to improve caching
efficiency.
- Introduced a new route handler for the `/api/v1/consolidated-api/view`
endpoint.
- **Performance Improvements**
- Optimized NGINX configuration for API responses.
- Updated tracing endpoint for better monitoring.
- **Dependency Updates**
- Added Jackson datatype support for Java 8 date and time handling.
- **Technical Enhancements**
- Improved request handling in ConsolidatedAPIController.
- Updated service worker configuration.
- Refined feature flag handling in the client.
- Enhanced API request headers for consolidated page load functions.
- Simplified caching and routing logic in the service worker.
- Adjusted service worker caching strategy for production environment.
- Updated test specification path for Cypress limited tests.
- Modified request handling to remove unnecessary headers in feature
flag functions.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
112 lines
3.2 KiB
TypeScript
112 lines
3.2 KiB
TypeScript
import { LICENSE_FEATURE_FLAGS } from "../Constants";
|
|
import { ObjectsRegistry } from "./Registry";
|
|
import produce from "immer";
|
|
|
|
const defaultFlags = {
|
|
rollout_remove_feature_walkthrough_enabled: false, // remove this flag from here when it's removed from code
|
|
release_git_modularisation_enabled: true,
|
|
};
|
|
|
|
export const featureFlagIntercept = (
|
|
flags: Record<string, boolean> = {},
|
|
reload = true,
|
|
) => {
|
|
getConsolidatedDataApi({ ...flags, ...defaultFlags }, false);
|
|
const response = {
|
|
responseMeta: {
|
|
status: 200,
|
|
success: true,
|
|
},
|
|
data: {
|
|
...flags,
|
|
...defaultFlags,
|
|
},
|
|
errorDisplay: "",
|
|
};
|
|
cy.intercept("GET", "/api/v1/users/features", response);
|
|
if (reload) ObjectsRegistry.AggregateHelper.CypressReload();
|
|
};
|
|
|
|
export const getConsolidatedDataApi = (
|
|
flags: Record<string, boolean> = {},
|
|
reload = true,
|
|
) => {
|
|
cy.intercept("GET", "/api/v1/consolidated-api/*?*", (req) => {
|
|
delete req.headers["if-none-match"];
|
|
req.reply((res: any) => {
|
|
if (
|
|
res.statusCode === 200 ||
|
|
res.statusCode === 401 ||
|
|
res.statusCode === 500
|
|
) {
|
|
const originalResponse = res?.body;
|
|
const updatedResponse = produce(originalResponse, (draft: any) => {
|
|
draft.data.featureFlags.data = {
|
|
...flags,
|
|
};
|
|
});
|
|
return res.send(updatedResponse);
|
|
}
|
|
});
|
|
}).as("getConsolidatedData");
|
|
if (reload) ObjectsRegistry.AggregateHelper.CypressReload();
|
|
};
|
|
|
|
export const featureFlagInterceptForLicenseFlags = () => {
|
|
cy.intercept(
|
|
{
|
|
method: "GET",
|
|
url: "/api/v1/users/features",
|
|
},
|
|
(req) => {
|
|
req.reply((res) => {
|
|
if (res) {
|
|
const originalResponse = res.body;
|
|
let modifiedResponse: any = {};
|
|
Object.keys(originalResponse.data).forEach((flag) => {
|
|
if (LICENSE_FEATURE_FLAGS.includes(flag)) {
|
|
modifiedResponse[flag] = originalResponse.data[flag];
|
|
}
|
|
});
|
|
modifiedResponse = {
|
|
...modifiedResponse,
|
|
release_app_sidebar_enabled: true,
|
|
};
|
|
res.send({
|
|
responseMeta: {
|
|
status: 200,
|
|
success: true,
|
|
},
|
|
data: { ...modifiedResponse },
|
|
errorDisplay: "",
|
|
});
|
|
}
|
|
});
|
|
},
|
|
).as("getLicenseFeatures");
|
|
|
|
cy.intercept("GET", "/api/v1/consolidated-api/*?*", (req) => {
|
|
req.reply((res: any) => {
|
|
delete req.headers["if-none-match"];
|
|
if (res.statusCode === 200) {
|
|
const originalResponse = res?.body;
|
|
const updatedResponse = produce(originalResponse, (draft: any) => {
|
|
draft.data.featureFlags.data = {};
|
|
Object.keys(originalResponse.data.featureFlags.data).forEach(
|
|
(flag) => {
|
|
if (LICENSE_FEATURE_FLAGS.includes(flag)) {
|
|
draft.data.featureFlags.data[flag] =
|
|
originalResponse.data.featureFlags.data[flag];
|
|
}
|
|
},
|
|
);
|
|
draft.data.featureFlags.data["release_app_sidebar_enabled"] = true;
|
|
});
|
|
return res.send(updatedResponse);
|
|
}
|
|
});
|
|
}).as("getConsolidatedData");
|
|
|
|
ObjectsRegistry.AggregateHelper.CypressReload();
|
|
};
|