← GPT-AI-BANNER
CODE · 1.7 KB

api/library.js

Workspace snapshot · 09/04 13:35

import { RUNTIME_SERVICE_ID } from "./banner-core.js";

const internalUrl = "https://agent-venture-studio.com/api/internal/ai-banner-library";

function publicImageUrl(baseUrl, objectPath) {
  return `${baseUrl}/storage/v1/object/public/ai-banner-library/${String(objectPath).split("/").map(encodeURIComponent).join("/")}`;
}

export default async function handler(req, res) {
  try {
    if (req.method === "GET") {
      const baseUrl = process.env.SUPABASE_URL;
      const anonKey = process.env.SUPABASE_ANON_KEY;
      const response = await fetch(`${baseUrl}/rest/v1/ai_banner_library_items?select=id,title,format_label,direction,width,height,object_path,published_at&order=published_at.desc`, { headers: { apikey: anonKey, Authorization: `Bearer ${anonKey}` } });
      const items = await response.json();
      if (!response.ok) throw new Error(items?.message || "ライブラリを取得できませんでした");
      return res.status(200).json({ items: items.map((item) => ({ ...item, imageUrl: publicImageUrl(baseUrl, item.object_path) })) });
    }
    if (req.method !== "POST") return res.status(405).json({ error: "GETまたはPOSTのみ利用できます" });
    if (req.body?.action === "backfill") return res.status(400).json({ error: "一括公開は終了しました" });
    const payload = req.body;
    const response = await fetch(internalUrl, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ...payload, serviceId: RUNTIME_SERVICE_ID, token: process.env.AVS_LLM_RUNTIME_SERVICE_TOKEN }) });
    const data = await response.json();
    return res.status(response.status).json(data);
  } catch (error) { return res.status(500).json({ error: error.message }); }
}