summaryrefslogtreecommitdiff
path: root/src/auth.tsx
diff options
context:
space:
mode:
Diffstat (limited to 'src/auth.tsx')
-rw-r--r--src/auth.tsx26
1 files changed, 20 insertions, 6 deletions
diff --git a/src/auth.tsx b/src/auth.tsx
index ebda74e..eef8b8f 100644
--- a/src/auth.tsx
+++ b/src/auth.tsx
@@ -1,19 +1,35 @@
import { Hono } from "hono";
import * as swa from "@simplewebauthn/server";
import { randomUUID } from "node:crypto";
-import { eq } from "drizzle-orm";
+import { and, eq, gt, sql } from "drizzle-orm";
import { RP_ID, ORIGIN, db } from "./index.js";
import { sessionTable, userTable, webauthnChallenges } from "./db/schema.js";
import { stringify, parse } from "superjson";
-import { setCookie } from "hono/cookie";
-
-let app = new Hono();
+import { getCookie, setCookie } from "hono/cookie";
+import type { Context } from "hono";
export const LoginForm = () => <section class="register-form">
<button hx-post="/auth/register-begin" hx-target="closest .register-form" hx-swap="outerHTML">register</button>
<button hx-post="/auth/login-begin" hx-target="closest .register-form" hx-swap="outerHTML">login</button>
</section>;
+export async function getSession(c: Context) {
+ let sessionId = getCookie(c, "session");
+ if (!sessionId) return null;
+
+ let [result] = await db
+ .select()
+ .from(sessionTable)
+ .innerJoin(userTable, eq(userTable.id, sessionTable.userId))
+ .where(({ sessions: session }) => and(eq(session.uuid, sessionId), gt(session.lastUse, sql`unixepoch() - ${60 * 60 * 24 * 7}`)));
+ if (!result) return null;
+ await db.update(sessionTable).set({ lastUse: sql`unixepoch()` }).where(eq(sessionTable.id, result.sessions.id));
+ return { user: result.users, lastUse: result.sessions.lastUse, uuid: result.sessions.uuid };
+}
+
+let app = new Hono();
+export default app;
+
app.post("/register-begin", async c => {
const username = randomUUID();
let options = await swa.generateRegistrationOptions({
@@ -89,5 +105,3 @@ app.post("/login-finish", async c => {
setCookie(c, "session", uuid);
return c.html(<p>Logged in!</p>);
});
-
-export default app;