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

Commit f36f2e1

Browse files
committed
feat(trade): add purchasePrice to TradeItem and update TradeService for price handling
1 parent d934547 commit f36f2e1

5 files changed

Lines changed: 187 additions & 74 deletions

File tree

dist/interfaces/Trade.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export interface TradeItem {
55
[key: string]: unknown;
66
_unique_id?: string;
77
};
8+
purchasePrice?: number;
89
}
910
export type TradeStatus = "pending" | "approved" | "completed" | "canceled";
1011
export interface Trade {

dist/services/TradeService.d.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export interface ITradeService {
1818
metadata?: {
1919
[key: string]: unknown;
2020
};
21+
purchasePrice?: number;
2122
}>;
2223
toUserItems: Array<{
2324
itemId: string;
@@ -29,6 +30,7 @@ export interface ITradeService {
2930
metadata?: {
3031
[key: string]: unknown;
3132
};
33+
purchasePrice?: number;
3234
}>;
3335
approvedFromUser: boolean;
3436
approvedToUser: boolean;
@@ -51,6 +53,7 @@ export interface ITradeService {
5153
metadata?: {
5254
[key: string]: unknown;
5355
};
56+
purchasePrice?: number;
5457
}>;
5558
toUserItems: Array<{
5659
itemId: string;
@@ -62,6 +65,7 @@ export interface ITradeService {
6265
metadata?: {
6366
[key: string]: unknown;
6467
};
68+
purchasePrice?: number;
6569
}>;
6670
approvedFromUser: boolean;
6771
approvedToUser: boolean;
@@ -95,6 +99,7 @@ export declare class TradeService implements ITradeService {
9599
metadata?: {
96100
[key: string]: unknown;
97101
};
102+
purchasePrice?: number;
98103
}>;
99104
toUserItems: Array<{
100105
itemId: string;
@@ -106,6 +111,7 @@ export declare class TradeService implements ITradeService {
106111
metadata?: {
107112
[key: string]: unknown;
108113
};
114+
purchasePrice?: number;
109115
}>;
110116
approvedFromUser: boolean;
111117
approvedToUser: boolean;
@@ -128,6 +134,7 @@ export declare class TradeService implements ITradeService {
128134
metadata?: {
129135
[key: string]: unknown;
130136
};
137+
purchasePrice?: number;
131138
}>;
132139
toUserItems: Array<{
133140
itemId: string;
@@ -139,6 +146,7 @@ export declare class TradeService implements ITradeService {
139146
metadata?: {
140147
[key: string]: unknown;
141148
};
149+
purchasePrice?: number;
142150
}>;
143151
approvedFromUser: boolean;
144152
approvedToUser: boolean;

dist/services/TradeService.js

Lines changed: 55 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ let TradeService = class TradeService {
9191
iconHash: item.iconHash,
9292
amount: ti.amount,
9393
uniqueId: ti.metadata?._unique_id,
94-
metadata: ti.metadata
94+
metadata: ti.metadata,
95+
purchasePrice: ti.purchasePrice // Transmettre le purchasePrice
9596
});
9697
}
9798
return enrichedItems;
@@ -177,10 +178,21 @@ let TradeService = class TradeService {
177178
}
178179
}
179180
else {
180-
// Pour les items sans métadonnées, vérifier la quantité disponible
181-
const hasItem = await this.inventoryService.hasItemWithoutMetadata(userId, tradeItem.itemId, tradeItem.amount);
182-
if (!hasItem)
183-
throw new Error("User does not have enough of the item");
181+
// Pour les items sans métadonnées, vérifier avec le prix d'achat si spécifié
182+
if (tradeItem.purchasePrice !== undefined) {
183+
const inventoryItems = await this.databaseService.read(`SELECT user_id, item_id, amount FROM inventories
184+
WHERE user_id = ? AND item_id = ? AND metadata IS NULL AND sellable = 1 AND purchasePrice = ?`, [userId, tradeItem.itemId, tradeItem.purchasePrice]);
185+
const totalAvailable = inventoryItems.reduce((sum, item) => sum + item.amount, 0);
186+
if (totalAvailable < tradeItem.amount) {
187+
throw new Error("User does not have enough of the item with specified purchase price");
188+
}
189+
}
190+
else {
191+
// Vérification normale sans prix spécifique
192+
const hasItem = await this.inventoryService.hasItemWithoutMetadata(userId, tradeItem.itemId, tradeItem.amount);
193+
if (!hasItem)
194+
throw new Error("User does not have enough of the item");
195+
}
184196
}
185197
const items = [...trade[userKey]];
186198
// Pour les items avec _unique_id, ne pas les empiler
@@ -194,8 +206,10 @@ let TradeService = class TradeService {
194206
items.push({ ...tradeItem });
195207
}
196208
else {
197-
// Pour les items sans métadonnées, on peut les empiler
198-
const idx = items.findIndex((i) => i.itemId === tradeItem.itemId && !i.metadata?._unique_id);
209+
// Pour les items sans métadonnées, vérifier l'empilage avec le prix d'achat
210+
const idx = items.findIndex((i) => i.itemId === tradeItem.itemId &&
211+
!i.metadata?._unique_id &&
212+
i.purchasePrice === tradeItem.purchasePrice);
199213
if (idx >= 0) {
200214
items[idx].amount += tradeItem.amount;
201215
}
@@ -223,8 +237,10 @@ let TradeService = class TradeService {
223237
i.metadata?._unique_id === tradeItem.metadata?._unique_id);
224238
}
225239
else {
226-
// Pour les items sans métadonnées, chercher un item empilable
227-
idx = items.findIndex((i) => i.itemId === tradeItem.itemId && !i.metadata?._unique_id);
240+
// Pour les items sans métadonnées, chercher avec le prix d'achat
241+
idx = items.findIndex((i) => i.itemId === tradeItem.itemId &&
242+
!i.metadata?._unique_id &&
243+
i.purchasePrice === tradeItem.purchasePrice);
228244
}
229245
if (idx === -1)
230246
throw new Error("Item not found in trade");
@@ -281,33 +297,48 @@ let TradeService = class TradeService {
281297
}
282298
// Échange les items et passe la trade à completed
283299
async exchangeTradeItems(trade) {
284-
// Pour les items avec _unique_id, utiliser transferItem pour préserver l'ID unique
285-
// Pour les items sans métadonnées, utiliser la méthode classique remove/add avec gestion de sellable
286300
for (const item of trade.fromUserItems) {
287301
if (item.metadata?._unique_id) {
288-
// Transférer directement l'item avec son unique_id préservé
289302
await this.inventoryService.transferItem(trade.fromUserId, trade.toUserId, item.itemId, item.metadata._unique_id);
290303
}
291304
else {
292-
// Pour les items sans métadonnées, vérifier s'ils sont sellable
293-
const inventory = await this.inventoryService.getInventory(trade.fromUserId);
294-
const inventoryItem = inventory.inventory.find(invItem => invItem.item_id === item.itemId && !invItem.metadata);
295-
const isSellable = inventoryItem?.sellable || false;
296-
await this.inventoryService.removeItem(trade.fromUserId, item.itemId, item.amount);
297-
await this.inventoryService.addItem(trade.toUserId, item.itemId, item.amount, undefined, isSellable);
305+
// Pour les items sans métadonnées, utiliser le prix d'achat spécifique si fourni
306+
if (item.purchasePrice !== undefined) {
307+
await this.inventoryService.removeSellableItemWithPrice(trade.fromUserId, item.itemId, item.amount, item.purchasePrice);
308+
await this.inventoryService.addItem(trade.toUserId, item.itemId, item.amount, undefined, true, // Les items échangés restent sellable
309+
item.purchasePrice);
310+
}
311+
else {
312+
// Méthode normale pour les items sans prix spécifique
313+
const inventory = await this.inventoryService.getInventory(trade.fromUserId);
314+
const inventoryItem = inventory.inventory.find(invItem => invItem.item_id === item.itemId && !invItem.metadata);
315+
const isSellable = inventoryItem?.sellable || false;
316+
const purchasePrice = inventoryItem?.purchasePrice;
317+
await this.inventoryService.removeItem(trade.fromUserId, item.itemId, item.amount);
318+
await this.inventoryService.addItem(trade.toUserId, item.itemId, item.amount, undefined, isSellable, purchasePrice);
319+
}
298320
}
299321
}
300322
for (const item of trade.toUserItems) {
301323
if (item.metadata?._unique_id) {
302324
await this.inventoryService.transferItem(trade.toUserId, trade.fromUserId, item.itemId, item.metadata._unique_id);
303325
}
304326
else {
305-
// Pour les items sans métadonnées, vérifier s'ils sont sellable
306-
const inventory = await this.inventoryService.getInventory(trade.toUserId);
307-
const inventoryItem = inventory.inventory.find(invItem => invItem.item_id === item.itemId && !invItem.metadata);
308-
const isSellable = inventoryItem?.sellable || false;
309-
await this.inventoryService.removeItem(trade.toUserId, item.itemId, item.amount);
310-
await this.inventoryService.addItem(trade.fromUserId, item.itemId, item.amount, undefined, isSellable);
327+
// Pour les items sans métadonnées, utiliser le prix d'achat spécifique si fourni
328+
if (item.purchasePrice !== undefined) {
329+
await this.inventoryService.removeSellableItemWithPrice(trade.toUserId, item.itemId, item.amount, item.purchasePrice);
330+
await this.inventoryService.addItem(trade.fromUserId, item.itemId, item.amount, undefined, true, // Les items échangés restent sellable
331+
item.purchasePrice);
332+
}
333+
else {
334+
// Méthode normale pour les items sans prix spécifique
335+
const inventory = await this.inventoryService.getInventory(trade.toUserId);
336+
const inventoryItem = inventory.inventory.find(invItem => invItem.item_id === item.itemId && !invItem.metadata);
337+
const isSellable = inventoryItem?.sellable || false;
338+
const purchasePrice = inventoryItem?.purchasePrice;
339+
await this.inventoryService.removeItem(trade.toUserId, item.itemId, item.amount);
340+
await this.inventoryService.addItem(trade.fromUserId, item.itemId, item.amount, undefined, isSellable, purchasePrice);
341+
}
311342
}
312343
}
313344
// Met à jour la trade

src/interfaces/Trade.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export interface TradeItem {
22
itemId: string;
33
amount: number;
44
metadata?: { [key: string]: unknown; _unique_id?: string }; // Métadonnées complètes incluant _unique_id
5+
purchasePrice?: number; // Prix d'achat pour identifier les items spécifiques
56
}
67

78
export type TradeStatus = "pending" | "approved" | "completed" | "canceled";

0 commit comments

Comments
 (0)