Move MCP module exploration, quick reference, and inquiries exploration documents to the centralized audit directory. Co-Authored-By: Paperclip <noreply@paperclip.ing>
12 KiB
📚 Inquiries Module - Complete Exploration Documentation
Generated: April 11, 2026
Module: apps/api/src/modules/inquiries/
Status: ✅ Complete & Thorough Analysis
📖 DOCUMENTATION FILES
This exploration includes 3 comprehensive documentation files designed for different use cases:
1. INQUIRIES_MODULE_EXPLORATION.md (23 KB)
Purpose: In-depth reference guide
Best for: Understanding architecture, patterns, and complete file descriptions
Contains:
- 📁 Complete directory structure
- 📄 Full file listing with descriptions
- 🏗️ Module architecture diagrams
- 🔑 Key classes & handlers breakdown
- 🎯 DDD layer analysis
- 📊 Test file summary
- 🛠️ Dependencies & security
- 📝 API contracts
Read this when: You need complete understanding of the module
2. INQUIRIES_MODULE_QUICK_REFERENCE.md (9.3 KB)
Purpose: Quick lookup guide
Best for: Getting up to speed quickly, finding specific information
Contains:
- 📊 Module at a glance
- 📁 Files by layer overview
- 🔄 Request flow diagrams
- 🔑 Key classes table
- 📝 Key interfaces
- 🧪 Test statistics
- 🔐 Authorization matrix
- 🎯 DDD principles
- 📌 Common patterns
- 🔍 Where to look for X guide
Read this when: You need quick answers or are new to the module
3. INQUIRIES_COMPLETE_FILE_INDEX.md (23 KB)
Purpose: Exhaustive file reference
Best for: Finding specific files, understanding dependencies, planning modifications
Contains:
- 📋 Complete file listing by path
- 📊 File statistics tables
- 🔍 File discovery guide
- 🔗 Dependency graph
- 📝 File cross-references
- 🎯 Entry points for modifications
- Line count for each file
- Detailed method descriptions
Read this when: You need file-by-file details or planning changes
🎯 QUICK START BY USE CASE
I want to understand the overall architecture
→ Start with Quick Reference → Dive into Exploration
I'm new to this module
→ Start with Quick Reference → Browse File Index as needed
I need to add a new endpoint
→ Check File Index → Entry Points section → Follow the guide
I need to understand a specific layer
→ Search Quick Reference for layer → Read full details in Exploration
I'm looking for a specific class or method
→ Use File Index → File Discovery Guide section
I need to understand data flow
→ Quick Reference → Request Flows section
I'm fixing a bug or refactoring
→ File Index → Dependency Graph & Cross-References
📊 MODULE SNAPSHOT
Location: apps/api/src/modules/inquiries/
Files: 25 total (19 source + 6 test files)
LOC: 1,212 lines of code
Pattern: CQRS + DDD (Clean Architecture)
Tests: 24 test cases across 6 suites
Endpoints: 4 HTTP endpoints
Layer Breakdown
| Layer | Files | Purpose |
|---|---|---|
| Presentation | 5 | HTTP endpoints + validation |
| Application | 8 | Commands/Queries + orchestration |
| Domain | 6 | Business logic + contracts |
| Infrastructure | 1 | Prisma persistence |
| Module | 2 | Configuration + exports |
🗂️ FILE TREE
inquiries/
├── 📄 index.ts [Barrel export]
├── 📄 inquiries.module.ts [NestJS Module]
│
├── 📁 presentation/
│ ├── controllers/
│ │ └── inquiries.controller.ts [4 endpoints]
│ ├── dto/
│ │ ├── create-inquiry.dto.ts [Input validation]
│ │ └── list-inquiries.dto.ts [Pagination]
│ └── __tests__/
│ └── inquiries.controller.spec.ts [6 tests]
│
├── 📁 application/
│ ├── commands/
│ │ ├── create-inquiry/
│ │ │ ├── create-inquiry.command.ts
│ │ │ └── create-inquiry.handler.ts
│ │ └── mark-inquiry-read/
│ │ ├── mark-inquiry-read.command.ts
│ │ └── mark-inquiry-read.handler.ts
│ ├── queries/
│ │ ├── get-inquiries-by-agent/
│ │ │ ├── get-inquiries-by-agent.query.ts
│ │ │ └── get-inquiries-by-agent.handler.ts
│ │ └── get-inquiries-by-listing/
│ │ ├── get-inquiries-by-listing.query.ts
│ │ └── get-inquiries-by-listing.handler.ts
│ └── __tests__/
│ ├── create-inquiry.handler.spec.ts
│ ├── mark-inquiry-read.handler.spec.ts
│ ├── get-inquiries-by-listing.handler.spec.ts
│ └── get-inquiries-by-agent.handler.spec.ts
│
├── 📁 domain/
│ ├── entities/
│ │ └── inquiry.entity.ts [Aggregate Root]
│ ├── events/
│ │ ├── inquiry-created.event.ts
│ │ └── inquiry-read.event.ts
│ ├── repositories/
│ │ ├── inquiry.repository.ts [Interface]
│ │ └── inquiry-read.dto.ts [Read DTO]
│ └── __tests__/
│ └── inquiry-domain.spec.ts [5 tests]
│
└── 📁 infrastructure/
└── repositories/
└── prisma-inquiry.repository.ts [Implementation]
🔄 REQUEST FLOWS
Create Inquiry
POST /inquiries
→ Controller validates JWT
→ CreateInquiryCommand dispatched
→ CreateInquiryHandler executes:
• Validate listing exists
• Create InquiryEntity
• Save to repository
• Publish InquiryCreatedEvent
→ Response: { id, listingId, createdAt }
Mark as Read
PATCH /inquiries/:id/read (AGENT only)
→ Controller validates JWT + AGENT role
→ MarkInquiryReadCommand dispatched
→ MarkInquiryReadHandler executes:
• Load inquiry entity
• Verify agent owns listing
• Update entity state
• Persist change
• Publish InquiryReadEvent
→ Response: { success: true }
List Inquiries
GET /inquiries/listing/:id or /agent/me
→ Controller validates JWT (+ AGENT for /agent/me)
→ Query dispatched
→ Handler resolves pagination
→ Repository executes paginated query
→ Response: PaginatedResult<InquiryReadDto>
🔑 KEY CONCEPTS
DDD (Domain-Driven Design)
- Domain Entity:
InquiryEntityencapsulates inquiry logic - Domain Events:
InquiryCreatedEvent,InquiryReadEvent - Repository Pattern: Interface in domain, implementation in infrastructure
- Aggregate Root: InquiryEntity manages state transitions
CQRS (Command Query Responsibility Segregation)
- Commands: CreateInquiryCommand, MarkInquiryReadCommand (write operations)
- Queries: GetInquiriesByListingQuery, GetInquiriesByAgentQuery (read operations)
- Handlers: Separate classes for each command/query
Clean Architecture Layers
- Presentation: HTTP endpoints, DTOs, decorators
- Application: Commands/Queries, handlers, coordination
- Domain: Business logic, entities, events, interfaces
- Infrastructure: Database, persistence implementation
🧪 TEST COVERAGE
Total: 24 tests across 6 test suites
| Test Suite | Tests | Focus |
|---|---|---|
| Domain Entity | 5 | Aggregate behavior, events |
| CreateInquiryHandler | 4 | Happy path, validation, events |
| MarkInquiryReadHandler | 5 | Happy path, auth, errors |
| GetInquiriesByListingHandler | 2 | Pagination, empty results |
| GetInquiriesByAgentHandler | 2 | Results, agent lookup |
| InquiriesController | 6 | All endpoints, defaults |
🔐 Security
Authentication: All endpoints require JWT token
Authorization: RBAC with AGENT role for certain endpoints
Endpoint Security Matrix
| Endpoint | Auth | Role | Extra Checks |
|---|---|---|---|
| POST /inquiries | JWT | Any | Listing exists |
| GET /listing/:id | JWT | Any | - |
| GET /agent/me | JWT | AGENT | - |
| PATCH /:id/read | JWT | AGENT | Agent owns listing |
📡 API CONTRACTS
POST /inquiries
Request: { listingId: string, message: string, phone?: string }
Response: { id: string, listingId: string, createdAt: string }
Status: 201 | 400 | 401 | 404
GET /inquiries/listing/:listingId
Query: { page?: number, limit?: number }
Response: PaginatedResult<InquiryReadDto>
Status: 200 | 401
GET /inquiries/agent/me
Query: { page?: number, limit?: number }
Response: PaginatedResult<InquiryReadDto>
Status: 200 | 401 | 403
PATCH /inquiries/:id/read
Response: { success: boolean }
Status: 200 | 401 | 403 | 404
🚀 GETTING STARTED
For Understanding the Code
- Read Quick Reference (5 min)
- Review Request Flows (5 min)
- Explore specific layers in Exploration as needed
For Adding Features
- Check File Index → Entry Points (2 min)
- Follow the modification guide (varies)
- Check existing tests for patterns
For Debugging
- Identify the layer (presentation/application/domain/infrastructure)
- Find the file in File Index
- Check tests for expected behavior
📋 COMMON PATTERNS
Adding a Command
- Create
application/commands/[name]/[name].command.ts - Create
application/commands/[name]/[name].handler.ts - Implement
ICommandHandler<YourCommand> - Register in
inquiries.module.tsCommandHandlers array - Add tests in
application/__tests__/
Adding a Query
- Create
application/queries/[name]/[name].query.ts - Create
application/queries/[name]/[name].handler.ts - Implement
IQueryHandler<YourQuery> - Register in
inquiries.module.tsQueryHandlers array - Add tests in
application/__tests__/
Adding an Endpoint
- Add method to
InquiriesController - Add DTOs if needed to
presentation/dto/ - Dispatch command/query via bus
- Add tests to
presentation/__tests__/
🔗 EXTERNAL DEPENDENCIES
Core:
@nestjs/common- Framework@nestjs/cqrs- CQRS bus@prisma/client- ORM
Validation:
class-validator- DTO validationclass-transformer- Type transformation
Documentation:
@nestjs/swagger- OpenAPI docs
Internal:
@modules/shared- AggregateRoot, exceptions@modules/auth- JWT guards, decorators
📈 QUALITY METRICS
| Aspect | Rating | Notes |
|---|---|---|
| Architecture | ⭐⭐⭐⭐⭐ | Clean DDD + CQRS |
| Organization | ⭐⭐⭐⭐⭐ | Clear layer separation |
| Type Safety | ⭐⭐⭐⭐⭐ | Full TypeScript |
| Tests | ⭐⭐⭐⭐☆ | 24 tests, good depth |
| Auth | ⭐⭐⭐⭐⭐ | Proper RBAC |
| Maintainability | ⭐⭐⭐⭐⭐ | Easy to extend |
💡 ARCHITECTURAL HIGHLIGHTS
✅ Separation of Concerns - Each layer has single responsibility
✅ Dependency Inversion - Depend on abstractions, not concrete implementations
✅ Event-Driven - Domain events for business significance
✅ CQRS - Read/write paths separate and optimizable
✅ Type Safety - Full TypeScript with no any types
✅ Testability - All layers independently testable
✅ Extensibility - Easy to add new commands/queries
🎓 LEARNING PATH
Beginner: Read Quick Reference → Understand layers → Look at controller
Intermediate: Study handlers → Review entities → Examine tests
Advanced: Deep dive into event sourcing → Pagination → Optimization patterns
📞 REFERENCE QUICK LINKS
Within documentation files:
Quick Reference:
- Files by layer
- Request flows
- Authorization matrix
- Entry points for changes
File Index:
- Complete file descriptions
- Dependency graph
- Cross-references
- Modification guide
Exploration:
- Architecture diagrams
- Design patterns
- Security details
- Test coverage analysis
✨ Next Steps
- Read the Quick Reference to get oriented
- Pick a documentation file based on your need
- Use the discovery guides to find specific information
- Follow the modification guides when making changes
- Check tests for expected behavior
Happy exploring! 🚀
Generated: April 11, 2026
Documentation Status: ✅ Complete