Skip to content

Commit 013beac

Browse files
authored
fix: control panel cache policy (#901)
* fix: control panel cache policy * chore: temp logs * fix: registry * fix: evault filtering
1 parent 5ea2cf6 commit 013beac

4 files changed

Lines changed: 59 additions & 26 deletions

File tree

infrastructure/control-panel/src/lib/services/evaultService.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ export class EVaultService {
3030
return freshData;
3131
}
3232

33+
3334
/**
3435
* Get cache status information
3536
*/

infrastructure/control-panel/src/lib/services/registry.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export class RegistryService {
1919
private baseUrl: string;
2020

2121
constructor() {
22-
this.baseUrl = env.PUBLIC_REGISTRY_URL || 'https://registry.staging.metastate.foundation';
22+
this.baseUrl = env.PUBLIC_REGISTRY_URL || 'https://registry.w3ds.metastate.foundation';
2323
}
2424

2525
async getEVaults(): Promise<RegistryVault[]> {

infrastructure/control-panel/src/routes/+page.svelte

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,11 @@
278278
isLoading = true;
279279
error = null;
280280
console.log('🔍 Fetching eVaults...');
281-
const data = await EVaultService.getEVaults();
281+
let data = await EVaultService.forceRefresh();
282+
if (!Array.isArray(data) || data.length === 0) {
283+
// Fallback to cache only if fresh load returns empty/invalid.
284+
data = await EVaultService.getEVaults();
285+
}
282286
console.log('📦 Data received:', data);
283287
console.log('📊 Data type:', typeof data);
284288
console.log('📊 Is array:', Array.isArray(data));

infrastructure/control-panel/src/routes/api/evaults/+server.ts

Lines changed: 52 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -41,16 +41,20 @@ function firstNonEmptyString(...values: unknown[]): string | null {
4141
async function fetchFirstParsedByOntology(
4242
vault: RegistryVault,
4343
ontologyId: string,
44-
token: string
44+
token?: string
4545
): Promise<Record<string, unknown> | null> {
46-
try {
46+
const tryRequest = async (withAuth: boolean): Promise<Record<string, unknown> | null> => {
47+
const headers: Record<string, string> = {
48+
'Content-Type': 'application/json',
49+
'X-ENAME': vault.ename
50+
};
51+
if (withAuth && token) {
52+
headers.Authorization = `Bearer ${token}`;
53+
}
54+
4755
const response = await fetch(`${vault.uri}/graphql`, {
4856
method: 'POST',
49-
headers: {
50-
'Content-Type': 'application/json',
51-
'X-ENAME': vault.ename,
52-
Authorization: `Bearer ${token}`
53-
},
57+
headers,
5458
body: JSON.stringify({
5559
query: META_ENVELOPES_QUERY,
5660
variables: {
@@ -66,21 +70,38 @@ async function fetchFirstParsedByOntology(
6670
}
6771

6872
const payload = await response.json();
73+
if (Array.isArray(payload?.errors) && payload.errors.length > 0) {
74+
return null;
75+
}
6976
const parsed = payload?.data?.metaEnvelopes?.edges?.[0]?.node?.parsed;
7077

7178
if (!parsed || typeof parsed !== 'object') {
7279
return null;
7380
}
7481

7582
return parsed as Record<string, unknown>;
83+
};
84+
85+
try {
86+
// Try with token first (preferred), then fallback to X-ENAME-only.
87+
const withAuth = await tryRequest(Boolean(token));
88+
if (withAuth) {
89+
return withAuth;
90+
}
91+
92+
if (token) {
93+
return await tryRequest(false);
94+
}
95+
96+
return null;
7697
} catch {
7798
return null;
7899
}
79100
}
80101

81102
async function resolveVaultIdentity(
82103
vault: RegistryVault,
83-
token: string
104+
token?: string
84105
): Promise<{ name: string; type: 'user' | 'group' }> {
85106
const defaultName = firstNonEmptyString(vault.ename, vault.evault, 'Unknown') || 'Unknown';
86107

@@ -99,7 +120,15 @@ async function resolveVaultIdentity(
99120
return {
100121
type: 'group',
101122
name:
102-
firstNonEmptyString(groupManifest.name, groupManifest.eName, vault.ename, vault.evault) ||
123+
firstNonEmptyString(
124+
groupManifest.name,
125+
groupManifest.displayName,
126+
groupManifest.title,
127+
groupManifest.eName,
128+
groupManifest.ename,
129+
vault.ename,
130+
vault.evault
131+
) ||
103132
defaultName
104133
};
105134
}
@@ -136,7 +165,12 @@ async function requestPlatformToken(platform: string): Promise<string> {
136165
export const GET: RequestHandler = async ({ url }) => {
137166
try {
138167
const platform = env.PUBLIC_CONTROL_PANEL_URL || url.origin;
139-
const token = await requestPlatformToken(platform);
168+
let token: string | undefined;
169+
try {
170+
token = await requestPlatformToken(platform);
171+
} catch (tokenError) {
172+
console.warn('Falling back to X-ENAME-only eVault queries:', tokenError);
173+
}
140174

141175
// Fetch all evaults from registry
142176
const registryVaults = await registryService.getEVaults();
@@ -149,32 +183,26 @@ export const GET: RequestHandler = async ({ url }) => {
149183

150184
const identity = await resolveVaultIdentity(vault, token);
151185

152-
// Check health status by attempting to fetch from URI
153-
let status = 'Unknown';
154-
try {
155-
const healthResponse = await fetch(`${vault.uri}/health`, {
156-
signal: AbortSignal.timeout(2000) // 2 second timeout
157-
});
158-
status = healthResponse.ok ? 'Active' : 'Inactive';
159-
} catch {
160-
status = 'Inactive';
161-
}
162-
163186
return {
164187
id: evaultId,
165188
name: identity.name,
166189
type: identity.type,
167190
ename: vault.ename,
168191
uri: vault.uri,
169192
evault: vault.evault,
170-
status: status,
193+
status: 'Unknown',
171194
serviceUrl: vault.uri
172195
};
173196
})
174197
);
175198

176-
console.log(`Total eVaults found: ${evaults.length}`);
177-
return json({ evaults });
199+
// Filter out platform-owned user profiles (e.g. "File Manager Platform").
200+
const filteredEVaults = evaults.filter(
201+
(vault) => !(vault.type === 'user' && /platform$/i.test(vault.name.trim()))
202+
);
203+
204+
console.log(`Total eVaults found: ${filteredEVaults.length}`);
205+
return json({ evaults: filteredEVaults });
178206
} catch (error) {
179207
console.error('Error fetching eVaults:', error);
180208
return json({ error: 'Failed to fetch eVaults', evaults: [] }, { status: 500 });

0 commit comments

Comments
 (0)