IKHSAN
ENID Baca dalam Bahasa Indonesia

homeio

Public

Forked from doctor-io/homeio

Branch
main
Latest commit
958d74616 October 2026

route.ts

Open raw
import { NextResponse } from "next/server";
import { db } from "@/lib/server/db/drizzle";
import { settings } from "@/lib/server/db/schema";
import {
  DEFAULT_APPEARANCE_SETTINGS,
  sanitizeAppearanceSettings,
  type AppearanceSettings,
} from "@/lib/desktop/appearance";
import { eq } from "drizzle-orm";
import { requireApiSession } from "@/lib/server/modules/auth/api";

export const runtime = "nodejs";

async function getAppearance(): Promise<AppearanceSettings> {
  const rows = await db.select().from(settings).where(eq(settings.id, "singleton")).limit(1);
  if (rows.length === 0 || !rows[0].appearanceJson) {
    return DEFAULT_APPEARANCE_SETTINGS;
  }
  return sanitizeAppearanceSettings(rows[0].appearanceJson);
}

export async function GET(request: Request) {
  const apiSession = await requireApiSession(request);
  if (apiSession.response) return apiSession.response;
  try {
    const appearance = await getAppearance();
    return NextResponse.json({ data: appearance });
  } catch {
    return NextResponse.json({ data: DEFAULT_APPEARANCE_SETTINGS });
  }
}

export async function PUT(request: Request) {
  const apiSession = await requireApiSession(request);
  if (apiSession.response) return apiSession.response;
  try {
    const body = await request.json();
    const appearance = sanitizeAppearanceSettings(body);

    await db
      .insert(settings)
      .values({ id: "singleton", appearanceJson: appearance })
      .onConflictDoUpdate({
        target: settings.id,
        set: { appearanceJson: appearance, updatedAt: new Date() },
      });

    return NextResponse.json({ data: appearance });
  } catch (err) {
    console.error("[appearance PUT]", err);
    return NextResponse.json({ error: "Failed to save appearance" }, { status: 500 });
  }
}
bytes
1,781
lines
54
Type
ts
Latest commit
16 October 2026