From cb3bdce24a3acf2f1fd7238d8d0e6f39a9a866c3 Mon Sep 17 00:00:00 2001 From: Ilia Mashkov Date: Mon, 18 May 2026 21:34:43 +0300 Subject: [PATCH] feat: tag all PocketBase fetches for ISR cache invalidation Each getCollection/getFirstRecord call now passes the collection name as a cache tag so revalidateTag can target individual collections. --- app/[[...slug]]/page.tsx | 2 ++ src/widgets/BioSection/ui/BioSection/BioSection.tsx | 2 +- .../ui/ExperienceSection/ExperienceSection.tsx | 1 + src/widgets/Footer/ui/Footer/Footer.tsx | 1 + src/widgets/IntroSection/ui/IntroSection/IntroSection.tsx | 2 +- .../ProjectsSection/ui/ProjectsSection/ProjectsSection.tsx | 1 + src/widgets/SkillsSection/ui/SkillsSection/SkillsSection.tsx | 1 + 7 files changed, 8 insertions(+), 2 deletions(-) diff --git a/app/[[...slug]]/page.tsx b/app/[[...slug]]/page.tsx index 7505816..00450ec 100644 --- a/app/[[...slug]]/page.tsx +++ b/app/[[...slug]]/page.tsx @@ -10,6 +10,7 @@ import { SectionsAccordion } from '$widgets/SectionsAccordion'; export async function generateStaticParams() { const { items: sections } = await getCollection('sections', { sort: 'order', + tags: ['sections'], }); return [{}, ...sections.map((s) => ({ slug: [s.slug] }))]; } @@ -26,6 +27,7 @@ export default async function SectionPage({ params }: Props) { const { items: sections } = await getCollection('sections', { sort: 'order', + tags: ['sections'], }); if (sections.length === 0) { diff --git a/src/widgets/BioSection/ui/BioSection/BioSection.tsx b/src/widgets/BioSection/ui/BioSection/BioSection.tsx index 455bf0a..1093cd2 100644 --- a/src/widgets/BioSection/ui/BioSection/BioSection.tsx +++ b/src/widgets/BioSection/ui/BioSection/BioSection.tsx @@ -8,7 +8,7 @@ import { RichText } from '$shared/ui'; * Displays personal biography content from PocketBase. */ export default async function BioSection() { - const data = await getFirstRecord('bio'); + const data = await getFirstRecord('bio', { tags: ['bio'] }); if (!data) { notFound(); diff --git a/src/widgets/ExperienceSection/ui/ExperienceSection/ExperienceSection.tsx b/src/widgets/ExperienceSection/ui/ExperienceSection/ExperienceSection.tsx index 1293456..3becc5f 100644 --- a/src/widgets/ExperienceSection/ui/ExperienceSection/ExperienceSection.tsx +++ b/src/widgets/ExperienceSection/ui/ExperienceSection/ExperienceSection.tsx @@ -10,6 +10,7 @@ import { formatMonthYearRange } from '$shared/lib'; export default async function ExperienceSection() { const { items } = await getCollection('experience', { sort: 'order', + tags: ['experience'], }); return ( diff --git a/src/widgets/Footer/ui/Footer/Footer.tsx b/src/widgets/Footer/ui/Footer/Footer.tsx index ff2b417..b89068f 100644 --- a/src/widgets/Footer/ui/Footer/Footer.tsx +++ b/src/widgets/Footer/ui/Footer/Footer.tsx @@ -10,6 +10,7 @@ import { Button, Link } from '$shared/ui'; export async function Footer() { const settings = await getFirstRecord('site_settings', { expand: 'contacts,contacts.socials', + tags: ['site_settings'], }); const cvUrl = settings?.cv ? buildFileUrl(settings.collectionId, settings.id, settings.cv) : null; diff --git a/src/widgets/IntroSection/ui/IntroSection/IntroSection.tsx b/src/widgets/IntroSection/ui/IntroSection/IntroSection.tsx index 2861198..c627bbb 100644 --- a/src/widgets/IntroSection/ui/IntroSection/IntroSection.tsx +++ b/src/widgets/IntroSection/ui/IntroSection/IntroSection.tsx @@ -8,7 +8,7 @@ import { RichText } from '$shared/ui'; * Displays primary introduction content from PocketBase. */ export default async function IntroSection() { - const data = await getFirstRecord('intro'); + const data = await getFirstRecord('intro', { tags: ['intro'] }); if (!data) { notFound(); diff --git a/src/widgets/ProjectsSection/ui/ProjectsSection/ProjectsSection.tsx b/src/widgets/ProjectsSection/ui/ProjectsSection/ProjectsSection.tsx index d5baa3a..f71d3e0 100644 --- a/src/widgets/ProjectsSection/ui/ProjectsSection/ProjectsSection.tsx +++ b/src/widgets/ProjectsSection/ui/ProjectsSection/ProjectsSection.tsx @@ -10,6 +10,7 @@ import { buildFileUrl } from '$shared/lib'; export default async function ProjectsSection() { const { items } = await getCollection('projects', { sort: 'order', + tags: ['projects'], }); return ( diff --git a/src/widgets/SkillsSection/ui/SkillsSection/SkillsSection.tsx b/src/widgets/SkillsSection/ui/SkillsSection/SkillsSection.tsx index 2b0e7ff..9c729c5 100644 --- a/src/widgets/SkillsSection/ui/SkillsSection/SkillsSection.tsx +++ b/src/widgets/SkillsSection/ui/SkillsSection/SkillsSection.tsx @@ -11,6 +11,7 @@ import { Badge } from '$shared/ui'; export default async function SkillsSection() { const data = await getCollection('skills', { sort: 'category,order', + tags: ['skills'], }); if (!data.items.length) {