Bỏ qua nội dung

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 listingId từ URL tab đang mở; hoặc cho user nhập tay listingId.
  • Popup hiện 2 nút chọn sàn đích: MuaBanNhaTot.
  • 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 backend GET /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ào chrome.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

  • 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.
  • user, tôi muốn nhập tay listingId khi popup không tự nhận được để vẫn prefill được.
  • 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.
  • 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.
  • 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
    end

Acceptance Criteria

  • AC-1: Popup chỉ kích hoạt được khi tab đang ở trang /user/my-listings củ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 listingId khi 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ửi PREFILL_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 để phoneaddress khô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-tin cho MuaBan, chotot.com/dang-tin cho 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: message PREFILL_PLATFORMplatform (muaban|chotot), listingId, sourceTabId.
  • ListingResponse: dữ liệu listing lấy từ GET /listings/{id} (gồm phone, address khi 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ận listingId.
  • 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ếu listingId, backend 404/lỗi, hoặc không lấy được listing.

Liên quan