Generated from prisma/schema.prisma (41 models, 37 enums): - docs/db/ERD.md: Mermaid ERD + domain map - docs/db/schema-audit.md: per-model findings with severity + 10 cross-cutting findings Co-Authored-By: Paperclip <noreply@paperclip.ing>
105 lines
4.1 KiB
Markdown
105 lines
4.1 KiB
Markdown
# GoodGo Platform — Entity Relationship Diagram
|
|
|
|
> Generated from `prisma/schema.prisma` as part of [TEC-3010](/TEC/issues/TEC-3010) (Epic: [TEC-3006](/TEC/issues/TEC-3006) — Database Schema Hardening).
|
|
|
|
- **Database**: PostgreSQL 16 + PostGIS
|
|
- **ORM**: Prisma
|
|
- **Models**: 41
|
|
- **Enums**: 37
|
|
- **Geospatial models**: `Property`, `ProjectDevelopment`, `IndustrialPark`, `POI`, `TransferListing`, `InfrastructureProject` (all use `geometry(Point, 4326)` indexed with GiST)
|
|
|
|
## High-level domain map
|
|
|
|
| Domain | Key models |
|
|
|---|---|
|
|
| Auth / identity | `User`, `Agent`, `RefreshToken`, `OAuthAccount`, `MfaChallenge` |
|
|
| Residential listings | `Property`, `PropertyMedia`, `Listing`, `PriceHistory`, `ProjectDevelopment` |
|
|
| Industrial / KCN | `IndustrialPark`, `IndustrialListing` |
|
|
| Transfer (furniture + premises) | `TransferListing`, `TransferItem` |
|
|
| Search & save | `SavedSearch`, `SavedListing` |
|
|
| Transactions / commerce | `Transaction`, `Inquiry`, `Lead`, `Order`, `Escrow`, `Payment` |
|
|
| Subscriptions | `Plan`, `Subscription`, `UsageRecord` |
|
|
| Messaging | `Conversation`, `ConversationParticipant`, `Message` |
|
|
| Analytics / AI | `Valuation`, `MarketIndex`, `Report`, `MacroeconomicData`, `InfrastructureProject` |
|
|
| Neighborhood | `POI`, `NeighborhoodScore` |
|
|
| Moderation / audit | `AdminAuditLog`, `ModerationAuditLog`, `Review` |
|
|
| Notifications | `NotificationLog`, `NotificationPreference` |
|
|
| System | `SystemSetting` |
|
|
|
|
## Mermaid ERD
|
|
|
|
```mermaid
|
|
erDiagram
|
|
User ||--o| Agent : has
|
|
User ||--o{ Listing : sells
|
|
User ||--o{ SavedSearch : owns
|
|
User ||--o| Subscription : holds
|
|
User ||--o{ Payment : makes
|
|
User ||--o{ Review : writes
|
|
User ||--o{ Inquiry : sends
|
|
User ||--o{ RefreshToken : owns
|
|
User ||--o{ OAuthAccount : links
|
|
User ||--o{ Transaction : buys
|
|
User ||--o{ Order : buys_or_sells
|
|
User ||--o{ MfaChallenge : authenticates
|
|
User ||--o{ TransferListing : lists
|
|
User ||--o{ Report : requests
|
|
User ||--o{ SavedListing : saves
|
|
User ||--o{ ProjectDevelopment : owns
|
|
User ||--o{ IndustrialPark : operates
|
|
|
|
Agent ||--o{ Listing : represents
|
|
Agent ||--o{ Lead : manages
|
|
|
|
ProjectDevelopment ||--o{ Property : contains
|
|
Property ||--o{ Listing : published_as
|
|
Property ||--o{ Valuation : valued_by
|
|
Property ||--o{ PropertyMedia : has
|
|
|
|
Listing ||--o{ Transaction : spawns
|
|
Listing ||--o{ Inquiry : receives
|
|
Listing ||--o{ Order : generates
|
|
Listing ||--o{ PriceHistory : tracks
|
|
Listing ||--o{ SavedListing : saved_as
|
|
|
|
Transaction ||--o{ Payment : settled_by
|
|
Order ||--o| Escrow : protected_by
|
|
Order ||--o{ Payment : paid_by
|
|
|
|
Plan ||--o{ Subscription : sold_as
|
|
Subscription ||--o{ UsageRecord : meters
|
|
|
|
IndustrialPark ||--o{ IndustrialListing : leases
|
|
|
|
Conversation ||--o{ ConversationParticipant : has
|
|
Conversation ||--o{ Message : contains
|
|
|
|
TransferListing ||--o{ TransferItem : contains
|
|
```
|
|
|
|
> The Mermaid diagram above intentionally omits cardinality-only links that do not have Prisma-level relations (e.g. `Review.targetId` polymorphic references, `ModerationAuditLog.targetId`, `AdminAuditLog.targetId`, `NotificationLog.userId`).
|
|
|
|
## Detached / polymorphic references
|
|
|
|
These fields reference other entities by id but lack a Prisma relation — they are polymorphic on purpose, but they sidestep referential integrity:
|
|
|
|
- `Review.targetType` + `Review.targetId` → any listing/property/agent
|
|
- `ModerationAuditLog.targetType` + `.targetId` → any moderatable entity
|
|
- `AdminAuditLog.targetId` + `.targetType` → user/listing/subscription
|
|
- `NotificationLog.userId` → `User.id` (no FK)
|
|
- `ConversationParticipant.userId` → `User.id` (no FK)
|
|
- `Message.senderId` → `User.id` (no FK)
|
|
- `IndustrialListing.sellerId` / `.agentId` → `User.id` / `Agent.id` (no FK)
|
|
- `Lead.source` (string), `Review.targetType` (string) — no enum
|
|
- `Conversation.listingId` → `Listing.id` (no FK)
|
|
|
|
See `schema-audit.md` → section **Findings** for severity.
|
|
|
|
## Rendered diagram
|
|
|
|
The Mermaid block above renders directly in GitHub, GitLab and most Markdown viewers. For an offline PNG/SVG, run:
|
|
|
|
```bash
|
|
npx @mermaid-js/mermaid-cli -i docs/db/ERD.md -o docs/db/ERD.png
|
|
```
|