Skip to content
This repository was archived by the owner on Apr 8, 2026. It is now read-only.

Commit b589a45

Browse files
committed
feat: Enhance inventory management by adding dataItemIndex parameter for item removal and selling operations
1 parent 7833b5f commit b589a45

9 files changed

Lines changed: 161 additions & 102 deletions

File tree

dist/controllers/ItemController.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ let Items = class Items {
326326
}
327327
async sellItem(req, res) {
328328
const { itemId } = req.params;
329-
const { amount, purchasePrice } = req.body; // Ajouter purchasePrice
329+
const { amount, purchasePrice, dataItemIndex } = req.body; // Ajouter purchasePrice
330330
if (!itemId || isNaN(amount)) {
331331
await this.createLog(req, "inventory", 400, req.user?.user_id, {
332332
reason: "invalid_input",
@@ -370,7 +370,7 @@ let Items = class Items {
370370
});
371371
}
372372
// Supprimer les items avec le prix d'achat spécifique
373-
await this.inventoryService.removeSellableItemWithPrice(user.user_id, itemId, amount, purchasePrice);
373+
await this.inventoryService.removeSellableItemWithPrice(user.user_id, itemId, amount, purchasePrice, dataItemIndex);
374374
const sellValue = purchasePrice * amount * 0.75; // 75% du prix d'achat
375375
const isOwner = user.user_id === item.owner;
376376
// Augmenter le balance seulement si l'utilisateur n'est PAS le propriétaire
@@ -619,7 +619,7 @@ let Items = class Items {
619619
}
620620
async dropItem(req, res) {
621621
const { itemId } = req.params;
622-
const { amount, uniqueId } = req.body;
622+
const { amount, uniqueId, dataItemIndex } = req.body;
623623
if (!itemId) {
624624
await this.createLog(req, "inventory", 400, req.user?.user_id, {
625625
reason: "missing_itemId",
@@ -680,7 +680,7 @@ let Items = class Items {
680680
message: "You don't have enough items without metadata to drop",
681681
});
682682
}
683-
await this.inventoryService.removeItem(user.user_id, itemId, amount);
683+
await this.inventoryService.removeItem(user.user_id, itemId, amount, dataItemIndex);
684684
await this.createLog(req, "inventory", 200, req.user?.user_id, {
685685
itemId,
686686
action: "drop",

dist/index.js

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,8 @@ function backupDatabase() {
3434
return;
3535
}
3636
const command = `mysqldump -h ${dbHost} -u ${dbUser} -p'${dbPassword}' ${dbName} > ${backupPath}`;
37-
(0, child_process_1.exec)(command, (error, stdout, stderr) => {
38-
if (error) {
39-
// console.error("MySQL database backup failed:", error);
40-
// console.error("stderr:", stderr);
41-
}
42-
else {
37+
(0, child_process_1.exec)(command, (error) => {
38+
if (!error) {
4339
console.log("MySQL database backup created:", backupPath);
4440
}
4541
});

dist/repositories/InventoryRepository.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ export declare class InventoryRepository {
1111
} | undefined, sellable: boolean, purchasePrice: number | undefined, uuidv4: () => string): Promise<void>;
1212
setItemAmount(userId: string, itemId: string, amount: number): Promise<void>;
1313
updateItemMetadata(userId: string, itemId: string, uniqueId: string, metadata: object): Promise<void>;
14-
removeItem(userId: string, itemId: string, amount: number): Promise<void>;
14+
removeItem(userId: string, itemId: string, amount: number, dataItemIndex?: number): Promise<void>;
1515
removeItemByUniqueId(userId: string, itemId: string, uniqueId: string): Promise<void>;
1616
hasItemWithoutMetadata(userId: string, itemId: string, amount: number): Promise<boolean>;
1717
hasItemWithoutMetadataSellable(userId: string, itemId: string, amount: number): Promise<boolean>;
1818
removeSellableItem(userId: string, itemId: string, amount: number): Promise<void>;
19-
removeSellableItemWithPrice(userId: string, itemId: string, amount: number, purchasePrice: number): Promise<void>;
19+
removeSellableItemWithPrice(userId: string, itemId: string, amount: number, purchasePrice: number, dataItemIndex?: number): Promise<void>;
2020
transferItem(fromUserId: string, toUserId: string, itemId: string, uniqueId: string): Promise<void>;
2121
}

dist/repositories/InventoryRepository.js

Lines changed: 60 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class InventoryRepository {
1313
)`, [userId]);
1414
}
1515
async getInventoryItems(userId) {
16-
return await this.databaseService.read(`SELECT
16+
const items = await this.databaseService.read(`SELECT
1717
inv.user_id,
1818
inv.item_id,
1919
inv.amount,
@@ -32,6 +32,29 @@ class InventoryRepository {
3232
FROM inventories inv
3333
INNER JOIN items i ON inv.item_id = i.itemId AND (i.deleted IS NULL OR i.deleted = 0)
3434
WHERE inv.user_id = ? AND inv.amount > 0`, [userId]);
35+
return items.sort((a, b) => {
36+
const nameCompare = a.name?.localeCompare(b.name || '') || 0;
37+
if (nameCompare !== 0)
38+
return nameCompare;
39+
if (!a.metadata && b.metadata)
40+
return -1;
41+
if (a.metadata && !b.metadata)
42+
return 1;
43+
return 0;
44+
}).map((item) => ({
45+
user_id: item.user_id,
46+
item_id: item.item_id,
47+
amount: item.amount,
48+
metadata: item.metadata,
49+
sellable: !!item.sellable,
50+
purchasePrice: item.purchasePrice,
51+
name: item.name,
52+
description: item.description,
53+
iconHash: item.iconHash,
54+
price: item.purchasePrice,
55+
rarity: item.rarity,
56+
custom_url_link: item.custom_url_link
57+
}));
3558
}
3659
async getItemAmount(userId, itemId) {
3760
const items = await this.databaseService.read("SELECT SUM(amount) as amount FROM inventories WHERE user_id = ? AND item_id = ?", [userId, itemId]);
@@ -73,21 +96,34 @@ class InventoryRepository {
7396
const metadataJson = JSON.stringify(metadataWithUniqueId);
7497
await this.databaseService.request("UPDATE inventories SET metadata = ? WHERE user_id = ? AND item_id = ? AND JSON_EXTRACT(metadata, '$._unique_id') = ?", [metadataJson, userId, itemId, uniqueId]);
7598
}
76-
async removeItem(userId, itemId, amount) {
77-
const items = await this.databaseService.read(`SELECT * FROM inventories WHERE user_id = ? AND item_id = ? AND metadata IS NULL ORDER BY amount DESC`, [userId, itemId]);
78-
console.log(`Removing ${amount} of item ${itemId} from user ${userId}`);
79-
console.log(`Found items:`, items);
99+
async removeItem(userId, itemId, amount, dataItemIndex) {
100+
// On récupère tous les stacks correspondants, triés par amount DESC pour vider les plus gros d'abord
101+
const items = await this.getInventoryItems(userId);
102+
// Si dataItemIndex est défini, on ne retire que sur ce stack précis
103+
if (typeof dataItemIndex === "number" && items[dataItemIndex]) {
104+
const item = items[dataItemIndex];
105+
const toRemoveFromStack = Math.min(amount, item.amount);
106+
const newAmount = item.amount - toRemoveFromStack;
107+
if (newAmount <= 0) {
108+
await this.databaseService.request(`DELETE FROM inventories WHERE user_id = ? AND item_id = ? AND sellable = ? AND amount = ? AND purchasePrice = ? LIMIT 1`, [userId, item.item_id, item.sellable ? 1 : 0, item.amount, item.purchasePrice]);
109+
}
110+
else {
111+
await this.databaseService.request(`UPDATE inventories SET amount = ? WHERE user_id = ? AND item_id = ? AND metadata IS NULL AND sellable = ? AND amount = ? AND purchasePrice = ? LIMIT 1`, [newAmount, userId, item.item_id, item.sellable ? 1 : 0, item.amount, item.purchasePrice]);
112+
}
113+
return;
114+
}
115+
// Sinon, comportement classique (réparti sur tous les stacks)
80116
let remainingToRemove = amount;
81117
for (const item of items) {
82118
if (remainingToRemove <= 0)
83119
break;
84120
const toRemoveFromStack = Math.min(remainingToRemove, item.amount);
85121
const newAmount = item.amount - toRemoveFromStack;
86122
if (newAmount <= 0) {
87-
await this.databaseService.request(`DELETE FROM inventories WHERE user_id = ? AND item_id = ? AND metadata IS NULL AND sellable = ?`, [userId, itemId, item.sellable ? 1 : 0]);
123+
await this.databaseService.request(`DELETE FROM inventories WHERE user_id = ? AND item_id = ? AND metadata IS NULL AND sellable = ? AND amount = ? LIMIT 1`, [userId, itemId, item.sellable ? 1 : 0, item.amount]);
88124
}
89125
else {
90-
await this.databaseService.request(`UPDATE inventories SET amount = ? WHERE user_id = ? AND item_id = ? AND metadata IS NULL AND sellable = ?`, [newAmount, userId, itemId, item.sellable ? 1 : 0]);
126+
await this.databaseService.request(`UPDATE inventories SET amount = ? WHERE user_id = ? AND item_id = ? AND metadata IS NULL AND sellable = ? AND amount = ? LIMIT 1`, [newAmount, userId, itemId, item.sellable ? 1 : 0, item.amount]);
91127
}
92128
remainingToRemove -= toRemoveFromStack;
93129
}
@@ -122,19 +158,33 @@ class InventoryRepository {
122158
remainingToRemove -= toRemoveFromStack;
123159
}
124160
}
125-
async removeSellableItemWithPrice(userId, itemId, amount, purchasePrice) {
161+
async removeSellableItemWithPrice(userId, itemId, amount, purchasePrice, dataItemIndex) {
126162
const items = await this.databaseService.read(`SELECT * FROM inventories WHERE user_id = ? AND item_id = ? AND metadata IS NULL AND sellable = 1 AND purchasePrice = ? ORDER BY amount DESC`, [userId, itemId, purchasePrice]);
163+
// Si dataItemIndex est défini, on ne retire que sur ce stack précis
164+
if (typeof dataItemIndex === "number" && items[dataItemIndex]) {
165+
const item = items[dataItemIndex];
166+
const toRemoveFromStack = Math.min(amount, item.amount);
167+
const newAmount = item.amount - toRemoveFromStack;
168+
if (newAmount <= 0) {
169+
await this.databaseService.request(`DELETE FROM inventories WHERE user_id = ? AND item_id = ? AND metadata IS NULL AND sellable = 1 AND amount = ? AND purchasePrice = ? LIMIT 1`, [userId, itemId, item.amount, purchasePrice]);
170+
}
171+
else {
172+
await this.databaseService.request(`UPDATE inventories SET amount = ? WHERE user_id = ? AND item_id = ? AND metadata IS NULL AND sellable = 1 AND amount = ? AND purchasePrice = ? LIMIT 1`, [newAmount, userId, itemId, item.amount, purchasePrice]);
173+
}
174+
return;
175+
}
176+
// Sinon, comportement classique (réparti sur tous les stacks)
127177
let remainingToRemove = amount;
128178
for (const item of items) {
129179
if (remainingToRemove <= 0)
130180
break;
131181
const toRemoveFromStack = Math.min(remainingToRemove, item.amount);
132182
const newAmount = item.amount - toRemoveFromStack;
133183
if (newAmount <= 0) {
134-
await this.databaseService.request(`DELETE FROM inventories WHERE user_id = ? AND item_id = ? AND metadata IS NULL AND sellable = 1 AND purchasePrice = ?`, [userId, itemId, purchasePrice]);
184+
await this.databaseService.request(`DELETE FROM inventories WHERE user_id = ? AND item_id = ? AND metadata IS NULL AND sellable = 1 AND amount = ? AND purchasePrice = ? LIMIT 1`, [userId, itemId, item.amount, purchasePrice]);
135185
}
136186
else {
137-
await this.databaseService.request(`UPDATE inventories SET amount = ? WHERE user_id = ? AND item_id = ? AND metadata IS NULL AND sellable = 1 AND purchasePrice = ?`, [newAmount, userId, itemId, purchasePrice]);
187+
await this.databaseService.request(`UPDATE inventories SET amount = ? WHERE user_id = ? AND item_id = ? AND metadata IS NULL AND sellable = 1 AND amount = ? AND purchasePrice = ? LIMIT 1`, [newAmount, userId, itemId, item.amount, purchasePrice]);
138188
}
139189
remainingToRemove -= toRemoveFromStack;
140190
}

dist/services/InventoryService.d.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ export interface IInventoryService {
77
addItem(userId: string, itemId: string, amount: number, metadata?: {
88
[key: string]: unknown;
99
}, sellable?: boolean, purchasePrice?: number): Promise<void>;
10-
removeItem(userId: string, itemId: string, amount: number): Promise<void>;
10+
removeItem(userId: string, itemId: string, amount: number, dataItemIndex?: number): Promise<void>;
1111
removeItemByUniqueId(userId: string, itemId: string, uniqueId: string): Promise<void>;
1212
setItemAmount(userId: string, itemId: string, amount: number): Promise<void>;
1313
updateItemMetadata(userId: string, itemId: string, uniqueId: string, metadata: {
@@ -18,7 +18,7 @@ export interface IInventoryService {
1818
transferItem(fromUserId: string, toUserId: string, itemId: string, uniqueId: string): Promise<void>;
1919
hasItemWithoutMetadataSellable(userId: string, itemId: string, amount?: number): Promise<boolean>;
2020
removeSellableItem(userId: string, itemId: string, amount: number): Promise<void>;
21-
removeSellableItemWithPrice(userId: string, itemId: string, amount: number, purchasePrice: number): Promise<void>;
21+
removeSellableItemWithPrice(userId: string, itemId: string, amount: number, purchasePrice: number, dataItemIndex?: number): Promise<void>;
2222
}
2323
export declare class InventoryService implements IInventoryService {
2424
private databaseService;
@@ -35,12 +35,12 @@ export declare class InventoryService implements IInventoryService {
3535
updateItemMetadata(userId: string, itemId: string, uniqueId: string, metadata: {
3636
[key: string]: unknown;
3737
}): Promise<void>;
38-
removeItem(userId: string, itemId: string, amount: number): Promise<void>;
38+
removeItem(userId: string, itemId: string, amount: number, dataItemIndex?: number): Promise<void>;
3939
removeItemByUniqueId(userId: string, itemId: string, uniqueId: string): Promise<void>;
4040
hasItem(userId: string, itemId: string, amount?: number): Promise<boolean>;
4141
hasItemWithoutMetadata(userId: string, itemId: string, amount?: number): Promise<boolean>;
4242
hasItemWithoutMetadataSellable(userId: string, itemId: string, amount?: number): Promise<boolean>;
4343
removeSellableItem(userId: string, itemId: string, amount: number): Promise<void>;
44-
removeSellableItemWithPrice(userId: string, itemId: string, amount: number, purchasePrice: number): Promise<void>;
44+
removeSellableItemWithPrice(userId: string, itemId: string, amount: number, purchasePrice: number, dataItemIndex: number): Promise<void>;
4545
transferItem(fromUserId: string, toUserId: string, itemId: string, uniqueId: string): Promise<void>;
4646
}

dist/services/InventoryService.js

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -30,31 +30,7 @@ let InventoryService = class InventoryService {
3030
const correctedUserId = await this.getCorrectedUserId(userId);
3131
await this.inventoryRepository.deleteNonExistingItems(correctedUserId);
3232
const items = await this.inventoryRepository.getInventoryItems(correctedUserId);
33-
items.sort((a, b) => {
34-
const nameCompare = a.name?.localeCompare(b.name || '') || 0;
35-
if (nameCompare !== 0)
36-
return nameCompare;
37-
if (!a.metadata && b.metadata)
38-
return -1;
39-
if (a.metadata && !b.metadata)
40-
return 1;
41-
return 0;
42-
});
43-
const processedItems = items.map((item) => ({
44-
user_id: item.user_id,
45-
item_id: item.item_id,
46-
amount: item.amount,
47-
metadata: item.metadata,
48-
sellable: !!item.sellable,
49-
purchasePrice: item.purchasePrice,
50-
name: item.name,
51-
description: item.description,
52-
iconHash: item.iconHash,
53-
price: item.purchasePrice,
54-
rarity: item.rarity,
55-
custom_url_link: item.custom_url_link
56-
}));
57-
return { user_id: userId, inventory: processedItems };
33+
return { user_id: userId, inventory: items };
5834
}
5935
async getItemAmount(userId, itemId) {
6036
const correctedUserId = await this.getCorrectedUserId(userId);
@@ -72,9 +48,9 @@ let InventoryService = class InventoryService {
7248
const correctedUserId = await this.getCorrectedUserId(userId);
7349
await this.inventoryRepository.updateItemMetadata(correctedUserId, itemId, uniqueId, metadata);
7450
}
75-
async removeItem(userId, itemId, amount) {
51+
async removeItem(userId, itemId, amount, dataItemIndex) {
7652
const correctedUserId = await this.getCorrectedUserId(userId);
77-
await this.inventoryRepository.removeItem(correctedUserId, itemId, amount);
53+
await this.inventoryRepository.removeItem(correctedUserId, itemId, amount, dataItemIndex);
7854
}
7955
async removeItemByUniqueId(userId, itemId, uniqueId) {
8056
const correctedUserId = await this.getCorrectedUserId(userId);
@@ -99,9 +75,9 @@ let InventoryService = class InventoryService {
9975
await this.inventoryRepository.removeSellableItem(correctedUserId, itemId, amount);
10076
}
10177
// Nouvelle méthode pour supprimer spécifiquement les items sellable avec un prix donné
102-
async removeSellableItemWithPrice(userId, itemId, amount, purchasePrice) {
78+
async removeSellableItemWithPrice(userId, itemId, amount, purchasePrice, dataItemIndex) {
10379
const correctedUserId = await this.getCorrectedUserId(userId);
104-
await this.inventoryRepository.removeSellableItemWithPrice(correctedUserId, itemId, amount, purchasePrice);
80+
await this.inventoryRepository.removeSellableItemWithPrice(correctedUserId, itemId, amount, purchasePrice, dataItemIndex);
10581
}
10682
async transferItem(fromUserId, toUserId, itemId, uniqueId) {
10783
const correctedFromUserId = await this.getCorrectedUserId(fromUserId);

src/controllers/ItemController.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -464,7 +464,7 @@ export class Items {
464464
@httpPost("/sell/:itemId", LoggedCheck.middleware)
465465
public async sellItem(req: AuthenticatedRequest, res: Response) {
466466
const { itemId } = req.params;
467-
const { amount, purchasePrice } = req.body; // Ajouter purchasePrice
467+
const { amount, purchasePrice, dataItemIndex } = req.body; // Ajouter purchasePrice
468468
if (!itemId || isNaN(amount)) {
469469
await this.createLog(req, "inventory", 400, req.user?.user_id, {
470470
reason: "invalid_input",
@@ -513,7 +513,7 @@ export class Items {
513513
}
514514

515515
// Supprimer les items avec le prix d'achat spécifique
516-
await this.inventoryService.removeSellableItemWithPrice(user.user_id, itemId, amount, purchasePrice);
516+
await this.inventoryService.removeSellableItemWithPrice(user.user_id, itemId, amount, purchasePrice, dataItemIndex);
517517

518518
const sellValue = purchasePrice * amount * 0.75; // 75% du prix d'achat
519519
const isOwner = user.user_id === item.owner;
@@ -838,7 +838,7 @@ export class Items {
838838
@httpPost("/drop/:itemId", LoggedCheck.middleware)
839839
public async dropItem(req: AuthenticatedRequest, res: Response) {
840840
const { itemId } = req.params;
841-
const { amount, uniqueId } = req.body;
841+
const { amount, uniqueId, dataItemIndex } = req.body;
842842

843843
if (!itemId) {
844844
await this.createLog(req, "inventory", 400, req.user?.user_id, {
@@ -905,7 +905,7 @@ export class Items {
905905
});
906906
}
907907

908-
await this.inventoryService.removeItem(user.user_id, itemId, amount);
908+
await this.inventoryService.removeItem(user.user_id, itemId, amount, dataItemIndex);
909909
await this.createLog(req, "inventory", 200, req.user?.user_id, {
910910
itemId,
911911
action: "drop",

0 commit comments

Comments
 (0)