Bỏ qua nội dung

Admin xoá mềm property bất kỳ

Feature URL
Module
admin
Status
in-development
Priority
P1
Platforms
fe · be
AC progress
6 / 9
Last reviewed
2026-05-30

Mục tiêu

Cho phép admin soft-delete property bất kỳ mà không cần là chủ sở hữu. Khi xoá, property bị đánh dấu INACTIVE, ghi lại thời điểm xoá và admin thực hiện, nhưng dữ liệu vẫn được giữ lại trong DB để admin tra cứu sau.

Phạm vi

Trong phạm vi (In scope):

  • Admin gọi DELETE /api/v1/admin/properties/{id} để soft-delete property bất kỳ.
  • Bỏ qua ownership check (admin không cần là createdBy).
  • Soft-delete: set status = INACTIVE, ghi deletedAt = now(), ghi deletedBy = actingAdminId.
  • API trả 204 No Content khi thành công.
  • FE nút xoá với confirmation dialog trong màn admin detail hoặc admin list.

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

  • Xoá cứng (hard delete) property khỏi DB.
  • Restore/undelete property đã soft-delete (chưa có endpoint).
  • Xoá hàng loạt (bulk delete).
  • Cascade xoá listings liên kết (listings không bị xoá tự động).

User Stories

  • admin, tôi muốn soft-delete property vi phạm để ẩn khỏi marketplace mà vẫn giữ lịch sử.
  • admin kiểm duyệt, tôi muốn biết ai đã xoá property và khi nào để có thể audit sau này.
  • admin vận hành, tôi muốn xoá property trùng lặp hoặc dữ liệu rác do user tạo sai.

Luồng chức năng

sequenceDiagram
    actor Admin
    participant Web
    participant BE
    participant DB

    Admin->>Web: Nhấn nút Xoá property trong màn admin
    Web->>Admin: Hiển thị confirmation dialog
    Admin->>Web: Xác nhận xoá
    Web->>BE: DELETE /api/v1/admin/properties/{id}
    BE->>BE: Kiểm tra role admin
    alt Property không tồn tại
        BE-->>Web: 404 Not Found
        Web->>Admin: Báo property không tồn tại
    else Thành công
        BE->>DB: Set status INACTIVE và deletedAt và deletedBy
        BE-->>Web: 204 No Content
        Web->>Admin: Thông báo đã xoá property
    end

Acceptance Criteria

  • AC-1: Backend có DELETE /api/v1/admin/properties/{id}, chỉ admin được gọi.
  • AC-2: API bỏ qua ownership check, admin không cần là createdBy.
  • AC-3: Soft-delete ghi status = INACTIVE, deletedAt = now(), deletedBy = actingAdminId.
  • AC-4: API trả 204 No Content khi thành công.
  • AC-5: Nếu property không tồn tại, API trả 404 Not Found.
  • AC-6: actingAdminId được lấy từ UserPrincipal của SecurityContext, null-safe.
  • AC-7: FE cần nút Xoá và confirmation dialog trong màn admin detail hoặc admin list.
  • AC-8: FE sau khi xoá thành công cần refresh danh sách hoặc chuyển về màn list.
  • AC-9: FE xử lý 404 (property không tồn tại) và error state.

Quy tắc nghiệp vụ

  • Chỉ admin được gọi DELETE /admin/properties/{id}.
  • Soft-delete không xoá listings liên kết; listings vẫn tồn tại và tham chiếu property đã xoá.
  • Bắt buộc có confirmation step trên FE trước khi gọi API xoá.
  • Dữ liệu property vẫn giữ trong DB sau soft-delete; admin xem được qua GET /admin/properties/{id}.
  • deletedBy ghi nhận UUID admin thực hiện để phục vụ audit; không public ra ngoài API thông thường.

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

Entity nghiệp vụ:

  • Property: bất động sản bị soft-delete — sau khi xoá status = INACTIVE, deletedAtdeletedBy được ghi.
  • User (deletedBy): admin thực hiện soft-delete, chỉ lưu UUID.

Trạng thái user-facing:

  • confirm-pending — đang chờ admin xác nhận xoá.
  • deleting — đang gọi API xoá.
  • delete-success — xoá thành công, property đã INACTIVE.
  • delete-not-found — property không tồn tại.
  • delete-error — lỗi khi xoá.

Liên quan