feat(listings): implement Listings module with CRUD, media upload, and moderation

Full DDD/CQRS implementation for the Listings module (TEC-1423):
- Domain: Property, Listing, PropertyMedia entities with status machine
- Value Objects: Address, GeoPoint, Price with validation
- Events: ListingCreated, ListingApproved, ListingSold
- Commands: CreateListing, UpdateListingStatus, UploadMedia, ModerateListing
- Queries: GetListing, SearchListings, GetPendingModeration
- Infrastructure: Prisma repositories with PostGIS support, MinIO media storage
- Presentation: REST controller with JWT auth, role-based moderation
- 21 domain unit tests (all passing)

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Ho Ngoc Hai
2026-04-08 01:47:15 +07:00
parent 6741592cbe
commit 8a33aae026
50 changed files with 2108 additions and 0 deletions

View File

@@ -29,6 +29,19 @@ export enum ErrorCode {
COURSE_ALREADY_PUBLISHED = 'COURSE_ALREADY_PUBLISHED',
COURSE_ENROLLMENT_CLOSED = 'COURSE_ENROLLMENT_CLOSED',
// Listing
LISTING_NOT_FOUND = 'LISTING_NOT_FOUND',
LISTING_INVALID_STATUS_TRANSITION = 'LISTING_INVALID_STATUS_TRANSITION',
LISTING_ALREADY_ACTIVE = 'LISTING_ALREADY_ACTIVE',
LISTING_EXPIRED = 'LISTING_EXPIRED',
// Property
PROPERTY_NOT_FOUND = 'PROPERTY_NOT_FOUND',
// Media
MEDIA_UPLOAD_FAILED = 'MEDIA_UPLOAD_FAILED',
MEDIA_LIMIT_EXCEEDED = 'MEDIA_LIMIT_EXCEEDED',
// Payment
PAYMENT_FAILED = 'PAYMENT_FAILED',
PAYMENT_ALREADY_PROCESSED = 'PAYMENT_ALREADY_PROCESSED',