transactions are gonna drive me insane

This commit is contained in:
Derock 2024-05-16 21:36:27 -04:00
parent d1528aa55b
commit 27b018a5de
No known key found for this signature in database
3 changed files with 23 additions and 22 deletions

View file

@ -53,7 +53,7 @@ CREATE TABLE `service_domain` (
--> statement-breakpoint
CREATE TABLE `service_generation` (
`id` text PRIMARY KEY DEFAULT (uuid_generate_v7()) NOT NULL,
`service_id` text NOT NULL,
`service_id` text NOT NULL DEFERRABLE INITIALLY DEFERRED,
`deployment_id` text,
`source` integer NOT NULL,
`environment` text,

View file

@ -15,6 +15,7 @@ import {
updateServiceProcedure,
} from "./update";
import { ServiceSource } from "~/server/db/types";
import { SQLiteSyncDialect } from "drizzle-orm/sqlite-core";
export const serviceRouter = createTRPCRouter({
containers: getServiceContainers,
@ -59,8 +60,19 @@ export const serviceRouter = createTRPCRouter({
.mutation(async ({ ctx, input }) => {
// create a generation for the service
const trxResult = await ctx.db.transaction(async (trx) => {
// mark all deferrable
trx.run(sql`PRAGMA defer_foreign_keys = true;`);
// create initial generation
const [generation] = await trx
.insert(serviceGeneration)
.values({
serviceId: "",
source: ServiceSource.Docker,
dockerImage: "traefik/whoami",
})
.returning({
id: serviceGeneration.id,
});
assert(generation?.id, "Expected generation data to be returned");
// create the service
const [data] = await trx
@ -68,7 +80,7 @@ export const serviceRouter = createTRPCRouter({
.values({
name: input.name,
projectId: ctx.project.getData().id,
latestGenerationId: "",
latestGenerationId: generation.id,
redeploySecret: randomBytes(env.REDEPLOY_SECRET_BYTES).toString(
"hex",
),
@ -79,26 +91,11 @@ export const serviceRouter = createTRPCRouter({
assert(data?.id, "Expected service data to be returned");
// create initial generation
trx.run(sql`PRAGMA defer_foreign_keys = true;`);
const [generation] = await trx
.insert(serviceGeneration)
.values({
serviceId: data.id,
source: ServiceSource.Docker,
dockerImage: "traefik/whoami",
})
.returning({
id: serviceGeneration.id,
});
assert(generation?.id, "Expected generation data to be returned");
// update the service with the generation id
await trx
.update(service)
.update(serviceGeneration)
.set({
latestGenerationId: generation.id,
serviceId: data.id,
})
.where(eq(service.id, data.id))
.execute();

View file

@ -68,7 +68,7 @@ function createDatabaseInstance() {
),
);
return drizzle(sqlite, {
const orm = drizzle(sqlite, {
schema,
logger: {
logQuery(query) {
@ -76,6 +76,10 @@ function createDatabaseInstance() {
},
},
});
// @ts-ignore
orm.sqlite = sqlite;
return orm;
}
export const db = (globalForDB.db ??= createDatabaseInstance());