fixed possible race condition when paying with gems
This commit is contained in:
parent
4798b2a0c6
commit
676bd7a978
|
|
@ -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));
|
||||
});
|
||||
};
|
||||
|
|
|
|||
Loading…
Reference in New Issue