Skip to content

Commit fea991a

Browse files
committed
List API does better validation of metadata, sorts invalid docs
1 parent d29755f commit fea991a

File tree

3 files changed

+41
-14
lines changed

3 files changed

+41
-14
lines changed

frontend/apps/web/app/routes/api.list.$.tsx

+35-12
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,52 @@ import {
88
import {ListAPIResponse} from '@shm/shared/api-types'
99
import {BIG_INT} from '@shm/shared/constants'
1010

11+
const processDocuments = (docs: any[]) => {
12+
const invalidDocuments: ListAPIResponse['invalidDocuments'] = []
13+
const documents: ListAPIResponse['documents'] = []
14+
15+
docs.forEach((doc) => {
16+
const id = hmId(
17+
'd',
18+
doc.account,
19+
doc.path ? {path: entityQueryPathToHmIdPath(doc.path)} : undefined,
20+
)
21+
const rawMetadata = doc.metadata?.toJson()
22+
const metadataParsed = HMDocumentMetadataSchema.safeParse(rawMetadata)
23+
24+
if (!metadataParsed.success) {
25+
invalidDocuments.push({
26+
id,
27+
error: metadataParsed.error,
28+
metadata: rawMetadata,
29+
})
30+
} else {
31+
documents.push({
32+
id,
33+
metadata: metadataParsed.data,
34+
})
35+
}
36+
})
37+
38+
return {invalidDocuments, documents}
39+
}
40+
1141
export const loader = apiGetter(async (req) => {
1242
const pathParts = req.pathParts
1343
const [_api, _list, uid] = pathParts
44+
1445
if (uid) {
1546
const docs = await queryClient.documents.listDocuments({
1647
account: uid,
1748
pageSize: BIG_INT,
1849
})
19-
return {
20-
documents: docs.documents.map((doc) => ({
21-
id: hmId('d', doc.account, {path: entityQueryPathToHmIdPath(doc.path)}),
22-
metadata: HMDocumentMetadataSchema.parse(doc.metadata?.toJson()),
23-
})),
24-
} satisfies ListAPIResponse
50+
const {invalidDocuments, documents} = processDocuments(docs.documents)
51+
return {invalidDocuments, documents} satisfies ListAPIResponse
2552
} else {
2653
const rootDocs = await queryClient.documents.listRootDocuments({
2754
pageSize: BIG_INT,
2855
})
29-
return {
30-
documents: rootDocs.documents.map((doc) => ({
31-
id: hmId('d', doc.account),
32-
metadata: HMDocumentMetadataSchema.parse(doc.metadata?.toJson()),
33-
})),
34-
} satisfies ListAPIResponse
56+
const {invalidDocuments, documents} = processDocuments(rootDocs.documents)
57+
return {invalidDocuments, documents} satisfies ListAPIResponse
3558
}
3659
})

frontend/apps/web/app/routes/hm.$.tsx

-1
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,5 @@ function produceHmId(
7373

7474
export default function HypermediaDocument() {
7575
const data = unwrap<SiteDocumentPayload>(useLoaderData())
76-
console.log('~~~ data', data)
7776
return <DocumentPage {...data} />
7877
}
+6-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
1-
import {HMMetadataPayload} from './hm-types'
1+
import {HMMetadataPayload, UnpackedHypermediaId} from './hm-types'
22

33
export type ListAPIResponse = {
44
documents: HMMetadataPayload[]
5+
invalidDocuments: {
6+
id: UnpackedHypermediaId
7+
error: any
8+
metadata: any
9+
}[]
510
}

0 commit comments

Comments
 (0)