← 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