Files
sofa/app/(pages)/settings/page.tsx
T
jakeandClaude Opus 4.6 d9b408128b Remove unnecessary await/async from sync bun:sqlite db calls
drizzle-orm/bun-sqlite is fully synchronous — all queries return values
directly, not promises. Remove await from all db calls, drop async from
functions that no longer need it, simplify Promise.all patterns that
wrapped sync operations, and fix setSetting() which was missing .run()
(previously masked by await triggering execution via thenable).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 19:04:40 -05:00

104 lines
3.2 KiB
TypeScript

import { desc, eq } from "drizzle-orm";
import { headers } from "next/headers";
import { redirect } from "next/navigation";
import { auth } from "@/lib/auth/server";
import { db } from "@/lib/db/client";
import { webhookConnections, webhookEventLog } from "@/lib/db/schema";
import { getSetting } from "@/lib/services/settings";
import { APP_VERSION, GIT_COMMIT } from "@/lib/version";
import { AccountSection } from "./_components/account-section";
import { IntegrationsSection } from "./_components/integrations-section";
import { ServerSection } from "./_components/server-section";
import { SettingsShell } from "./_components/settings-shell";
export default async function SettingsPage() {
const session = await auth.api.getSession({ headers: await headers() });
if (!session?.user) redirect("/login");
const isAdmin = session.user.role === "admin";
const connections = db
.select()
.from(webhookConnections)
.where(eq(webhookConnections.userId, session.user.id))
.all()
.map((conn) => {
const events = db
.select()
.from(webhookEventLog)
.where(eq(webhookEventLog.connectionId, conn.id))
.orderBy(desc(webhookEventLog.receivedAt))
.limit(10)
.all();
return {
id: conn.id,
provider: conn.provider,
token: conn.token,
mediaServerUsername: conn.mediaServerUsername,
enabled: conn.enabled,
lastEventAt: conn.lastEventAt?.toISOString() ?? null,
recentEvents: events.map((e) => ({
id: e.id,
eventType: e.eventType,
mediaType: e.mediaType,
mediaTitle: e.mediaTitle,
status: e.status,
receivedAt: e.receivedAt.toISOString(),
})),
};
});
const registrationOpen = isAdmin
? getSetting("registrationOpen") === "true"
: false;
const repoUrl = "https://github.com/jakejarvis/sofa";
return (
<SettingsShell
footer={
<footer className="border-t border-border/50 pt-6 pb-2 text-center text-xs text-muted-foreground">
<p>
<a
href={repoUrl}
target="_blank"
rel="noopener noreferrer"
className="font-medium text-primary/80 hover:text-primary transition-colors"
>
Sofa
</a>{" "}
v{APP_VERSION}
{GIT_COMMIT && (
<>
{" "}
(
<a
href={`${repoUrl}/commit/${GIT_COMMIT}`}
target="_blank"
rel="noopener noreferrer"
className="font-mono hover:text-primary transition-colors"
>
{GIT_COMMIT}
</a>
)
</>
)}
</p>
</footer>
}
>
<AccountSection
user={{
name: session.user.name,
email: session.user.email,
createdAt: session.user.createdAt.toISOString(),
role: session.user.role ?? undefined,
}}
/>
<IntegrationsSection initialConnections={connections} />
{isAdmin && <ServerSection initialRegistrationOpen={registrationOpen} />}
</SettingsShell>
);
}