aegida-console / app / api / me / model / route.ts
route.ts
Raw
import { AuthError, authenticateRequest } from "@/lib/auth/server";
import { CatalogError, listGateModels } from "@/lib/chat/catalog";
import { isModelId } from "@/lib/chat/types";
import { getPool } from "@/lib/db/pool";
import { updateLastModelId } from "@/lib/db/users";

const noStoreHeaders = { "Cache-Control": "no-store" };
export async function PATCH(request: Request): Promise<Response> {
  try {
    const user = await authenticateRequest(request);
    const authorization = request.headers.get("Authorization");
    if (!authorization) throw new AuthError();
    const body: unknown = await request.json();
    const model =
      typeof body === "object" && body !== null && "model" in body
        ? body.model
        : undefined;
    if (!isModelId(model)) {
      return Response.json({ error: "Некорректный запрос" }, { status: 400, headers: noStoreHeaders });
    }
    const models = await listGateModels(authorization, request.signal);
    if (!models.some((item) => item.id === model)) {
      return Response.json({ error: "Некорректный запрос" }, { status: 400, headers: noStoreHeaders });
    }
    await updateLastModelId(getPool(), user.id, model);
    return Response.json({ model }, { headers: noStoreHeaders });
  } catch (error) {
    const status =
      error instanceof AuthError ||
      (error instanceof CatalogError && error.reason === "unauthorized")
        ? 401
        : 503;
    return Response.json(
      { error: status === 401 ? "Unauthorized" : "Хранилище чатов временно недоступно" },
      { status, headers: noStoreHeaders },
    );
  }
}