fixed possible race condition when paying with gems

This commit is contained in:
MasterGordon 2026-03-10 18:54:33 +01:00
parent 4798b2a0c6
commit 676bd7a978
1 changed files with 25 additions and 17 deletions

View File

@ -18,17 +18,21 @@ export const addGems = async (
user: string,
gems: number,
) => {
const { count, totalCount } = await getGems(db, user);
if ((await db.select().from(Gems).where(eq(Gems.user, user))).length === 0) {
await db
.insert(Gems)
.values({ user, count: count + gems, totalCount: totalCount + gems });
return;
}
await db
.update(Gems)
.set({ count: count + gems, totalCount: totalCount + gems })
.where(eq(Gems.user, user));
await db.transaction(async (tx) => {
const res = (await tx.select().from(Gems).where(eq(Gems.user, user)))[0];
const count = res?.count ?? 0;
const totalCount = res?.totalCount ?? 0;
if (!res) {
await tx
.insert(Gems)
.values({ user, count: count + gems, totalCount: totalCount + gems });
return;
}
await tx
.update(Gems)
.set({ count: count + gems, totalCount: totalCount + gems })
.where(eq(Gems.user, user));
});
};
export const removeGems = async (
@ -36,10 +40,14 @@ export const removeGems = async (
user: string,
gems: number,
) => {
const { count, totalCount } = await getGems(db, user);
if (count - gems < 0) throw new Error("Not enough gems");
await db
.update(Gems)
.set({ count: count - gems, totalCount: totalCount })
.where(eq(Gems.user, user));
await db.transaction(async (tx) => {
const res = (await tx.select().from(Gems).where(eq(Gems.user, user)))[0];
const count = res?.count ?? 0;
const totalCount = res?.totalCount ?? 0;
if (count - gems < 0) throw new Error("Not enough gems");
await tx
.update(Gems)
.set({ count: count - gems, totalCount: totalCount })
.where(eq(Gems.user, user));
});
};