fix(platform): address bot review comments (sentry + coderabbit)

- CRITICAL: Use execute_raw_with_schema for INSERT (not query_raw)
- Remove accidentally committed transcripts/
- Add dry_run guard to skip cost logging for simulated executions
- Change onDelete: Cascade → SetNull to preserve cost history
- Add standalone createdAt index for date-only queries
- Add deterministic tiebreaker (id) to pagination ORDER BY
- Update migration SQL to match schema changes
This commit is contained in:
Zamil Majdy
2026-04-02 16:26:01 +02:00
parent c054799b4f
commit 9924dedddc
4 changed files with 14 additions and 7 deletions

View File

@@ -6,7 +6,7 @@ from typing import Any
from pydantic import BaseModel
from backend.data.db import query_raw_with_schema
from backend.data.db import execute_raw_with_schema, query_raw_with_schema
logger = logging.getLogger(__name__)
@@ -31,7 +31,7 @@ class PlatformCostEntry(BaseModel):
async def log_platform_cost(entry: PlatformCostEntry) -> None:
await query_raw_with_schema(
await execute_raw_with_schema(
"""
INSERT INTO {schema_prefix}"PlatformCostLog"
("id", "createdAt", "userId", "graphExecId", "nodeExecId",
@@ -278,7 +278,7 @@ async def get_platform_cost_logs(
FROM {{schema_prefix}}"PlatformCostLog" p
LEFT JOIN {{schema_prefix}}"User" u ON u."id" = p."userId"
WHERE {where_sql}
ORDER BY p."createdAt" DESC
ORDER BY p."createdAt" DESC, p."id" DESC
LIMIT ${limit_idx} OFFSET ${offset_idx}
""",
*params,

View File

@@ -2054,6 +2054,9 @@ async def _log_system_credential_cost(
(e.g. OpenRouter returns a cost field). The credit_cost in metadata
captures our internal credit charge as a proxy.
"""
if node_exec.execution_context.dry_run:
return
input_data = node_exec.inputs
input_model = cast(type[BlockSchema], block.input_schema)

View File

@@ -2,7 +2,7 @@
CREATE TABLE "PlatformCostLog" (
"id" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"userId" TEXT NOT NULL,
"userId" TEXT,
"graphExecId" TEXT,
"nodeExecId" TEXT,
"graphId" TEXT,
@@ -28,8 +28,11 @@ CREATE INDEX "PlatformCostLog_userId_createdAt_idx" ON "PlatformCostLog"("userId
-- CreateIndex
CREATE INDEX "PlatformCostLog_provider_createdAt_idx" ON "PlatformCostLog"("provider", "createdAt");
-- CreateIndex
CREATE INDEX "PlatformCostLog_createdAt_idx" ON "PlatformCostLog"("createdAt");
-- CreateIndex
CREATE INDEX "PlatformCostLog_graphExecId_idx" ON "PlatformCostLog"("graphExecId");
-- AddForeignKey
ALTER TABLE "PlatformCostLog" ADD CONSTRAINT "PlatformCostLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "PlatformCostLog" ADD CONSTRAINT "PlatformCostLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;

View File

@@ -810,8 +810,8 @@ model PlatformCostLog {
id String @id @default(uuid())
createdAt DateTime @default(now())
userId String
User User @relation(fields: [userId], references: [id], onDelete: Cascade)
userId String?
User User? @relation(fields: [userId], references: [id], onDelete: SetNull)
graphExecId String?
nodeExecId String?
graphId String?
@@ -833,6 +833,7 @@ model PlatformCostLog {
@@index([userId, createdAt])
@@index([provider, createdAt])
@@index([createdAt])
@@index([graphExecId])
}