Bỏ qua nội dung

Properties - xoá (soft-delete) bất động sản

Feature URL
Module
properties
Status
shipped
Priority
P0
Platforms
fe · be
AC progress
6 / 6
Last reviewed
2026-05-29

Mục tiêu

Cho phép owner xoá một property không còn dùng theo cơ chế xoá mềm: property chuyển sang INACTIVE và được đánh dấu deletedAt cùng deletedBy thay vì xoá cứng. Cách này bảo toàn liên kết lịch sử với các tin đăng đã tham chiếu property. Admin có thể force-delete property của bất kỳ user nào.

Phạm vi

Trong phạm vi (In scope):

  • Xoá property qua DELETE /properties/{id} cho owner (quyền property:delete:own) — soft-delete, đặt status INACTIVE và ghi deletedAt, deletedBy.
  • Ẩn property đã xoá khỏi tìm kiếm public và khỏi truy vấn chi tiết thông thường.
  • Admin force-delete qua DELETE /admin/properties/{id} (quyền admin).

Ngoài phạm vi (Out of scope):

  • Xoá cứng property khỏi cơ sở dữ liệu.
  • Tự động xoá các listing đang gắn property.
  • Khôi phục property đã xoá (chưa có luồng restore — xem câu hỏi mở).
  • Xoá hàng loạt nhiều property.

User Stories

  • owner, tôi muốn xoá BĐS không còn dùng, để danh sách property của tôi gọn gàng.
  • Backend, tôi muốn soft-delete thay vì xoá cứng, để không phá vỡ liên kết lịch sử với các tin đăng.
  • admin, tôi muốn xoá property vi phạm của bất kỳ user nào, để giữ dữ liệu nền tảng sạch.

Luồng chức năng

sequenceDiagram
    actor Owner
    participant App as FE/Mobile
    participant BE
    participant PropertySvc as Properties
    participant Listings

    Owner->>App: Xoá bất động sản
    App->>BE: Gửi yêu cầu xoá property
    BE->>PropertySvc: Kiểm tra quyền owner
    BE->>Listings: Kiểm tra listing liên quan
    BE->>PropertySvc: Đặt status INACTIVE và ghi deletedAt deletedBy
    PropertySvc-->>BE: Property đã soft-delete
    BE-->>App: Báo xoá thành công

Acceptance Criteria

  • AC-1: DELETE /properties/{id} chỉ cho owner của property (quyền property:delete:own).
  • AC-2: Xoá là soft-delete: property chuyển status INACTIVE và được ghi deletedAt cùng deletedBy.
  • AC-3: Property đã xoá không xuất hiện trong tìm kiếm public và truy vấn chi tiết thông thường.
  • AC-4: Hệ thống không xoá cứng property và không tự động xoá listing đang gắn property.
  • AC-5: Admin xoá được property của bất kỳ user nào qua DELETE /admin/properties/{id}.
  • AC-6: Người không phải owner và không phải admin bị từ chối xoá.

Quy tắc nghiệp vụ

  • Ưu tiên soft-delete để bảo toàn liên kết với các tin đăng đã tham chiếu.
  • Property đã soft-delete bị ẩn khỏi luồng public nhưng admin vẫn truy được qua endpoint admin.
  • Không xoá hoặc thay đổi listing khi property bị xoá.
  • deletedBy ghi lại người thực hiện xoá (owner hoặc admin) phục vụ đối soát.

Dữ liệu & Trạng thái

Entity nghiệp vụ:

  • Property: bản ghi được chuyển trạng thái xoá mềm (status, deletedAt, deletedBy).
  • Listing: tin đăng có thể đang tham chiếu property qua property_id.

Trạng thái user-facing:

  • ACTIVE — property đang hoạt động bình thường.
  • INACTIVE — property đã soft-delete hoặc ngừng hoạt động, bị ẩn khỏi luồng public.
  • forbidden — người gọi không phải owner và không phải admin nên thao tác bị chặn.

Endpoint BE hiện có:

  • DELETE /properties/{id} — owner soft-delete property (quyền property:delete:own).
  • DELETE /admin/properties/{id} — admin xoá bất kỳ property (quyền admin).

Liên quan