feat: FINALLY WORKING NEW GEN PROCEDURE

This commit is contained in:
Derock 2024-05-17 11:17:44 -04:00
parent 27b018a5de
commit 8bfbc22016
No known key found for this signature in database
2 changed files with 56 additions and 35 deletions

View file

@ -16,6 +16,9 @@ import {
} from "./update"; } from "./update";
import { ServiceSource } from "~/server/db/types"; import { ServiceSource } from "~/server/db/types";
import { SQLiteSyncDialect } from "drizzle-orm/sqlite-core"; import { SQLiteSyncDialect } from "drizzle-orm/sqlite-core";
import { uuidv7 } from "uuidv7";
import logger from "~/server/utils/logger";
import { type Database } from "better-sqlite3";
export const serviceRouter = createTRPCRouter({ export const serviceRouter = createTRPCRouter({
containers: getServiceContainers, containers: getServiceContainers,
@ -60,47 +63,64 @@ export const serviceRouter = createTRPCRouter({
.mutation(async ({ ctx, input }) => { .mutation(async ({ ctx, input }) => {
// create a generation for the service // create a generation for the service
const trxResult = await ctx.db.transaction(async (trx) => { const trxResult = await ctx.db.transaction(async (trx) => {
// create initial generation // @ts-expect-error using drizzle-orm doesnt work, keep getting foreign key constraint error after the first insert despite it being deferred
const [generation] = await trx const db: Database = trx.session.client;
.insert(serviceGeneration)
.values({
serviceId: "",
source: ServiceSource.Docker,
dockerImage: "traefik/whoami",
})
.returning({
id: serviceGeneration.id,
});
assert(generation?.id, "Expected generation data to be returned"); db.pragma(`defer_foreign_keys = ON`);
const generationId = uuidv7();
const serviceId = uuidv7();
// create initial generation
const dialect = new SQLiteSyncDialect();
const createGenerationQuery = dialect.sqlToQuery(
trx
.insert(serviceGeneration)
.values({
id: generationId,
serviceId: serviceId,
source: ServiceSource.Docker,
dockerImage: "traefik/whoami",
})
.getSQL(),
);
const genCreateResult = db
.prepare(createGenerationQuery.sql)
.run(...createGenerationQuery.params);
logger.debug(
"inserted generation",
createGenerationQuery.sql,
genCreateResult,
);
// create the service // create the service
const [data] = await trx const createServiceQuery = dialect.sqlToQuery(
.insert(service) trx
.values({ .insert(service)
name: input.name, .values({
projectId: ctx.project.getData().id, id: serviceId,
latestGenerationId: generation.id, name: input.name,
redeploySecret: randomBytes(env.REDEPLOY_SECRET_BYTES).toString( projectId: ctx.project.getData().id,
"hex", latestGenerationId: generationId,
), redeploySecret: randomBytes(env.REDEPLOY_SECRET_BYTES).toString(
}) "hex",
.returning({ ),
id: serviceGeneration.id, })
}); .returning({
id: serviceGeneration.id,
})
.getSQL(),
);
assert(data?.id, "Expected service data to be returned"); const createResult = db
.prepare(createServiceQuery.sql)
.run(...createServiceQuery.params);
// update the service with the generation id logger.debug("inserted service", createServiceQuery.sql, createResult);
await trx
.update(serviceGeneration)
.set({
serviceId: data.id,
})
.where(eq(service.id, data.id))
.execute();
return data.id; return serviceId;
}); });
return trxResult; return trxResult;

View file

@ -48,6 +48,7 @@ function createDatabaseInstance() {
// enable WAL mode // enable WAL mode
sqlite.pragma("journal_mode = WAL"); sqlite.pragma("journal_mode = WAL");
sqlite.pragma("defer_foreign_keys = true");
// load uuidv7 extension // load uuidv7 extension
// built from https://github.com/craigpastro/sqlite-uuidv7 // built from https://github.com/craigpastro/sqlite-uuidv7