# GoodGo Platform API Documentation Index

Complete reference suite for mapping UI components to real API data.

**Generated**: April 21, 2026 | **Status**: ✅ Complete

---

## 📚 Documentation Suite

### 1. **API_ENDPOINTS_REFERENCE.md** — The Complete Reference
**Best for**: Developers implementing API integrations  
**Length**: ~800 lines  
**Contains**:
- All 15+ API endpoints with full signatures
- Request parameters (query, body, path)
- Response schemas in TypeScript
- Caching behavior per endpoint
- Rate limits
- Auth requirements
- Prisma model definitions
- Enum values

**When to use**: 
- "What fields does the valuation response have?"
- "What query parameters does the heatmap endpoint accept?"
- "What's the database schema for Property?"

### 2. **UI_MAPPING_QUICK_GUIDE.md** — Fast Integration Reference
**Best for**: Frontend developers building UI components  
**Length**: ~400 lines  
**Contains**:
- Visual mockups with field labels
- Pre-formatted UI examples (property card, market snapshot, etc.)
- Direct field mappings from API → UI display
- Format conversion functions (price, confidence, distance)
- Status color schemes
- Engagement metric displays

**When to use**:
- "How should I display the market snapshot widget?"
- "What data goes in this property card?"
- "How do I convert the confidence score to stars?"

### 3. **API_EXPLORATION_SUMMARY.md** — Executive Overview
**Best for**: Project leads, architects, QA teams  
**Length**: ~300 lines  
**Contains**:
- High-level findings by module
- Field count & complexity metrics
- Quick integration checklist
- Data quality notes
- Next steps & action items
- Source files analyzed

**When to use**:
- Project planning
- Sprint estimation
- Quality assurance review
- Team onboarding

---

## 🗺️ Module-by-Module Breakdown

### Analytics Module
- **15+ Endpoints**: Market data, valuations, scores, POIs
- **Key Files**: See API_ENDPOINTS_REFERENCE.md → Analytics Module
- **UI Components to Build**: 
  - Market snapshot widget
  - Price trend chart
  - Heatmap display
  - District stats table
  - Trending areas carousel
  - Valuation card
  - Neighborhood score card
  - POI map

**Quick Field Map**:
| Feature | Endpoint | Key Fields |
|---------|----------|-----------|
| Market Overview | `GET /analytics/market-snapshot` | activeCount, avgPrice, medianPrice, priceChangePct |
| Price History | `GET /analytics/price-trend` | trend[].{period, medianPrice, avgPriceM2} |
| Heatmap | `GET /analytics/heatmap` | dataPoints[].{district, avgPriceM2} |
| District Stats | `GET /analytics/district-stats` | districts[].{medianPrice, totalListings, yoyChange} |
| Hot Areas | `GET /analytics/trending-areas` | areas[].{listings, inquiries, views, scoreRank} |
| Property Value | `GET/POST /analytics/valuation` | estimatedPrice, confidence, comparables[] |
| Scores | `GET /analytics/neighborhoods/:district/score` | educationScore, totalScore, poiCounts |
| POIs | `GET /analytics/pois/nearby` | pois[].{name, type, distance} |

### Listings Module
- **2 Core Entities**: Property (45 fields), Listing (25 fields)
- **Key Files**: See API_ENDPOINTS_REFERENCE.md → Listings Module
- **UI Components**: 
  - Property card (search results)
  - Property detail page
  - Listing editor
  - Status badges

**Quick Field Map**:
| Display | Source | Field Path |
|---------|--------|-----------|
| Price | Listing | listing.priceVND |
| Beds/Baths | Property | property.bedrooms, property.bathrooms |
| Area | Property | property.areaM2 |
| Status | Listing | listing.status |
| Views | Listing | listing.viewCount |
| Agent | Listing | listing.agent.user.fullName |
| Address | Property | property.address, property.district |

### Agents Module
- **Key Fields**: Profile, credentials, performance metrics
- **Key Files**: See API_ENDPOINTS_REFERENCE.md → Agents Module
- **UI Components**:
  - Agent card
  - Agent profile page
  - Agent rating badge

**Quick Field Map**:
| Display | Field | Type |
|---------|-------|------|
| Name | user.fullName | string |
| Rating | qualityScore | 0-100 → convert to stars |
| License | licenseNumber | string (nullable) |
| Verified | isVerified | boolean |
| Service Areas | serviceAreas[] | array of district IDs |
| Response Time | responseTimeAvg | seconds → hours |

