refactor(db): typed query helpers, shared test FormData helper
Replace raw db.execute tuple casts with queryRows/rowsFrom/execResult/ affectedRows helpers from lib/db, drop redundant mysql2 casts on typed query builders, and centralize per-test fakeForm into test/fake-form. Update db mocks in tests so helpers resolve against mocked execute.
This commit is contained in:
1 parent
2e25b39364
commit
8638e81444
116 files changed
+866
-897
No files matched your search
@@ -2,7 +2,10 @@ import type { SQL } from "drizzle-orm";
|
||||
import { MySqlDialect } from "drizzle-orm/mysql-core";
|
||||
import { expect, it, vi } from "vitest";
|
||||
|
||||
vi.mock("@/lib/db", () => ({ db: {} }));
|
||||
vi.mock("@/lib/db", async () => ({
|
||||
rowsFrom: (await import("@/test/db-helpers")).rowsFrom,
|
||||
db: {},
|
||||
}));
|
||||
|
||||
import { applyHistory, type HistoryTransaction } from "./server";
|
||||
|
||||
|
||||
@@ -2,7 +2,11 @@ import type { SQL } from "drizzle-orm";
|
||||
import { MySqlDialect } from "drizzle-orm/mysql-core";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
|
||||
vi.mock("@/lib/db", async () => ({ ...(await import("@/db/schema")), db: {} }));
|
||||
vi.mock("@/lib/db", async () => ({
|
||||
...(await import("@/db/schema")),
|
||||
rowsFrom: (await import("@/test/db-helpers")).rowsFrom,
|
||||
db: {},
|
||||
}));
|
||||
|
||||
import { historyChanges, sameSnapshot } from "./model";
|
||||
import {
|
||||
|
||||
@@ -7,7 +7,7 @@ import {
|
||||
CatalogPagesBc,
|
||||
WebsiteArticles,
|
||||
} from "@/db/schema";
|
||||
import type { db } from "@/lib/db";
|
||||
import { type db, rowsFrom } from "@/lib/db";
|
||||
import { getOperationContext } from "@/lib/foundation/request-context";
|
||||
import { type HistorySnapshot, sameSnapshot } from "./model";
|
||||
export type HistoryKind =
|
||||
@@ -84,10 +84,11 @@ export async function historySnapshot(
|
||||
(key) =>
|
||||
sql`${sql.identifier(columns[key as keyof typeof columns].name)} AS ${sql.identifier(key)}`,
|
||||
);
|
||||
const [rows] = await tx.execute(
|
||||
sql`SELECT ${sql.join(selected, sql`, `)} FROM ${table} WHERE id=${id} FOR UPDATE`,
|
||||
);
|
||||
const row = (rows as unknown as Record<string, unknown>[])[0];
|
||||
const row = rowsFrom<Record<string, unknown>>(
|
||||
await tx.execute(
|
||||
sql`SELECT ${sql.join(selected, sql`, `)} FROM ${table} WHERE id=${id} FOR UPDATE`,
|
||||
),
|
||||
)[0];
|
||||
if (!row) throw Error("unavailable");
|
||||
return Object.fromEntries(
|
||||
fields.map((key) => {
|
||||
@@ -223,11 +224,12 @@ export async function lockOfferHistoryPages(
|
||||
].sort((a, b) => a - b);
|
||||
if (ids.some((id) => !Number.isSafeInteger(id) || id < 1))
|
||||
throw Error("unavailable");
|
||||
const [rows] = await tx.execute(
|
||||
sql`SELECT id FROM catalog_pages WHERE id IN (${sql.join(ids, sql`, `)}) ORDER BY id FOR UPDATE`,
|
||||
);
|
||||
const found = new Set(
|
||||
(rows as unknown as Array<{ id: number }>).map((row) => Number(row.id)),
|
||||
rowsFrom<{ id: number }>(
|
||||
await tx.execute(
|
||||
sql`SELECT id FROM catalog_pages WHERE id IN (${sql.join(ids, sql`, `)}) ORDER BY id FOR UPDATE`,
|
||||
),
|
||||
).map((row) => Number(row.id)),
|
||||
);
|
||||
if (ids.some((id) => !found.has(id))) throw Error("unavailable");
|
||||
}
|
||||
Reference in new issue
Block a user