basic user-tailored UI

master
Avraham Sakal 4 weeks ago
parent 83e3f867dd
commit 61540f9338

@ -34,7 +34,7 @@ export interface Entity<T> {
construct: (data: T) => T; construct: (data: T) => T;
create: (data: Omit<T, "id">) => Promise<T>; create: (data: Omit<T, "id">) => Promise<T>;
createMany: (data: Omit<T, "id">[]) => Promise<T[]>; createMany: (data: Omit<T, "id">[]) => Promise<T[]>;
findAll: () => Promise<T[]>; findAll: (user?: { userId: string }) => Promise<T[]>;
findById: (id: string) => Promise<T | undefined>; findById: (id: string) => Promise<T | undefined>;
update: (id: string, data: Partial<T>) => Promise<void>; update: (id: string, data: Partial<T>) => Promise<void>;
delete: (id: string) => Promise<void>; delete: (id: string) => Promise<void>;

@ -58,11 +58,13 @@ export function getDb(POSTGRES_CONNECTION_STRING: string) {
.execute(); .execute();
return insertedRows; return insertedRows;
}, },
findAll: async () => { findAll: async (user) => {
const rows = await dbClient const userId = user?.userId;
.selectFrom("conversations") let query = await dbClient.selectFrom("conversations");
.selectAll() if (userId) {
.execute(); query = query.where("userId", "=", userId);
}
const rows = query.selectAll().execute();
return rows; return rows;
}, },
findById: async (id) => { findById: async (id) => {

@ -16,6 +16,7 @@ export const data = async (pageContext: PageContextServer) => {
openrouter: getOpenrouter( openrouter: getOpenrouter(
(pageContext.env?.OPENROUTER_API_KEY || env.OPENROUTER_API_KEY) as string (pageContext.env?.OPENROUTER_API_KEY || env.OPENROUTER_API_KEY) as string
), ),
// jwt: pageContext.,
}); });
const [ const [

@ -5,18 +5,19 @@ import {
} from "../../trpc/server"; } from "../../trpc/server";
export const conversations = router({ export const conversations = router({
fetchAll: publicProcedure.query(async ({ ctx: { db } }) => { fetchAll: publicProcedure.query(async ({ ctx: { db, jwt } }) => {
return await db.conversations.findAll(); console.log("jwt", jwt);
return await db.conversations.findAll({ userId: jwt?.id as string });
}), }),
fetchOne: publicProcedure fetchOne: publicProcedure
.input((x) => x as { id: string }) .input((x) => x as { id: string })
.query(async ({ input: { id }, ctx: { db } }) => { .query(async ({ input: { id }, ctx: { db } }) => {
return await db.conversations.findById(id); return await db.conversations.findById(id);
}), }),
start: publicProcedure.mutation(async ({ ctx: { db } }) => { start: publicProcedure.mutation(async ({ ctx: { db, jwt } }) => {
const row = { const row = {
title: "New Conversation", title: "New Conversation",
userId: "019900bb-61b3-7333-b760-b27784dfe33b", userId: jwt?.id as string,
}; };
return await db.conversations.create(row); return await db.conversations.create(row);
}), }),

@ -73,7 +73,7 @@ export const chat = router({
input: { conversationId, messages, systemPrompt, parameters }, input: { conversationId, messages, systemPrompt, parameters },
ctx, ctx,
}) { }) {
const { db, openrouter } = ctx; const { db, openrouter, jwt } = ctx;
const factsCaller = createCallerFacts(ctx); const factsCaller = createCallerFacts(ctx);
const messagesCaller = createCallerMessages(ctx); const messagesCaller = createCallerMessages(ctx);
const factTriggerCaller = createCallerFactTriggers(ctx); const factTriggerCaller = createCallerFactTriggers(ctx);
@ -173,7 +173,7 @@ export const chat = router({
}); });
const insertedFactsFromUserMessage = await db.facts.createMany( const insertedFactsFromUserMessage = await db.facts.createMany(
factsFromUserMessageResponse.object.facts.map((fact) => ({ factsFromUserMessageResponse.object.facts.map((fact) => ({
userId: "019900bb-61b3-7333-b760-b27784dfe33b", userId: jwt?.id as string,
sourceMessageId: insertedUserMessage.id, sourceMessageId: insertedUserMessage.id,
content: fact, content: fact,
})) }))
@ -228,7 +228,7 @@ export const chat = router({
const insertedFactsFromAssistantMessage = await db.facts.createMany( const insertedFactsFromAssistantMessage = await db.facts.createMany(
factsFromAssistantMessageResponse.object.facts.map((factContent) => ({ factsFromAssistantMessageResponse.object.facts.map((factContent) => ({
userId: "019900bb-61b3-7333-b760-b27784dfe33b", userId: jwt?.id as string,
sourceMessageId: insertedAssistantMessage.id, sourceMessageId: insertedAssistantMessage.id,
content: factContent, content: factContent,
createdAt: new Date().toISOString(), createdAt: new Date().toISOString(),

@ -4,7 +4,7 @@ import {
createActionURL, createActionURL,
setEnvDefaults, setEnvDefaults,
} from "@auth/core"; } from "@auth/core";
import CredentialsProvider from "@auth/core/providers/credentials"; // import CredentialsProvider from "@auth/core/providers/credentials";
import GoogleProvider from "@auth/core/providers/google"; import GoogleProvider from "@auth/core/providers/google";
import type { Session } from "@auth/core/types"; import type { Session } from "@auth/core/types";
// TODO: stop using universal-middleware and directly integrate server middlewares instead and/or use vike-server https://vike.dev/server. (Bati generates boilerplates that use universal-middleware https://github.com/magne4000/universal-middleware to make Bati's internal logic easier. This is temporary and will be removed soon.) // TODO: stop using universal-middleware and directly integrate server middlewares instead and/or use vike-server https://vike.dev/server. (Bati generates boilerplates that use universal-middleware https://github.com/magne4000/universal-middleware to make Bati's internal logic easier. This is temporary and will be removed soon.)
@ -41,26 +41,26 @@ const authjsConfig = {
secret: "buginoo", secret: "buginoo",
providers: [ providers: [
// TODO: Choose and implement providers // TODO: Choose and implement providers
CredentialsProvider({ // CredentialsProvider({
name: "Credentials", // name: "Credentials",
credentials: { // credentials: {
username: { label: "Username", type: "text", placeholder: "jsmith" }, // username: { label: "Username", type: "text", placeholder: "jsmith" },
password: { label: "Password", type: "password" }, // password: { label: "Password", type: "password" },
}, // },
async authorize() { // async authorize() {
// Add logic here to look up the user from the credentials supplied // // Add logic here to look up the user from the credentials supplied
const user = { // const user = {
id: "019900bb-61b3-7333-b760-b27784dfe33b", // id: "019900bb-61b3-7333-b760-b27784dfe33b",
name: "J Smith", // name: "J Smith",
email: "jsmith@example.com", // email: "jsmith@example.com",
}; // };
// Any object returned will be saved in `user` property of the JWT // // Any object returned will be saved in `user` property of the JWT
// If you return null then an error will be displayed advising the user to check their details. // // If you return null then an error will be displayed advising the user to check their details.
// You can also Reject this callback with an Error thus the user will be sent to the error page with the error message as a query parameter // // You can also Reject this callback with an Error thus the user will be sent to the error page with the error message as a query parameter
return user ?? null; // return user ?? null;
}, // },
}), // }),
GoogleProvider({ GoogleProvider({
clientId: clientId:
"697711350664-t6237s5n3ttjd1npp1qif1aupptkr0va.apps.googleusercontent.com", "697711350664-t6237s5n3ttjd1npp1qif1aupptkr0va.apps.googleusercontent.com",

@ -9,13 +9,14 @@ import { fetchRequestHandler } from "@trpc/server/adapters/fetch";
import { getDb, getDbClient } from "../database/postgres"; import { getDb, getDbClient } from "../database/postgres";
import { getOpenrouter } from "../pages/chat/provider"; import { getOpenrouter } from "../pages/chat/provider";
import { env as processEnv } from "./env.js"; import { env as processEnv } from "./env.js";
import { getToken } from "@auth/core/jwt";
export const trpcHandler = ((endpoint) => (request, context, runtime) => { export const trpcHandler = ((endpoint) => (request, context, runtime) => {
return fetchRequestHandler({ return fetchRequestHandler({
endpoint, endpoint,
req: request, req: request,
router: appRouter, router: appRouter,
createContext({ req, resHeaders }) { async createContext({ req, resHeaders }) {
const env = getEnv(runtime); const env = getEnv(runtime);
const dbClient = getDbClient( const dbClient = getDbClient(
(env.POSTGRES_CONNECTION_STRING || (env.POSTGRES_CONNECTION_STRING ||
@ -28,6 +29,7 @@ export const trpcHandler = ((endpoint) => (request, context, runtime) => {
const openrouter = getOpenrouter( const openrouter = getOpenrouter(
(env.OPENROUTER_API_KEY || processEnv.OPENROUTER_API_KEY) as string (env.OPENROUTER_API_KEY || processEnv.OPENROUTER_API_KEY) as string
); );
const jwt = await getToken({ req: request, secret: "buginoo" });
return { return {
...context, ...context,
...runtime, ...runtime,
@ -36,6 +38,7 @@ export const trpcHandler = ((endpoint) => (request, context, runtime) => {
dbClient, dbClient,
db, db,
openrouter, openrouter,
jwt,
}; };
}, },
allowMethodOverride: true, allowMethodOverride: true,

@ -3,6 +3,7 @@ import { TypeCompiler } from "@sinclair/typebox/compiler";
import { initTRPC, TRPCError } from "@trpc/server"; import { initTRPC, TRPCError } from "@trpc/server";
import type { getDb } from "../database/postgres"; import type { getDb } from "../database/postgres";
import type { getOpenrouter } from "../pages/chat/provider"; import type { getOpenrouter } from "../pages/chat/provider";
import type { JWT } from "@auth/core/jwt";
/** /**
* Initialization of tRPC backend * Initialization of tRPC backend
@ -13,6 +14,7 @@ const t = initTRPC
object & { object & {
db: ReturnType<typeof getDb>; db: ReturnType<typeof getDb>;
openrouter: ReturnType<typeof getOpenrouter>; openrouter: ReturnType<typeof getOpenrouter>;
jwt?: JWT | null;
} }
>() >()
.create(/*{ .create(/*{

Loading…
Cancel
Save