### Search Module
- **31 Indexed Fields**: ListingDocument structure
- **Key Files**: See API_ENDPOINTS_REFERENCE.md → Search Module
- **UI Components**:
  - Search bar
  - Filter sidebar
  - Results list with pagination
  - Geo-search on map

**Quick Field Map**:
| Filter | Field | Values |
|--------|-------|--------|
| Type | propertyType | APARTMENT, VILLA, TOWNHOUSE, LAND, OFFICE, SHOPHOUSE |
| Transaction | transactionType | SALE, RENT |
| Price Range | priceVND | numeric range |
| Area Range | areaM2 | numeric range |
| Bedrooms | bedrooms | >= operator |
| Location | district, city | equality match |

---

## 🚀 Common Integration Patterns

### Pattern 1: Display Property Card
```
1. Fetch from search index or detail endpoint
2. Map fields:
   - listing.priceVND → format as VND string
   - property.bedrooms → display or show "Studio" if null
   - listing.status → map to color & icon
   - listing.featuredUntil → show "Featured" badge if > now
3. Fetch agent data via listing.agent.id
4. Render with caching indicator
```

### Pattern 2: Display Market Snapshot
```
1. GET /analytics/market-snapshot?city=HCMC
2. Map response fields to widgets
3. Show priceChangePct.d1/d7/d30 as trend indicators
4. Display nextRefreshAt for cache status
5. Poll again at nextRefreshAt or use web socket
```

### Pattern 3: Implement Property Valuation
```
1. For existing property: GET /analytics/valuation?propertyId=X
2. For manual input: POST /analytics/valuation with form data
3. Display estimatedPrice (format as VND)
4. Convert confidence (0.0-1.0) to percentage
5. Show comparables[] in carousel
6. Cache for 24 hours
```

### Pattern 4: Build District Search
```
1. Get districts from heatmap or district-stats endpoint
2. Render as map overlay or list
3. Allow filtering by avgPriceM2 (color intensity)
4. Show tooltip with medianPrice, totalListings, daysOnMarket
5. Update heatmap as user changes period
```

---

## 📊 Field Type Quick Reference

### Prices (all VND)
- **Type**: `string` (in API DTOs) | `BigInt` (database)
- **Display**: Format with thousand separators + currency symbol
- **Range**: 0 to 9,223,372,036,854,775,807 (BigInt max)
- **Example**: `"2500000000"` → `"2.5B"` or `"2,500,000,000 ₫"`

### Confidence Scores
- **Valuation**: 0.0-1.0 (multiply by 100 for %)
- **Moderation**: 0-100 (direct use)
- **Quality (Agent)**: 0.0-100.0 (divide by 20 for stars: 0-5)

### Distances
- **Storage**: meters (int/float)
- **Display**: `< 1000m` → show "XXXm", `>= 1000m` → show "X.Xkm"

### Timestamps
- **Format**: ISO 8601 strings
- **Cache**: `cachedAt`, `nextRefreshAt`, `calculatedAt`, `valuedAt`, `publishedAt`
- **Type**: Most are `Date` in entities, `string` in API responses

### Enums (Map to Display Labels)
```typescript
PropertyType: {
  APARTMENT: "Căn hộ",
  VILLA: "Biệt thự",
  TOWNHOUSE: "Nhà phố",
  LAND: "Đất",
  OFFICE: "Văn phòng",
  SHOPHOUSE: "Nhà mặt phố"
}

ListingStatus: {
  DRAFT: "Nháp" (Gray),
  PENDING_REVIEW: "Chờ duyệt" (Yellow),
  ACTIVE: "Hoạt động" (Green),
  RESERVED: "Đặt" (Blue),
  SOLD: "Đã bán" (Dark),
  RENTED: "Đã thuê" (Dark),
  EXPIRED: "Hết hạn" (Orange),
  REJECTED: "Từ chối" (Red)
}

Direction: {
  NORTH: "Hướng Bắc",
  SOUTH: "Hướng Nam",
  EAST: "Hướng Đông",
  WEST: "Hướng Tây",
  NORTHEAST: "Hướng Đông Bắc",
  // ... etc
}
```

---

## ⚡ Performance Considerations

### Caching Strategy
```
Market Snapshot:  30 minutes
Price Trend:      1 hour
Heatmap:          1 hour
District Stats:   6 hours
Trending Areas:   30 minutes
Valuation:        24 hours
Neighborhood:     24 hours
```
→ Check `nextRefreshAt` in response to avoid redundant calls

