# GoodGo Analytics Module — Complete Architecture Guide

## 📚 Overview

This package contains **4 comprehensive guides** (2,174 lines, 71 KB) to understand the GoodGo Analytics Module architecture, caching system, and endpoint patterns.

## 📖 Quick Navigation

| File | Purpose | Read Time | Best For |
|------|---------|-----------|----------|
| **00_SUMMARY.md** | Overview & key findings | 5 min | Getting oriented |
| **02_quick_reference.md** | Visual diagrams & checklists | 10 min | Visual learners |
| **03_file_paths_reference.md** | File navigation & structure | 15 min | Finding code |
| **01_analytics_architecture_guide.md** | Deep dive with code examples | 30+ min | Full understanding |

## 🚀 Recommended Reading Path

1. Start with **00_SUMMARY.md** — understand what you're learning
2. Read **02_quick_reference.md** — visualize the architecture
3. Skim **03_file_paths_reference.md** — know where to find things
4. Deep dive **01_analytics_architecture_guide.md** — master the patterns

**Total time: ~60 minutes to fully understand the module**

## 🎯 What You'll Learn

### Architecture
- ✅ Domain-Driven Design (DDD) with CQRS pattern
- ✅ 4-layer structure: Presentation → Application → Domain → Infrastructure
- ✅ 24 endpoints across 2 controllers
- ✅ 15+ query handlers with caching

### Caching
- ✅ Redis cache-aside pattern
- ✅ Two caching styles: @Cacheable decorator vs manual cache.getOrSet()
- ✅ Cache TTLs for different endpoint types
- ✅ Graceful degradation when Redis is down
- ✅ Cache metadata in responses

### Database
- ✅ Prisma schema for Property, Listing, MarketIndex, Valuation
- ✅ PostGIS spatial queries
- ✅ Indexes for query optimization

### Implementation
- ✅ How to add a new GET endpoint in 7 steps
- ✅ Query handler patterns with real examples
- ✅ DTO design and validation
- ✅ Error handling conventions
- ✅ Testing patterns

## 🏗️ Architecture Overview

```
┌─────────────────────────────────────────┐
│ PRESENTATION LAYER                      │
│ • AnalyticsController (19 endpoints)    │
│ • AvmController (5 endpoints)           │
│ • DTOs, Guards, Interceptors            │
└──────────────────┬──────────────────────┘
                   ↓ QueryBus.execute()
┌──────────────────────────────────────────┐
│ APPLICATION LAYER (CQRS)                 │
│ • 15+ Query Handlers (@QueryHandler)     │
│ • @Cacheable or cache.getOrSet()        │
│ • Try-catch error handling               │
└──────────────────┬──────────────────────┘
                   ↓ Injected services
┌──────────────────────────────────────────┐
│ DOMAIN LAYER (Business Logic)            │
│ • Entities, Repository Interfaces        │
│ • Service Interfaces, Result DTOs        │
└──────────────────┬──────────────────────┘
                   ↓ Injected implementation
┌──────────────────────────────────────────┐
│ INFRASTRUCTURE LAYER                     │
│ • Prisma Repositories                    │
│ • HTTP Services, External clients        │
└──────────────────────────────────────────┘
```

## 💾 Caching Pattern

```
HTTP GET /analytics/market-snapshot?city=Ho Chi Minh
    ↓
QueryHandler builds key: "cache:analytics:market_snapshot:ho_chi_minh"
    ↓
cache.getOrSet(key, loader, TTL, resource):
    ├─ Redis HIT: return cached value
    ├─ Redis MISS: call loader() → compute → store
    └─ Redis DOWN: call loader() directly (graceful degradation)
    ↓
CacheMetaInterceptor wraps: { data: result, cacheMeta: {...} }
    ↓
HTTP 200: { data: {...}, cacheMeta: { cachedAt, nextRefreshAt, source } }
```

## 🔑 Key Findings

- **24 Endpoints**: 19 in AnalyticsController + 5 in AvmController
- **15+ Query Handlers**: All with caching (except predictions)
- **2 Caching Patterns**: @Cacheable decorator or manual cache.getOrSet()
- **Redis Cache-Aside**: TTL-based expiry, graceful degradation
- **4 Prisma Models**: Property, Listing, MarketIndex, Valuation
- **DTOs + Guards**: All endpoints secured with JWT, Quota, Rate Limit

## 📚 Detailed Contents

### 00_SUMMARY.md
- Overview of all 4 guides
- Key architecture decisions
- 7-step endpoint addition walkthrough
- Architecture decision matrix
- Core conventions checklist

### 01_analytics_architecture_guide.md ⭐ COMPREHENSIVE
- DDD layer breakdown with code examples
- All 24 endpoints documented
- Query handler patterns (decorator vs manual)
- Complete Redis caching system
- Real code from GetMarketSnapshotHandler, GetDistrictStatsHandler
- Full Prisma schema documentation
- Shared module utilities (CacheService, @Cacheable, CacheMetaInterceptor)
- Complete 7-step guide: adding GET /trending-areas endpoint
- Testing patterns & error handling conventions

