basic user-tailored UI
This commit is contained in:
+1
-1
@@ -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);
|
||||||
}),
|
}),
|
||||||
|
|||||||
+3
-3
@@ -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(),
|
||||||
|
|||||||
+20
-20
@@ -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(/*{
|
||||||
|
|||||||
Reference in New Issue
Block a user