diff --git a/src/app/[rc_id]/conversations/[conv_id]/page.tsx b/src/app/[rc_id]/conversations/[conv_id]/page.tsx index 0142847..bc4cd2e 100644 --- a/src/app/[rc_id]/conversations/[conv_id]/page.tsx +++ b/src/app/[rc_id]/conversations/[conv_id]/page.tsx @@ -2,10 +2,10 @@ import { env } from "~/env"; import { redirect } from "next/navigation"; import { DummySendMessage } from "~/app/_components/dummy-send-message"; -import { api } from "~/lib/infrastructure/server/trpc/server-api"; import type AuthGatewayOutputPort from "~/lib/core/ports/secondary/auth-gateway-output-port"; import serverContainer from "~/lib/infrastructure/server/config/ioc/server-container"; -import { GATEWAYS } from "~/lib/infrastructure/server/config/ioc/server-ioc-symbols"; +import { GATEWAYS, TRPC } from "~/lib/infrastructure/server/config/ioc/server-ioc-symbols"; +import type { TServerComponentAPI } from "~/lib/infrastructure/server/trpc/server-api"; export default async function Home({ params, @@ -23,6 +23,7 @@ export default async function Home({ } async function ListMessages({ conv_id }: { conv_id: string }) { + const api: TServerComponentAPI = serverContainer.get(TRPC.REACT_SERVER_COMPONENTS_API); const conv_id_int = parseInt(conv_id); const authGateway = serverContainer.get( GATEWAYS.AUTH_GATEWAY, @@ -30,7 +31,7 @@ async function ListMessages({ conv_id }: { conv_id: string }) { const session = await authGateway.getSession(); if (!session?.user) return null; - const messages = await api.message.list({ + const messages = await api.kernel.message.list({ conversationId: conv_id_int, xAuthToken: env.KP_AUTH_TOKEN, }); diff --git a/src/app/[rc_id]/conversations/page.tsx b/src/app/[rc_id]/conversations/page.tsx index 6da3c1e..39fec51 100644 --- a/src/app/[rc_id]/conversations/page.tsx +++ b/src/app/[rc_id]/conversations/page.tsx @@ -1,10 +1,10 @@ import { env } from "~/env"; import { redirect } from "next/navigation"; import { ListConversationsPage } from "../../_components/list-conversations"; -import { api } from "~/lib/infrastructure/server/trpc/server-api"; import type AuthGatewayOutputPort from "~/lib/core/ports/secondary/auth-gateway-output-port"; import serverContainer from "~/lib/infrastructure/server/config/ioc/server-container"; -import { GATEWAYS } from "~/lib/infrastructure/server/config/ioc/server-ioc-symbols"; +import { GATEWAYS, TRPC } from "~/lib/infrastructure/server/config/ioc/server-ioc-symbols"; +import type { TServerComponentAPI } from "~/lib/infrastructure/server/trpc/server-api"; export default async function Home({ params }: { params: { rc_id: string } }) { const authGateway = serverContainer.get( @@ -18,6 +18,7 @@ export default async function Home({ params }: { params: { rc_id: string } }) { } async function ListConversations({ rc_id }: { rc_id: string }) { + const api: TServerComponentAPI = serverContainer.get(TRPC.REACT_SERVER_COMPONENTS_API); const rc_id_int = parseInt(rc_id); const authGateway = serverContainer.get( GATEWAYS.AUTH_GATEWAY, @@ -25,7 +26,7 @@ async function ListConversations({ rc_id }: { rc_id: string }) { const session = await authGateway.getSession(); if (!session?.user) return null; - const conversations = await api.conversation.list({ + const conversations = await api.kernel.conversation.list({ id: rc_id_int, xAuthToken: env.KP_AUTH_TOKEN, }); diff --git a/src/app/[rc_id]/sources/page.tsx b/src/app/[rc_id]/sources/page.tsx index c97e976..0f1ffc6 100644 --- a/src/app/[rc_id]/sources/page.tsx +++ b/src/app/[rc_id]/sources/page.tsx @@ -1,9 +1,9 @@ import { env } from "~/env"; import { redirect } from "next/navigation"; -import { api } from "~/lib/infrastructure/server/trpc/server-api"; import type AuthGatewayOutputPort from "~/lib/core/ports/secondary/auth-gateway-output-port"; import serverContainer from "~/lib/infrastructure/server/config/ioc/server-container"; -import { GATEWAYS } from "~/lib/infrastructure/server/config/ioc/server-ioc-symbols"; +import { GATEWAYS, TRPC } from "~/lib/infrastructure/server/config/ioc/server-ioc-symbols"; +import type { TServerComponentAPI } from "~/lib/infrastructure/server/trpc/server-api"; export default async function Home( { params }: { params: { rc_id: string } } @@ -19,14 +19,14 @@ export default async function Home( } async function ListSourceData({ rc_id }: { rc_id: string }) { - + const api: TServerComponentAPI = serverContainer.get(TRPC.REACT_SERVER_COMPONENTS_API); const rc_id_int = parseInt(rc_id); const authGateway = serverContainer.get(GATEWAYS.AUTH_GATEWAY); const session = await authGateway.getSession(); if (!session?.user) return null; - const sourceData = await api.sourceData.listForResearchContext( + const sourceData = await api.kernel.sourceData.listForResearchContext( { researchContextId: rc_id_int, xAuthToken: env.KP_AUTH_TOKEN diff --git a/src/app/_components/create-post.tsx b/src/app/_components/create-post.tsx index f860c24..0fde9fb 100644 --- a/src/app/_components/create-post.tsx +++ b/src/app/_components/create-post.tsx @@ -2,13 +2,16 @@ import { useRouter } from "next/navigation"; import { useState } from "react"; -import { api } from "~/lib/infrastructure/client/trpc/react"; +import clientContainer from "~/lib/infrastructure/client/config/ioc/client-container"; +import type { TClientComponentAPI } from "~/lib/infrastructure/client/trpc/react-api"; +import { TRPC } from "~/lib/infrastructure/client/config/ioc/client-ioc-symbols"; export function CreatePost() { const router = useRouter(); const [name, setName] = useState(""); + const api = clientContainer.get(TRPC.REACT_CLIENT_COMPONENTS_API); const createPost = api.post.create.useMutation({ onSuccess: () => { router.refresh(); diff --git a/src/app/_components/dummy-download.tsx b/src/app/_components/dummy-download.tsx index 3cb54d0..30b5812 100644 --- a/src/app/_components/dummy-download.tsx +++ b/src/app/_components/dummy-download.tsx @@ -1,6 +1,8 @@ "use client"; -import { api } from "~/lib/infrastructure/client/trpc/react"; +import clientContainer from "~/lib/infrastructure/client/config/ioc/client-container"; +import type { TClientComponentAPI } from "~/lib/infrastructure/client/trpc/react-api"; +import { TRPC } from "~/lib/infrastructure/client/config/ioc/client-ioc-symbols"; export type DummyDownloadProps = { clientId: number, @@ -13,7 +15,8 @@ export type DummyDownloadProps = { export function DummyDownloadComponent( props: DummyDownloadProps ) { - const downloadSourceDataMutation = api.sourceData.download.useMutation({ + const api = clientContainer.get(TRPC.REACT_CLIENT_COMPONENTS_API); + const downloadSourceDataMutation = api.kernel.sourceData.download.useMutation({ onSuccess: () => { console.log("Source data downloaded"); }, diff --git a/src/app/_components/dummy-send-message.tsx b/src/app/_components/dummy-send-message.tsx index 06b2a7b..10eadf3 100644 --- a/src/app/_components/dummy-send-message.tsx +++ b/src/app/_components/dummy-send-message.tsx @@ -1,6 +1,8 @@ "use client"; -import { api } from "~/lib/infrastructure/client/trpc/react"; +import clientContainer from "~/lib/infrastructure/client/config/ioc/client-container"; +import type { TClientComponentAPI } from "~/lib/infrastructure/client/trpc/react-api"; +import { TRPC } from "~/lib/infrastructure/client/config/ioc/client-ioc-symbols"; export type DummySendMessageProps = { conversationId: number, @@ -11,7 +13,8 @@ export type DummySendMessageProps = { export function DummySendMessage( props: DummySendMessageProps ) { - const sendMessageMutation = api.message.create.useMutation({ + const api = clientContainer.get(TRPC.REACT_CLIENT_COMPONENTS_API); + const sendMessageMutation = api.kernel.message.create.useMutation({ onSuccess: () => { console.log("Message sent"); }, diff --git a/src/app/_components/dummy-upload.tsx b/src/app/_components/dummy-upload.tsx index e47d5c3..7e64670 100644 --- a/src/app/_components/dummy-upload.tsx +++ b/src/app/_components/dummy-upload.tsx @@ -1,5 +1,7 @@ "use client"; -import { api } from "~/lib/infrastructure/client/trpc/react"; +import clientContainer from "~/lib/infrastructure/client/config/ioc/client-container"; +import type { TClientComponentAPI } from "~/lib/infrastructure/client/trpc/react-api"; +import { TRPC } from "~/lib/infrastructure/client/config/ioc/client-ioc-symbols"; export type DummyUploadProps = { clientId: number, @@ -13,7 +15,8 @@ export type DummyUploadProps = { export function DummyUploadComponent( props: DummyUploadProps ) { - const uploadSourceDataMutation = api.sourceData.create.useMutation({ + const api = clientContainer.get(TRPC.REACT_CLIENT_COMPONENTS_API); + const uploadSourceDataMutation = api.kernel.sourceData.create.useMutation({ onSuccess: () => { console.log("Source data uploaded"); }, diff --git a/src/app/_components/list-research-contexts.tsx b/src/app/_components/list-research-contexts.tsx index 9079dde..22dc696 100644 --- a/src/app/_components/list-research-contexts.tsx +++ b/src/app/_components/list-research-contexts.tsx @@ -1,7 +1,9 @@ "use client"; import { ResearchContextPage } from "@maany_shr/planckster-ui-kit"; import { type ResearchContext } from "node_modules/@maany_shr/kernel-planckster-sdk-ts"; -import { api } from "~/lib/infrastructure/client/trpc/react"; +import clientContainer from "~/lib/infrastructure/client/config/ioc/client-container"; +import type { TClientComponentAPI } from "~/lib/infrastructure/client/trpc/react-api"; +import { TRPC } from "~/lib/infrastructure/client/config/ioc/client-ioc-symbols"; export type ListResearchContextsPageProps = { researchContexts: ResearchContext[]; @@ -15,7 +17,8 @@ export type ListResearchContextsPageProps = { ) } export function ListResearchContextsPage(props: ListResearchContextsPageProps) { - const addNewContextMutation = api.researchContext.create.useMutation({ + const api = clientContainer.get(TRPC.REACT_CLIENT_COMPONENTS_API); + const addNewContextMutation = api.kernel.researchContext.create.useMutation({ onSuccess: () => { // TODO: handle success console.log("Context created"); diff --git a/src/app/api/trpc/[trpc]/route.ts b/src/app/api/trpc/[trpc]/route.ts index ed27bcf..c2056e9 100644 --- a/src/app/api/trpc/[trpc]/route.ts +++ b/src/app/api/trpc/[trpc]/route.ts @@ -2,7 +2,9 @@ import { fetchRequestHandler } from "@trpc/server/adapters/fetch"; import { type NextRequest } from "next/server"; import { env } from "~/env"; -import { appRouter } from "~/lib/infrastructure/server/trpc/app-router"; +import serverContainer from "~/lib/infrastructure/server/config/ioc/server-container"; +import { TRPC } from "~/lib/infrastructure/server/config/ioc/server-ioc-symbols"; +import { type AppRouter } from "~/lib/infrastructure/server/trpc/app-router"; import { createTRPCContext } from "~/lib/infrastructure/server/trpc/server"; /** @@ -15,8 +17,9 @@ const createContext = async (req: NextRequest) => { }); }; -const handler = (req: NextRequest) => - fetchRequestHandler({ +const handler = (req: NextRequest) => { + const appRouter: AppRouter = serverContainer.get(TRPC.APP_ROUTER); + return fetchRequestHandler({ endpoint: "/api/trpc", req, router: appRouter, @@ -29,6 +32,6 @@ const handler = (req: NextRequest) => ); } : undefined, - }); + })}; export { handler as GET, handler as POST }; diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 97ce442..55a10d9 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -2,7 +2,7 @@ import "~/styles/globals.css"; import serverContainer from "~/lib/infrastructure/server/config/ioc/server-container"; import { Inter } from "next/font/google"; -import { TRPCReactProvider } from "~/lib/infrastructure/client/trpc/react"; +import { TRPCReactProvider } from "~/lib/infrastructure/client/trpc/react-provider"; // Explicitly load the container to ensure all dependencies are loaded, else the optimization of the build will fail serverContainer.load(); diff --git a/src/app/page.tsx b/src/app/page.tsx index d78c58a..231787e 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -4,8 +4,8 @@ import { ListResearchContextsPage } from "./_components/list-research-contexts"; import type { ResearchContext } from "@maany_shr/kernel-planckster-sdk-ts"; import serverContainer from "~/lib/infrastructure/server/config/ioc/server-container"; import type AuthGatewayOutputPort from "~/lib/core/ports/secondary/auth-gateway-output-port"; -import { GATEWAYS } from "~/lib/infrastructure/server/config/ioc/server-ioc-symbols"; -import { api } from "~/lib/infrastructure/server/trpc/server-api"; +import { GATEWAYS, TRPC } from "~/lib/infrastructure/server/config/ioc/server-ioc-symbols"; +import type { TServerComponentAPI } from "~/lib/infrastructure/server/trpc/server-api"; export default async function Home() { const authGateway = serverContainer.get(GATEWAYS.AUTH_GATEWAY); const session = await authGateway.getSession(); @@ -19,10 +19,12 @@ export default async function Home() { async function ListResearchContexts() { const isConnected = false + const api: TServerComponentAPI = serverContainer.get(TRPC.REACT_SERVER_COMPONENTS_API); + let researchContexts: ResearchContext[] = []; if (isConnected) { - researchContexts = await api.researchContext.list( + researchContexts = await api.kernel.researchContext.list( { id: env.KP_CLIENT_ID, xAuthToken: env.KP_AUTH_TOKEN }, ); } diff --git a/src/app/sources/page.tsx b/src/app/sources/page.tsx index 680acb6..60cb832 100644 --- a/src/app/sources/page.tsx +++ b/src/app/sources/page.tsx @@ -2,10 +2,10 @@ import { env } from "~/env"; import { redirect } from "next/navigation"; import { DummyUploadComponent } from "../_components/dummy-upload"; import { DummyDownloadComponent } from "../_components/dummy-download"; -import { api } from "~/lib/infrastructure/server/trpc/server-api"; import type AuthGatewayOutputPort from "~/lib/core/ports/secondary/auth-gateway-output-port"; import serverContainer from "~/lib/infrastructure/server/config/ioc/server-container"; -import { GATEWAYS } from "~/lib/infrastructure/server/config/ioc/server-ioc-symbols"; +import { GATEWAYS, TRPC } from "~/lib/infrastructure/server/config/ioc/server-ioc-symbols"; +import type { TServerComponentAPI } from "~/lib/infrastructure/server/trpc/server-api"; export default async function Home() { const authGateway = serverContainer.get( @@ -19,13 +19,14 @@ export default async function Home() { } async function ListSourceData() { + const api: TServerComponentAPI = serverContainer.get(TRPC.REACT_SERVER_COMPONENTS_API); const authGateway = serverContainer.get( GATEWAYS.AUTH_GATEWAY, ); const session = await authGateway.getSession(); if (!session?.user) return null; - const sourceData = await api.sourceData.listForClient({ + const sourceData = await api.kernel.sourceData.listForClient({ clientId: env.KP_CLIENT_ID, xAuthToken: env.KP_AUTH_TOKEN, }); diff --git a/src/lib/infrastructure/client/config/ioc/client-container.ts b/src/lib/infrastructure/client/config/ioc/client-container.ts index 45b79c5..70916ca 100644 --- a/src/lib/infrastructure/client/config/ioc/client-container.ts +++ b/src/lib/infrastructure/client/config/ioc/client-container.ts @@ -1,7 +1,10 @@ import "reflect-metadata"; import { Container } from "inversify"; +import { TRPC } from "./client-ioc-symbols"; +import { api } from "~/lib/infrastructure/client/trpc/react-api"; const clientContainer = new Container(); +clientContainer.bind(TRPC.REACT_CLIENT_COMPONENTS_API).toConstantValue(api); export default clientContainer; \ No newline at end of file diff --git a/src/lib/infrastructure/client/config/ioc/client-ioc-symbols.ts b/src/lib/infrastructure/client/config/ioc/client-ioc-symbols.ts index e83b659..e9e81f7 100644 --- a/src/lib/infrastructure/client/config/ioc/client-ioc-symbols.ts +++ b/src/lib/infrastructure/client/config/ioc/client-ioc-symbols.ts @@ -1,5 +1,6 @@ -const SIGNALS = { - S_CLIENT_KP_CONNECTION_STATUS: Symbol.for("S_KP_CONNECTION_STATUS"), +export const SIGNALS = { } -export { SIGNALS }; \ No newline at end of file +export const TRPC = { + REACT_CLIENT_COMPONENTS_API: Symbol("TRPC_REACT_CLIENT_API"), +} \ No newline at end of file diff --git a/src/lib/infrastructure/client/trpc/react-api.ts b/src/lib/infrastructure/client/trpc/react-api.ts new file mode 100644 index 0000000..3ac770e --- /dev/null +++ b/src/lib/infrastructure/client/trpc/react-api.ts @@ -0,0 +1,8 @@ +"use client"; + +import { createTRPCReact } from "@trpc/react-query"; +import type { AppRouter } from "~/lib/infrastructure/server/trpc/app-router"; + +export const api = createTRPCReact(); + +export type TClientComponentAPI = typeof api; \ No newline at end of file diff --git a/src/lib/infrastructure/client/trpc/react.tsx b/src/lib/infrastructure/client/trpc/react-provider.tsx similarity index 86% rename from src/lib/infrastructure/client/trpc/react.tsx rename to src/lib/infrastructure/client/trpc/react-provider.tsx index 7efd675..bb96bee 100644 --- a/src/lib/infrastructure/client/trpc/react.tsx +++ b/src/lib/infrastructure/client/trpc/react-provider.tsx @@ -1,14 +1,11 @@ -/* eslint-disable @typescript-eslint/no-unsafe-return */ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ "use client"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import { loggerLink, unstable_httpBatchStreamLink } from "@trpc/client"; -import { createTRPCReact } from "@trpc/react-query"; import { useState } from "react"; import SuperJSON from "superjson"; -import type { AppRouter } from "~/lib/infrastructure/server/trpc/app-router"; +import { api } from "./react-api"; const createQueryClient = () => new QueryClient(); @@ -23,7 +20,6 @@ const getQueryClient = () => { return (clientQueryClientSingleton ??= createQueryClient()); }; -export const api = createTRPCReact(); export function TRPCReactProvider(props: { children: React.ReactNode }) { const queryClient = getQueryClient(); diff --git a/src/lib/infrastructure/server/config/ioc/server-container.ts b/src/lib/infrastructure/server/config/ioc/server-container.ts index dcf0dd3..deb0ba9 100644 --- a/src/lib/infrastructure/server/config/ioc/server-container.ts +++ b/src/lib/infrastructure/server/config/ioc/server-container.ts @@ -1,9 +1,11 @@ import "reflect-metadata"; import { Container } from "inversify"; -import { CONSTANTS, GATEWAYS } from "./server-ioc-symbols"; -import { authOptions } from "../auth/next-auth-config"; +import { CONSTANTS, GATEWAYS, TRPC } from "./server-ioc-symbols"; +import { authOptions } from "~/lib/infrastructure/server/config/auth/next-auth-config"; import type AuthGatewayOutputPort from "~/lib/core/ports/secondary/auth-gateway-output-port"; -import NextAuthGateway from "../../gateway/next-auth-gateway"; +import NextAuthGateway from "~/lib/infrastructure/server/gateway/next-auth-gateway"; +import { appRouter } from "~/lib/infrastructure/server/trpc/app-router"; +import { api } from "~/lib/infrastructure/server/trpc/server-api"; const serverContainer = new Container(); @@ -12,8 +14,14 @@ const serverContainer = new Container(); serverContainer.bind(CONSTANTS.NEXT_AUTH_OPTIONS).toConstantValue(authOptions); /** TRPC Server Side Router */ +serverContainer.bind(TRPC.APP_ROUTER).toConstantValue(appRouter); + +/** TRPC Server API : Should be used ONLY in Server Components */ +serverContainer.bind(TRPC.REACT_SERVER_COMPONENTS_API).toConstantValue(api); /**AuthGatewayOutputPort */ serverContainer.bind(GATEWAYS.AUTH_GATEWAY).to(NextAuthGateway).inSingletonScope(); + + export default serverContainer; diff --git a/src/lib/infrastructure/server/config/ioc/server-ioc-symbols.ts b/src/lib/infrastructure/server/config/ioc/server-ioc-symbols.ts index 0fb60fb..2968f86 100644 --- a/src/lib/infrastructure/server/config/ioc/server-ioc-symbols.ts +++ b/src/lib/infrastructure/server/config/ioc/server-ioc-symbols.ts @@ -5,6 +5,11 @@ export const CONSTANTS = { NEXT_AUTH_OPTIONS: Symbol.for('NEXT_AUTH_OPTIONS'), } +export const TRPC = { + APP_ROUTER: Symbol.for('APP_ROUTER'), + REACT_SERVER_COMPONENTS_API: Symbol.for('SERVER_API'), +} + export const GATEWAYS = { AUTH_GATEWAY: Symbol.for('AUTH_GATEWAY'), TRPC: Symbol.for('TRPC'), diff --git a/src/lib/infrastructure/server/trpc/app-router.ts b/src/lib/infrastructure/server/trpc/app-router.ts index a85ee45..1dcf5b8 100644 --- a/src/lib/infrastructure/server/trpc/app-router.ts +++ b/src/lib/infrastructure/server/trpc/app-router.ts @@ -13,12 +13,15 @@ import { createTRPCRouter } from "~/lib/infrastructure/server/trpc/server"; * All routers added in /api/routers should be manually added here. */ export const appRouter = createTRPCRouter({ + kernel: { + researchContext: researchContextRouter, + conversation: conversationRouter, + message: messageRouter, + sourceData: sourceDataRouter, + healthCheck: kernelPlancksterHealthCheckRouter, + }, post: postRouter, - researchContext: researchContextRouter, - conversation: conversationRouter, - message: messageRouter, - sourceData: sourceDataRouter, - healthCheck: kernelPlancksterHealthCheckRouter, + }); // export type definition of API diff --git a/src/lib/infrastructure/server/trpc/server-api.ts b/src/lib/infrastructure/server/trpc/server-api.ts index f31a331..9af3682 100644 --- a/src/lib/infrastructure/server/trpc/server-api.ts +++ b/src/lib/infrastructure/server/trpc/server-api.ts @@ -20,3 +20,5 @@ export const createCaller = createCallerFactory(appRouter); * This is the tRPC caller that is used to make tRPC calls from React Server Components. */ export const api = createCaller(createContext); + +export type TServerComponentAPI = typeof api; \ No newline at end of file