Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions src/frontend/src/hooks/use-entity-metadata.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -164,10 +164,10 @@ describe('useEntityMetadata Hook', () => {
expect(fetchMock).toHaveBeenCalledTimes(4);
});

expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_contract/contract-456/rich-texts');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_contract/contract-456/links');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_contract/contract-456/documents');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_contract/contract-456/attachments');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_contract/rich-texts?entity_id=contract-456');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_contract/links?entity_id=contract-456');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_contract/documents?entity_id=contract-456');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_contract/attachments?entity_id=contract-456');
});

it('sets loading state during fetch', async () => {
Expand Down Expand Up @@ -528,7 +528,7 @@ describe('useEntityMetadata Hook', () => {
expect(fetchMock).toHaveBeenCalled();
});

expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_domain/domain-123/rich-texts');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_domain/rich-texts?entity_id=domain-123');
});

it('works with data_product entity type', async () => {
Expand All @@ -541,7 +541,7 @@ describe('useEntityMetadata Hook', () => {
expect(fetchMock).toHaveBeenCalled();
});

expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_product/product-123/rich-texts');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_product/rich-texts?entity_id=product-123');
});

it('works with data_contract entity type', async () => {
Expand All @@ -554,7 +554,7 @@ describe('useEntityMetadata Hook', () => {
expect(fetchMock).toHaveBeenCalled();
});

expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_contract/contract-123/rich-texts');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_contract/rich-texts?entity_id=contract-123');
});
});

Expand Down Expand Up @@ -652,15 +652,15 @@ describe('useEntityMetadata Hook', () => {
);

await waitFor(() => {
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_product/entity-1/rich-texts');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_product/rich-texts?entity_id=entity-1');
});

fetchMock.mockClear();

rerender({ entityId: 'entity-2' });

await waitFor(() => {
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_product/entity-2/rich-texts');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_product/rich-texts?entity_id=entity-2');
});
});

Expand All @@ -674,15 +674,15 @@ describe('useEntityMetadata Hook', () => {
);

await waitFor(() => {
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_product/entity-123/rich-texts');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_product/rich-texts?entity_id=entity-123');
});

fetchMock.mockClear();

rerender({ entityType: 'data_contract' as EntityKind });

await waitFor(() => {
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_contract/entity-123/rich-texts');
expect(fetchMock).toHaveBeenCalledWith('/api/entities/data_contract/rich-texts?entity_id=entity-123');
});
});
});
Expand Down
11 changes: 7 additions & 4 deletions src/frontend/src/hooks/use-entity-metadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -117,11 +117,14 @@ export function useEntityMetadata(entityType: EntityKind, entityId: string | nul
try {
setLoading(true);
setError(null);
// Metadata endpoints take the entity id as a query param (?entity_id=),
// not a path segment; the id may be an IRI so it must be URL-encoded.
const eid = encodeURIComponent(entityId);
const [rt, li, docs, att] = await Promise.all([
fetch(`/api/entities/${entityType}/${entityId}/rich-texts`).then(r => r.ok ? r.json() : Promise.reject(new Error(`rich-texts ${r.status}`))),
fetch(`/api/entities/${entityType}/${entityId}/links`).then(r => r.ok ? r.json() : Promise.reject(new Error(`links ${r.status}`))),
fetch(`/api/entities/${entityType}/${entityId}/documents`).then(r => r.ok ? r.json() : Promise.reject(new Error(`documents ${r.status}`))),
fetch(`/api/entities/${entityType}/${entityId}/attachments`).then(r => r.ok ? r.json() : []),
fetch(`/api/entities/${entityType}/rich-texts?entity_id=${eid}`).then(r => r.ok ? r.json() : Promise.reject(new Error(`rich-texts ${r.status}`))),
fetch(`/api/entities/${entityType}/links?entity_id=${eid}`).then(r => r.ok ? r.json() : Promise.reject(new Error(`links ${r.status}`))),
fetch(`/api/entities/${entityType}/documents?entity_id=${eid}`).then(r => r.ok ? r.json() : Promise.reject(new Error(`documents ${r.status}`))),
fetch(`/api/entities/${entityType}/attachments?entity_id=${eid}`).then(r => r.ok ? r.json() : []),
]);
setRichTexts(Array.isArray(rt) ? rt : []);
setLinks(Array.isArray(li) ? li : []);
Expand Down
9 changes: 6 additions & 3 deletions src/frontend/src/views/data-domain-details.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -458,10 +458,13 @@ export default function DataDomainDetailsView() {

const fetchMetadata = useCallback(async (id: string) => {
try {
// Metadata endpoints take the entity id as a query param (?entity_id=),
// not a path segment.
const eid = encodeURIComponent(id);
const [rtResp, liResp, docResp] = await Promise.all([
get<RichTextItem[]>(`/api/entities/${entityType}/${id}/rich-texts`),
get<LinkItem[]>(`/api/entities/${entityType}/${id}/links`),
get<DocumentItem[]>(`/api/entities/${entityType}/${id}/documents`),
get<RichTextItem[]>(`/api/entities/${entityType}/rich-texts?entity_id=${eid}`),
get<LinkItem[]>(`/api/entities/${entityType}/links?entity_id=${eid}`),
get<DocumentItem[]>(`/api/entities/${entityType}/documents?entity_id=${eid}`),
]);
setRichTexts(checkApiResponse(rtResp, 'Rich Texts'));
setLinks(checkApiResponse(liResp, 'Links'));
Expand Down
Loading