wip: listings/admin in-flight — bulk update, duplicates, audit log, price constraints
Some checks failed
CI / Lint → Typecheck → Test → Build (22) (push) Failing after 7s
CI / E2E Tests (push) Has been skipped
CodeQL Analysis / CodeQL (javascript-typescript) (push) Failing after 10s
Deploy / Build API Image (push) Failing after 23s
E2E Tests / Playwright E2E (push) Failing after 7s
Security Scanning / Dependency Audit (pnpm) (push) Failing after 3s
Security Scanning / Trivy Scan — API Image (push) Failing after 43s
Security Scanning / Trivy Scan — Web Image (push) Failing after 28s
Security Scanning / Trivy Scan — AI Services Image (push) Failing after 28s
Deploy / Build Web Image (push) Failing after 10s
Deploy / Build AI Services Image (push) Failing after 9s
Security Scanning / Trivy Filesystem Scan (push) Failing after 38s
Deploy / Deploy to Staging (push) Has been skipped
Deploy / Smoke Test Staging (push) Has been skipped
Deploy / Deploy to Production (push) Has been skipped
Deploy / Smoke Test Production (push) Has been skipped
Security Scanning / Security Gate (push) Failing after 1s
Deploy / Rollback Staging (push) Has been skipped
Deploy / Rollback Production (push) Has been skipped
Some checks failed
CI / Lint → Typecheck → Test → Build (22) (push) Failing after 7s
CI / E2E Tests (push) Has been skipped
CodeQL Analysis / CodeQL (javascript-typescript) (push) Failing after 10s
Deploy / Build API Image (push) Failing after 23s
E2E Tests / Playwright E2E (push) Failing after 7s
Security Scanning / Dependency Audit (pnpm) (push) Failing after 3s
Security Scanning / Trivy Scan — API Image (push) Failing after 43s
Security Scanning / Trivy Scan — Web Image (push) Failing after 28s
Security Scanning / Trivy Scan — AI Services Image (push) Failing after 28s
Deploy / Build Web Image (push) Failing after 10s
Deploy / Build AI Services Image (push) Failing after 9s
Security Scanning / Trivy Filesystem Scan (push) Failing after 38s
Deploy / Deploy to Staging (push) Has been skipped
Deploy / Smoke Test Staging (push) Has been skipped
Deploy / Deploy to Production (push) Has been skipped
Deploy / Smoke Test Production (push) Has been skipped
Security Scanning / Security Gate (push) Failing after 1s
Deploy / Rollback Staging (push) Has been skipped
Deploy / Rollback Production (push) Has been skipped
Batch-committing concurrent work-in-progress so it isn't lost: Listings — bulk update + duplicate detection --------------------------------------------- - New command BulkUpdateListings + handler + tests under application/commands/bulk-update-listings/. - New DTO presentation/dto/bulk-update-listings.dto.ts. - Controller wires the bulk endpoint; update DTO extended. - Property duplicate detector hardened: normalized-address pipeline (new migration 20260420020000_add_property_address_normalized), repository + service updates, tests refreshed. - Listing entity gains ownership-transferred event (new event file). - Integration specs for price constraints (20260420000000_add_price_check_constraints) and duplicates. - E2E: e2e/api/listings-duplicates.spec.ts. Admin — moderation audit log ---------------------------- - New Prisma table (migration 20260420010000_add_moderation_audit_log) + Prisma repo + interface + DI wiring. - Listener `moderation-audit.listener.ts` + unit spec. - Query GetModerationAuditLogs + handler + controller `admin-moderation-audit.controller.ts` + DTO. Supporting ---------- - shared/infrastructure/cache.service.ts tweak. - AUDIT_LISTINGS_PROPERTY_MANAGEMENT.md — in-repo audit notes. - Various test + module wiring updates to keep the tree green. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
-- TEC-2932: add a normalized-address column for duplicate detection
|
||||
--
|
||||
-- Strategy:
|
||||
-- * Vietnamese-aware normalization done in application code (Address VO),
|
||||
-- so the column is plain TEXT and is populated by the API layer.
|
||||
-- * Backfill existing rows with an in-DB approximation
|
||||
-- (LOWER + UNACCENT + collapse whitespace + trim). This keeps the
|
||||
-- migration self-contained without requiring a TS backfill script.
|
||||
-- * BTree index on (agentId-aware lookups via Listing) so equality
|
||||
-- filtering is cheap. Address normalization is also valuable for
|
||||
-- analytics/admin so we index the column itself.
|
||||
--
|
||||
-- The column is added nullable so the migration can be applied to a
|
||||
-- production database without blocking writes; new inserts coming through
|
||||
-- the API layer always populate the value.
|
||||
|
||||
CREATE EXTENSION IF NOT EXISTS "unaccent";
|
||||
|
||||
ALTER TABLE "Property"
|
||||
ADD COLUMN IF NOT EXISTS "addressNormalized" TEXT;
|
||||
|
||||
-- Backfill existing rows. The expression mirrors the application-level
|
||||
-- Address.normalize() rule:
|
||||
-- 1. concatenate `address, ward, district, city`
|
||||
-- 2. unaccent (strip Vietnamese diacritics)
|
||||
-- 3. lowercase
|
||||
-- 4. replace any non-alphanumeric run with a single space
|
||||
-- 5. collapse whitespace and trim
|
||||
UPDATE "Property"
|
||||
SET "addressNormalized" = TRIM(
|
||||
REGEXP_REPLACE(
|
||||
LOWER(
|
||||
UNACCENT(
|
||||
CONCAT_WS(', ', "address", "ward", "district", "city")
|
||||
)
|
||||
),
|
||||
'[^a-z0-9]+',
|
||||
' ',
|
||||
'g'
|
||||
)
|
||||
)
|
||||
WHERE "addressNormalized" IS NULL;
|
||||
|
||||
-- Equality lookup index (used by duplicate detector + admin endpoint).
|
||||
CREATE INDEX IF NOT EXISTS "Property_addressNormalized_idx"
|
||||
ON "Property" ("addressNormalized");
|
||||
Reference in New Issue
Block a user