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
+
+
+
+
+
+ {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;
+};