diff --git a/apps/infoalloggi/src/i18n/en.ts b/apps/infoalloggi/src/i18n/en.ts index 313275f..a3f8e49 100644 --- a/apps/infoalloggi/src/i18n/en.ts +++ b/apps/infoalloggi/src/i18n/en.ts @@ -659,6 +659,7 @@ export const en: LangDict = { { href: "/area-riservata/admin/utenti", title: "Users" }, { href: "/area-riservata/admin/chats", title: "Chat List" }, { href: "/area-riservata/admin/ordini", title: "Orders" }, + { href: "/area-riservata/admin/incroci", title: "Incroci" }, { href: "/area-riservata/admin/annunci", title: "Ads" }, { href: "/area-riservata/admin/prezziario", title: "Pricing" }, ], diff --git a/apps/infoalloggi/src/i18n/it.ts b/apps/infoalloggi/src/i18n/it.ts index c74cbf8..f20e914 100644 --- a/apps/infoalloggi/src/i18n/it.ts +++ b/apps/infoalloggi/src/i18n/it.ts @@ -664,6 +664,7 @@ export const it: LangDict = { { href: "/area-riservata/admin/utenti", title: "Utenti" }, { href: "/area-riservata/admin/chats", title: "Lista Chat" }, { href: "/area-riservata/admin/ordini", title: "Ordini" }, + { href: "/area-riservata/admin/incroci", title: "Incroci" }, { href: "/area-riservata/admin/annunci", title: "Annunci" }, { href: "/area-riservata/admin/prezziario", title: "Prezziario" }, ], diff --git a/apps/infoalloggi/src/pages/area-riservata/admin/incroci.tsx b/apps/infoalloggi/src/pages/area-riservata/admin/incroci.tsx new file mode 100644 index 0000000..0a4c227 --- /dev/null +++ b/apps/infoalloggi/src/pages/area-riservata/admin/incroci.tsx @@ -0,0 +1,118 @@ +import { format } from "date-fns"; +import type { GetServerSideProps } from "next"; +import Head from "next/head"; +import Link from "next/link"; +import { AreaRiservataLayout } from "~/components/Layout"; +import { LoadingPage } from "~/components/loading"; +import { Status500 } from "~/components/status-page"; +import { Button } from "~/components/ui/button"; +import { Separator } from "~/components/ui/separator"; +import type { NextPageWithLayout } from "~/pages/_app"; +import { TrpcAuthedFetchingIstance } from "~/server/utils/ssgHelper"; +import { api } from "~/utils/api"; + +const Incroci: NextPageWithLayout = () => { + const { data, isLoading } = api.incroci.getAll.useQuery(); + + if (isLoading) return ; + if (!data) return ; + + return ( + <> + + Incorici - Infoalloggi.it + + +
+
+
+

Incroci

+
+
+
+ {data.map((incrocio) => ( +
+
+ Cod: + {incrocio.codice} +
+
+ Titolo: + {incrocio.titolo_it} +
+
+ Richieste: +
+
    + {incrocio.richieste.map((r) => ( +
  • +
    + Username: + {r.username} +
    +
    + Aggiunto il: + + {format(new Date(r.created_at), "dd/MM/yyyy")} + +
    +
    + Aperto Contatti il: + + {r.open_contatti_at + ? format(new Date(r.open_contatti_at), "dd/MM/yyyy") + : "Non aperto"} + +
    +
    + Mandato conferma il: + + {r.user_confirmed_at + ? format(new Date(r.user_confirmed_at), "dd/MM/yyyy") + : "Non confermato"} + +
    +
    + Conferma da Admin: + {r.hasConfermaAdmin ? "Si" : "No"} +
    + + + + +
  • + ))} +
+
+ ))} +
+
+ + ); +}; + +export default Incroci; + +export const getServerSideProps = (async (context) => { + const access_token = context.req.cookies.access_token; + + const helpers = await TrpcAuthedFetchingIstance({ access_token }); + if (helpers) { + await helpers.trpc.incroci.getAll.prefetch(); + return { + props: { + trpcState: helpers.trpc.dehydrate(), + }, + }; + } + return { + props: {}, + }; +}) satisfies GetServerSideProps; + +Incroci.getLayout = function getLayout(page) { + return {page}; +}; diff --git a/apps/infoalloggi/src/server/api/root.ts b/apps/infoalloggi/src/server/api/root.ts index d457fe9..447295e 100644 --- a/apps/infoalloggi/src/server/api/root.ts +++ b/apps/infoalloggi/src/server/api/root.ts @@ -22,6 +22,7 @@ import { bannersRouter } from "./routers/banners"; import { catastoRouter } from "./routers/catasto"; import { etichetteRouter } from "./routers/etichette"; import { flagsRouter } from "./routers/flags"; +import { incrociRouter } from "./routers/incroci"; import { inviteRouter } from "./routers/invite"; import { potenzialiRouter } from "./routers/potenziali"; import { revalidationRouter } from "./routers/revalidation"; @@ -59,5 +60,6 @@ export const appRouter = createTRPCRouter({ revalidation: revalidationRouter, potenziali: potenzialiRouter, invite: inviteRouter, + incroci: incrociRouter, }); export type AppRouter = typeof appRouter; diff --git a/apps/infoalloggi/src/server/api/routers/incroci.ts b/apps/infoalloggi/src/server/api/routers/incroci.ts new file mode 100644 index 0000000..1328d27 --- /dev/null +++ b/apps/infoalloggi/src/server/api/routers/incroci.ts @@ -0,0 +1,8 @@ +import { adminProcedure, createTRPCRouter } from "~/server/api/trpc"; +import { getAll } from "~/server/controllers/incroci.controller"; + +export const incrociRouter = createTRPCRouter({ + getAll: adminProcedure.query(async () => { + return await getAll(); + }), +}); diff --git a/apps/infoalloggi/src/server/controllers/incroci.controller.ts b/apps/infoalloggi/src/server/controllers/incroci.controller.ts new file mode 100644 index 0000000..861cc35 --- /dev/null +++ b/apps/infoalloggi/src/server/controllers/incroci.controller.ts @@ -0,0 +1,36 @@ +import { jsonArrayFrom } from "kysely/helpers/postgres"; +import { db } from "../db"; + +export const getAll = async () => { + const data = await db + .selectFrom("annunci") + .innerJoin("servizio_annunci", "servizio_annunci.annunci_id", "annunci.id") + + .select((eb) => [ + "annunci.id", + "annunci.titolo_it", + "annunci.codice", + jsonArrayFrom( + eb + .selectFrom("servizio_annunci") + .select([ + "servizio_annunci.open_contatti_at", + "servizio_annunci.servizio_id", + "servizio_annunci.created_at", + "servizio_annunci.user_confirmed_at", + "servizio_annunci.hasConfermaAdmin", + ]) + .leftJoin( + "servizio", + "servizio.servizio_id", + "servizio_annunci.servizio_id", + ) + .leftJoin("users", "users.id", "servizio.user_id") + .select(["users.username", "users.id as userId"]) + .whereRef("servizio_annunci.annunci_id", "=", "annunci.id"), + ).as("richieste"), + ]) + .groupBy("annunci.id") + .execute(); + return data; +};