PIT: add backend logic for deep PIT and rollback

This commit is contained in:
carlosmonastyrski
2025-05-14 10:26:41 -03:00
parent 9e1d38a27b
commit 8bfd3913da
14 changed files with 1818 additions and 462 deletions
@@ -1,27 +1,14 @@
import { Knex } from "knex";
import { TDbClient } from "@app/db";
import {
TableName,
TFolderTreeCheckpointResources,
TFolderTreeCheckpoints,
TProjectEnvironments,
TSecretFolders
} from "@app/db/schemas";
import { TableName, TFolderTreeCheckpointResources } from "@app/db/schemas";
import { DatabaseError } from "@app/lib/errors";
import { ormify, selectAllTableCols } from "@app/lib/knex";
import { buildFindFilter, ormify, selectAllTableCols } from "@app/lib/knex";
export type TFolderTreeCheckpointResourcesDALFactory = ReturnType<typeof folderTreeCheckpointResourcesDALFactory>;
type ResourceWithCheckpointInfo = TFolderTreeCheckpointResources & {
folderCommitId: string;
};
type ResourceWithFolderInfo = TFolderTreeCheckpointResources & {
name: string;
parentId?: string | null;
slug: string;
envName: string;
type TFolderTreeCheckpointResourcesWithCommitId = TFolderTreeCheckpointResources & {
commitId: number;
};
export const folderTreeCheckpointResourcesDALFactory = (db: TDbClient) => {
@@ -30,95 +17,28 @@ export const folderTreeCheckpointResourcesDALFactory = (db: TDbClient) => {
const findByTreeCheckpointId = async (
folderTreeCheckpointId: string,
tx?: Knex
): Promise<TFolderTreeCheckpointResources[]> => {
): Promise<TFolderTreeCheckpointResourcesWithCommitId[]> => {
try {
const docs = await (tx || db.replicaNode())<TFolderTreeCheckpointResources>(
TableName.FolderTreeCheckpointResources
)
.where({ folderTreeCheckpointId })
.select(selectAllTableCols(TableName.FolderTreeCheckpointResources));
.join(
TableName.FolderCommit,
`${TableName.FolderTreeCheckpointResources}.folderCommitId`,
`${TableName.FolderCommit}.id`
)
// eslint-disable-next-line @typescript-eslint/no-misused-promises
.where(buildFindFilter({ folderTreeCheckpointId }, TableName.FolderTreeCheckpointResources))
.select(selectAllTableCols(TableName.FolderTreeCheckpointResources))
.select(db.ref("commitId").withSchema(TableName.FolderCommit).as("commitId"));
return docs;
} catch (error) {
throw new DatabaseError({ error, name: "FindByTreeCheckpointId" });
}
};
const findByFolderId = async (folderId: string, tx?: Knex): Promise<ResourceWithCheckpointInfo[]> => {
try {
const docs = await (tx || db.replicaNode())<
TFolderTreeCheckpointResources & Pick<TFolderTreeCheckpoints, "folderCommitId" | "createdAt">
>(TableName.FolderTreeCheckpointResources)
.where({ folderId })
.select(selectAllTableCols(TableName.FolderTreeCheckpointResources))
.join(
TableName.FolderTreeCheckpoint,
`${TableName.FolderTreeCheckpointResources}.folderTreeCheckpointId`,
`${TableName.FolderTreeCheckpoint}.id`
)
.select(
db.ref("folderCommitId").withSchema(TableName.FolderTreeCheckpoint),
db.ref("createdAt").withSchema(TableName.FolderTreeCheckpoint)
);
return docs;
} catch (error) {
throw new DatabaseError({ error, name: "FindByFolderId" });
}
};
const findByFolderCommitId = async (folderCommitId: string, tx?: Knex): Promise<TFolderTreeCheckpointResources[]> => {
try {
const docs = await (tx || db.replicaNode())<
TFolderTreeCheckpointResources & Pick<TFolderTreeCheckpoints, "createdAt">
>(TableName.FolderTreeCheckpointResources)
.where({ folderCommitId })
.select(selectAllTableCols(TableName.FolderTreeCheckpointResources))
.join(
TableName.FolderTreeCheckpoint,
`${TableName.FolderTreeCheckpointResources}.folderTreeCheckpointId`,
`${TableName.FolderTreeCheckpoint}.id`
)
.select(db.ref("createdAt").withSchema(TableName.FolderTreeCheckpoint));
return docs;
} catch (error) {
throw new DatabaseError({ error, name: "FindByFolderCommitId" });
}
};
const findFoldersInTreeCheckpoint = async (
folderTreeCheckpointId: string,
tx?: Knex
): Promise<ResourceWithFolderInfo[]> => {
try {
const docs = await (tx || db.replicaNode())<
TFolderTreeCheckpointResources &
Pick<TSecretFolders, "name" | "parentId"> &
Pick<TProjectEnvironments, "slug"> & { envName: string }
>(TableName.FolderTreeCheckpointResources)
.where({ folderTreeCheckpointId })
.select(selectAllTableCols(TableName.FolderTreeCheckpointResources))
.join(
TableName.SecretFolder,
`${TableName.FolderTreeCheckpointResources}.folderId`,
`${TableName.SecretFolder}.id`
)
.join(TableName.Environment, `${TableName.SecretFolder}.envId`, `${TableName.Environment}.id`)
.select(
db.ref("name").withSchema(TableName.SecretFolder),
db.ref("parentId").withSchema(TableName.SecretFolder),
db.ref("slug").withSchema(TableName.Environment),
db.ref("name").withSchema(TableName.Environment).as("envName")
);
return docs;
} catch (error) {
throw new DatabaseError({ error, name: "FindFoldersInTreeCheckpoint" });
}
};
return {
...folderTreeCheckpointResourcesOrm,
findByTreeCheckpointId,
findByFolderId,
findByFolderCommitId,
findFoldersInTreeCheckpoint
findByTreeCheckpointId
};
};