WP-RIDE-API-AUDIT-01 — Audit đặt xe (D-RIDES)
Domain: D-RIDES · Surfaces: CON · API · DRV · Date: 2026-08-14 · Status: AUDIT
Verdict
| Layer |
Kết luận |
| API core (local) |
Đủ & hoạt động cho quote → create (CASH) → get → tracking → list → cancel |
| E2E đặt xe có tài xế |
Chưa đủ thực tế nếu không có driver online/GPS → chuyến kẹt REQUESTED |
| Thanh toán |
CASH OK · WALLET đúng khi đủ số dư (thiếu → 400) · MoMo/VNPay có BE, FE chưa chọn được |
| VPS |
Health OK · OTP SMS (esms) 503 → không smoke rides trên prod trong audit này |
Luồng CON (mobile)
RideHome → RideQuote (POST /rides/quotes)
→ book (POST /rides)
→ RideMatching (poll GET /rides/:id)
→ RideDetail (get + tracking + WS /rides)
→ cancel / rate
| FE screen |
API |
Smoke local |
| Quote |
POST /rides/quotes |
PASS fare=35450 · 3 options · dist≈4690m |
| Book |
POST /rides |
PASS status=REQUESTED · CASH UNPAID · no driver |
| Detail |
GET /rides/:id |
PASS |
| Tracking |
GET /rides/:id/tracking |
PASS · realtime=socket.io /rides · driverLoc=null |
| History |
GET /rides |
PASS count≥1 |
| Cancel |
POST /rides/:id/cancel |
PASS → CANCELLED |
| Rate |
POST /rides/:id/rate |
PASS guard — reject khi chưa COMPLETED/CONFIRMED |
| Wallet book |
POST /rides WALLET |
PASS guard — Số dư ví không đủ |
| Bad promo |
promoCode=NOTEXIST999 |
PASS guard — mã không hợp lệ |
Unit: rides.service.spec.ts — 3/3 PASS.
API surface (Swagger tag rides)
| Method |
Path |
Auth |
Ghi chú |
| POST |
/rides/quotes |
JWT |
Haversine + TTL quote |
| POST |
/rides |
JWT |
vehicle · pay · promo · gateway · tryAutoAssign |
| GET |
/rides |
JWT |
lịch sử |
| GET |
/rides/:id |
JWT |
chi tiết + driver embed |
| POST |
/rides/:id/cancel |
JWT |
+ refund ví/gateway |
| POST |
/rides/:id/rate |
JWT |
COMPLETED/CONFIRMED |
| GET |
/rides/:id/tracking |
JWT |
meta + last driver loc (WS) |
| GET/POST |
/rides/admin/trips* |
ADMIN |
ops |
DRV (liên quan): GET /driver/trips/available|active|history · accept|pickup|complete|reject|cancel.
Đủ / chưa đủ
Đã đủ (MVP kỹ thuật)
- Báo giá 3 loại xe (BIKE/CAR/CAR_PLUS) từ BE
options
- Tạo chuyến + idempotent theo quote
- Hủy + refund path (WALLET/gateway) khi đã prepaid
- Settle khi complete (BE · gọi từ driver complete)
- Promo resolve + mark used
- Gateway
RIDE_PAY + IPN → PREPAID → match
- Auto-match nếu có driver APPROVED + online + lastLat/lng ≤8km
- CON WS join
/rides trên RideDetail
Gap / rủi ro sản phẩm
| # |
Gap |
Impact |
| 1 |
Không có driver online → mãi REQUESTED · Matching poll vô hạn UX |
User thấy “đang tìm” mãi |
| 2 |
FE chỉ CASH / WALLET — không UI MoMo/VNPay · payUrl chỉ Alert |
Gateway IMP BE nhưng CON không dùng đủ |
| 3 |
Fare = Haversine, không OSRM/Mapbox road distance |
Giá lệch thực tế đường đi |
| 4 |
Matching không subscribe WS status — chỉ poll 2.5s |
Chậm hơn realtime một nhịp |
| 5 |
Rate cho phép CONFIRMED (không chỉ COMPLETED) |
Có thể rate sớm nếu match auto CONFIRMED |
| 6 |
VPS OTP SMS fail → không verify rides prod trong audit |
Ops/SMS |
Khuyến nghị (ưu tiên)
- WP-RIDE-MATCH-UX-01 — timeout matching · CTA hủy rõ · empty “không có tài xế gần bạn”
- WP-FE-RIDE-PAY-GATEWAY-02 — chọn MoMo/VNPay +
Linking.openURL(payUrl)
- Seed / ops: ≥1 driver online +
lastLat/lng Q1 để demo match
- Optional: quote distance từ
/routing/directions thay Haversine
Files tham chiếu
api/src/modules/rides/rides.controller.ts · rides.service.ts
mobile/src/services/api.ts (RidesApi) · features/rides/screens/*
driver/src/services/api.ts (DriverApi trips)
- Prior:
docs/reports/WP-RIDE-PAY-SETTLE-PROMO-MATCH-2026-08-13.md