From d868baade5a8f59b951eaecb8b68ead89c56d6e8 Mon Sep 17 00:00:00 2001 From: Nathan Rashleigh Date: Tue, 29 Apr 2025 20:34:01 +1000 Subject: [PATCH] prisma types --- crates/api/auth.middleware.ts | 61 +++++++++++++------------------ crates/api/error.middleware.ts | 29 +++++++++++++++ crates/api/pg.ts | 6 +-- crates/components/main.tsx | 32 ++++++++-------- crates/components/offer.group.tsx | 61 ++++--------------------------- crates/components/offer.tsx | 22 +++-------- crates/deno.jsonc | 8 +++- crates/fresh.config.ts | 8 ++-- crates/fresh.gen.ts | 6 +++ crates/package.json | 1 + crates/prisma/schema.prisma | 2 +- crates/routes/_middleware.ts | 18 +++++++++ crates/routes/api/offers.ts | 15 ++++++++ crates/routes/api/wants.ts | 15 ++++++++ crates/routes/home.tsx | 26 +++++++++++++ crates/routes/index.tsx | 29 --------------- crates/routes/login.tsx | 9 ++--- 17 files changed, 184 insertions(+), 164 deletions(-) create mode 100644 crates/api/error.middleware.ts create mode 100644 crates/routes/_middleware.ts create mode 100644 crates/routes/api/offers.ts create mode 100644 crates/routes/api/wants.ts create mode 100644 crates/routes/home.tsx delete mode 100644 crates/routes/index.tsx diff --git a/crates/api/auth.middleware.ts b/crates/api/auth.middleware.ts index 699d21e..cd703e4 100644 --- a/crates/api/auth.middleware.ts +++ b/crates/api/auth.middleware.ts @@ -18,8 +18,11 @@ export async function authMiddleware(req: Request, ctx: FreshContext): Promise session.expiresAt) { - if (session) { - sessions.delete(sessionId) - } - throw new Error("Invalid or expired session") - } + // Verify session + const session = sessions.get(sessionId) - // Get user from database - const pg = createPg(console) - const user = await pg.userFindId(session.userId) - - if (!user) { - throw new Error("User not found") + if (!session || new Date() > session.expiresAt) { + if (session) { + sessions.delete(sessionId) } - - // Add user to state for use in handlers - ctx.state.user = user - return await ctx.next() - } catch (error) { - console.error("Auth error:", error) - - if (path.startsWith("/api/")) { - return new Response(JSON.stringify({ error: "Unauthorized" }), { - status: 401, - headers: { "Content-Type": "application/json" } - }) - } - - // Redirect to login page for non-API routes - return new Response(null, { - status: 302, - headers: { Location: "/" } - }) + throw new Error("Invalid or expired session") } + + // Get user from database + const pg = createPg(console) + const user = await pg.userFindId(session.userId) + + if (!user) { + throw new Error("User not found") + } + + ctx.state.user = user + ctx.state.pg = pg + + console.log("woas") + + return await ctx.next() } \ No newline at end of file diff --git a/crates/api/error.middleware.ts b/crates/api/error.middleware.ts new file mode 100644 index 0000000..4a1fad5 --- /dev/null +++ b/crates/api/error.middleware.ts @@ -0,0 +1,29 @@ +import { FreshContext } from "$fresh/server.ts" + +export async function errorMiddleware(req: Request, ctx: FreshContext): Promise { + try { + const response = await ctx.next() + return response + } catch (error) { + console.error(`Error handling ${req.method} ${new URL(req.url).pathname}:`, error) + + // Check if this is an API route + const isApiRoute = new URL(req.url).pathname.startsWith("/api/") + + if (isApiRoute) { + return new Response(JSON.stringify({ + error: "Internal server error", + message: error.message + }), { + status: 500, + headers: { "Content-Type": "application/json" } + }) + } + + // For non-API routes, return a redirect to an error page or render an error component + return new Response(null, { + status: 302, + headers: { Location: "/?error=server_error" } + }) + } +} \ No newline at end of file diff --git a/crates/api/pg.ts b/crates/api/pg.ts index 6e20b72..34078b2 100644 --- a/crates/api/pg.ts +++ b/crates/api/pg.ts @@ -1,6 +1,6 @@ import * as bcrypt from "https://deno.land/x/bcrypt@v0.4.1/mod.ts" import { load } from "$std/dotenv/mod.ts" -import { PrismaClient } from "prisma/generated/index.js"; +import { PrismaClient } from "prisma/generated/index.ts"; // Load environment variables await load({ export: true }) @@ -32,7 +32,7 @@ export function createPg(log: Console) { return prisma.user.findUnique({ where: { email } }) } - async function userWants(user: any) { + async function userWants(user: User) { const wants = await prisma.want.findMany({ where: { userId: user.id }, include: { _count: { select: { offers: true } } }, @@ -46,7 +46,7 @@ export function createPg(log: Console) { }) } - async function userOffers(user: any) { + async function userOffers(user: User) { return prisma.offer.findMany({ where: { userId: user.id, diff --git a/crates/components/main.tsx b/crates/components/main.tsx index 0e406c7..1e49cdb 100644 --- a/crates/components/main.tsx +++ b/crates/components/main.tsx @@ -1,11 +1,7 @@ import { h } from 'preact'; -import { route } from 'preact-router'; -import { useSelector } from 'react-redux' +// import { route } from 'preact-router'; -import { State } from './../store'; -import * as toast from './../toast'; - -import OfferGroup from './../components/offer.group'; +import OfferGroup from "./offer.group.tsx"; const GroupNav = (want) => { if (!want._count.offers) return null @@ -19,19 +15,25 @@ const GroupNav = (want) => { ); }; -function Home() { - const offers = useSelector((state: State) => state.offers); - const wants = useSelector((state: State) => state.wants); - +function Main({ wants, offers }) { if (offers && offers.length === 0) { - toast.info('no offers', 'You have no offers yet, search for some more items.'); - route('/search'); + // Redirect to search if no offers + if (typeof window !== 'undefined') { + // route('/search'); + } } - if (!offers || !wants) return
loading...
; + if (!offers || !wants) { + return ( +
+

No wants or offers found.

+ Search Records +
+ ); + } return ( -
+