Danh sách Feature
| Feature | Module | Copy URL | Status | Priority | Platforms | Note | Updated |
|---|---|---|---|---|---|---|---|
| MASKING_UNLOCKS 1 feature | |||||||
| Mở khóa số điện thoại trên listing masking-unlock | MASKING_UNLOCKS | shipped | P0 | febe | Che số điện thoại chủ tin; mở khóa bằng hạn mức miễn phí hằng ngày hoặc trả V-Credit. Chủ tin mở miễn phí. | ||
| SUBSCRIPTION-PACKAGE 5 feature | |||||||
| Mua gói package bằng V-Credits package-purchase | SUBSCRIPTION-PACKAGE | shipped | P0 | febe | User mua gói trả phí bằng ví V-Credits (POST /subscriptions/me/purchase). Trừ ví atomic, 409 nếu thiếu credits, kích hoạt UserPackage active, reset daily unlock cho lần mua đầu. | ||
| Xem gói package và quyền lợi hiện tại package-view | SUBSCRIPTION-PACKAGE | shipped | P0 | febe | Public list gói ACTIVE (GET /subscriptions/plans) cho pricing page + xem gói đang dùng và quyền lợi của chính mình (GET /subscriptions/me/entitlement). Là nơi định nghĩa entity Package và UserPackage. | ||
| Cập nhật gói đang dùng (nâng cấp / hạ gói) package-change | SUBSCRIPTION-PACKAGE | shipped | P1 | febe | Đổi gói khi đang có gói active (POST /subscriptions/me/purchase). Upgrade-only: nâng tier hoặc kéo dài cycle được phép + hoàn pro-rata; hạ tier, hạ cycle, mua lại đúng gói = 409. | ||
| Lịch sử gói thuê bao của user package-history | SUBSCRIPTION-PACKAGE | shipped | P1 | febe | User xem toàn bộ lịch sử gói đã mua/hết hạn (GET /subscriptions/me/history). Page<SubscriptionHistoryResponse>, sắp xếp startedAt DESC, gồm cả ACTIVE lẫn EXPIRED, giá snapshot tại thời điểm mua. | ||
| Gia hạn và tự động gia hạn gói package-renewal | SUBSCRIPTION-PACKAGE | shipped | P1 | febe | Bật/tắt auto-renew (POST /subscriptions/me/renewal/deactivate, thực chất là toggle) + job nền gia hạn gói khi hết hạn: đủ credits thì trừ ví và tạo kỳ mới, không đủ thì EXPIRED + notify. | ||
| PROPERTIES 4 feature | |||||||
| Properties - tạo bất động sản properties-create | PROPERTIES | shipped | P0 | febe | POST /properties tạo bất động sản (lớp vật lý dùng chung cho listing), gắn owner, chọn PropertyType, đính kèm hồ sơ pháp lý tuỳ chọn, mặc định ACTIVE. | ||
| Properties - xoá (soft-delete) bất động sản properties-delete | PROPERTIES | shipped | P0 | febe | DELETE /properties/{id} soft-delete (INACTIVE + deletedAt/deletedBy), ẩn khỏi public; admin force-delete qua /admin/properties/{id}. Không xoá listing đang gắn. | ||
| Properties - tìm kiếm và xem chi tiết bất động sản properties-list | PROPERTIES | shipped | P0 | febe | GET /properties (public search ACTIVE), /properties/me (property của user), /properties/{id} (chi tiết kèm tin đăng liên quan, hồ sơ pháp lý theo người xem). | ||
| Properties - cập nhật bất động sản properties-update | PROPERTIES | shipped | P0 | febe | PUT /properties/{id} owner full-replace + upsert/gỡ hồ sơ pháp lý; admin force-edit qua /admin/properties/{id}. Giữ nguyên property_id và liên kết listing. | ||
| CONTACTS 4 feature | |||||||
| Contacts - tạo contact contacts-create | CONTACTS | draft | P1 | febe | Cho phép broker hoặc luồng crawl tạo contact tập trung, gắn số điện thoại qua phone_registries và dùng lại cho nhiều listings. | ||
| Contacts - xoá hoặc lưu trữ contact contacts-delete | CONTACTS | draft | P1 | febe | Cho phép xoá hoặc lưu trữ contact theo rule an toàn, đặc biệt khi contact đang liên kết với listings. | ||
| Contacts - xem danh sách và chi tiết contact contacts-list | CONTACTS | draft | P1 | febe | Cho phép broker xem danh sách, tìm kiếm và mở chi tiết contact trong CRM. | ||
| Contacts - cập nhật contact contacts-update | CONTACTS | draft | P1 | febe | Cho phép broker chỉnh sửa thông tin contact trong phạm vi được phép mà không phá vỡ liên kết listing. | ||
| BROWSER-EXTENSION 3 feature | |||||||
| Map field listing V-Nexus sang field sàn (MuaBan/Chotot) extension-field-mapping | BROWSER-EXTENSION | in-development | P2 | febe | Map ListingResponse → nhãn field MuaBan/Chotot, humanize tiếng Việt cho autofill tự động (text, dropdown, chip, subtype): dealType, hướng, areaM2 fan-out, bỏ field rỗng/0/NaN, phone chỉ MuaBan, price required Chotot. | ||
| Prefill tin đăng V-Nexus sang sàn (MuaBan/Nhà Tốt) extension-listing-prefill | BROWSER-EXTENSION | in-development | P2 | febe | Luồng core Extension: popup chỉ bật ở /user/my-listings, lấy listing (token tự đọc từ tab), mở tab MuaBan/NhaTot và TỰ ĐỘNG điền form (text + dropdown + chip + stepper). User tự upload ảnh và tự bấm đăng. | ||
| Origin cố định, token tự đọc & phạm vi kích hoạt Extension extension-settings | BROWSER-EXTENSION | in-development | P2 | fe | Bỏ trang Options: origin backend/FE hardcode (Staging api-test/vnexus-test), token tự đọc từ tab V-Nexus đang đăng nhập, popup chỉ bật ở /user/my-listings. host_permissions phải khớp backend + FE + host sàn. | ||
| Auth 6 feature | |||||||
| Đăng nhập bằng Google (OAuth 2.0) auth-login-google | AUTH | shipped | P0 | febemobile | OAuth Google flow — tự tạo hoặc link user theo email_verified. 2 mode response: JSON hoặc redirect callback URL. | ||
| Đăng nhập bằng số điện thoại auth-login-phone | AUTH | shipped | P0 | febemobile | Phone + password login. Trả JWT access (15 phút) + refresh token (7 ngày). Credentials sai → 401 code 4011. | ||
| Đăng ký tài khoản với số điện thoại (OTP) auth-register-otp | AUTH | shipped | P0 | febemobile | 3 bước: request OTP → verify OTP → create password. Đã release production. | ||
| Phone Registries - quản lý định danh số điện thoại phone-registries | AUTH | draft | P1 | be | Nguồn trung tâm để chuẩn hóa, định danh và liên kết số điện thoại trong hệ thống. | ||
| Nâng cấp user lên broker user-upgrade-to-broker | AUTH | draft | P1 | febe | User nâng cấp lên broker với tỉnh và phường bắt buộc. Không thu thập giá. | ||
| Đăng xuất (revoke refresh token) auth-logout | AUTH | shipped | P1 | febemobile | Idempotent revoke refresh token. Multi-device safe (chỉ revoke token cụ thể, không revoke all devices). | ||
| User 5 feature | |||||||
| Cập nhật avatar hồ sơ trên web user-avatar-update-web | USER | in-development | P1 | febe | Flow đổi avatar: upload ảnh qua R2 rồi lưu avatarUrl bằng PATCH /users/me/avatar. BE validate domain; FE chưa có flow upload/update. | ||
| Cập nhật hồ sơ cá nhân trên web user-profile-update-web | USER | in-development | P1 | febe | Flow sửa fullName, bio, phone, province, ward. BE đã có PUT /users/me; FE cần thêm form/thunk update profile. | ||
| Xem hồ sơ cá nhân trên web user-profile-view-web | USER | in-development | P1 | febe | Hydrate và xem profile cá nhân trên web. BE đã có /users/me; FE đã fetch vào Redux và menu, trang /customer/profile còn placeholder. | ||
| Vô hiệu hoá tài khoản cá nhân trên web user-account-deactivate-web | USER | in-development | P2 | febe | Flow user tự vô hiệu hoá tài khoản. BE đã có DELETE /users/me soft deactivate; FE cần màn xác nhận và hậu xử lý session. | ||
| Xem public profile và tin công khai của user user-public-profile-listings-web | USER | in-development | P2 | febe | Public profile và listings active của user. BE đã có /users/{id} và /users/{id}/listings; FE cần page/card khai thác contract này. | ||
| Admin 13 feature | |||||||
| Admin xoá mềm property bất kỳ admin-property-delete | ADMIN | in-development | P1 | febe | Admin DELETE /admin/properties/{id} — soft-delete bỏ qua owner check, trả 204. BE đã xong; FE cần confirmation dialog và nút xoá. | ||
| Admin xem chi tiết property bất kỳ admin-property-detail | ADMIN | in-development | P1 | febe | Admin xem chi tiết property bất kỳ (mọi status + soft-deleted). BE đã có GET /admin/properties/{id}; FE cần detail page hoặc drawer. | ||
| Admin sửa property bất kỳ admin-property-edit | ADMIN | in-development | P1 | febe | Admin PUT /admin/properties/{id} — ghi đè mọi field, bỏ qua owner check. BE đã xong; FE cần form edit. | ||
| Admin xem và tìm kiếm danh sách property admin-property-list-search | ADMIN | in-development | P1 | febe | Admin search/list property ở mọi status (ACTIVE/INACTIVE + soft-deleted). BE đã có GET /admin/properties; FE /admin/properties cần build. | ||
| Admin xem chi tiết thông tin user admin-user-detail | ADMIN | in-development | P1 | febe | Admin xem full user detail gồm private fields, role, auth provider, referral, anti-fraud và quota. BE đã có GET /admin/users/{id}; FE chưa có detail UI. | ||
| Admin xem và tìm kiếm danh sách user admin-user-list-search | ADMIN | in-development | P1 | febe | Admin search/list user theo keyword, status, role, province/ward và ngày tạo. BE đã có GET /admin/users; FE /admin/users còn placeholder. | ||
| Admin ban và unban user admin-user-ban-unban | ADMIN | in-development | P1 | febe | Admin đặt user non-admin sang BANNED, xoá refresh token và khôi phục BANNED về ACTIVE. BE đã có endpoints; FE chưa có action UI. | ||
| Admin tạo gói package admin-package-create | ADMIN | shipped | P1 | febe | Admin tạo gói thuê bao mới (POST /admin/subscriptions/packages, role admin). Validate input, unique code 409, sinh default plans/affiliateRate/status khi thiếu. | ||
| Admin xem danh sách gói package admin-package-list | ADMIN | shipped | P1 | febe | Admin tra cứu danh sách gói (GET /admin/subscriptions/packages, role admin). Filter status ACTIVE/INACTIVE, phân trang, thấy cả gói INACTIVE khác endpoint public. | ||
| Admin xem thống kê gói package admin-package-statistics | ADMIN | shipped | P1 | febe | Admin xem thống kê tổng hợp gói (GET /admin/subscriptions/packages/statistics, role admin). Scalar totalPackages/activePackages/totalActiveSubscribers + items per-package, một query grouped tránh N+1. | ||
| Admin xem subscriber của gói package admin-package-subscribers | ADMIN | shipped | P1 | febe | Admin drill-down subscriber của 1 gói (GET /admin/subscriptions/packages/{id}/subscribers, role admin). Filter status ACTIVE/EXPIRED, phân trang, 404 nếu gói không tồn tại. | ||
| Admin cập nhật gói package admin-package-update | ADMIN | shipped | P1 | febe | Admin cập nhật partial gói (PATCH /admin/subscriptions/packages/{id}, role admin). 404 nếu không tồn tại, bắt buộc ít nhất 1 field, chỉ ghi đè field được gửi. | ||
| Admin quản lý role của user admin-user-role-management | ADMIN | in-development | P2 | febe | Admin xem/gán/gỡ/replace roles của user, có audit và last-admin guard. BE đã có /admin/iam/users/{userId}/roles; FE chưa có UI. | ||
| Listing 6 feature | |||||||
| Listings - tạo tin đăng listing-create | LISTING | shipped | P0 | febe | Tạo listing qua POST /listings, gắn property active, mặc định DRAFT hoặc publish ACTIVE để tính trust score. | ||
| Listings - xoá hoặc ẩn tin đăng listing-delete | LISTING | shipped | P0 | febe | Owner soft-delete listing sang DELETED; admin force-delete/ban listing sang BANNED để ẩn khỏi public. | ||
| Listings - xem danh sách và chi tiết tin đăng listing-list | LISTING | shipped | P0 | febe | Public search/detail ACTIVE listings, owner views own listings/drafts, áp dụng visibility và masking theo viewer. | ||
| Listings - cập nhật tin đăng listing-update | LISTING | shipped | P0 | febe | Owner replace toàn bộ mutable fields qua PUT /listings/{id}; BANNED bị khóa, ACTIVE recalc trust score. | ||
| Phân bổ listings cho broker theo gói broker-daily-listing-distribution | LISTING | draft | P1 | febe | list_broker = broker đúng band gói + phường + còn limit. Bands: Premium 50-59, Pro 60-69, MAX 70-79, >=80 Admin. Chọn tối đa 3 theo fill_ratio. | ||
| Favorite listing - lưu và theo dõi tin yêu thích listing-favorite | LISTING | draft | P2 | febe | Cho phép user lưu/bỏ lưu listing, xem danh sách đã thích, biết tin nào đã thích khi duyệt và số lượt thích; chủ tin nhận thông báo gộp khi tin được yêu thích. | ||
| Payment 6 feature | |||||||
| Nhận IPN/webhook SePay và đẩy realtime trạng thái thanh toán payment-sepay-ipn-webhook-realtime | PAYMENT | in-development | P0 | febe | Tách riêng public callbacks SePay: IPN checkout và bank-transfer webhook. Khi order SUCCESS, backend push realtime tới /user/queue/payment-orders. | ||
| Lấy chi tiết đơn hàng thanh toán payment-order-detail-sync | PAYMENT | shipped | P0 | febe | GET /payments/orders/{providerOrderId}/detail sync trạng thái SePay, confirm order khi CAPTURED và đẩy realtime status qua /user/queue/payment-orders. | ||
| Huỷ đơn hàng nạp ví theo providerOrderId wallet-topup-cancel | PAYMENT | shipped | P0 | be | POST /wallet/topups/{providerOrderId}/cancel huỷ order top-up còn pending theo owner hiện tại. | ||
| Tạo đơn hàng nạp tiền ví V-credit (HTML) wallet-topup-create | PAYMENT | shipped | P0 | be | POST /wallet/topups tạo hoặc resume checkout SePay cho top-up V-Credits. | ||
| Tạo đơn hàng nạp tiền ví V-credit (Webhook VietQR) wallet-topup-sepay-qr-webhook | PAYMENT | shipped | P0 | febe | Tạo QR nạp ví, xử lý webhook SePay bằng payload.code, cộng V-Credits idempotent và đẩy realtime status qua /user/queue/payment-orders. | ||
| Chương trình giới thiệu (Affiliate) affiliate | PAYMENT | shipped | P1 | febe | Referrer chia sẻ mã; referee mua gói trả phí thì referrer nhận hoa hồng 10% quy đổi credits vào ví. Tự động, idempotent, có chống gian lận. Đã release. | ||
| Crawler 1 feature | |||||||
| Crawl listings từ nguồn ngoài (Muaban, Nhà Tốt, Batdongsan) listing-crawl-external-sources | CRAWLER | draft | P1 | febe | Crawl → property/listing/contact/nguồn, dùng POST /properties + /listings (no ingest). Dedup source+source_id. Contact FK contact_id 1-N; SĐT ở phone_registries (FK phone_registry_id), không resolve user/owner. Bỏ data_sources. | ||
Không có feature nào khớp filter.