forked from OpenWF/SpaceNinjaServer
Fix currency synchronization and add real-time validation
This commit is contained in:
parent
3fedc701f1
commit
75ecabcdaf
@ -6,12 +6,28 @@ import { getInventory } from "../../services/inventoryService.ts";
|
|||||||
import { sendWsBroadcastTo } from "../../services/wsService.ts";
|
import { sendWsBroadcastTo } from "../../services/wsService.ts";
|
||||||
|
|
||||||
export const purchaseController: RequestHandler = async (req, res) => {
|
export const purchaseController: RequestHandler = async (req, res) => {
|
||||||
const purchaseRequest = JSON.parse(String(req.body)) as IPurchaseRequest;
|
try {
|
||||||
const accountId = await getAccountIdForRequest(req);
|
const purchaseRequest = JSON.parse(String(req.body)) as IPurchaseRequest;
|
||||||
const inventory = await getInventory(accountId);
|
const accountId = await getAccountIdForRequest(req);
|
||||||
const response = await handlePurchase(purchaseRequest, inventory);
|
const inventory = await getInventory(accountId);
|
||||||
await inventory.save();
|
|
||||||
//console.log(JSON.stringify(response, null, 2));
|
const response = await handlePurchase(purchaseRequest, inventory);
|
||||||
res.json(response);
|
await inventory.save();
|
||||||
sendWsBroadcastTo(accountId, { update_inventory: true });
|
|
||||||
|
res.json(response);
|
||||||
|
sendWsBroadcastTo(accountId, { update_inventory: true });
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof Error && error.message.includes('Insufficient')) {
|
||||||
|
res.status(400).json({
|
||||||
|
error: 'INSUFFICIENT_CURRENCY',
|
||||||
|
message: error.message
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.error('Purchase failed:', error);
|
||||||
|
res.status(500).json({
|
||||||
|
error: 'PURCHASE_FAILED',
|
||||||
|
message: 'An error occurred during purchase'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@ -1254,10 +1254,18 @@ export const updateCurrency = (
|
|||||||
inventory: TInventoryDatabaseDocument,
|
inventory: TInventoryDatabaseDocument,
|
||||||
price: number,
|
price: number,
|
||||||
usePremium: boolean,
|
usePremium: boolean,
|
||||||
inventoryChanges: IInventoryChanges = {}
|
inventoryChanges: IInventoryChanges = {},
|
||||||
|
validateBalance: boolean = false
|
||||||
): IInventoryChanges => {
|
): IInventoryChanges => {
|
||||||
if (price != 0 && isCurrencyTracked(inventory, usePremium)) {
|
if (price != 0 && isCurrencyTracked(inventory, usePremium)) {
|
||||||
if (usePremium) {
|
if (usePremium) {
|
||||||
|
if (validateBalance) {
|
||||||
|
const totalPlatinum = inventory.PremiumCredits + inventory.PremiumCreditsFree;
|
||||||
|
if (totalPlatinum < price) {
|
||||||
|
throw new Error(`Insufficient platinum balance. Required: ${price}, Available: ${totalPlatinum}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (inventory.PremiumCreditsFree > 0) {
|
if (inventory.PremiumCreditsFree > 0) {
|
||||||
const premiumCreditsFreeDelta = Math.min(price, inventory.PremiumCreditsFree) * -1;
|
const premiumCreditsFreeDelta = Math.min(price, inventory.PremiumCreditsFree) * -1;
|
||||||
inventoryChanges.PremiumCreditsFree ??= 0;
|
inventoryChanges.PremiumCreditsFree ??= 0;
|
||||||
@ -1269,6 +1277,10 @@ export const updateCurrency = (
|
|||||||
inventory.PremiumCredits -= price;
|
inventory.PremiumCredits -= price;
|
||||||
logger.debug(`currency changes `, { PremiumCredits: -price });
|
logger.debug(`currency changes `, { PremiumCredits: -price });
|
||||||
} else {
|
} else {
|
||||||
|
if (validateBalance && inventory.RegularCredits < price) {
|
||||||
|
throw new Error(`Insufficient credits balance. Required: ${price}, Available: ${inventory.RegularCredits}`);
|
||||||
|
}
|
||||||
|
|
||||||
inventoryChanges.RegularCredits ??= 0;
|
inventoryChanges.RegularCredits ??= 0;
|
||||||
inventoryChanges.RegularCredits -= price;
|
inventoryChanges.RegularCredits -= price;
|
||||||
inventory.RegularCredits -= price;
|
inventory.RegularCredits -= price;
|
||||||
|
|||||||
@ -209,7 +209,8 @@ export const handlePurchase = async (
|
|||||||
inventory,
|
inventory,
|
||||||
purchaseRequest.PurchaseParams.ExpectedPrice,
|
purchaseRequest.PurchaseParams.ExpectedPrice,
|
||||||
purchaseRequest.PurchaseParams.UsePremium,
|
purchaseRequest.PurchaseParams.UsePremium,
|
||||||
prePurchaseInventoryChanges
|
prePurchaseInventoryChanges,
|
||||||
|
true
|
||||||
);
|
);
|
||||||
|
|
||||||
switch (purchaseRequest.PurchaseParams.Source) {
|
switch (purchaseRequest.PurchaseParams.Source) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user