system now uses seperate pricing.
All checks were successful
Build Frontend / Build Frontend (push) Successful in 24s

This commit is contained in:
2026-01-11 03:24:54 +00:00
parent b686acee8f
commit 7a32454b83
6 changed files with 718 additions and 11 deletions

View File

@@ -786,6 +786,98 @@ export default async function adminManagementRoutes(fastify, options) {
}
);
// PATCH /admin/config/instantsell - Update instant sell settings
fastify.patch(
"/config/instantsell",
{
preHandler: [authenticate, isAdmin],
schema: {
body: {
type: "object",
properties: {
enabled: { type: "boolean" },
payoutRate: { type: "number", minimum: 0, maximum: 1 },
minItemValue: { type: "number", minimum: 0 },
maxItemValue: { type: "number", minimum: 0 },
cs2: {
type: "object",
properties: {
enabled: { type: "boolean" },
payoutRate: { type: "number", minimum: 0, maximum: 1 },
},
},
rust: {
type: "object",
properties: {
enabled: { type: "boolean" },
payoutRate: { type: "number", minimum: 0, maximum: 1 },
},
},
},
},
},
},
async (request, reply) => {
try {
const config = await SiteConfig.getConfig();
// Update top-level instant sell settings
["enabled", "payoutRate", "minItemValue", "maxItemValue"].forEach(
(key) => {
if (request.body[key] !== undefined) {
config.instantSell[key] = request.body[key];
}
}
);
// Update CS2 settings
if (request.body.cs2) {
Object.keys(request.body.cs2).forEach((key) => {
if (request.body.cs2[key] !== undefined) {
config.instantSell.cs2[key] = request.body.cs2[key];
}
});
}
// Update Rust settings
if (request.body.rust) {
Object.keys(request.body.rust).forEach((key) => {
if (request.body.rust[key] !== undefined) {
config.instantSell.rust[key] = request.body.rust[key];
}
});
}
config.lastUpdatedBy = request.user.username;
config.lastUpdatedAt = new Date();
await config.save();
console.log(
`⚙️ Admin ${request.user.username} updated instant sell settings:`,
{
payoutRate: config.instantSell.payoutRate,
cs2PayoutRate: config.instantSell.cs2?.payoutRate,
rustPayoutRate: config.instantSell.rust?.payoutRate,
}
);
return reply.send({
success: true,
message: "Instant sell settings updated",
instantSell: config.instantSell,
});
} catch (error) {
console.error("❌ Failed to update instant sell settings:", error);
return reply.status(500).send({
success: false,
message: "Failed to update instant sell settings",
error: error.message,
});
}
}
);
// ============================================
// ANNOUNCEMENTS
// ============================================

View File

@@ -3,6 +3,7 @@ import { authenticate } from "../middleware/auth.js";
import Item from "../models/Item.js";
import Trade from "../models/Trade.js";
import Transaction from "../models/Transaction.js";
import SiteConfig from "../models/SiteConfig.js";
import { config } from "../config/index.js";
import pricingService from "../services/pricing.js";
import marketPriceService from "../services/marketPrice.js";
@@ -184,6 +185,23 @@ export default async function inventoryRoutes(fastify, options) {
// Enrich items with market prices (fast database lookup)
console.log(`💰 Adding market prices...`);
// Get site config for payout rate
const siteConfig = await SiteConfig.getConfig();
let payoutRate = siteConfig.instantSell.payoutRate || 0.6;
// Check for game-specific payout rate
if (game === "cs2" && siteConfig.instantSell.cs2?.payoutRate) {
payoutRate = siteConfig.instantSell.cs2.payoutRate;
} else if (game === "rust" && siteConfig.instantSell.rust?.payoutRate) {
payoutRate = siteConfig.instantSell.rust.payoutRate;
}
console.log(
`💵 Instant sell payout rate: ${(payoutRate * 100).toFixed(
0
)}% of market price`
);
// Get all item names for batch lookup
const itemNames = items.map((item) => item.name);
console.log(`📋 Looking up prices for ${itemNames.length} items`);
@@ -196,12 +214,19 @@ export default async function inventoryRoutes(fastify, options) {
`💰 Found prices for ${foundPrices}/${itemNames.length} items`
);
// Add prices to items
const enrichedItems = items.map((item) => ({
...item,
marketPrice: priceMap[item.name] || null,
hasPriceData: !!priceMap[item.name],
}));
// Add prices to items (applying payout rate for instant sell)
const enrichedItems = items.map((item) => {
const marketPrice = priceMap[item.name] || null;
return {
...item,
marketPrice: marketPrice
? parseFloat((marketPrice * payoutRate).toFixed(2))
: null,
fullMarketPrice: marketPrice, // Keep original for reference
payoutRate: payoutRate,
hasPriceData: !!marketPrice,
};
});
// Log items without prices
const itemsWithoutPrices = enrichedItems.filter(