NON-PRODUCTION

Achievement — tài liệu ghép client

Thành tích của user trên lobby. Client gọi POST /api/v2/rpc trên game-api-gateway, body mã hóa AES giống mission.

1. Tổng quan

MụcGiá trị
Gatewaygame-api-gateway · POST /api/v2/rpc
AuthJWT game
Methods/achievement/list, /achievement/select
UserLấy từ JWT. Client không gửi user_id
List chỉ gồm achievement đang bật. Tên tab category đã dịch theo country của session. Không có bản dịch thì name chính là chuỗi category (slot, fishing, …).

2. Auth

POST /api/v2/rpc
Authorization: Bearer <access_token>

decrypt → { "method": "/achievement/list", "data": {} }

success → HTTP 200, encrypted { "code": 0, "msg": { ... } }
error   → HTTP 500, encrypted { "code": ..., "msg": ... }

3. Danh sách achievement

method: /achievement/list. data rỗng {}.

msg:
{
  "achievements": [
    {
      "achievement": {
        "id": 12,
        "name": "Play 10 slots",
        "translations": [{ "country": "KH", "description": "Chơi 10 ván slot" }],
        "url": "https://cdn.example.com/a.png",
        "type": "game_play_count",
        "category": "slot",
        "target": 10,
        "enable": true
      },
      "progress": 4,
      "completed": false,
      "selected": false
    }
  ],
  "categories": [
    { "category": "slot", "name": "ស្លត" },
    { "category": "pvp", "name": "PvP" }
  ]
}
FieldÝ nghĩa
achievement.categoryNhóm để chia tab. Khớp categories[].category.
translationsMô tả theo country CMS soạn. Client chọn bản đúng country, fallback phần tử đầu hoặc name.
progress / targetThanh tiến độ. Chưa chơi thì progress = 0.
completedĐã chạm target. Giữ nguyên sau khi hoàn thành.
selectedAchievement user đang trưng bày. Tối đa một cái.
categoriesDanh sách tab. name đã i18n, key dịch chính là chuỗi category.

4. Category

Thứ tự ổn định: slot, pvp, betting, minigame, fishing, topup, invite, mission, login.

Dùng categories để vẽ tab. Không hardcode tên hiển thị. Achievement không thuộc category nào vẫn nằm trong achievements và có thể hiện ở tab “tất cả”.

5. Chọn achievement trưng bày

method: /achievement/select

data:
{ "achievement_id": 12 }

msg: {}
Chỉ chọn achievement đang bật. Sau khi thành công, gọi lại list hoặc set selected local: cái vừa chọn = true, các cái khác = false.

6. Gợi ý UI