### Rate Limits (Per User)
```
Valuation POST:   10 req/min
Search:           200 req/min
Analytics Queries: 100 req/min
Batch Operations: Limited to 50 items
```
→ Implement exponential backoff for 429 responses

### Pagination
```
Search results include: page, perPage, totalPages, totalFound
Implement: Lazy loading or infinite scroll
Typical perPage: 20-50 listings
```

---

## 🔍 Field Validation Rules

### Required Fields (Cannot be null)
- Listing: `priceVND`, `transactionType`, `status`, `sellerId`
- Property: `propertyType`, `title`, `location`, `areaM2`
- Agent: `userId`, `isVerified`

### Nullable Fields (Default to null)
- `property.bedrooms` → null means studio/no specific bedroom count
- `property.bathrooms` → null if not specified
- `listing.agentId` → null means direct seller (no agent)
- `listing.aiPriceEstimate` → null if valuation not run
- Agent `bio`, `licenseNumber` → optional fields

### String Length Limits
- Description fields: typically `@db.Text` (no limit imposed)
- Titles: reasonable limit (~200 chars implied)
- Enum values: fixed options (no arbitrary strings)

---

## 🧪 Testing & Mock Data

### Mock Market Snapshot Response
```json
{
  "city": "HCMC",
  "activeCount": 2345,
  "avgPrice": 2800000000,
  "medianPrice": 2500000000,
  "priceChangePct": {"d1": 2, "d7": 5, "d30": 12},
  "avgPricePerM2": 35000000,
  "daysOnMarket": 45,
  "newListings24h": 12,
  "cachedAt": "2026-04-21T10:30:00Z",
  "nextRefreshAt": "2026-04-21T11:00:00Z"
}
```

### Mock Valuation Response
```json
{
  "estimatedPrice": "2500000000",
  "confidence": 0.82,
  "pricePerM2": 33300000,
  "comparables": [
    {
      "propertyId": "prop-1",
      "address": "123 Nguyen Hue",
      "priceVND": "2340000000",
      "pricePerM2": 31200000,
      "distanceMeters": 450,
      "soldAt": "2026-04-15T00:00:00Z"
    }
  ],
  "modelVersion": "v2"
}
```

### Mock Property Card Fields
```json
{
  "listing": {
    "id": "list-1",
    "priceVND": "2500000000",
    "transactionType": "SALE",
    "status": "ACTIVE",
    "viewCount": 342,
    "saveCount": 28,
    "inquiryCount": 12,
    "featuredUntil": null,
    "publishedAt": "2026-04-15T08:30:00Z"
  },
  "property": {
    "id": "prop-1",
    "title": "Căn hộ sang trọng Quận 1",
    "propertyType": "APARTMENT",
    "areaM2": 75,
    "bedrooms": 2,
    "bathrooms": 1,
    "district": "Quận 1",
    "ward": "Phường Bến Nghé",
    "city": "Hồ Chí Minh"
  }
}
```

---

## 📖 Quick Start by Role

### Frontend Developer
1. Start with **UI_MAPPING_QUICK_GUIDE.md**
2. Reference **API_ENDPOINTS_REFERENCE.md** for exact field names
3. Use mock data above for testing
4. Implement price formatting utilities

### Backend/Full-Stack Developer
1. Read **API_EXPLORATION_SUMMARY.md** for overview
2. Use **API_ENDPOINTS_REFERENCE.md** as API contract
3. Reference Prisma models for database design
4. Review rate limits & caching strategy

### QA / Test Automation
1. Start with **API_EXPLORATION_SUMMARY.md**
2. Review rate limits & error handling
3. Test edge cases (null values, precision, bounds)
4. Verify caching behavior using `cachedAt`/`nextRefreshAt`

### Product / Project Lead
1. Read **API_EXPLORATION_SUMMARY.md**
2. Review integration checklist
3. Identify potential blockers
4. Estimate component complexity

---

## 📝 Document Update Protocol

These documents were generated by scanning source code on **April 21, 2026**.

**To update**:
1. Re-scan source modules if API changes
2. Update DTOs → API_ENDPOINTS_REFERENCE.md
3. Update Prisma schema → Prisma Schema section
4. Verify UI mappings → UI_MAPPING_QUICK_GUIDE.md
5. Update this index with changelog

**Changelog**:
- v1.0 (2026-04-21): Initial complete documentation

---

**Last Updated**: April 21, 2026  
**Status**: ✅ Complete  
**Maintainer**: Generated by API exploration task

For questions or updates, reference the source files in:
- `apps/api/src/modules/` (API layer)
- `prisma/schema.prisma` (Database)
