optimize public collection loading: (#2444)
- remove query for /collections endpoint just to get the org name - add orgName to single /collection endpoint, where it is already available on the backend
This commit is contained in:
parent
2263745df3
commit
631b019baf
@ -377,6 +377,8 @@ class CollectionOps:
|
|||||||
"""Get PublicCollOut by id"""
|
"""Get PublicCollOut by id"""
|
||||||
result = await self.get_collection_raw(coll_id)
|
result = await self.get_collection_raw(coll_id)
|
||||||
|
|
||||||
|
result["orgName"] = org.name
|
||||||
|
|
||||||
allowed_access = [CollAccessType.PUBLIC]
|
allowed_access = [CollAccessType.PUBLIC]
|
||||||
if allow_unlisted:
|
if allow_unlisted:
|
||||||
allowed_access.append(CollAccessType.UNLISTED)
|
allowed_access.append(CollAccessType.UNLISTED)
|
||||||
@ -496,6 +498,8 @@ class CollectionOps:
|
|||||||
org, self.storage_ops
|
org, self.storage_ops
|
||||||
)
|
)
|
||||||
|
|
||||||
|
res["orgName"] = org.name
|
||||||
|
|
||||||
if public_colls_out:
|
if public_colls_out:
|
||||||
collections.append(PublicCollOut.from_dict(res))
|
collections.append(PublicCollOut.from_dict(res))
|
||||||
else:
|
else:
|
||||||
|
|||||||
@ -1525,6 +1525,7 @@ class PublicCollOut(BaseMongoModel):
|
|||||||
name: str
|
name: str
|
||||||
slug: str
|
slug: str
|
||||||
oid: UUID
|
oid: UUID
|
||||||
|
orgName: str
|
||||||
description: Optional[str] = None
|
description: Optional[str] = None
|
||||||
caption: Optional[str] = None
|
caption: Optional[str] = None
|
||||||
created: Optional[datetime] = None
|
created: Optional[datetime] = None
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
import { localized, msg } from "@lit/localize";
|
import { localized, msg } from "@lit/localize";
|
||||||
import { Task, TaskStatus } from "@lit/task";
|
import { Task } from "@lit/task";
|
||||||
import { html, type TemplateResult } from "lit";
|
import { html, type TemplateResult } from "lit";
|
||||||
import { customElement, property } from "lit/decorators.js";
|
import { customElement, property } from "lit/decorators.js";
|
||||||
import { ifDefined } from "lit/directives/if-defined.js";
|
import { ifDefined } from "lit/directives/if-defined.js";
|
||||||
@ -10,7 +10,6 @@ import { metadataColumn } from "@/layouts/collections/metadataColumn";
|
|||||||
import { page } from "@/layouts/page";
|
import { page } from "@/layouts/page";
|
||||||
import { RouteNamespace } from "@/routes";
|
import { RouteNamespace } from "@/routes";
|
||||||
import type { PublicCollection } from "@/types/collection";
|
import type { PublicCollection } from "@/types/collection";
|
||||||
import type { PublicOrgCollections } from "@/types/org";
|
|
||||||
import { formatRwpTimestamp } from "@/utils/replay";
|
import { formatRwpTimestamp } from "@/utils/replay";
|
||||||
|
|
||||||
enum Tab {
|
enum Tab {
|
||||||
@ -48,15 +47,6 @@ export class Collection extends BtrixElement {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
private readonly orgCollections = new Task(this, {
|
|
||||||
task: async ([orgSlug]) => {
|
|
||||||
if (!orgSlug) throw new Error("orgSlug required");
|
|
||||||
const org = await this.fetchCollections({ orgSlug });
|
|
||||||
return org;
|
|
||||||
},
|
|
||||||
args: () => [this.orgSlug] as const,
|
|
||||||
});
|
|
||||||
|
|
||||||
private readonly collection = new Task(this, {
|
private readonly collection = new Task(this, {
|
||||||
task: async ([orgSlug, collectionSlug]) => {
|
task: async ([orgSlug, collectionSlug]) => {
|
||||||
if (!orgSlug || !collectionSlug)
|
if (!orgSlug || !collectionSlug)
|
||||||
@ -89,19 +79,13 @@ export class Collection extends BtrixElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private readonly renderComplete = (collection: PublicCollection) => {
|
private readonly renderComplete = (collection: PublicCollection) => {
|
||||||
const org = this.orgCollections.value?.org;
|
|
||||||
const header: Parameters<typeof page>[0] = {
|
const header: Parameters<typeof page>[0] = {
|
||||||
breadcrumbs:
|
breadcrumbs: [
|
||||||
this.orgCollections.status > TaskStatus.PENDING
|
{
|
||||||
? org
|
href: `/${RouteNamespace.PublicOrgs}/${this.orgSlug}`,
|
||||||
? [
|
content: collection.orgName,
|
||||||
{
|
},
|
||||||
href: `/${RouteNamespace.PublicOrgs}/${this.orgSlug}`,
|
],
|
||||||
content: org.name,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
: undefined
|
|
||||||
: [],
|
|
||||||
title: collection.name || "",
|
title: collection.name || "",
|
||||||
actions: html`
|
actions: html`
|
||||||
<btrix-share-collection
|
<btrix-share-collection
|
||||||
@ -239,23 +223,6 @@ export class Collection extends BtrixElement {
|
|||||||
return html`<div class="rounded-lg border p-6">${metadata}</div>`;
|
return html`<div class="rounded-lg border p-6">${metadata}</div>`;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async fetchCollections({
|
|
||||||
orgSlug,
|
|
||||||
}: {
|
|
||||||
orgSlug: string;
|
|
||||||
}): Promise<PublicOrgCollections> {
|
|
||||||
const resp = await fetch(`/api/public/orgs/${orgSlug}/collections`, {
|
|
||||||
headers: { "Content-Type": "application/json" },
|
|
||||||
});
|
|
||||||
|
|
||||||
switch (resp.status) {
|
|
||||||
case 200:
|
|
||||||
return (await resp.json()) as PublicOrgCollections;
|
|
||||||
default:
|
|
||||||
throw resp.status;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private async fetchCollection({
|
private async fetchCollection({
|
||||||
orgSlug,
|
orgSlug,
|
||||||
collectionSlug,
|
collectionSlug,
|
||||||
|
|||||||
@ -20,6 +20,7 @@ export const publicCollectionSchema = z.object({
|
|||||||
id: z.string(),
|
id: z.string(),
|
||||||
slug: z.string(),
|
slug: z.string(),
|
||||||
oid: z.string(),
|
oid: z.string(),
|
||||||
|
orgName: z.string(),
|
||||||
name: z.string(),
|
name: z.string(),
|
||||||
created: z.string().datetime(),
|
created: z.string().datetime(),
|
||||||
modified: z.string().datetime(),
|
modified: z.string().datetime(),
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user