← back to Handbag Auth Nextjs
src/types/marketplace.ts
91 lines
// Marketplace Types - Real Database Schema
export interface Listing {
id: number
brand: string
model: string | null
price_usd: number
image_url: string | null
product_url: string
source: string
crawled_at: string
condition: string | null
is_active: number
historical_prices?: string | null // JSON string of historical price data
}
export interface MarketplaceBag {
id: number
brand: string
model: string
material: string
hardware: string
color: string
pricePerShare: number
totalValue: number
sharesAvailable: number
totalShares: number
appreciation: number
image: string
lastSale: {
date: string
price: number
source: string
}
dataSource: string
methodology: string
confidence: number
productUrl: string
priceHistory: Array<{ year: number; price: number }>
}
export interface MarketplaceStats {
totalListings: number
totalBrands: number
avgPrice: number
lastCrawl: string
dataQuality: string
verified: boolean
}
export interface BrandBreakdown {
brand: string
count: number
avgPrice: number
minPrice: number
maxPrice: number
}
export interface MarketplaceResponse {
success: boolean
dataSource: string
bags: MarketplaceBag[]
stats: MarketplaceStats
brandBreakdown: BrandBreakdown[]
disclaimer: string
}
export type BrandFilter = 'all' | 'hermes' | 'chanel' | 'lv' | 'dior' | 'prada' | 'fendi'
export const BRAND_MAP: Record<string, string> = {
'hermes': 'Hermes',
'chanel': 'Chanel',
'lv': 'Louis Vuitton',
'dior': 'Dior',
'prada': 'Prada',
'fendi': 'Fendi'
} as const
export const PRICE_FILTERS = {
MIN_PRICE: 1000,
MAX_PRICE: 100000
} as const
export const SHARE_CALCULATIONS = {
SHARES_PER_BAG: 100,
APPRECIATION_BASE: 5,
APPRECIATION_MULTIPLIER: 2
} as const
export const TOP_LUXURY_BRANDS = ['Hermes', 'Chanel', 'Louis Vuitton', 'Dior', 'Prada', 'Fendi'] as const