From 699fbf06c5accdbe11fbdaa799284b6f4160ec44 Mon Sep 17 00:00:00 2001 From: Guillaume Dorce Date: Sun, 21 May 2023 18:58:15 +0200 Subject: [PATCH] list pages from pocketbase --- src/@types/pocketbase-types.ts | 1 - src/pages/[slug].tsx | 27 ++++++++++++++++++ src/pages/test-pb.tsx | 2 +- src/pages/test/list-pages.tsx | 37 +++++++++++++++++++++++++ src/server/api/root.ts | 4 +-- src/server/api/routers/example.ts | 12 -------- src/server/api/routers/pages.ts | 19 +++++++++++++ src/utils/pb.ts | 46 +++++++++++++++++++++++++++++-- 8 files changed, 130 insertions(+), 18 deletions(-) create mode 100644 src/pages/[slug].tsx create mode 100644 src/pages/test/list-pages.tsx delete mode 100644 src/server/api/routers/example.ts create mode 100644 src/server/api/routers/pages.ts diff --git a/src/@types/pocketbase-types.ts b/src/@types/pocketbase-types.ts index 8f4f734..f664d41 100644 --- a/src/@types/pocketbase-types.ts +++ b/src/@types/pocketbase-types.ts @@ -32,7 +32,6 @@ export type AuthSystemFields = { // Record types for each collection export type PagesRecord = { - field?: HTMLString content?: null | Tcontent title?: string slug?: string diff --git a/src/pages/[slug].tsx b/src/pages/[slug].tsx new file mode 100644 index 0000000..4f286f5 --- /dev/null +++ b/src/pages/[slug].tsx @@ -0,0 +1,27 @@ +import type { PagesRecord } from '@/@types/pocketbase-types'; +import Layout from '@/layouts/Home' +import { getPageBySlug } from '@/utils/pb' + +export default function Page({data}: {slug: string, data: PagesRecord}) { + return ( + +

{data.title}

+
{JSON.stringify(data.content, null, 2)}
+
+ ) +} + +export async function getServerSideProps({params}: {params: {slug: string}}) { + const {data, error} = await getPageBySlug(params.slug); + if (error || !data) { + return { + notFound: true, + } + } + + return { + props: { + data: data, + }, + } +} diff --git a/src/pages/test-pb.tsx b/src/pages/test-pb.tsx index f287d4d..c2a6a8f 100644 --- a/src/pages/test-pb.tsx +++ b/src/pages/test-pb.tsx @@ -1,6 +1,6 @@ import Layout from "@/layouts/Home" import { getPages } from "@/utils/pb" -import { PagesRecord } from "@/@types/pocketbase-types" +import type { PagesRecord } from "@/@types/pocketbase-types" export default function Test({ json }: { json: PagesRecord[]}) { console.log(json) diff --git a/src/pages/test/list-pages.tsx b/src/pages/test/list-pages.tsx new file mode 100644 index 0000000..c94eccc --- /dev/null +++ b/src/pages/test/list-pages.tsx @@ -0,0 +1,37 @@ +import type { PagesRecord } from "@/@types/pocketbase-types"; +import { getPages } from "@/utils/pb"; +import Layout from "@/layouts/Home"; + +export default function ListPages({ data }: { data: PagesRecord[] }) { + return ( + +
+

List Pages

+
+ {data.map((page: PagesRecord) => ( +
+

{page.title}

+

Content (in JSON):

+
{JSON.stringify(page.content, null, 2)}
+
+ ))} +
+
+
+ ) +} + +export async function getServerSideProps() { + const { data, error } = await getPages(); + if (error || !data) { + return { + notFound: true, + } + } + + return { + props: { + data: data, + }, + } +} diff --git a/src/server/api/root.ts b/src/server/api/root.ts index c3f288e..4dad66f 100644 --- a/src/server/api/root.ts +++ b/src/server/api/root.ts @@ -1,5 +1,5 @@ import { createTRPCRouter } from "./trpc"; -import { exampleRouter } from "./routers/example"; +import { pagesRouter } from "./routers/pages"; /** * This is the primary router for your server. @@ -7,7 +7,7 @@ import { exampleRouter } from "./routers/example"; * All routers added in /api/routers should be manually added here */ export const appRouter = createTRPCRouter({ - example: exampleRouter, + pages: pagesRouter, }); // export type definition of API diff --git a/src/server/api/routers/example.ts b/src/server/api/routers/example.ts deleted file mode 100644 index 1a4c66c..0000000 --- a/src/server/api/routers/example.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { z } from "zod"; -import { createTRPCRouter, publicProcedure } from "../trpc"; - -export const exampleRouter = createTRPCRouter({ - hello: publicProcedure - .input(z.object({ text: z.string() })) - .query(({ input }) => { - return { - greeting: `Hello ${input.text}`, - }; - }), -}); diff --git a/src/server/api/routers/pages.ts b/src/server/api/routers/pages.ts new file mode 100644 index 0000000..a273599 --- /dev/null +++ b/src/server/api/routers/pages.ts @@ -0,0 +1,19 @@ +import { z } from "zod"; +import { createTRPCRouter, publicProcedure } from "../trpc"; +import { getPage, getPages } from "@/utils/pb"; + +export const pagesRouter = createTRPCRouter({ + getPage: publicProcedure + .input(z.object({ id: z.string() })) + .query(({ input }) => { + return { + data: getPage(input.id), + }; + }), + getPages: publicProcedure + .query(() => { + return { + data: getPages(), + }; + }), +}); diff --git a/src/utils/pb.ts b/src/utils/pb.ts index 5eb1656..0d2b9b3 100644 --- a/src/utils/pb.ts +++ b/src/utils/pb.ts @@ -1,6 +1,6 @@ import PocketBase from "pocketbase"; import { env } from "@/env/server.mjs"; -import { PagesRecord } from "@/@types/pocketbase-types"; +import type { PagesRecord } from "@/@types/pocketbase-types"; const pb = new PocketBase(env.PB_API); @@ -14,4 +14,46 @@ async function getPages() { } } -export { pb, getPages }; +async function getPageById(id: string) { + try { + const data: PagesRecord = await pb.collection("pages").getOne(id); + return { data }; + } catch (error) { + console.log(error); + return { error }; + } +} + +async function getPageBySlug(slug: string) { + try { + const data: PagesRecord = await pb + .collection("pages") + .getFirstListItem('slug="' + slug + '"'); + return { data }; + } catch (error) { + console.log(error); + return { error }; + } +} + +async function createPage(data: PagesRecord) { + try { + const res = await pb.collection("pages").create(data); + return { data: res }; + } catch (error) { + console.log(error); + return { error }; + } +} + +async function updatePage(id: string, data: PagesRecord) { + try { + const res = await pb.collection("pages").update(id, data); + return { data: res }; + } catch (error) { + console.log(error); + return { error }; + } +} + +export { pb, getPages, getPageById, getPageBySlug, createPage, updatePage };