XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFESpaceNinjaServer

A simple server for a small space ninja game

公开
关注 0 Fork 0 Star 0
返回提交历史

XFEstudio/XFESpaceNinjaServer

fix: inconsistent handling of purchase request (#594)

f2ae465d
Sainan <sainan@calamity.inc>
提交于

代码差异

2 个文件 +3 -41
Modified src/controllers/api/purchaseController.ts +2 -2
@@ -1,11 +1,11 @@
1 1 import { RequestHandler } from "express";
2 2 import { getAccountIdForRequest } from "@/src/services/loginService";
3 import { toPurchaseRequest } from "@/src/helpers/purchaseHelpers";
3 import { IPurchaseRequest } from "@/src/types/purchaseTypes";
4 4 import { handlePurchase } from "@/src/services/purchaseService";
5 5
6 6 // eslint-disable-next-line @typescript-eslint/no-misused-promises
7 7 export const purchaseController: RequestHandler = async (req, res) => {
8 const purchaseRequest = toPurchaseRequest(JSON.parse(String(req.body)));
8 const purchaseRequest = JSON.parse(String(req.body)) as IPurchaseRequest;
9 9 const accountId = await getAccountIdForRequest(req);
10 10 const response = await handlePurchase(purchaseRequest, accountId);
11 11 res.json(response);
Modified src/helpers/purchaseHelpers.ts +1 -39
@@ -1,43 +1,5 @@
1 import { parseBoolean, parseNumber, parseString } from "@/src/helpers/general";
2 1 import { slotPurchaseNameToSlotName } from "@/src/services/purchaseService";
3 import { IPurchaseRequest, SlotPurchaseName } from "@/src/types/purchaseTypes";
4
5 export const toPurchaseRequest = (purchaseRequest: unknown): IPurchaseRequest => {
6 if (!purchaseRequest || typeof purchaseRequest !== "object") {
7 throw new Error("incorrect or missing purchase request data");
8 }
9
10 if (
11 "PurchaseParams" in purchaseRequest &&
12 "buildLabel" in purchaseRequest &&
13 purchaseRequest.PurchaseParams &&
14 typeof purchaseRequest.PurchaseParams === "object" &&
15 "Source" in purchaseRequest.PurchaseParams &&
16 "StoreItem" in purchaseRequest.PurchaseParams &&
17 "StorePage" in purchaseRequest.PurchaseParams &&
18 "SearchTerm" in purchaseRequest.PurchaseParams &&
19 "CurrentLocation" in purchaseRequest.PurchaseParams &&
20 "Quantity" in purchaseRequest.PurchaseParams &&
21 "UsePremium" in purchaseRequest.PurchaseParams &&
22 "ExpectedPrice" in purchaseRequest.PurchaseParams
23 ) {
24 return {
25 PurchaseParams: {
26 Source: parseNumber(purchaseRequest.PurchaseParams.Source),
27 StoreItem: parseString(purchaseRequest.PurchaseParams.StoreItem),
28 StorePage: parseString(purchaseRequest.PurchaseParams.StorePage),
29 SearchTerm: parseString(purchaseRequest.PurchaseParams.SearchTerm),
30 CurrentLocation: parseString(purchaseRequest.PurchaseParams.CurrentLocation),
31 Quantity: parseNumber(purchaseRequest.PurchaseParams.Quantity),
32 UsePremium: parseBoolean(purchaseRequest.PurchaseParams.UsePremium),
33 ExpectedPrice: parseNumber(purchaseRequest.PurchaseParams.ExpectedPrice)
34 },
35 buildLabel: parseString(purchaseRequest.buildLabel)
36 };
37 }
38
39 throw new Error("invalid purchaseRequest");
40 };
2 import { SlotPurchaseName } from "@/src/types/purchaseTypes";
41 3
42 4 export const isSlotPurchaseName = (slotPurchaseName: string): slotPurchaseName is SlotPurchaseName => {
43 5 return slotPurchaseName in slotPurchaseNameToSlotName;