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,294 @@
# Listings Module Exploration - Complete Index
**Date:** April 21, 2026
**Status:** ✅ Comprehensive exploration complete
**Total Documentation:** 2,434 lines across 4 markdown files
---
## 📚 Documentation Files
### 1. **LISTINGS_MODULE_EXPLORATION.md** (965 lines)
**→ START HERE for detailed understanding**
**Contents:**
- Section 1: GET /listings/:id handler (controller + query + cache pattern)
- Section 2: Response DTO/schema (ListingDetailData interface with all fields)
- Section 3: AVM Service integration (HttpAVMService, AI client, comparables)
- Section 4: Agent Quality Score (formula, storage, calculation service)
- Section 5: Inquiries module (tracking, events, denormalization)
- Section 6: Similar listings algorithm (matching criteria, sorting, performance)
- Section 7: Redis caching patterns (cache-aside, TTLs, invalidation, metrics)
- Summary table with file paths and key details
- Key insights and next steps
**Best for:** Getting complete context, understanding code flow, seeing actual code snippets
---
### 2. **LISTINGS_QUICK_REFERENCE.md** (306 lines)
**→ QUICK LOOKUP for everyday reference**
**Contents:**
- 1⃣ GET /listings/:id flow (ASCII diagram)
- 2⃣ ListingDetailData structure (TypeScript interface with comments)
- 3⃣ AVM Service integration (call path, inputs, outputs, batch processing)
- 4⃣ Agent Quality Score (formula, storage, inputs)
- 5⃣ Inquiries tracking (create flow, fields, denormalization)
- 6⃣ Similar listings algorithm (query pattern, SQL WHERE clauses)
- 7⃣ Redis caching (methods, TTLs, prefixes, metrics)
- Key file paths table
- Important behaviors checklist
**Best for:** Quick lookups, status meetings, implementation reference
---
### 3. **LISTINGS_DATA_SCHEMA.md** (456 lines)
**→ DATABASE & PERFORMANCE focus**
**Contents:**
- Listing table definition (SQL, fields, indexes)
- Property table definition (PostGIS geometry, JSONB fields)
- PropertyMedia table definition (media ordering)
- Inquiry table definition (HTML sanitization, isRead tracking)
- Agent table definition (quality score storage)
- Review table definition (for aggregation)
- Related tables (User reference)
- Query patterns (listing detail, similar, count inquiries, quality score calc)
- Cache invalidation triggers (events → cache keys)
- Performance considerations (indexes, optimization)
- Denormalization strategy & eventual consistency model
**Best for:** Database queries, performance tuning, schema changes, cache planning
---
### 4. **EXPLORATION_SUMMARY_LISTINGS.md** (320 lines)
**→ EXECUTIVE SUMMARY & ARCHITECTURE overview**
**Contents:**
- 3 documents overview
- 7 key findings (one per component)
- File organization (directory structure)
- Data flow diagram
- Component dependencies (ASCII diagram)
- Important implementation details (cache envelope, denormalization, AVM fallback, quality formula)
- Potential issues & edge cases (7 items)
- Recommended next steps (6 items)
- References to all documents
**Best for:** Architecture review, team onboarding, stakeholder briefing
---
## 🎯 Quick Navigation by Task
### "I need to understand how GET /listings/:id works"
→ Read **LISTINGS_QUICK_REFERENCE.md** Section 1
→ Then **LISTINGS_MODULE_EXPLORATION.md** Section 1
→ Reference **LISTINGS_DATA_SCHEMA.md** Query Patterns
### "What fields are returned in the API response?"
**LISTINGS_QUICK_REFERENCE.md** Section 2
**LISTINGS_MODULE_EXPLORATION.md** Section 2
→ Source: `apps/api/src/modules/listings/domain/repositories/listing-read.dto.ts`
### "How does the AVM service work?"
**LISTINGS_QUICK_REFERENCE.md** Section 3
**LISTINGS_MODULE_EXPLORATION.md** Section 3
→ Sources:
- `apps/api/src/modules/analytics/domain/services/avm-service.ts`
- `apps/api/src/modules/analytics/infrastructure/services/http-avm.service.ts`
- `apps/api/src/modules/analytics/infrastructure/services/ai-service.client.ts`
### "How is agent quality score calculated?"
**LISTINGS_QUICK_REFERENCE.md** Section 4⃣ (formula)
**LISTINGS_MODULE_EXPLORATION.md** Section 4
→ Source: `apps/api/src/modules/agents/domain/services/quality-score.service.ts`
### "How are inquiries tracked and counted?"
**LISTINGS_QUICK_REFERENCE.md** Section 5
**LISTINGS_MODULE_EXPLORATION.md** Section 5
**LISTINGS_DATA_SCHEMA.md** Denormalization Strategy
→ Sources:
- `apps/api/src/modules/inquiries/application/commands/create-inquiry/create-inquiry.handler.ts`
- `apps/api/src/modules/inquiries/domain/repositories/inquiry-read.dto.ts`
### "How do we find similar listings?"
**LISTINGS_QUICK_REFERENCE.md** Section 6
**LISTINGS_MODULE_EXPLORATION.md** Section 6
**LISTINGS_DATA_SCHEMA.md** Query Patterns
→ Source: `apps/api/src/modules/listings/infrastructure/repositories/listing-read.queries.ts` (lines 296-369)
### "How does caching work?"
**LISTINGS_QUICK_REFERENCE.md** Section 7
**LISTINGS_MODULE_EXPLORATION.md** Section 7
**LISTINGS_DATA_SCHEMA.md** Cache Invalidation Triggers
→ Source: `apps/api/src/modules/shared/infrastructure/cache.service.ts`
### "I need to understand the database schema"
**LISTINGS_DATA_SCHEMA.md** (all sections)
→ References Prisma schema at `prisma/schema.prisma`
### "I'm doing performance optimization"
**LISTINGS_DATA_SCHEMA.md** Performance Considerations
**EXPLORATION_SUMMARY_LISTINGS.md** Key Findings
**LISTINGS_DATA_SCHEMA.md** Denormalization Strategy
### "I need an architectural overview for stakeholders"
**EXPLORATION_SUMMARY_LISTINGS.md** (entire document)
**LISTINGS_QUICK_REFERENCE.md** for tactical details
---
## 🔑 Key File Paths
All paths relative to `apps/api/src/modules/`:
| Component | Path |
|-----------|------|
| **GET Handler** | `listings/presentation/controllers/listings.controller.ts` (L236-247) |
| **Query Logic** | `listings/application/queries/get-listing/get-listing.handler.ts` |
| **Response DTO** | `listings/domain/repositories/listing-read.dto.ts` |
| **Listing Entity** | `listings/domain/entities/listing.entity.ts` |
| **SQL Queries** | `listings/infrastructure/repositories/listing-read.queries.ts` |
| **AVM Interface** | `analytics/domain/services/avm-service.ts` |
| **AVM HTTP** | `analytics/infrastructure/services/http-avm.service.ts` |
| **AI Client** | `analytics/infrastructure/services/ai-service.client.ts` |
| **Quality Score** | `agents/domain/services/quality-score.service.ts` |
| **Agent Queries** | `agents/infrastructure/repositories/agent-profile.queries.ts` |
| **Inquiry Handler** | `inquiries/application/commands/create-inquiry/create-inquiry.handler.ts` |
| **Inquiry DTO** | `inquiries/domain/repositories/inquiry-read.dto.ts` |
| **Cache Service** | `shared/infrastructure/cache.service.ts` |
---
## 🎨 Visual Reference
### High-Level Flow
```
Client Request: GET /listings/{id}
ListingsController
GetListingHandler
├─ Cache Check (Redis)
├─ DB Query (Prisma)
├─ PostGIS Geometry
└─ Cache Write
ListingDetailData Response
```
### Component Relationships
```
Listings
├─ Properties
├─ Media
├─ Inquiries (count)
├─ Reviews (seller)
├─ Agent (reference)
└─ Cache
Analytics (AVM)
├─ AI Service (HTTP)
└─ PostGIS Fallback
Agents
├─ Quality Score (calc'd from)
├─ Reviews
├─ Inquiries
└─ Listings (active count)
Inquiries
├─ Listing (denorm counter)
└─ User (inquirer)
```
---
## 📊 Statistics
| Metric | Value |
|--------|-------|
| Total documentation lines | 2,434 |
| Code snippets shown | 50+ |
| Database tables covered | 6 |
| API endpoints explained | 8 |
| Services documented | 10+ |
| Key formulas | 2 (quality score, cache envelope) |
| Algorithms explained | 3 (similar listings, AVM, quality calc) |
| Performance patterns | 5 (caching, denormalization, indexing, batch processing, fallback) |
---
## ⚠️ Critical Concepts
### 1. Cache-Aside Pattern
- Check cache first, fall back to loader if miss
- Store result in Redis with TTL
- **Not-found signal**: Don't cache null to allow newly-created listings to be discoverable
### 2. Denormalization via Events
- `InquiryCreatedEvent` published → listener increments `Listing.inquiryCount`
- Avoids expensive COUNT() queries
- Eventual consistency (may lag seconds)
- Should have reconciliation job
### 3. AVM Fallback Strategy
- Primary: Python AI service (v1 or v2)
- Fallback: PostGIS comparables-based estimation
- Graceful degradation with metrics tracking
### 4. Similar Listings Algorithm
- Rule-based (not ML): price ±10%, area ±20%, same type & district
- Fetch 3x limit, sort by delta, return top N
- Sorted by price difference (closest first)
### 5. Quality Score Formula
- 40% review rating + 30% response time + 20% conversion + 10% listing activity
- Recalculated on review/inquiry events
- Stored in Agent table (denormalized)
---
## 🚀 Implementation Tips
**Cache invalidation:** Invalidate `cache:listing:{id}` on status change, price update, media upload, featured status change
**Denormalization drift:** Implement periodic reconciliation job to recount inquiries per listing
**AVM errors:** Always have fallback ready; log confidence scores to track when fallback is used
**PostGIS:** Raw SQL queries required for geometry extraction (`$queryRaw`); Prisma doesn't map types
**Batch operations:** Never exceed 5 concurrent AVM requests to avoid overloading Python service
**Cache envelope:** Legacy entries (plain JSON) work transparently; new entries include metadata
---
## 📝 Notes
- All code snippets are from **actual source files** (paths provided)
- Exploration performed April 21, 2026
- Database schema inferred from Prisma usage patterns
- Denormalization strategy validated against event handlers
- Performance recommendations based on index analysis
---
## 🤝 Contributing to These Docs
When making changes to the listings module:
1. Update relevant sections in these documents
2. Add new findings to EXPLORATION_SUMMARY_LISTINGS.md
3. Update LISTINGS_QUICK_REFERENCE.md with any formula/algorithm changes
4. Update LISTINGS_DATA_SCHEMA.md if schema changes
---
**Last Updated:** April 21, 2026
**Status:** Complete and comprehensive
**Recommendation:** Print or bookmark for frequent reference