返回提交历史
Modified
src/controllers/api/sellController.ts
+220
-230
XFEstudio/XFESpaceNinjaServer
chore: warn when sell category is unhandled (#3090)
Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/3090 Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com> Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
1d75716c
代码差异
1 个文件
+220
-230
@@ -19,6 +19,7 @@ import type { IInventoryChanges } from "../../types/purchaseTypes.ts";
19
19
import type { TInventoryDatabaseDocument } from "../../models/inventoryModels/inventoryModel.ts";
20
20
import { broadcastInventoryUpdate } from "../../services/wsService.ts";
21
21
import { parseFusionTreasure } from "../../helpers/inventoryHelpers.ts";
22
import { logger } from "../../utils/logger.ts";
22
23
23
24
export const sellController: RequestHandler = async (req, res) => {
24
25
const payload = JSON.parse(String(req.body)) as ISellRequest;
@@ -53,44 +54,44 @@ export const sellController: RequestHandler = async (req, res) => {
53
54
if (requiredFields.has("Upgrades")) {
54
55
requiredFields.add("RawUpgrades");
55
56
}
56
if (payload.Items.Suits) {
57
if ("Suits" in payload.Items) {
57
58
requiredFields.add(InventorySlot.SUITS);
58
59
}
59
if (payload.Items.LongGuns || payload.Items.Pistols || payload.Items.Melee) {
60
if ("LongGuns" in payload.Items || "Pistols" in payload.Items || "Melee" in payload.Items) {
60
61
requiredFields.add(InventorySlot.WEAPONS);
61
62
}
62
if (payload.Items.SpaceSuits) {
63
if ("SpaceSuits" in payload.Items) {
63
64
requiredFields.add(InventorySlot.SPACESUITS);
64
65
}
65
if (payload.Items.SpaceGuns || payload.Items.SpaceMelee) {
66
if ("SpaceGuns" in payload.Items || "SpaceMelee" in payload.Items) {
66
67
requiredFields.add(InventorySlot.SPACEWEAPONS);
67
68
}
68
if (payload.Items.MechSuits) {
69
if ("MechSuits" in payload.Items) {
69
70
requiredFields.add(InventorySlot.MECHSUITS);
70
71
}
71
if (payload.Items.Sentinels || payload.Items.SentinelWeapons || payload.Items.MoaPets) {
72
if ("Sentinels" in payload.Items || "SentinelWeapons" in payload.Items || "MoaPets" in payload.Items) {
72
73
requiredFields.add(InventorySlot.SENTINELS);
73
74
}
74
if (payload.Items.OperatorAmps) {
75
if ("OperatorAmps" in payload.Items) {
75
76
requiredFields.add(InventorySlot.AMPS);
76
77
}
77
if (payload.Items.Hoverboards) {
78
if ("Hoverboards" in payload.Items) {
78
79
requiredFields.add(InventorySlot.SPACESUITS);
79
80
}
80
if (payload.Items.CrewMembers) {
81
if ("CrewMembers" in payload.Items) {
81
82
requiredFields.add(InventorySlot.CREWMEMBERS);
82
83
}
83
if (payload.Items.CrewShipWeapons || payload.Items.CrewShipWeaponSkins) {
84
if ("CrewShipWeapons" in payload.Items || "CrewShipWeaponSkins" in payload.Items) {
84
85
requiredFields.add(InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
85
86
requiredFields.add("CrewShipRawSalvage");
86
if (payload.Items.CrewShipWeapons) {
87
if ("CrewShipWeapons" in payload.Items) {
87
88
requiredFields.add("CrewShipSalvagedWeapons");
88
89
}
89
if (payload.Items.CrewShipWeaponSkins) {
90
if ("CrewShipWeaponSkins" in payload.Items) {
90
91
requiredFields.add("CrewShipSalvagedWeaponSkins");
91
92
}
92
93
}
93
if (payload.Items.WeaponSkins) {
94
if ("WeaponSkins" in payload.Items) {
94
95
requiredFields.add("WeaponSkins");
95
96
}
96
97
const inventory = await getInventory(accountId, Array.from(requiredFields).join(" "));
@@ -125,203 +126,217 @@ export const sellController: RequestHandler = async (req, res) => {
125
126
const inventoryChanges: IInventoryChanges = {};
126
127
127
128
// Remove item(s)
128
if (payload.Items.Suits) {
129
payload.Items.Suits.forEach(sellItem => {
130
inventory.Suits.pull({ _id: sellItem.String });
131
freeUpSlot(inventory, InventorySlot.SUITS);
132
});
133
}
134
if (payload.Items.LongGuns) {
135
payload.Items.LongGuns.forEach(sellItem => {
136
inventory.LongGuns.pull({ _id: sellItem.String });
137
freeUpSlot(inventory, InventorySlot.WEAPONS);
138
});
139
}
140
if (payload.Items.Pistols) {
141
payload.Items.Pistols.forEach(sellItem => {
142
inventory.Pistols.pull({ _id: sellItem.String });
143
freeUpSlot(inventory, InventorySlot.WEAPONS);
144
});
145
}
146
if (payload.Items.Melee) {
147
payload.Items.Melee.forEach(sellItem => {
148
inventory.Melee.pull({ _id: sellItem.String });
149
freeUpSlot(inventory, InventorySlot.WEAPONS);
150
});
151
}
152
if (payload.Items.SpaceSuits) {
153
payload.Items.SpaceSuits.forEach(sellItem => {
154
inventory.SpaceSuits.pull({ _id: sellItem.String });
155
freeUpSlot(inventory, InventorySlot.SPACESUITS);
156
});
157
}
158
if (payload.Items.SpaceGuns) {
159
payload.Items.SpaceGuns.forEach(sellItem => {
160
inventory.SpaceGuns.pull({ _id: sellItem.String });
161
freeUpSlot(inventory, InventorySlot.SPACEWEAPONS);
162
});
163
}
164
if (payload.Items.SpaceMelee) {
165
payload.Items.SpaceMelee.forEach(sellItem => {
166
inventory.SpaceMelee.pull({ _id: sellItem.String });
167
freeUpSlot(inventory, InventorySlot.SPACEWEAPONS);
168
});
169
}
170
if (payload.Items.MechSuits) {
171
payload.Items.MechSuits.forEach(sellItem => {
172
inventory.MechSuits.pull({ _id: sellItem.String });
173
freeUpSlot(inventory, InventorySlot.MECHSUITS);
174
});
175
}
176
if (payload.Items.Sentinels) {
177
payload.Items.Sentinels.forEach(sellItem => {
178
inventory.Sentinels.pull({ _id: sellItem.String });
179
freeUpSlot(inventory, InventorySlot.SENTINELS);
180
});
181
}
182
if (payload.Items.SentinelWeapons) {
183
payload.Items.SentinelWeapons.forEach(sellItem => {
184
inventory.SentinelWeapons.pull({ _id: sellItem.String });
185
freeUpSlot(inventory, InventorySlot.SENTINELS);
186
});
187
}
188
if (payload.Items.MoaPets) {
189
payload.Items.MoaPets.forEach(sellItem => {
190
inventory.MoaPets.pull({ _id: sellItem.String });
191
freeUpSlot(inventory, InventorySlot.SENTINELS);
192
});
193
}
194
if (payload.Items.OperatorAmps) {
195
payload.Items.OperatorAmps.forEach(sellItem => {
196
inventory.OperatorAmps.pull({ _id: sellItem.String });
197
freeUpSlot(inventory, InventorySlot.AMPS);
198
});
199
}
200
if (payload.Items.Hoverboards) {
201
payload.Items.Hoverboards.forEach(sellItem => {
202
inventory.Hoverboards.pull({ _id: sellItem.String });
203
freeUpSlot(inventory, InventorySlot.SPACESUITS);
204
});
205
}
206
if (payload.Items.Drones) {
207
payload.Items.Drones.forEach(sellItem => {
208
inventory.Drones.pull({ _id: sellItem.String });
209
});
210
}
211
if (payload.Items.KubrowPetPrints) {
212
payload.Items.KubrowPetPrints.forEach(sellItem => {
213
inventory.KubrowPetPrints.pull({ _id: sellItem.String });
214
});
215
}
216
if (payload.Items.CrewMembers) {
217
payload.Items.CrewMembers.forEach(sellItem => {
218
inventory.CrewMembers.pull({ _id: sellItem.String });
219
freeUpSlot(inventory, InventorySlot.CREWMEMBERS);
220
});
221
}
222
if (payload.Items.CrewShipWeapons) {
223
payload.Items.CrewShipWeapons.forEach(sellItem => {
224
if (sellItem.String[0] == "/") {
225
addCrewShipRawSalvage(inventory, [
226
{
227
ItemType: sellItem.String,
228
ItemCount: sellItem.Count * -1
129
for (const key in payload.Items) {
130
switch (key) {
131
case "Suits":
132
payload.Items.Suits.forEach(sellItem => {
133
inventory.Suits.pull({ _id: sellItem.String });
134
freeUpSlot(inventory, InventorySlot.SUITS);
135
});
136
break;
137
case "LongGuns":
138
payload.Items.LongGuns.forEach(sellItem => {
139
inventory.LongGuns.pull({ _id: sellItem.String });
140
freeUpSlot(inventory, InventorySlot.WEAPONS);
141
});
142
break;
143
case "Pistols":
144
payload.Items.Pistols.forEach(sellItem => {
145
inventory.Pistols.pull({ _id: sellItem.String });
146
freeUpSlot(inventory, InventorySlot.WEAPONS);
147
});
148
break;
149
case "Melee":
150
payload.Items.Melee.forEach(sellItem => {
151
inventory.Melee.pull({ _id: sellItem.String });
152
freeUpSlot(inventory, InventorySlot.WEAPONS);
153
});
154
break;
155
case "SpaceSuits":
156
payload.Items.SpaceSuits.forEach(sellItem => {
157
inventory.SpaceSuits.pull({ _id: sellItem.String });
158
freeUpSlot(inventory, InventorySlot.SPACESUITS);
159
});
160
break;
161
case "SpaceGuns":
162
payload.Items.SpaceGuns.forEach(sellItem => {
163
inventory.SpaceGuns.pull({ _id: sellItem.String });
164
freeUpSlot(inventory, InventorySlot.SPACEWEAPONS);
165
});
166
break;
167
case "SpaceMelee":
168
payload.Items.SpaceMelee.forEach(sellItem => {
169
inventory.SpaceMelee.pull({ _id: sellItem.String });
170
freeUpSlot(inventory, InventorySlot.SPACEWEAPONS);
171
});
172
break;
173
case "MechSuits":
174
payload.Items.MechSuits.forEach(sellItem => {
175
inventory.MechSuits.pull({ _id: sellItem.String });
176
freeUpSlot(inventory, InventorySlot.MECHSUITS);
177
});
178
break;
179
case "Sentinels":
180
payload.Items.Sentinels.forEach(sellItem => {
181
inventory.Sentinels.pull({ _id: sellItem.String });
182
freeUpSlot(inventory, InventorySlot.SENTINELS);
183
});
184
break;
185
case "SentinelWeapons":
186
payload.Items.SentinelWeapons.forEach(sellItem => {
187
inventory.SentinelWeapons.pull({ _id: sellItem.String });
188
freeUpSlot(inventory, InventorySlot.SENTINELS);
189
});
190
break;
191
case "MoaPets":
192
payload.Items.MoaPets.forEach(sellItem => {
193
inventory.MoaPets.pull({ _id: sellItem.String });
194
freeUpSlot(inventory, InventorySlot.SENTINELS);
195
});
196
break;
197
case "OperatorAmps":
198
payload.Items.OperatorAmps.forEach(sellItem => {
199
inventory.OperatorAmps.pull({ _id: sellItem.String });
200
freeUpSlot(inventory, InventorySlot.AMPS);
201
});
202
break;
203
case "Hoverboards":
204
payload.Items.Hoverboards.forEach(sellItem => {
205
inventory.Hoverboards.pull({ _id: sellItem.String });
206
freeUpSlot(inventory, InventorySlot.SPACESUITS);
207
});
208
break;
209
case "Drones":
210
payload.Items.Drones.forEach(sellItem => {
211
inventory.Drones.pull({ _id: sellItem.String });
212
});
213
break;
214
case "KubrowPetPrints":
215
payload.Items.KubrowPetPrints.forEach(sellItem => {
216
inventory.KubrowPetPrints.pull({ _id: sellItem.String });
217
});
218
break;
219
case "CrewMembers":
220
payload.Items.CrewMembers.forEach(sellItem => {
221
inventory.CrewMembers.pull({ _id: sellItem.String });
222
freeUpSlot(inventory, InventorySlot.CREWMEMBERS);
223
});
224
break;
225
case "CrewShipWeapons":
226
payload.Items.CrewShipWeapons.forEach(sellItem => {
227
if (sellItem.String[0] == "/") {
228
addCrewShipRawSalvage(inventory, [
229
{
230
ItemType: sellItem.String,
231
ItemCount: sellItem.Count * -1
232
}
233
]);
234
} else {
235
const index = inventory.CrewShipWeapons.findIndex(x => x._id.equals(sellItem.String));
236
if (index != -1) {
237
if (sellCurrency == "SC_Resources") {
238
refundPartialBuildCosts(
239
inventory,
240
inventory.CrewShipWeapons[index].ItemType,
241
inventoryChanges
242
);
243
}
244
inventory.CrewShipWeapons.splice(index, 1);
245
freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
246
} else {
247
inventory.CrewShipSalvagedWeapons.pull({ _id: sellItem.String });
248
}
229
249
}
230
]);
231
} else {
232
const index = inventory.CrewShipWeapons.findIndex(x => x._id.equals(sellItem.String));
233
if (index != -1) {
234
if (sellCurrency == "SC_Resources") {
235
refundPartialBuildCosts(inventory, inventory.CrewShipWeapons[index].ItemType, inventoryChanges);
250
});
251
break;
252
case "CrewShipWeaponSkins":
253
payload.Items.CrewShipWeaponSkins.forEach(sellItem => {
254
if (sellItem.String[0] == "/") {
255
addCrewShipRawSalvage(inventory, [
256
{
257
ItemType: sellItem.String,
258
ItemCount: sellItem.Count * -1
259
}
260
]);
261
} else {
262
const index = inventory.CrewShipWeaponSkins.findIndex(x => x._id.equals(sellItem.String));
263
if (index != -1) {
264
if (sellCurrency == "SC_Resources") {
265
refundPartialBuildCosts(
266
inventory,
267
inventory.CrewShipWeaponSkins[index].ItemType,
268
inventoryChanges
269
);
270
}
271
inventory.CrewShipWeaponSkins.splice(index, 1);
272
freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
273
} else {
274
inventory.CrewShipSalvagedWeaponSkins.pull({ _id: sellItem.String });
275
}
236
276
}
237
inventory.CrewShipWeapons.splice(index, 1);
238
freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
239
} else {
240
inventory.CrewShipSalvagedWeapons.pull({ _id: sellItem.String });
241
}
242
}
243
});
244
}
245
if (payload.Items.CrewShipWeaponSkins) {
246
payload.Items.CrewShipWeaponSkins.forEach(sellItem => {
247
if (sellItem.String[0] == "/") {
248
addCrewShipRawSalvage(inventory, [
249
{
250
ItemType: sellItem.String,
251
ItemCount: sellItem.Count * -1
252
}
253
]);
254
} else {
255
const index = inventory.CrewShipWeaponSkins.findIndex(x => x._id.equals(sellItem.String));
256
if (index != -1) {
257
if (sellCurrency == "SC_Resources") {
258
refundPartialBuildCosts(
259
inventory,
260
inventory.CrewShipWeaponSkins[index].ItemType,
261
inventoryChanges
262
);
277
});
278
break;
279
case "Consumables":
280
{
281
const consumablesChanges = [];
282
for (const sellItem of payload.Items.Consumables) {
283
consumablesChanges.push({
284
ItemType: sellItem.String,
285
ItemCount: sellItem.Count * -1
286
});
263
287
}
264
inventory.CrewShipWeaponSkins.splice(index, 1);
265
freeUpSlot(inventory, InventorySlot.RJ_COMPONENT_AND_ARMAMENTS);
266
} else {
267
inventory.CrewShipSalvagedWeaponSkins.pull({ _id: sellItem.String });
288
addConsumables(inventory, consumablesChanges);
268
289
}
269
}
270
});
271
}
272
if (payload.Items.Consumables) {
273
const consumablesChanges = [];
274
for (const sellItem of payload.Items.Consumables) {
275
consumablesChanges.push({
276
ItemType: sellItem.String,
277
ItemCount: sellItem.Count * -1
278
});
279
}
280
addConsumables(inventory, consumablesChanges);
281
}
282
if (payload.Items.Recipes) {
283
const recipeChanges = [];
284
for (const sellItem of payload.Items.Recipes) {
285
recipeChanges.push({
286
ItemType: sellItem.String,
287
ItemCount: sellItem.Count * -1
288
});
289
}
290
addRecipes(inventory, recipeChanges);
291
}
292
if (payload.Items.Upgrades) {
293
payload.Items.Upgrades.forEach(sellItem => {
294
if (sellItem.Count == 0) {
295
inventory.Upgrades.pull({ _id: sellItem.String });
296
} else {
297
addMods(inventory, [
298
{
299
ItemType: sellItem.String,
300
ItemCount: sellItem.Count * -1
301
}
302
]);
303
}
304
});
305
}
306
if (payload.Items.MiscItems) {
307
payload.Items.MiscItems.forEach(sellItem => {
308
addMiscItems(inventory, [
290
break;
291
case "Recipes":
309
292
{
310
ItemType: sellItem.String,
311
ItemCount: sellItem.Count * -1
293
const recipeChanges = [];
294
for (const sellItem of payload.Items.Recipes) {
295
recipeChanges.push({
296
ItemType: sellItem.String,
297
ItemCount: sellItem.Count * -1
298
});
299
}
300
addRecipes(inventory, recipeChanges);
312
301
}
313
]);
314
});
315
}
316
if (payload.Items.FusionTreasures) {
317
payload.Items.FusionTreasures.forEach(sellItem => {
318
addFusionTreasures(inventory, [parseFusionTreasure(sellItem.String, sellItem.Count * -1)]);
319
});
320
}
321
if (payload.Items.WeaponSkins) {
322
payload.Items.WeaponSkins.forEach(sellItem => {
323
inventory.WeaponSkins.pull({ _id: sellItem.String });
324
});
302
break;
303
case "Upgrades":
304
payload.Items.Upgrades.forEach(sellItem => {
305
if (sellItem.Count == 0) {
306
inventory.Upgrades.pull({ _id: sellItem.String });
307
} else {
308
addMods(inventory, [
309
{
310
ItemType: sellItem.String,
311
ItemCount: sellItem.Count * -1
312
}
313
]);
314
}
315
});
316
break;
317
case "MiscItems":
318
payload.Items.MiscItems.forEach(sellItem => {
319
addMiscItems(inventory, [
320
{
321
ItemType: sellItem.String,
322
ItemCount: sellItem.Count * -1
323
}
324
]);
325
});
326
break;
327
case "FusionTreasures":
328
payload.Items.FusionTreasures.forEach(sellItem => {
329
addFusionTreasures(inventory, [parseFusionTreasure(sellItem.String, sellItem.Count * -1)]);
330
});
331
break;
332
case "WeaponSkins": // SNS specific field, only used by webui
333
payload.Items.WeaponSkins.forEach(sellItem => {
334
inventory.WeaponSkins.pull({ _id: sellItem.String });
335
});
336
break;
337
default:
338
logger.warn(`unhandled sell category: ${key}`);
339
}
325
340
}
326
341
327
342
await inventory.save();
@@ -332,32 +347,7 @@ export const sellController: RequestHandler = async (req, res) => {
332
347
};
333
348
334
349
interface ISellRequest {
335
Items: {
336
Suits?: ISellItem[];
337
LongGuns?: ISellItem[];
338
Pistols?: ISellItem[];
339
Melee?: ISellItem[];
340
Consumables?: ISellItem[];
341
Recipes?: ISellItem[];
342
Upgrades?: ISellItem[];
343
MiscItems?: ISellItem[];
344
SpaceSuits?: ISellItem[];
345
SpaceGuns?: ISellItem[];
346
SpaceMelee?: ISellItem[];
347
MechSuits?: ISellItem[];
348
Sentinels?: ISellItem[];
349
SentinelWeapons?: ISellItem[];
350
MoaPets?: ISellItem[];
351
OperatorAmps?: ISellItem[];
352
Hoverboards?: ISellItem[];
353
Drones?: ISellItem[];
354
KubrowPetPrints?: ISellItem[];
355
CrewMembers?: ISellItem[];
356
CrewShipWeapons?: ISellItem[];
357
CrewShipWeaponSkins?: ISellItem[];
358
FusionTreasures?: ISellItem[];
359
WeaponSkins?: ISellItem[]; // SNS specific field
360
};
350
Items: Record<string, ISellItem[]>;
361
351
SellPrice: number;
362
352
SellCurrency?:
363
353
| "SC_RegularCredits"