Prefill tin đăng V-Nexus sang sàn (MuaBan/Nhà Tốt)
Feature URL
Module
browser-extension
Status
in-development
Priority
P2
Platforms
fe · be
AC progress
0 / 16
Last reviewed
2026-06-29
Mục tiêu
Giúp người dùng đăng lại một listing có sẵn trên V-Nexus sang các sàn rao vặt MuaBan và Nhà Tốt (Chotot) mà không phải nhập lại thủ công. Người dùng mở extension ngay trên trang quản lý tin của mình, chọn sàn đích, extension tự lấy dữ liệu listing và tự động điền toàn bộ form đăng tin trên sàn. Người dùng chỉ còn việc rà soát, tự upload ảnh và tự bấm đăng.
Phạm vi
Trong phạm vi (In scope):
- Chrome Extension Manifest V3 (React + Vite) tên “V-Nexus Listing Poster”, bản Staging, dùng cho mục đích cá nhân.
- Popup chỉ kích hoạt khi tab đang ở trang Tin của tôi trên FE V-Nexus (
/user/my-listings); ở trang khác icon bị làm mờ và popup không mở (xem extension-settings). - Popup tự nhận
listingIdtừ URL tab đang mở; hoặc cho user nhập taylistingId. - Popup hiện 2 nút chọn sàn đích: MuaBan và NhaTot.
- Khi bấm 1 nút → gửi message
PREFILL_PLATFORM { platform, listingId, sourceTabId }tới background service worker. - Background worker: tự đọc access token từ tab V-Nexus đang đăng nhập (quyền
scripting) → gọi backendGET /listings/{id}bằng token đó để các field nhạy cảm (phone,address) trả về không bị mask. - Worker dựng payload prefill (
buildPrefillFields(platform, listing)) → lưu vàochrome.storage.session→ mở tab trang đăng tin của sàn tương ứng (muaban.net/dang-tin,chotot.com/dang-tin). - Content script chạy trên host sàn được cho phép (
muaban.net,chotot.com,nhatot.com): đọc payload và tự động điền form — gồm điền text/number/textarea theo nhãn, đi qua các bước chọn loại BĐS, mở dropdown chọn hướng/giấy tờ, click chip nội thất, chỉnh số phòng bằng nút +/−. - Liệt kê danh sách ảnh để user tự upload tay; phản hồi về popup số field đã map và số ảnh.
Ngoài phạm vi (Out of scope):
- Trang Options để user tự cấu hình backend/origin/token — đã bỏ; origin cố định và token tự đọc (xem extension-settings).
- Tự động submit/đăng tin (user phải tự bấm đăng).
- Tự động upload ảnh (JS không set được file input → chỉ liệt kê ảnh để user upload tay).
- Sinh nội dung bằng Gemini/AI và tích hợp Facebook (các hướng cũ đã bỏ).
- Chi tiết bảng map field V-Nexus → sàn — xem extension-field-mapping.
- Cấu hình origin cố định, cơ chế đọc token và phạm vi kích hoạt popup — xem extension-settings.
User Stories
- Là user, tôi muốn mở extension ngay trên trang “Tin của tôi” và chọn sàn để form đăng tin của sàn được điền sẵn tự động, đỡ phải copy-paste từng field.
- Là user, tôi muốn nhập tay
listingIdkhi popup không tự nhận được để vẫn prefill được. - Là user, tôi muốn extension tự điền cả các field dạng chọn (loại BĐS, hướng, nội thất, số phòng) để gần như không phải sửa tay.
- Là user, tôi muốn tự upload ảnh và tự bấm đăng để kiểm soát hoàn toàn tin đăng cuối cùng.
- Là user là chủ listing, tôi muốn extension lấy được số điện thoại và địa chỉ không bị mask để form điền đầy đủ.
Luồng chức năng
sequenceDiagram
actor User
participant Popup as Popup
participant SW as Background Worker
participant BE as V-Nexus BE
participant CS as Content Script sàn
User->>Popup: Mở extension trên trang Tin của tôi
Popup->>Popup: Tự nhận listingId từ URL tab hoặc user nhập tay
User->>Popup: Bấm MuaBan hoặc NhaTot
Popup->>SW: PREFILL_PLATFORM với platform và listingId
SW->>SW: Tự đọc access token từ tab V-Nexus đang đăng nhập
SW->>BE: Gọi API chi tiết listing bằng token (chủ tin)
alt Thiếu listingId
SW-->>Popup: Báo lỗi thiếu listingId
else Lỗi hoặc không tìm thấy
BE-->>SW: Trả lỗi hoặc 404
SW-->>Popup: Báo lỗi không lấy được listing
else Thành công
BE-->>SW: ListingResponse
SW->>SW: buildPrefillFields theo platform
SW->>SW: Lưu payload vào chrome.storage session
SW->>CS: Mở tab trang đăng tin của sàn
CS->>CS: Đọc payload rồi tự động điền form (text, loại BĐS, hướng, nội thất, số phòng)
CS-->>Popup: Số field đã map và số ảnh, user tự upload ảnh và bấm đăng
endAcceptance Criteria
- AC-1: Popup chỉ kích hoạt được khi tab đang ở trang
/user/my-listingscủa FE V-Nexus; ở trang khác icon bị disable và popup không mở. - AC-2: Khi mở popup,
listingIdđược tự nhận từ URL của tab đang mở. - AC-3: User có thể nhập tay
listingIdkhi popup không tự nhận được. - AC-4: Khi thiếu
listingId(không nhận tự động và không nhập tay), popup báo lỗi và không gửiPREFILL_PLATFORM. - AC-5: Popup hiện đúng 2 nút sàn đích: MuaBan và NhaTot.
- AC-6: Bấm 1 nút sàn gửi message
PREFILL_PLATFORM { platform, listingId, sourceTabId }tới background worker. - AC-7: Worker tự đọc access token từ tab V-Nexus đang đăng nhập; không yêu cầu user dán token thủ công.
- AC-8: Worker gọi
GET /listings/{id}; khi BE trả 404 hoặc lỗi thì báo lỗi về popup, không mở tab sàn. - AC-9: Gọi backend bằng token của chủ tin để
phonevàaddresskhông bị mask trong dữ liệu nhận về. - AC-10: Khi lấy listing thành công, payload prefill được lưu vào
chrome.storage.session. - AC-11: Worker mở đúng posting URL theo platform (
muaban.net/dang-tincho MuaBan,chotot.com/dang-tincho NhaTot). - AC-12: Content script chỉ chạy trên các host sàn được cho phép (
muaban.net,chotot.com,nhatot.com). - AC-13: Content script tự động điền form: điền các ô text/number/textarea theo nhãn, đi qua bước chọn loại BĐS, chọn hướng/giấy tờ qua dropdown, chọn nội thất qua chip, chỉnh số phòng bằng nút +/−.
- AC-14: Khi sàn hiện hộp thoại khôi phục nháp (draft), extension tự bỏ qua để bắt đầu tin mới.
- AC-15: Ảnh được liệt kê để user upload tay; extension không tự upload ảnh và không tự bấm đăng.
- AC-16: Popup nhận phản hồi gồm số field đã map và số ảnh.
Quy tắc nghiệp vụ
- Extension là bản Staging dùng cho mục đích cá nhân; backend/FE origin cố định, không có trang cấu hình (xem extension-settings).
- Popup chỉ kích hoạt trên trang quản lý tin của user (
/user/my-listings); mọi trang khác đều bị chặn để tránh dùng nhầm ngữ cảnh. - Token gọi backend được tự đọc từ tab V-Nexus đang đăng nhập; vì là chủ tin nên dữ liệu nhạy cảm (
phone,address) không bị mask. Không có cơ chế dán token thủ công trong luồng. - Autofill là tự động và best-effort: field nào không khớp nhãn/không có trên form thì bỏ qua, không chặn luồng; user vẫn rà soát lại trước khi đăng.
- Extension chỉ điền sẵn, không bao giờ tự động submit/đăng tin — quyền đăng cuối cùng thuộc về user.
- Ảnh không thể set tự động vào file input bằng JS → luôn yêu cầu user upload tay; payload chỉ liệt kê danh sách ảnh.
- Payload prefill lưu ở
chrome.storage.session(vòng đời theo phiên); content script bỏ qua payload quá cũ (> 30 phút). - Content script chỉ kích hoạt trên đúng host sàn cho phép; không chạy trên trang khác.
Dữ liệu & Trạng thái
Entity nghiệp vụ:
PrefillRequest: messagePREFILL_PLATFORM—platform(muaban|chotot),listingId,sourceTabId.ListingResponse: dữ liệu listing lấy từGET /listings/{id}(gồmphone,addresskhi gọi bằng token chủ tin).PrefillPayload: dữ liệu đã build cho sàn, lưu ởchrome.storage.session— danh sách field theo nhãn + danh sách ảnh + thời điểm tạo.PrefillResult: phản hồi về popup — số field đã map, số ảnh, posting URL.
Trạng thái user-facing:
idle— popup chờ, đã/đang nhậnlistingId.busy— đang đọc token và gọi backend / map dữ liệu.ok— đã mở tab sàn và autofill xong, báo số field + số ảnh.error— thiếulistingId, backend 404/lỗi, hoặc không lấy được listing.
Liên quan
- Phụ thuộc: listing-list, extension-field-mapping, extension-settings
- Ảnh hưởng: extension-field-mapping, extension-settings