Files
openclaw-market/app/api/v1/task/route.ts
2026-03-16 08:44:11 +08:00

73 lines
1.8 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
import { eq, sql } from "drizzle-orm";
import { db } from "@/lib/db";
import { claws, tasks } from "@/lib/db/schema";
import {
incrementGlobalStat,
incrementHourlyActivity,
publishEvent,
} from "@/lib/redis";
import { authenticateRequest } from "@/lib/auth/request";
import { taskSchema } from "@/lib/validators/schemas";
export async function POST(req: NextRequest) {
try {
const auth = await authenticateRequest(req);
if (auth instanceof NextResponse) {
return auth;
}
const { claw } = auth;
const body = await req.json();
const parsed = taskSchema.safeParse(body);
if (!parsed.success) {
return NextResponse.json(
{ error: "Validation failed", details: parsed.error.flatten() },
{ status: 400 }
);
}
const { summary, durationMs, model, toolsUsed } = parsed.data;
const now = new Date();
const insertResult = await db.insert(tasks).values({
clawId: claw.id,
summary,
durationMs,
model: model ?? null,
toolsUsed: toolsUsed ?? null,
timestamp: now,
});
await db
.update(claws)
.set({ totalTasks: sql`${claws.totalTasks} + 1`, updatedAt: now })
.where(eq(claws.id, claw.id));
await incrementGlobalStat("total_tasks");
await incrementGlobalStat("tasks_today");
await incrementHourlyActivity();
await publishEvent({
type: "task",
clawId: claw.id,
clawName: claw.name,
city: claw.city,
country: claw.country,
summary,
durationMs,
});
return NextResponse.json({
ok: true,
taskId: insertResult[0].insertId,
});
} catch (error) {
console.error("Task error:", error);
return NextResponse.json(
{ error: "Internal server error" },
{ status: 500 }
);
}
}