Add basic transactions

This commit is contained in:
Owen Schwartz 2024-12-24 16:00:02 -05:00
parent c8676ce06a
commit 2f328fc719
No known key found for this signature in database
GPG key ID: 8271FDFFD9E0CCBD
22 changed files with 548 additions and 459 deletions

View file

@ -118,16 +118,20 @@ export async function acceptInvite(
);
}
// add the user to the org
await db.insert(userOrgs).values({
userId: existingUser[0].userId,
orgId: existingInvite[0].orgId,
roleId: existingInvite[0].roleId
await db.transaction(async (trx) => {
// add the user to the org
await trx.insert(userOrgs).values({
userId: existingUser[0].userId,
orgId: existingInvite[0].orgId,
roleId: existingInvite[0].roleId
});
// delete the invite
await trx
.delete(userInvites)
.where(eq(userInvites.inviteId, inviteId));
});
// delete the invite
await db.delete(userInvites).where(eq(userInvites.inviteId, inviteId));
return response<AcceptInviteResponse>(res, {
data: { accepted: true, orgId: existingInvite[0].orgId },
success: true,

View file

@ -34,33 +34,36 @@ export async function addUserSite(
const { userId, siteId } = parsedBody.data;
const newUserSite = await db
.insert(userSites)
.values({
userId,
siteId
})
.returning();
await db.transaction(async (trx) => {
const newUserSite = await trx
.insert(userSites)
.values({
userId,
siteId
})
.returning();
const siteResources = await db
.select()
.from(resources)
.where(eq(resources.siteId, siteId));
const siteResources = await trx
.select()
.from(resources)
.where(eq(resources.siteId, siteId));
for (const resource of siteResources) {
await db.insert(userResources).values({
userId,
resourceId: resource.resourceId
for (const resource of siteResources) {
await trx.insert(userResources).values({
userId,
resourceId: resource.resourceId
});
}
return response(res, {
data: newUserSite[0],
success: true,
error: false,
message: "Site added to user successfully",
status: HttpCode.CREATED
});
}
return response(res, {
data: newUserSite[0],
success: true,
error: false,
message: "Site added to user successfully",
status: HttpCode.CREATED
});
} catch (error) {
logger.error(error);
return next(

View file

@ -130,21 +130,26 @@ export async function inviteUser(
const tokenHash = await hashPassword(token);
// delete any existing invites for this email
await db
.delete(userInvites)
.where(
and(eq(userInvites.email, email), eq(userInvites.orgId, orgId))
)
.execute();
await db.transaction(async (trx) => {
// delete any existing invites for this email
await trx
.delete(userInvites)
.where(
and(
eq(userInvites.email, email),
eq(userInvites.orgId, orgId)
)
)
.execute();
await db.insert(userInvites).values({
inviteId,
orgId,
email,
expiresAt,
tokenHash,
roleId
await trx.insert(userInvites).values({
inviteId,
orgId,
email,
expiresAt,
tokenHash,
roleId
});
});
const inviteLink = `${config.app.base_url}/invite?token=${inviteId}-${token}`;

View file

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