Move 36 root-level audit/analysis documents and 7 web app audit documents into docs/audits/ directory to declutter the project root. Remove stale EXPLORATION_SUMMARY.txt. Co-Authored-By: Paperclip <noreply@paperclip.ing>
12 KiB
Agent Public Profile Page — Complete Implementation Guide
Last Updated: April 11, 2026
Status: 📋 Exploration Complete — Ready for Implementation
Scope: /agents/[id] public profile page for GoodGo platform
📚 Documentation Index
This exploration package contains 3 comprehensive documents:
1. AGENT_PROFILE_EXPLORATION.md (21 KB)
Comprehensive technical analysis of the entire codebase
Contains:
- ✅ Web app structure & routing analysis
- ✅ Existing agent-related code inventory
- ✅ API endpoint design proposals
- ✅ UI component library overview
- ✅ Styling patterns & Tailwind setup
- ✅ State management & data fetching patterns
- ✅ SEO & structured data patterns
- ✅ Type definitions & interfaces
- ✅ Implementation checklist
- ✅ Key files reference guide
Read this first to understand the full architecture.
2. AGENT_PROFILE_QUICK_REFERENCE.md (10 KB)
Quick-start guide for developers
Contains:
- ✅ URL patterns & routing
- ✅ Backend API specification
- ✅ Frontend architecture diagram
- ✅ Data flow visualization
- ✅ Component composition guide
- ✅ API endpoints reference
- ✅ UI mockups & layouts
- ✅ Copy-paste code templates
- ✅ SEO & schema references
- ✅ 5-phase implementation timeline
- ✅ Example response structures
- ✅ Key files checklist
Use this during development as a handy reference.
3. AGENT_PROFILE_CODE_EXAMPLES.md (20 KB)
Ready-to-use code templates for all components
Contains:
- ✅ Backend query handler (CQRS pattern)
- ✅ Backend DTO definitions
- ✅ Backend controller endpoint
- ✅ Repository interface updates
- ✅ Prisma implementation
- ✅ Frontend API client (agents-api.ts)
- ✅ Frontend server fetch (agents-server.ts)
- ✅ Server component (page.tsx)
- ✅ Agent header component
- ✅ Agent listings section component
- ✅ Agent reviews section component
- ✅ Tailwind styling patterns
- ✅ Testing checklist
Copy & paste these into your actual files and customize.
🎯 Quick Start (5 Minutes)
-
Read
AGENT_PROFILE_QUICK_REFERENCE.mdsections:- 🎯 Implementation Overview
- 📦 Backend Setup
- 🎨 Frontend Architecture
-
Review
AGENT_PROFILE_CODE_EXAMPLES.md:- Backend files structure
- Frontend files structure
-
Plan implementation in 5 phases (see quick reference)
🏗️ Architecture Summary
Backend (NestJS)
New Endpoint: GET /api/v1/agents/:agentId/profile
│
├── Query: GetAgentProfileQuery
├── Handler: GetAgentProfileHandler
├── DTO: AgentPublicProfileDto
├── Repository: IAgentRepository.getPublicProfile()
└── Implementation: PrismaAgentRepository
Frontend (Next.js 14)
Route: /agents/[id]
│
├── Page Component: [id]/page.tsx (Server)
│ ├── Metadata generation (SEO)
│ └── JSON-LD structured data
│
└── Client Component: AgentDetailClient
├── AgentHeader (profile info)
├── AgentReviewsSection (reviews & ratings)
└── AgentListingsSection (properties)
Data Flow
1. GET /agents/[id]
2. Server fetches agent profile (ISR: 1 hour cache)
3. Generates SEO metadata
4. Renders with JSON-LD structured data
5. Client component fetches:
- Agent's listings (parallel)
- Agent's reviews (parallel)
6. Display agent profile with interactive sections
📋 Implementation Phases
Phase 1: Backend (1-2 hours)
- Create
get-agent-profile/query handler - Create
agent-public-profile.dto.ts - Update
agent.repository.tsinterface - Implement
prisma-agent.repository.ts - Add endpoint to
agents.controller.ts - Test with Postman/curl
Phase 2: Frontend Setup (1 hour)
- Create
lib/agents-api.ts - Create
lib/agents-server.ts - Create
/agents/[id]/directory - Create
/agents/[id]/page.tsx(stub)
Phase 3: UI Components (2-3 hours)
- Create
components/agents/directory - Create
agent-detail-client.tsx - Create
agent-header.tsx - Create
agent-reviews-section.tsx - Create
agent-listings-section.tsx
Phase 4: SEO & Polish (1 hour)
- Implement
generateMetadata() - Add JSON-LD schemas
- Mobile responsive testing
- Dark mode testing
Phase 5: Testing & QA (1 hour)
- Manual e2e testing
- 404 handling
- ISR revalidation
- Pagination (reviews/listings)
- SEO audit (Lighthouse)
Total Estimated Time: 6-8 hours
🔗 Key API Endpoints
Backend (New)
GET /agents/:agentId/profile
# Returns: AgentPublicProfileDto
# Status: 200 (success), 404 (not found)
Backend (Existing, Reused)
GET /listings?agentId=:id&status=ACTIVE
# Get agent's active listings
GET /reviews?targetType=AGENT&targetId=:id
# Get agent reviews with pagination
GET /reviews/stats?targetType=AGENT&targetId=:id
# Get aggregate rating statistics
🎨 Frontend Routes
/ # Landing page
/agents/[id] # Agent profile (NEW)
/en/agents/[id] # English locale (NEW)
/vi/agents/[id] # Vietnamese locale (NEW)
/listings/[id] # Listing detail (EXISTING)
/search # Search page (EXISTING)
/pricing # Pricing page (EXISTING)
📦 Files to Create/Modify
Backend
| File | Action | Lines |
|---|---|---|
agents/application/queries/get-agent-profile/get-agent-profile.query.ts |
CREATE | 5 |
agents/application/queries/get-agent-profile/get-agent-profile.handler.ts |
CREATE | 30 |
agents/presentation/dto/agent-public-profile.dto.ts |
CREATE | 30 |
agents/presentation/controllers/agents.controller.ts |
MODIFY | +20 |
agents/domain/repositories/agent.repository.ts |
MODIFY | +1 method |
agents/infrastructure/repositories/prisma-agent.repository.ts |
MODIFY | +35 |
Frontend
| File | Action | Lines |
|---|---|---|
lib/agents-api.ts |
CREATE | 40 |
lib/agents-server.ts |
CREATE | 15 |
app/[locale]/(public)/agents/[id]/page.tsx |
CREATE | 120 |
components/agents/agent-detail-client.tsx |
CREATE | 30 |
components/agents/agent-header.tsx |
CREATE | 120 |
components/agents/agent-listings-section.tsx |
CREATE | 70 |
components/agents/agent-reviews-section.tsx |
CREATE | 100 |
Total New Lines: ~595
Files Created: 10
Files Modified: 3
🧪 Validation Checklist
API Validation
- Endpoint returns 200 for valid agent
- Endpoint returns 404 for invalid agent
- Response includes all required fields
- Dates are ISO 8601 formatted
- Numbers have correct precision
Frontend Validation
- Page loads without errors
- Metadata generates correctly
- JSON-LD validates on structured.data.org
- Mobile responsive (320px, 768px, 1024px)
- Dark mode works correctly
- ISR revalidation works
SEO Validation
- Title tag is unique and descriptive
- Meta description is complete
- OG image displays correctly
- Canonical URL is correct
- Breadcrumb schema is valid
- LocalBusiness schema is valid
Performance Validation
- First Contentful Paint < 2s
- Largest Contentful Paint < 2.5s
- Cumulative Layout Shift < 0.1
- Lighthouse score > 80
📊 Data Structure Reference
Agent Public Profile Response
{
id: string; // "clu1x2y3z4a5b6c7d8e9f0"
fullName: string; // "Nguyễn Văn A"
avatarUrl: string | null; // "https://..."
licenseNumber: string | null; // "DA123456"
agency: string | null; // "GoodGo Agency"
qualityScore: number; // 4.8
bio: string | null; // Agent description
serviceAreas: string[]; // ["quan-1", "quan-7"]
isVerified: boolean; // true
totalListings: number; // 45
activeListings: number; // 32
avgReviewRating: number; // 4.7
totalReviews: number; // 120
createdAt: string; // ISO 8601
updatedAt: string; // ISO 8601
}
🔍 Key Design Decisions
- Routing: Agent profiles under
(public)group, same as listings - Pattern: Follow listing detail page pattern exactly (copy/paste approach)
- Data Fetching: Server-side with ISR (1 hour revalidation)
- State: Client-side useState for reviews/listings (no Zustand)
- Components: Split into Page (server) + Client (interactive)
- SEO: LocalBusiness JSON-LD schema for agent
- Styling: Reuse existing UI components & Tailwind tokens
- Reviews: Leverage existing /reviews endpoints (already public)
🚀 Getting Started
Step 1: Read the Docs
- Read
AGENT_PROFILE_QUICK_REFERENCE.md(10 min) - Skim
AGENT_PROFILE_EXPLORATION.md(20 min)
Step 2: Backend Implementation
- Copy code from
AGENT_PROFILE_CODE_EXAMPLES.md(Phase 1) - Adapt to your codebase
- Test with Postman
Step 3: Frontend Implementation
- Create directory structure
- Copy components from code examples (Phase 2-3)
- Wire up data fetching
- Add SEO metadata
Step 4: Testing
- Manual testing
- Lighthouse audit
- E2E test (agent profile page)
💡 Implementation Tips
- Copy the listing detail page structure — Agent page should be ~90% similar
- Reuse PropertyCard component — For displaying agent's listings
- Use existing review endpoints — Already public and don't need auth
- Follow i18n patterns — Agent name/bio may need translation
- Test 404 handling — When agent doesn't exist
- Cache agent profile — 1 hour ISR matches listing pattern
📖 Reference Files in Codebase
Pattern to Copy
- ✅
app/[locale]/(public)/listings/[id]/page.tsx— Page structure - ✅
components/search/property-card.tsx— Card pattern - ✅
lib/listings-api.ts— API client pattern - ✅
lib/listings-server.ts— Server fetch pattern - ✅
components/seo/json-ld.tsx— JSON-LD pattern
Endpoints to Use
- ✅
GET /listings?agentId=:id— Existing - ✅
GET /reviews?targetType=AGENT— Existing - ✅
GET /reviews/stats?targetType=AGENT— Existing
Components to Reuse
- ✅
Card,CardContent— Layout - ✅
Badge— Status/stats display - ✅
Button— CTAs - ✅
Image— Avatar & property photos - ✅
PropertyCard— Listings display
❓ FAQ
Q: How long does this take to implement?
A: 6-8 hours total (1-2h backend, 1h setup, 2-3h UI, 1h SEO, 1h testing)
Q: Do I need to create new backend endpoints?
A: Yes, 1 new endpoint: GET /agents/:agentId/profile. Reviews/listings endpoints already exist.
Q: Can I reuse components from the listing page?
A: Yes! PropertyCard, metadata generation, JSON-LD structure can all be adapted.
Q: How do I handle pagination for listings/reviews?
A: Use the same pagination as listing detail page (limit, offset, page)
Q: What about internationalization?
A: Agent fullName/bio come from database; use existing i18n patterns in codebase
Q: How is SEO handled?
A: Server-side metadata generation + LocalBusiness JSON-LD schema
📞 Support
If you have questions during implementation:
- Check the exploration document — Most answers are there
- Review code examples — All patterns are shown
- Look at existing pages — Listing detail page is the best reference
- Follow the CQRS pattern — Used throughout the API
✅ Completion Checklist
- Read all 3 documentation files
- Understand the data flow
- Plan your implementation (5 phases)
- Create directory structure
- Implement backend endpoint
- Implement frontend API client
- Create page component
- Create client components
- Add SEO metadata
- Add JSON-LD schemas
- Test manually
- Run Lighthouse audit
- Deploy & monitor
Status: 🟢 Ready to build!
Good luck with your implementation. Follow the patterns in the codebase, and you'll have a professional agent profile page up and running in a day.