### 02_quick_reference.md ⭐ VISUAL QUICK START
- Architecture layer stack diagram
- Request flow visualization
- Caching strategy matrix
- Decorators & guards cheat sheet
- Prisma schema snapshot
- Response structure examples
- 7-step endpoint addition checklist

### 03_file_paths_reference.md ⭐ NAVIGATION MAP
- Core module files (analytics.module.ts, index.ts)
- All 24 endpoints mapped to file paths
- DTO files organized by type (request vs response)
- All 15+ query types with descriptions
- Domain, Infrastructure, Shared layer breakdowns
- Database schema models with fields & indexes
- Directory tree with line counts
- Import patterns reference
- Key metrics & numbers

## 🎯 Quick Start: Adding New Endpoint

### 7 Steps to Add GET /analytics/trending-areas

1. **Request DTO** → `presentation/dto/get-trending-areas.dto.ts`
2. **Query Class** → `application/queries/get-trending-areas/query.ts`
3. **Handler** → `application/queries/get-trending-areas/handler.ts` (with @Cacheable)
4. **Register** → Add to QueryHandlers array in analytics.module.ts
5. **Controller** → Add method to analytics.controller.ts
6. **Export** → Add to presentation/dto/index.ts
7. **Test** → Create handler spec

Full walkthrough with code in guides!

## ✅ Core Conventions

```ts
// Cache with TTL
Dashboard tiles: 300s (5 min)
Aggregations: 300s (5 min)
Reports: 900s (15 min)
Trends: 1800s (30 min)
Predictions: NO_CACHE (always fresh)

// Build cache keys deterministically
CacheService.buildKey(CachePrefix.MARKET_DISTRICT, city, period)
// Result: "cache:market:district:ho_chi_minh:2024_q1"

// Always wrap handlers in try-catch
try { ... } catch(error) {
  if (error instanceof DomainException) throw error;
  logger.error(...);
  throw new InternalServerErrorException('...');
}

// Always return DTOs with null metadata
return { city, data, cachedAt: null, nextRefreshAt: null };

// Always use guards
@UseGuards(JwtAuthGuard, QuotaGuard)
@RequireQuota('analytics_queries')
```

## 📊 Key Metrics

| Metric | Value |
|--------|-------|
| Controllers | 2 |
| Endpoints | 24 |
| Query Handlers | 15+ |
| DTOs | 15+ |
| Caching Patterns | 2 |
| Cache Prefixes | 10+ |
| Cache TTLs | 20+ |
| Prisma Models | 4 |
| Repository Interfaces | 2 |
| Services (interfaces) | 2 |
| Services (implementations) | 6+ |
| Module LOC | ~2,000 |
| Shared Cache LOC | ~250 |

## 🧠 Test Your Understanding

After reading all guides, you should be able to:

1. Explain the 4 DDD layers and what goes in each
2. Describe how cache-aside pattern works
3. Distinguish @Cacheable from cache.getOrSet()
4. Explain why response DTOs have null metadata
5. Build deterministic cache keys
6. Choose appropriate TTLs for endpoints
7. List required guards for endpoints
8. Add a new endpoint in 7 steps
9. Explain CacheMetaInterceptor purpose
10. Describe graceful degradation behavior

## 📁 Prisma Schema Models

**Property** — Real estate property details
- Type, location (PostGIS), area, rooms, condition
- Indexes: [propertyType], [district, city], [location (Gist)]

**Listing** — Property listings on platform
- Price (BigInt), status, AVM estimates
- Indexes: [status], [sellerId, status], [publishedAt]

**MarketIndex** — Aggregated market data by period
- District, city, propertyType, period
- Median price, average price/m², statistics
- Unique: [district, city, propertyType, period]

**Valuation** — AI valuation estimates
- Property, estimated price, confidence, method
- Features, comparables, explainers (Json)
- Index: [propertyId, valuationDate DESC]

## 🚀 Next Steps

1. Read all 4 guides in recommended order (60 min)
2. Review the 7-step endpoint addition guide
3. Study real handler code examples in guide
4. Explore actual files in codebase:
   - `apps/api/src/modules/analytics/`
   - `apps/api/src/modules/shared/`
5. Add your first new endpoint following patterns

## 📞 Questions & Understanding

If you have questions after reading:
- Refer back to specific sections in guides
- Check code examples in guide vs actual code
- Review the 10 validation questions
- Study the architecture decision matrix

---

**Total package: 2,174 lines, 71 KB of comprehensive documentation**

Start with 00_SUMMARY.md and follow the reading path. You'll understand the entire architecture in about 60 minutes!
