feat: 全栈 Logger 依赖注入 — DB/Route/AI 层传参 + 前端 Logger + 测试更新 + 归档 add-frontend-logger

This commit is contained in:
2026-06-01 20:32:19 +08:00
parent 4c72754739
commit 844562303c
60 changed files with 1648 additions and 778 deletions

View File

@@ -3,6 +3,7 @@ import type Database from "bun:sqlite";
import { desc, eq } from "drizzle-orm";
import type { Conversation, Message, UpdateConversationRequest } from "../../shared/api";
import type { Logger } from "../logger";
import { paginateQuery, wrap } from "./connection";
import { conversations, messages, models } from "./schema";
@@ -10,6 +11,7 @@ import { conversations, messages, models } from "./schema";
export function createConversation(
raw: Database,
projectId: string,
logger: Logger,
defaultModelId?: string,
): { conversation: Conversation } | { error: string; status: number } {
const db = wrap(raw);
@@ -50,6 +52,7 @@ export function createMessage(
parts?: string;
role: "assistant" | "system" | "user";
},
_logger: Logger,
): Message {
const db = wrap(raw);
const id = crypto.randomUUID();
@@ -78,6 +81,7 @@ export function createMessages(
parts?: string;
role: "assistant" | "system" | "user";
}>,
_logger: Logger,
): Message[] {
const db = wrap(raw);
const now = new Date().toISOString();
@@ -102,7 +106,11 @@ export function createMessages(
return results;
}
export function deleteConversation(raw: Database, id: string): { error: string; status: number } | { success: true } {
export function deleteConversation(
raw: Database,
id: string,
_logger: Logger,
): { error: string; status: number } | { success: true } {
const db = wrap(raw);
const existing = db.select().from(conversations).where(eq(conversations.id, id)).get();
if (!existing) return { error: "会话不存在", status: 404 };
@@ -154,6 +162,7 @@ export function updateConversation(
raw: Database,
id: string,
data: UpdateConversationRequest,
_logger: Logger,
): { conversation: Conversation } | { error: string; status: number } {
const db = wrap(raw);
const existing = db.select().from(conversations).where(eq(conversations.id, id)).get();

View File

@@ -35,9 +35,15 @@ export function runMigrations(db: Database, migrations: MigrationRecord[], dataD
db.transaction(() => {
for (const migration of pending) {
logger.info({ id: migration.id }, "执行 migration");
db.exec(migration.sql);
insertApplied.run(migration.id, migration.checksum, new Date().toISOString());
try {
logger.info({ id: migration.id }, "执行 migration");
db.exec(migration.sql);
insertApplied.run(migration.id, migration.checksum, new Date().toISOString());
} catch (e: unknown) {
const msg = e instanceof Error ? e.message : String(e);
logger.error({ error: msg, id: migration.id }, "migration 执行失败");
throw e;
}
}
})();

View File

@@ -3,6 +3,7 @@ import type Database from "bun:sqlite";
import { desc, eq, like, or, sql } from "drizzle-orm";
import type { CreateModelRequest, Model, ModelCapability, UpdateModelRequest } from "../../shared/api";
import type { Logger } from "../logger";
import { paginateQuery, wrap } from "./connection";
import { models, providers } from "./schema";
@@ -10,6 +11,7 @@ import { models, providers } from "./schema";
export function createModel(
raw: Database,
request: CreateModelRequest,
logger: Logger,
): { error: string; status: number } | { model: Model } {
const db = wrap(raw);
@@ -49,6 +51,7 @@ export function createModel(
if (msg.includes("UNIQUE constraint")) {
return { error: "该供应商下模型 ID 已存在", status: 409 };
}
logger.error({ error: msg, operation: "create", table: "models" }, "数据库操作失败");
throw e;
}
@@ -56,7 +59,11 @@ export function createModel(
return { model: toModel(row!) };
}
export function deleteModel(raw: Database, id: string): { error: string; status: number } | { success: true } {
export function deleteModel(
raw: Database,
id: string,
_logger: Logger,
): { error: string; status: number } | { success: true } {
const db = wrap(raw);
const existing = db.select().from(models).where(eq(models.id, id)).get();
if (!existing) return { error: "模型不存在", status: 404 };
@@ -111,6 +118,7 @@ export function updateModel(
raw: Database,
id: string,
request: UpdateModelRequest,
logger: Logger,
): { error: string; status: number } | { model: Model } {
const db = wrap(raw);
const existing = db.select().from(models).where(eq(models.id, id)).get();
@@ -164,6 +172,7 @@ export function updateModel(
if (msg.includes("UNIQUE constraint")) {
return { error: "该供应商下模型 ID 已存在", status: 409 };
}
logger.error({ error: msg, operation: "update", table: "models" }, "数据库操作失败");
throw e;
}

View File

@@ -3,11 +3,16 @@ import type Database from "bun:sqlite";
import { desc, eq, like, or } from "drizzle-orm";
import type { CreateProjectRequest, Project, ProjectStatus, UpdateProjectRequest } from "../../shared/api";
import type { Logger } from "../logger";
import { paginateQuery, wrap } from "./connection";
import { projects } from "./schema";
export function archiveProject(raw: Database, id: string): { error: string; status: number } | { project: Project } {
export function archiveProject(
raw: Database,
id: string,
_logger: Logger,
): { error: string; status: number } | { project: Project } {
const db = wrap(raw);
const existing = db.select().from(projects).where(eq(projects.id, id)).get();
if (!existing) return { error: "项目不存在", status: 404 };
@@ -23,6 +28,7 @@ export function archiveProject(raw: Database, id: string): { error: string; stat
export function createProject(
raw: Database,
request: CreateProjectRequest,
logger: Logger,
): { error: string; status: number } | { project: Project } {
const db = wrap(raw);
const name = request.name.trim();
@@ -50,6 +56,7 @@ export function createProject(
if (msg.includes("UNIQUE constraint")) {
return { error: "项目名称已存在", status: 409 };
}
logger.error({ error: msg, operation: "create", table: "projects" }, "数据库操作失败");
throw e;
}
@@ -57,7 +64,11 @@ export function createProject(
return { project: toProject(row!) };
}
export function deleteProject(raw: Database, id: string): { error: string; status: number } | { success: true } {
export function deleteProject(
raw: Database,
id: string,
_logger: Logger,
): { error: string; status: number } | { success: true } {
const db = wrap(raw);
const existing = db.select().from(projects).where(eq(projects.id, id)).get();
if (!existing) return { error: "项目不存在", status: 404 };
@@ -99,7 +110,11 @@ export function listProjects(
});
}
export function restoreProject(raw: Database, id: string): { error: string; status: number } | { project: Project } {
export function restoreProject(
raw: Database,
id: string,
_logger: Logger,
): { error: string; status: number } | { project: Project } {
const db = wrap(raw);
const existing = db.select().from(projects).where(eq(projects.id, id)).get();
if (!existing) return { error: "项目不存在", status: 404 };
@@ -116,6 +131,7 @@ export function updateProject(
raw: Database,
id: string,
request: UpdateProjectRequest,
logger: Logger,
): { error: string; status: number } | { project: Project } {
const db = wrap(raw);
const existing = db.select().from(projects).where(eq(projects.id, id)).get();
@@ -150,6 +166,7 @@ export function updateProject(
if (msg.includes("UNIQUE constraint")) {
return { error: "项目名称已存在", status: 409 };
}
logger.error({ error: msg, operation: "update", table: "projects" }, "数据库操作失败");
throw e;
}

View File

@@ -3,6 +3,7 @@ import type Database from "bun:sqlite";
import { desc, eq, like } from "drizzle-orm";
import type { CreateProviderRequest, Provider, ProviderOption, UpdateProviderRequest } from "../../shared/api";
import type { Logger } from "../logger";
import { paginateQuery, wrap } from "./connection";
import { providers } from "./schema";
@@ -10,6 +11,7 @@ import { providers } from "./schema";
export function createProvider(
raw: Database,
request: CreateProviderRequest,
logger: Logger,
): { error: string; status: number } | { provider: Provider } {
const db = wrap(raw);
const name = request.name.trim();
@@ -41,6 +43,7 @@ export function createProvider(
if (msg.includes("UNIQUE constraint")) {
return { error: "供应商名称已存在", status: 409 };
}
logger.error({ error: msg, operation: "create", table: "providers" }, "数据库操作失败");
throw e;
}
@@ -48,7 +51,11 @@ export function createProvider(
return { provider: toProvider(row!) };
}
export function deleteProvider(raw: Database, id: string): { error: string; status: number } | { success: true } {
export function deleteProvider(
raw: Database,
id: string,
_logger: Logger,
): { error: string; status: number } | { success: true } {
const db = wrap(raw);
const existing = db.select().from(providers).where(eq(providers.id, id)).get();
if (!existing) return { error: "供应商不存在", status: 404 };
@@ -100,6 +107,7 @@ export function updateProvider(
raw: Database,
id: string,
request: UpdateProviderRequest,
logger: Logger,
): { error: string; status: number } | { provider: Provider } {
const db = wrap(raw);
const existing = db.select().from(providers).where(eq(providers.id, id)).get();
@@ -142,6 +150,7 @@ export function updateProvider(
if (msg.includes("UNIQUE constraint")) {
return { error: "供应商名称已存在", status: 409 };
}
logger.error({ error: msg, operation: "update", table: "providers" }, "数据库操作失败");
throw e;
}