mirror of
https://github.com/Studio-Saelix/sencho.git
synced 2026-08-05 16:37:46 +00:00
0daddfde00
* fix: reconcile sticky update indicators with Anatomy preview Sidebar, Updates filter, and Fleet treated retained partial/failed scanner has_update as confirmed. Keep raw state for retention/notifications, project confirmed-only to APIs, show distinct incomplete indicators, and clear sticky rows only after an authoritative-negative preview. Closes #1685 * test: align sidebar truncate E2E with failed-over-retained precedence Purple update indicators are confirmed-only; hasUpdate with a failed check correctly shows the failed trailing icon. * fix: clear confirmed update rows on authoritative-negative preview Address audit SF-1/SF-2/SF-3: observation-watermark clears for older ok+has_update rows (DB + memory gens), Fleet checkability parity with backend not_checkable, and Updates chip confirmed-only regressions. * fix: tombstone equal-generation writers on preview clear Advance the per-stack write generation when clearing at the observation watermark so a scanner reserved before preview cannot recreate the row after an authoritative-negative reconcile. * fix: clear sticky updates with digest and tag preview parity Share detection across scanner and preview, keep GET read-only with POST reconcile, gate Apply to digest and rebuild updates, and invalidate the hub fleet cache on clear. * test: set digestUpdate on auto-update checkImage mocks Scheduler and execute routes now gate Compose on digest drift; fixtures that expect an apply need digestUpdate so they exercise the update path. * fix: clear unused lint errors on sticky update branch Drop unused partial helper and fleet invalidate import; keep the CacheService inflight self-ref as let with an eslint exception so tsc stays green. * fix: use inflight holder for CacheService prefer-const Keep generation-aware ownership without a let self-reference that fights ESLint and tsc.
35 lines
1.2 KiB
TypeScript
35 lines
1.2 KiB
TypeScript
import { CacheService } from '../services/CacheService';
|
|
|
|
/** Hub aggregation cache for GET /api/image-updates/fleet. */
|
|
export const FLEET_UPDATE_CACHE_KEY = 'fleet-updates';
|
|
|
|
/**
|
|
* Drop the hub fleet-updates aggregation. Generation-aware via CacheService:
|
|
* an in-flight getOrFetch started before this call cannot commit afterward.
|
|
*/
|
|
export function invalidateFleetUpdateCache(): void {
|
|
CacheService.getInstance().invalidate(FLEET_UPDATE_CACHE_KEY);
|
|
}
|
|
|
|
function pathWithoutQuery(pathAfterApi: string): string {
|
|
return pathAfterApi.split('?')[0] ?? pathAfterApi;
|
|
}
|
|
|
|
/**
|
|
* True when `pathAfterApi` is a full-stack update route
|
|
* (`/stacks/:name/update`), not a service-scoped update/restore.
|
|
* `pathAfterApi` is the Express path after the `/api` mount strip
|
|
* (for example `/stacks/paperless/update`).
|
|
*/
|
|
export function isFullStackUpdatePath(pathAfterApi: string): boolean {
|
|
return /^\/stacks\/[^/]+\/update\/?$/.test(pathWithoutQuery(pathAfterApi));
|
|
}
|
|
|
|
/**
|
|
* True when `pathAfterApi` is the stack update-preview route
|
|
* (`/stacks/:name/update-preview`).
|
|
*/
|
|
export function isUpdatePreviewPath(pathAfterApi: string): boolean {
|
|
return /^\/stacks\/[^/]+\/update-preview\/?$/.test(pathWithoutQuery(pathAfterApi));
|
|
}
|