customers.view 可讀列表與詳情,但不可更新。customers.edit 可更新基本資料、停權與恢復會員。yuruicamp.firebase.enabled=false,開啟 http://localhost:8080/swagger-ui.html。dev:booking-seed-admin:booking-seed@example.test:google:Booking Seed Admin
Authorize 設定 Token。GET /api/admin/customers?page=0&size=20&sort=registeredAt,desc
預期 HTTP 200,Envelope 包含 data 與分頁 meta。沒有完成付款訂單的會員應回 totalSpent="0.00"、tier="explorer"。
再分別驗證 q、status、tier、tagId 與 sort=totalSpent,desc;同一會員即使有多個標籤,也只能出現一次。
GET /api/admin/customers/{customerId}
預期回傳 Email、電話、生日、唯讀標籤/偏好/預設地址與 summary,但只回 firebaseUidBound,不回完整 Firebase UID。
PATCH /api/admin/customers/{customerId}
Content-Type: application/json
{
"name": "G2A 驗證會員",
"phone": "0912345678",
"birthday": "1995-05-20",
"points": 200
}
預期 HTTP 200。傳入負點數或未來生日應回 400;Email、狀態、Firebase UID、等級與消費總額不在此契約內。
POST /api/admin/customers/{customerId}/suspend
POST /api/admin/customers/{customerId}/reactivate
預期第一次依序回 suspended、active;對相同狀態重送會回放目前資料。deleted 會員呼叫任一端點回 409。
停權後,以該會員原本的 Token 呼叫:
GET /api/me
預期立即拒絕;恢復後可再次通過會員身分驗證。
SELECT id, name, email, status, points, deleted_at, updated_at
FROM customers
WHERE id = '<customerId>';
SELECT customer_id, total_spent, tier_code, tier_name
FROM customer_tier_summary
WHERE customer_id = '<customerId>';
確認停權不刪除會員關聯資料,且等級與消費總額和 View 一致。