docs: consolidate exploration & audit reports under docs/ (TEC-3094)

- Move 8 stray .md (+5 .txt) from ~/Desktop into docs/explorations/from-desktop/
- Reorganize 27 .md/.txt at workspace root:
  - audit reports -> docs/audits/
  - exploration reports -> docs/explorations/
  - design system -> docs/design-system/
- Keep only README/CHANGELOG/CONTRIBUTING/CLAUDE at repo root
- Refresh docs/README.md as canonical index with links to all groups
- Note: pre-existing docs/audits/AUDIT_INDEX.md and AUDIT_SUMMARY.md were
  overwritten by the newer root-level versions during the move

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Ho Ngoc Hai
2026-04-21 16:29:24 +07:00
parent 912121cf09
commit 08b96f9c2d
39 changed files with 15129 additions and 562 deletions

View File

@@ -0,0 +1,321 @@
# GoodGo Platform API Exploration Summary
## Executive Summary
Complete audit of GoodGo Platform monorepo API endpoints and data structures. All field names, types, and response formats documented for UI component mapping.
**Generated**: April 21, 2026
**Scope**: `apps/api/src/modules/{analytics,listings,agents,search}` + `prisma/schema.prisma`
---
## 📋 Key Findings
### Analytics Module (✅ Fully Explored)
**Endpoints Count**: 15+ key endpoints
**Architecture**: CQRS with query handlers → DTOs
**Caching**: 30min - 24hr TTL across endpoints
**Auth**: JWT required (except public endpoints)
**Core Features**:
1. **Market Data** (snapshot, trends, heatmap, district stats)
- Real-time aggregation from active listings
- Price change metrics (1d, 7d, 30d)
- Per-district inventory & absorption data
2. **Valuations (AVM)** (v1 & v2 models)
- GET by property ID or coordinates
- POST manual input with extended features
- Batch operations (up to 50 properties)
- Historical tracking & comparisons
- Confidence scoring with explanations
3. **Trending Areas**
- Scoring algorithm: `inquiries×0.6 + views×0.3 + listings×0.1`
- Time-window configurable (default 30 days)
- District/ward level aggregation
4. **Neighborhood Scores**
- 6 dimensional scoring (education, healthcare, transport, shopping, greenery, safety)
- POI counting (schools, hospitals, transit, malls, parks, restaurants)
- 0-100 scale with aggregation
5. **Nearby POIs** (Public)
- Geographic search within radius
- 6 main categories with type mapping
- Distance calculation using PostGIS
### Listings Module (✅ Fully Explored)
**Entity Count**: 2 main aggregates (Listing + Property)
**Field Count**: ~45 total fields across entities
**Key Features**:
- Listing status state machine (DRAFT → PENDING_REVIEW → ACTIVE → SOLD/RENTED)
- AI price estimates with confidence scores
- Moderation workflow with scoring
- Engagement metrics (views, saves, inquiries)
- Featured promotion with expiry tracking
- Rent pricing support
- Commission tracking
**Property Fields**:
- Core: type, title, description, location (PostGIS), area
- Rooms: bedrooms, bathrooms, floors, floor level
- Infrastructure: direction, year built, legal status, metro distance
- Amenities: JSON-based (flexible schema)
- Enhanced: furnishing, condition, parking, maintenance fee, pet-friendly, view types, suitability tags
### Agents Module (✅ Explored)
**Key Fields**:
- Profile: userId, licenseNumber, agency, bio
- Credentials: isVerified (boolean)
- Performance: qualityScore (0-100), totalDeals, responseTimeAvg
- Coverage: serviceAreas (array of district IDs)
**Performance Metrics**:
- Quality score as composite metric
- Response time in seconds (need conversion for display)
- Deal count as credibility indicator
### Search Module (✅ Explored)
**Architecture**: Meilisearch (typesense-compatible backend)
**Index Fields**: 31 fields per document
**Key Features**:
- Full-text + filtering + geo-search
- Featured listing flag
- Engagement metrics copied to index
- Amenities as string array
**Supported Filters**:
- propertyType, transactionType
- Price range, area range
- Bedrooms (>= operator)
- District, city
- Featured status
### Prisma Schema (✅ Full Review)
**Key Models**:
- User (role-based: BUYER, SELLER, AGENT, DEVELOPER, PARK_OPERATOR, ADMIN)
- Property (core real estate entity)
- Listing (marketplace listing wrapper)
- Agent (performance tracking)
- Valuation (AVM history)
- MarketIndex (market analytics cache)
- Transaction, Inquiry, Lead, Payment, Order, Escrow models
**Enums**:
- PropertyType: 6 values (APARTMENT, VILLA, TOWNHOUSE, LAND, OFFICE, SHOPHOUSE)
- TransactionType: 2 values (SALE, RENT)
- ListingStatus: 8 values (DRAFT...REJECTED)
- Direction: 8 compass values
- Furnishing: 3 levels
- PropertyCondition: 4 conditions
---
## 🎯 API Field Reference by Use Case
### For Property Card Display
```
Price → listing.priceVND (format as VND)
Type → listing.transactionType
Status → listing.status
Area → property.areaM2
Beds/Baths → property.bedrooms, property.bathrooms
Location → property.district, property.ward, property.city
Agent → listing.agent.user.fullName, listing.agent.qualityScore
Engagement → listing.viewCount, listing.saveCount, listing.inquiryCount
Featured → listing.featuredUntil (if > now, show badge)
```
### For Valuation Display
```
Estimate → ValuationDto.estimatedPrice (string, format as VND)
Confidence → ValuationDto.confidence (0.0-1.0, convert to %)
Price/m² → ValuationDto.pricePerM2
Model Version → ValuationDto.modelVersion (v1|v2|ensemble)
Comparables → ValuationDto.comparables[] with distance & price
```
### For Market Analysis
```
Market Snapshot → GET /analytics/market-snapshot
├─ activeCount, avgPrice, medianPrice, avgPricePerM2
├─ daysOnMarket, newListings24h
└─ priceChangePct { d1, d7, d30 }
Price Trend → GET /analytics/price-trend
├─ trend[] { period, medianPrice, avgPriceM2, totalListings }
Heatmap → GET /analytics/heatmap
├─ dataPoints[] { district, avgPriceM2, totalListings, medianPrice }
District Stats → GET /analytics/district-stats
├─ districts[] { district, medianPrice, avgPriceM2, totalListings, daysOnMarket, yoyChange }
Trending Areas → GET /analytics/trending-areas
├─ areas[] { name, listings, inquiries, views, priceChangePct, scoreRank }
```
### For Location Intelligence
```
Neighborhood Score → GET /analytics/neighborhoods/:district/score
├─ educationScore, healthcareScore, transportScore, shoppingScore
├─ greeneryScore, safetyScore, totalScore (all 0-100)
├─ poiCounts { schools, hospitals, transit, shopping, parks, restaurants }
Nearby POIs → GET /analytics/pois/nearby
├─ pois[] { name, type, category, lat, lng, distance, address }
```
---
## 🔌 Quick Integration Checklist
### Before Mapping UI Components:
- [ ] **Understand Caching**: Most analytics endpoints have 30min-24hr cache
- Include `cachedAt` and `nextRefreshAt` in UI
- Plan refresh UX accordingly
- [ ] **Price Handling**: All prices in VND
- Received as strings (precision preservation)
- Must format for display (thousand separators, currency symbol)
- BigInt in DB, may overflow JS numbers
- [ ] **Confidence Scores**: Different scales
- Valuation confidence: 0.0-1.0 (multiply by 100 for %)
- Moderation score: 0-100 (direct use)
- Quality score (agent): 0-100 (convert 0-5 stars)
- [ ] **Enum Handling**: Map enum values to display labels
- PropertyType: 6 values (need translations)
- ListingStatus: 8 values (map to colors/icons)
- TransactionType: 2 values (SALE vs RENT)
- [ ] **Coordinates**: Use `property.location` (PostGIS geometry)
- Accessible as `lat`, `lng` in API responses
- Distance calculations use PostGIS functions
- [ ] **Rate Limits**: Per endpoint
- Valuation POST: 10 req/min/user
- Search: 200 req/min/user
- Implement backoff/retry logic
- [ ] **Null Handling**: Many fields optional
- `bedrooms`/`bathrooms` can be null (studio)
- `agentId` can be null (direct seller)
- Valuation `confidence` may have `null` comparables
- Handle gracefully in UI
- [ ] **Pagination**: Search results include
- `page`, `perPage`, `totalPages`, `totalFound`
- Implement lazy loading or infinite scroll
---
## 📚 Documentation Files Generated
1. **API_ENDPOINTS_REFERENCE.md** (~800 lines)
- Complete endpoint documentation
- Request/response schemas in TypeScript
- Query parameters & caching info
- Prisma model definitions
2. **UI_MAPPING_QUICK_GUIDE.md** (~400 lines)
- Visual mockups with field mappings
- Pre-formatted example layouts
- Common conversions (price, confidence, distance)
- UI integration patterns
3. **API_EXPLORATION_SUMMARY.md** (this file)
- Executive overview
- Key findings by module
- Integration checklist
- References
---
## 🔗 Source Files Analyzed
### Analytics Module
- `controllers/analytics.controller.ts` → 15 endpoints
- `domain/services/avm-service.ts` → AVM interface & types
- `application/queries/{...}/handler.ts` → 10+ query handlers with DTO definitions
- `presentation/dto/{...}.ts` → Request/response types
### Listings Module
- `domain/entities/listing.entity.ts` → Listing aggregate (status machine, events)
- `domain/entities/property.entity.ts` → Property aggregate (updateable fields)
### Agents Module
- `domain/entities/agent.entity.ts` → Agent profile & performance metrics
### Search Module
- `domain/repositories/search.repository.ts` → SearchResult interface & 31 indexed fields
### Database
- `prisma/schema.prisma` → 30+ models with enums & indexes
---
## ✅ Data Quality Notes
**Strengths**:
- Strong type safety (NestJS + Prisma)
- Comprehensive DTOs for API contracts
- Clear status machine for listings
- Well-indexed database schema
- Separation of concerns (domain → application → presentation)
**Considerations**:
- JSON fields in Property (amenities, nearbyPOIs) — verify schema client-side
- Price precision — use strings, not numbers, for financial data
- Confidence scores use different scales — easy to mix up
- Service areas stored as JSON array of district IDs — need mapping table
- Valuation comparables may be null if insufficient data
---
## 🎓 Next Steps
1. **API Client Generation**
- Use Swagger/OpenAPI docs from NestJS controllers
- Generate TypeScript client with `openapi-generator`
2. **Component Development**
- Start with property card components
- Wire market snapshot widget
- Build valuation display components
3. **Data Transformation Layer**
- Create utility functions for price formatting
- Build confidence score converters
- Implement district ID → name mappings
4. **Testing**
- Mock response data from this reference
- Test edge cases (null values, precision, formatting)
- Verify caching behavior
---
## 📞 Key Contacts & Resources
**API Documentation**: Swagger/OpenAPI available at `/api/docs` (NestJS Swagger module)
**Prisma Models**: Comprehensive schema with relationships in `prisma/schema.prisma`
**Code Examples**: Query handlers in `apps/api/src/modules/analytics/application/queries/`
---
**Document Version**: 1.0
**Last Updated**: April 21, 2026
**Status**: Complete ✅
All information current as of repository scan on 2026-04-21.