77 lines
2.7 KiB
TypeScript
77 lines
2.7 KiB
TypeScript
import { RequestHandler } from "express";
|
|
import { getJSONfromString } from "@/src/helpers/stringHelpers";
|
|
import { getAccountIdForRequest } from "@/src/services/loginService";
|
|
import { getInventory, addMods } from "@/src/services/inventoryService";
|
|
import { IOid } from "@/src/types/commonTypes";
|
|
|
|
export const arcaneCommonController: RequestHandler = async (req, res) => {
|
|
const accountId = await getAccountIdForRequest(req);
|
|
const json = getJSONfromString<IArcaneCommonRequest>(String(req.body));
|
|
const inventory = await getInventory(accountId);
|
|
const upgrade = inventory.Upgrades.id(json.arcane.ItemId.$oid);
|
|
if (json.newRank == -1) {
|
|
// Break down request?
|
|
if (!upgrade || !upgrade.UpgradeFingerprint) {
|
|
throw new Error(`Failed to find upgrade with OID ${json.arcane.ItemId.$oid}`);
|
|
}
|
|
|
|
// Remove Upgrade
|
|
inventory.Upgrades.pull({ _id: json.arcane.ItemId.$oid });
|
|
|
|
// Add RawUpgrades
|
|
const numRawUpgradesToGive = arcaneLevelCounts[(JSON.parse(upgrade.UpgradeFingerprint) as { lvl: number }).lvl];
|
|
addMods(inventory, [
|
|
{
|
|
ItemType: json.arcane.ItemType,
|
|
ItemCount: numRawUpgradesToGive
|
|
}
|
|
]);
|
|
|
|
res.json({ upgradeId: json.arcane.ItemId.$oid, numConsumed: numRawUpgradesToGive });
|
|
} else {
|
|
// Upgrade request?
|
|
let numConsumed = arcaneLevelCounts[json.newRank];
|
|
let upgradeId = json.arcane.ItemId.$oid;
|
|
if (upgrade) {
|
|
// Have an existing Upgrade item?
|
|
if (upgrade.UpgradeFingerprint) {
|
|
const existingLevel = (JSON.parse(upgrade.UpgradeFingerprint) as { lvl: number }).lvl;
|
|
numConsumed -= arcaneLevelCounts[existingLevel];
|
|
}
|
|
upgrade.UpgradeFingerprint = JSON.stringify({ lvl: json.newRank });
|
|
} else {
|
|
const newLength = inventory.Upgrades.push({
|
|
ItemType: json.arcane.ItemType,
|
|
UpgradeFingerprint: JSON.stringify({ lvl: json.newRank })
|
|
});
|
|
upgradeId = inventory.Upgrades[newLength - 1]._id.toString();
|
|
}
|
|
|
|
// Remove RawUpgrades
|
|
addMods(inventory, [
|
|
{
|
|
ItemType: json.arcane.ItemType,
|
|
ItemCount: numConsumed * -1
|
|
}
|
|
]);
|
|
|
|
res.json({ newLevel: json.newRank, numConsumed, upgradeId });
|
|
}
|
|
await inventory.save();
|
|
};
|
|
|
|
const arcaneLevelCounts = [0, 3, 6, 10, 15, 21];
|
|
|
|
interface IArcaneCommonRequest {
|
|
arcane: {
|
|
ItemType: string;
|
|
ItemId: IOid;
|
|
FromSKU: boolean;
|
|
UpgradeFingerprint: string;
|
|
PendingRerollFingerprint: string;
|
|
ItemCount: number;
|
|
LastAdded: IOid;
|
|
};
|
|
newRank: number;
|
|
}
|