- Backend: ?force=true on /proxy bypasses cache for fresh link fetch - Frontend: parse `se` param for live expiry countdown on download links - Frontend: show Refresh button when link expires in <6h, force-fetches fresh URL - Frontend: CliCommand component replaces Aria2Tip — wget/curl/aria2 tabs, persists selection in localStorage - Frontend: RecentlyViewed component — localStorage, shows active countdown or expired state - Frontend: FileSize shown alongside arch if returned by Microsoft CDN Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
42 lines
1.3 KiB
Markdown
42 lines
1.3 KiB
Markdown
# Issue Drafts
|
|
|
|
## Inactive products still trigger backend requests
|
|
|
|
### Summary
|
|
|
|
The new `active: false` catalog state is not fully enforced on the product detail page.
|
|
|
|
Inactive products still pass validation and trigger `/skuinfo` requests before the UI shows the discontinued-product panel.
|
|
|
|
### Affected file
|
|
|
|
- `frontend/src/pages/ProductDetailPage.tsx`
|
|
|
|
### Current behavior
|
|
|
|
For a catalog entry with `active: false`:
|
|
|
|
- the page loads the product from `products.json`
|
|
- `setIsValidated(true)` still runs
|
|
- the follow-up effect calls `/skuinfo?product_id=...`
|
|
- the backend and Microsoft endpoints are still hit
|
|
- only afterward does the page render the `Product Discontinued` state
|
|
|
|
### Expected behavior
|
|
|
|
Inactive products should fail fast on the frontend and should not trigger backend or Microsoft API requests.
|
|
|
|
### Risk
|
|
|
|
The inactive-product flow still consumes backend capacity and external request budget even though the user cannot download that release.
|
|
|
|
### Suggested fix
|
|
|
|
- gate validation on `product.active !== false`
|
|
- avoid setting `isValidated` for inactive products
|
|
- ensure the `/skuinfo` effect only runs for active products
|
|
|
|
### Prevention
|
|
|
|
- add a test covering an inactive catalog entry and assert that no backend request is made
|
|
- model the route state explicitly so `active`, `not_found`, and `error` paths cannot fall through into fetch logic
|