Add basic transactions

This commit is contained in:
Owen Schwartz
2024-12-24 16:00:02 -05:00
parent c8676ce06a
commit 2f328fc719
22 changed files with 548 additions and 459 deletions

View File

@@ -51,32 +51,34 @@ export async function addRoleSite(
const { roleId } = parsedParams.data;
const newRoleSite = await db
.insert(roleSites)
.values({
roleId,
siteId
})
.returning();
await db.transaction(async (trx) => {
const newRoleSite = await trx
.insert(roleSites)
.values({
roleId,
siteId
})
.returning();
const siteResources = await db
.select()
.from(resources)
.where(eq(resources.siteId, siteId));
const siteResources = await db
.select()
.from(resources)
.where(eq(resources.siteId, siteId));
for (const resource of siteResources) {
await db.insert(roleResources).values({
roleId,
resourceId: resource.resourceId
for (const resource of siteResources) {
await trx.insert(roleResources).values({
roleId,
resourceId: resource.resourceId
});
}
return response(res, {
data: newRoleSite[0],
success: true,
error: false,
message: "Site added to role successfully",
status: HttpCode.CREATED
});
}
return response(res, {
data: newRoleSite[0],
success: true,
error: false,
message: "Site added to role successfully",
status: HttpCode.CREATED
});
} catch (error) {
logger.error(error);

View File

@@ -82,31 +82,33 @@ export async function createRole(
);
}
const newRole = await db
.insert(roles)
.values({
...roleData,
orgId
})
.returning();
await db
.insert(roleActions)
.values(
defaultRoleAllowedActions.map((action) => ({
roleId: newRole[0].roleId,
actionId: action,
await db.transaction(async (trx) => {
const newRole = await trx
.insert(roles)
.values({
...roleData,
orgId
}))
)
.execute();
})
.returning();
return response<Role>(res, {
data: newRole[0],
success: true,
error: false,
message: "Role created successfully",
status: HttpCode.CREATED
await trx
.insert(roleActions)
.values(
defaultRoleAllowedActions.map((action) => ({
roleId: newRole[0].roleId,
actionId: action,
orgId
}))
)
.execute();
return response<Role>(res, {
data: newRole[0],
success: true,
error: false,
message: "Role created successfully",
status: HttpCode.CREATED
});
});
} catch (error) {
logger.error(error);

View File

@@ -98,15 +98,17 @@ export async function deleteRole(
);
}
// move all users from the userOrgs table with roleId to newRoleId
await db
.update(userOrgs)
.set({ roleId: newRoleId })
.where(eq(userOrgs.roleId, roleId));
// delete the old role
await db.delete(roles).where(eq(roles.roleId, roleId));
await db.transaction(async (trx) => {
// move all users from the userOrgs table with roleId to newRoleId
await trx
.update(userOrgs)
.set({ roleId: newRoleId })
.where(eq(userOrgs.roleId, roleId));
// delete the old role
await trx.delete(roles).where(eq(roles.roleId, roleId));
});
return response(res, {
data: null,
success: true,

View File

@@ -51,38 +51,43 @@ export async function removeRoleSite(
const { roleId } = parsedBody.data;
const deletedRoleSite = await db
.delete(roleSites)
.where(
and(eq(roleSites.roleId, roleId), eq(roleSites.siteId, siteId))
)
.returning();
if (deletedRoleSite.length === 0) {
return next(
createHttpError(
HttpCode.NOT_FOUND,
`Site with ID ${siteId} not found for role with ID ${roleId}`
)
);
}
const siteResources = await db
.select()
.from(resources)
.where(eq(resources.siteId, siteId));
for (const resource of siteResources) {
await db
.delete(roleResources)
await db.transaction(async (trx) => {
const deletedRoleSite = await trx
.delete(roleSites)
.where(
and(
eq(roleResources.roleId, roleId),
eq(roleResources.resourceId, resource.resourceId)
eq(roleSites.roleId, roleId),
eq(roleSites.siteId, siteId)
)
)
.returning();
}
if (deletedRoleSite.length === 0) {
return next(
createHttpError(
HttpCode.NOT_FOUND,
`Site with ID ${siteId} not found for role with ID ${roleId}`
)
);
}
const siteResources = await db
.select()
.from(resources)
.where(eq(resources.siteId, siteId));
for (const resource of siteResources) {
await trx
.delete(roleResources)
.where(
and(
eq(roleResources.roleId, roleId),
eq(roleResources.resourceId, resource.resourceId)
)
)
.returning();
}
});
return response(res, {
data: null,