system now uses seperate pricing.
All checks were successful
Build Frontend / Build Frontend (push) Successful in 24s
All checks were successful
Build Frontend / Build Frontend (push) Successful in 24s
This commit is contained in:
@@ -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
|
||||
// ============================================
|
||||
|
||||
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user