first commit
This commit is contained in:
389
PRICING_SETUP_COMPLETE.md
Normal file
389
PRICING_SETUP_COMPLETE.md
Normal file
@@ -0,0 +1,389 @@
|
||||
# ✅ Pricing System & Phase Detection - COMPLETE
|
||||
|
||||
## 🎉 What's Been Implemented
|
||||
|
||||
### 1. Phase Detection ✅
|
||||
- Automatically detects Doppler phases from item names/descriptions
|
||||
- Supported phases: Ruby, Sapphire, Black Pearl, Emerald, Phase 1-4
|
||||
- Phase multipliers applied to prices (Ruby 3.5x, Sapphire 3.8x, etc.)
|
||||
- Integrated into inventory loading
|
||||
|
||||
### 2. Real Market Prices Only ✅
|
||||
- **Removed all hardcoded prices**
|
||||
- Only uses real prices from SteamAPIs.com
|
||||
- Items without market data show as "no price available"
|
||||
- No fake/estimated prices anymore
|
||||
|
||||
### 3. Database Storage ✅
|
||||
- Added `marketPrice` field to Item model
|
||||
- Added `priceUpdatedAt` timestamp
|
||||
- Added `phase` field for Doppler items
|
||||
- Proper indexes for performance
|
||||
|
||||
### 4. Automatic Updates ✅
|
||||
- Scheduled hourly price updates (configurable)
|
||||
- Fetches from SteamAPIs.com `/market/items/{AppID}`
|
||||
- Updates CS2 and Rust items automatically
|
||||
- Logs update results
|
||||
|
||||
### 5. Admin Panel ✅
|
||||
- Complete admin interface at `/admin`
|
||||
- Price update controls
|
||||
- System statistics
|
||||
- Items without prices list
|
||||
- Real-time status monitoring
|
||||
|
||||
---
|
||||
|
||||
## 🚀 Quick Start
|
||||
|
||||
### Step 1: Make Yourself Admin
|
||||
|
||||
Run this script to grant admin access:
|
||||
|
||||
```bash
|
||||
node make-admin.js
|
||||
```
|
||||
|
||||
This will:
|
||||
- Find your user (Steam ID: 76561198027608071)
|
||||
- Set staffLevel to 3 (admin)
|
||||
- Grant access to admin routes
|
||||
|
||||
### Step 2: Restart Backend
|
||||
|
||||
```bash
|
||||
# Stop current server (Ctrl+C)
|
||||
npm run dev
|
||||
```
|
||||
|
||||
The server will:
|
||||
- Load pricing service
|
||||
- Start automatic hourly updates (if enabled)
|
||||
- Register admin routes
|
||||
|
||||
### Step 3: Initial Price Update
|
||||
|
||||
**Option A: Via Admin Panel (Recommended)**
|
||||
1. Go to http://localhost:5173/admin
|
||||
2. Select "All Games"
|
||||
3. Click "Update Prices Now"
|
||||
4. Wait for completion (~30 seconds)
|
||||
|
||||
**Option B: Via API**
|
||||
```bash
|
||||
curl -X POST http://localhost:3000/api/admin/prices/update \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Cookie: accessToken=YOUR_TOKEN" \
|
||||
-d '{"game": "all"}'
|
||||
```
|
||||
|
||||
### Step 4: Test Sell Page
|
||||
|
||||
1. Go to http://localhost:5173/sell
|
||||
2. Load your Steam inventory
|
||||
3. Items now show real market prices
|
||||
4. Items without prices won't appear (no fake prices!)
|
||||
|
||||
---
|
||||
|
||||
## 📊 Admin Panel Features
|
||||
|
||||
### Price Management
|
||||
- **Update Prices** - Manually trigger price updates
|
||||
- **Price Status** - View last update time and coverage
|
||||
- **Missing Prices** - See items without market data
|
||||
- **System Stats** - Total value, items, users
|
||||
|
||||
### Statistics Dashboard
|
||||
- CS2 item count and price coverage
|
||||
- Rust item count and price coverage
|
||||
- Last update timestamp
|
||||
- Total marketplace value
|
||||
- Average prices
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Configuration
|
||||
|
||||
### Environment Variables
|
||||
|
||||
```env
|
||||
# Steam API Key (REQUIRED)
|
||||
STEAM_APIS_KEY=your_steamapis_key_here
|
||||
|
||||
# Admin Access (Your Steam ID already added to script)
|
||||
# Or add to .env for multiple admins:
|
||||
ADMIN_STEAM_IDS=76561198027608071,76561198000000000
|
||||
|
||||
# Enable automatic price updates in development (OPTIONAL)
|
||||
ENABLE_PRICE_UPDATES=true
|
||||
```
|
||||
|
||||
### Automatic Updates
|
||||
|
||||
**Default:** Runs every 1 hour in production
|
||||
|
||||
**Disable in Development:**
|
||||
```env
|
||||
# Don't set ENABLE_PRICE_UPDATES or set to false
|
||||
```
|
||||
|
||||
**Change Interval:**
|
||||
```javascript
|
||||
// In index.js
|
||||
pricingService.scheduleUpdates(120 * 60 * 1000); // 2 hours
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📡 API Endpoints
|
||||
|
||||
All admin endpoints require:
|
||||
- Authentication (logged in via Steam)
|
||||
- Admin access (staffLevel >= 3)
|
||||
|
||||
### Update Prices
|
||||
```
|
||||
POST /api/admin/prices/update
|
||||
Body: { "game": "cs2" | "rust" | "all" }
|
||||
```
|
||||
|
||||
### Get Price Status
|
||||
```
|
||||
GET /api/admin/prices/status
|
||||
```
|
||||
|
||||
### Get Items Without Prices
|
||||
```
|
||||
GET /api/admin/prices/missing?game=cs2&limit=50
|
||||
```
|
||||
|
||||
### Estimate Price for Item
|
||||
```
|
||||
POST /api/admin/prices/estimate
|
||||
Body: { "itemId": "item_id_here" }
|
||||
```
|
||||
|
||||
### Get System Stats
|
||||
```
|
||||
GET /api/admin/stats
|
||||
```
|
||||
|
||||
### Schedule Updates
|
||||
```
|
||||
POST /api/admin/prices/schedule
|
||||
Body: { "intervalMinutes": 60 }
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 How It Works
|
||||
|
||||
### Phase Detection Flow
|
||||
|
||||
1. **Inventory Load** → User goes to Sell page
|
||||
2. **Fetch Steam Data** → Get item descriptions
|
||||
3. **Parse Phase** → Scan name + description for keywords
|
||||
4. **Apply Multipliers** → Adjust price based on phase
|
||||
|
||||
**Example:**
|
||||
```
|
||||
Item: "★ Karambit | Doppler (Factory New) - Ruby"
|
||||
Phase Detected: "Ruby"
|
||||
Base Price: $400
|
||||
With Ruby Multiplier (3.5x): $1,400
|
||||
```
|
||||
|
||||
### Price Update Flow
|
||||
|
||||
1. **Trigger** → Scheduled (hourly) or manual (admin panel)
|
||||
2. **Fetch API** → GET SteamAPIs.com/market/items/730
|
||||
3. **Parse Response** → Extract item names and 30-day avg prices
|
||||
4. **Query DB** → Get all active items for game
|
||||
5. **Match & Update** → Compare by name, update marketPrice
|
||||
6. **Log Results** → Report updated/not found/errors
|
||||
|
||||
**Example Log:**
|
||||
```
|
||||
📊 Fetching CS2 market prices...
|
||||
✅ Fetched 5000 prices for CS2
|
||||
🔄 Updating database prices for CS2...
|
||||
✅ Price update complete for CS2:
|
||||
- Total items: 150
|
||||
- Updated: 142
|
||||
- Not found: 8
|
||||
- Errors: 0
|
||||
```
|
||||
|
||||
### Price Calculation (Sell Page)
|
||||
|
||||
```javascript
|
||||
1. Fetch market price from database
|
||||
↓
|
||||
2. If no price → Item not shown (no fake prices!)
|
||||
↓
|
||||
3. Apply wear multiplier (FN=1.0, MW=0.85, etc.)
|
||||
↓
|
||||
4. Apply phase multiplier (Ruby=3.5x, etc.)
|
||||
↓
|
||||
5. Apply StatTrak multiplier (1.5x)
|
||||
↓
|
||||
6. Apply Souvenir multiplier (1.3x)
|
||||
↓
|
||||
7. Show final price to user
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 Testing
|
||||
|
||||
### Test Phase Detection
|
||||
```javascript
|
||||
// In browser console on Sell page
|
||||
// Select a Doppler knife and check:
|
||||
console.log(item.phase); // "Ruby", "Phase 2", etc.
|
||||
```
|
||||
|
||||
### Test Price Updates
|
||||
```bash
|
||||
# Manually trigger update
|
||||
POST /api/admin/prices/update
|
||||
|
||||
# Check logs for:
|
||||
# ✅ Fetched X prices for CS2
|
||||
# ✅ Updated X/Y items
|
||||
```
|
||||
|
||||
### Verify Database
|
||||
```javascript
|
||||
// MongoDB shell
|
||||
db.items.find({ marketPrice: { $exists: true } }).count()
|
||||
db.items.find({ phase: { $ne: null } })
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📈 What Changed
|
||||
|
||||
### Files Created
|
||||
- ✅ `services/pricing.js` - Pricing service
|
||||
- ✅ `routes/admin.js` - Admin API endpoints
|
||||
- ✅ `frontend/src/views/AdminPage.vue` - Admin panel UI
|
||||
- ✅ `make-admin.js` - Script to grant admin access
|
||||
- ✅ `PRICING_SYSTEM.md` - Complete documentation
|
||||
|
||||
### Files Modified
|
||||
- ✅ `models/Item.js` - Added marketPrice, phase, priceUpdatedAt
|
||||
- ✅ `models/User.js` - Added isAdmin virtual property
|
||||
- ✅ `routes/inventory.js` - Added phase detection, removed hardcoded prices
|
||||
- ✅ `services/pricing.js` - Removed all hardcoded price logic
|
||||
- ✅ `index.js` - Added pricing service initialization
|
||||
|
||||
### Frontend Already Has
|
||||
- ✅ Admin route in router
|
||||
- ✅ isAdmin computed property in auth store
|
||||
- ✅ Admin panel component ready
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ Important Notes
|
||||
|
||||
### No More Hardcoded Prices
|
||||
- Items without market data **will not show prices**
|
||||
- This is intentional - only real prices now
|
||||
- Run price update to populate prices
|
||||
|
||||
### First-Time Setup
|
||||
1. Run `node make-admin.js` to become admin
|
||||
2. Restart backend server
|
||||
3. Go to admin panel
|
||||
4. Click "Update Prices Now"
|
||||
5. Wait for completion
|
||||
6. Prices now populated!
|
||||
|
||||
### Rate Limits
|
||||
- Free tier: 100,000 requests/month
|
||||
- Each update uses 1 request per game
|
||||
- Default: 2 requests/hour (CS2 + Rust)
|
||||
- Monthly: ~1,500 requests (well within limit)
|
||||
|
||||
---
|
||||
|
||||
## 🎓 Next Steps
|
||||
|
||||
### Immediate (Do Now)
|
||||
1. ✅ Run `node make-admin.js`
|
||||
2. ✅ Restart backend
|
||||
3. ✅ Go to http://localhost:5173/admin
|
||||
4. ✅ Click "Update Prices Now"
|
||||
5. ✅ Test Sell page with real prices
|
||||
|
||||
### Short Term
|
||||
- Monitor price coverage (% of items with prices)
|
||||
- Check items without prices regularly
|
||||
- Adjust update frequency if needed
|
||||
- Add caching for frequently accessed prices
|
||||
|
||||
### Long Term
|
||||
- Implement Redis caching
|
||||
- Add price history tracking
|
||||
- Create price charts/trends
|
||||
- Add email alerts for failed updates
|
||||
|
||||
---
|
||||
|
||||
## 🐛 Troubleshooting
|
||||
|
||||
### "Admin access required"
|
||||
```bash
|
||||
# Run this command:
|
||||
node make-admin.js
|
||||
|
||||
# Then restart backend
|
||||
```
|
||||
|
||||
### "No prices available"
|
||||
```bash
|
||||
# Trigger price update via admin panel
|
||||
# Or via API:
|
||||
POST /api/admin/prices/update
|
||||
```
|
||||
|
||||
### Items not showing prices
|
||||
- This is normal if market data doesn't exist
|
||||
- Not all items are on Steam market
|
||||
- Check "Items Without Prices" in admin panel
|
||||
|
||||
### Update failing
|
||||
- Check STEAM_APIS_KEY is set
|
||||
- Verify API key is valid at steamapis.com
|
||||
- Check rate limits not exceeded
|
||||
- Review backend logs for errors
|
||||
|
||||
---
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
- **Complete Guide:** `PRICING_SYSTEM.md`
|
||||
- **API Reference:** See "API Endpoints" section above
|
||||
- **Phase Detection:** See "How It Works" section above
|
||||
|
||||
---
|
||||
|
||||
## ✨ Summary
|
||||
|
||||
**Status:** ✅ COMPLETE
|
||||
**Admin Access:** Run `make-admin.js` (one-time)
|
||||
**Price Source:** SteamAPIs.com only (no hardcoded)
|
||||
**Update Frequency:** Every 1 hour (automatic)
|
||||
**Admin Panel:** http://localhost:5173/admin
|
||||
|
||||
**Your Steam ID:** 76561198027608071
|
||||
**Next Action:** Run `node make-admin.js` and test!
|
||||
|
||||
---
|
||||
|
||||
**Last Updated:** 2024
|
||||
**Version:** 1.0
|
||||
**Ready to Use:** YES ✅
|
||||
Reference in New Issue
Block a user