import { serve } from "https://deno.land/std@0.220.1/http/server.ts";
// HTML 页面
const html = `
AI Models Price Update
`;
// 使用 Deno KV 存储数据
const kv = await Deno.openKv();
// 读取价格数据
async function readPrices(): Promise {
const prices = await kv.get(["prices"]);
return prices.value || [];
}
// 写入价格数据
async function writePrices(prices: any[]): Promise {
await kv.set(["prices"], prices);
}
// 验证请求数据
function validateData(data: any): string | null {
if (!data.model || !data.type || !data.channel_type || !data.input || !data.output) {
return "所有字段都是必需的";
}
if (isNaN(data.channel_type) || isNaN(data.input) || isNaN(data.output)) {
return "数字字段格式无效";
}
return null;
}
// 处理请求
async function handler(req: Request): Promise {
const url = new URL(req.url);
// 添加 CORS 支持
const headers = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type",
};
// 处理 OPTIONS 请求
if (req.method === "OPTIONS") {
return new Response(null, { headers });
}
// 提供静态页面
if (url.pathname === "/" || url.pathname === "/index.html") {
return new Response(html, {
headers: {
"Content-Type": "text/html; charset=utf-8",
...headers
}
});
}
// API 端点
if (url.pathname === "/api/prices") {
if (req.method === "POST") {
try {
let data;
const contentType = req.headers.get("content-type") || "";
if (contentType.includes("application/json")) {
data = await req.json();
} else if (contentType.includes("application/x-www-form-urlencoded")) {
const formData = await req.formData();
data = {};
for (const [key, value] of formData.entries()) {
data[key] = value;
}
} else {
throw new Error("不支持的内容类型");
}
// 验证数据
const error = validateData(data);
if (error) {
return new Response(JSON.stringify({ error }), {
status: 400,
headers: {
"Content-Type": "application/json",
...headers
}
});
}
// 转换数据类型
const newPrice = {
model: data.model,
type: data.type,
channel_type: parseInt(data.channel_type),
input: parseFloat(data.input),
output: parseFloat(data.output)
};
// 读取现有数据
const prices = await readPrices();
// 添加新数据
prices.push(newPrice);
// 保存数据
await writePrices(prices);
return new Response(JSON.stringify({ success: true }), {
headers: {
"Content-Type": "application/json",
...headers
}
});
} catch (error) {
console.error("Error:", error);
return new Response(JSON.stringify({ error: error.message }), {
status: 500,
headers: {
"Content-Type": "application/json",
...headers
}
});
}
} else if (req.method === "GET") {
const prices = await readPrices();
return new Response(JSON.stringify(prices), {
headers: {
"Content-Type": "application/json",
...headers
}
});
}
}
return new Response("Not Found", {
status: 404,
headers
});
}
// 启动服务器
serve(handler);