mirror of
https://github.com/linsa-io/linsa.git
synced 2026-04-10 10:53:42 +02:00
142 lines
3.8 KiB
TypeScript
142 lines
3.8 KiB
TypeScript
import { createFileRoute } from "@tanstack/react-router"
|
|
import { getAuth } from "@/lib/auth"
|
|
import { db } from "@/db/connection"
|
|
import { browser_sessions, browser_session_tabs } from "@/db/schema"
|
|
import { eq, and } from "drizzle-orm"
|
|
|
|
const jsonResponse = (data: unknown, status = 200) =>
|
|
new Response(JSON.stringify(data), {
|
|
status,
|
|
headers: { "content-type": "application/json" },
|
|
})
|
|
|
|
export const Route = createFileRoute("/api/browser-sessions/$sessionId")({
|
|
server: {
|
|
handlers: {
|
|
GET: async ({
|
|
request,
|
|
params,
|
|
}: {
|
|
request: Request
|
|
params: { sessionId: string }
|
|
}) => {
|
|
const session = await getAuth().api.getSession({
|
|
headers: request.headers,
|
|
})
|
|
if (!session?.user?.id) {
|
|
return jsonResponse({ error: "Unauthorized" }, 401)
|
|
}
|
|
|
|
const { sessionId } = params
|
|
|
|
// Get session
|
|
const [browserSession] = await db()
|
|
.select()
|
|
.from(browser_sessions)
|
|
.where(
|
|
and(
|
|
eq(browser_sessions.id, sessionId),
|
|
eq(browser_sessions.user_id, session.user.id),
|
|
),
|
|
)
|
|
.limit(1)
|
|
|
|
if (!browserSession) {
|
|
return jsonResponse({ error: "Session not found" }, 404)
|
|
}
|
|
|
|
// Get tabs
|
|
const tabs = await db()
|
|
.select()
|
|
.from(browser_session_tabs)
|
|
.where(eq(browser_session_tabs.session_id, sessionId))
|
|
.orderBy(browser_session_tabs.position)
|
|
|
|
return jsonResponse({ session: browserSession, tabs })
|
|
},
|
|
|
|
PATCH: async ({
|
|
request,
|
|
params,
|
|
}: {
|
|
request: Request
|
|
params: { sessionId: string }
|
|
}) => {
|
|
const session = await getAuth().api.getSession({
|
|
headers: request.headers,
|
|
})
|
|
if (!session?.user?.id) {
|
|
return jsonResponse({ error: "Unauthorized" }, 401)
|
|
}
|
|
|
|
const { sessionId } = params
|
|
const body = (await request.json().catch(() => ({}))) as {
|
|
name?: string
|
|
is_favorite?: boolean
|
|
}
|
|
|
|
// Verify ownership
|
|
const [existing] = await db()
|
|
.select()
|
|
.from(browser_sessions)
|
|
.where(
|
|
and(
|
|
eq(browser_sessions.id, sessionId),
|
|
eq(browser_sessions.user_id, session.user.id),
|
|
),
|
|
)
|
|
.limit(1)
|
|
|
|
if (!existing) {
|
|
return jsonResponse({ error: "Session not found" }, 404)
|
|
}
|
|
|
|
// Build update
|
|
const updates: Partial<{ name: string; is_favorite: boolean }> = {}
|
|
if (body.name !== undefined) updates.name = body.name
|
|
if (body.is_favorite !== undefined) updates.is_favorite = body.is_favorite
|
|
|
|
if (Object.keys(updates).length === 0) {
|
|
return jsonResponse({ error: "No updates provided" }, 400)
|
|
}
|
|
|
|
const [updated] = await db()
|
|
.update(browser_sessions)
|
|
.set(updates)
|
|
.where(eq(browser_sessions.id, sessionId))
|
|
.returning()
|
|
|
|
return jsonResponse({ session: updated })
|
|
},
|
|
|
|
DELETE: async ({
|
|
request,
|
|
params,
|
|
}: {
|
|
request: Request
|
|
params: { sessionId: string }
|
|
}) => {
|
|
const session = await getAuth().api.getSession({
|
|
headers: request.headers,
|
|
})
|
|
if (!session?.user?.id) {
|
|
return jsonResponse({ error: "Unauthorized" }, 401)
|
|
}
|
|
|
|
const { sessionId } = params
|
|
|
|
await db()
|
|
.delete(browser_sessions)
|
|
.where(
|
|
and(
|
|
eq(browser_sessions.id, sessionId),
|
|
eq(browser_sessions.user_id, session.user.id),
|
|
),
|
|
)
|
|
|
|
return jsonResponse({ success: true })
|
|
},
|
|
},
|
|
},
|
|
})
|