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ềnproperty:delete:own) — soft-delete, đặtstatusINACTIVEvà ghideletedAt,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
- Là 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.
- Là 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.
- Là 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ôngAcceptance Criteria
- AC-1:
DELETE /properties/{id}chỉ cho owner của property (quyềnproperty:delete:own). - AC-2: Xoá là soft-delete: property chuyển
statusINACTIVEvà được ghideletedAtcùngdeletedBy. - 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á.
deletedByghi 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 quaproperty_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ềnproperty:delete:own).DELETE /admin/properties/{id}— admin xoá bất kỳ property (quyền admin).
Liên quan
- Phụ thuộc: properties-create, properties-list
- Ảnh hưởng: listing-create, listing-list