NON-PRODUCTION

Achievement CMS

REST JSON trên admin-api-gateway. Mọi đọc/ghi cấu hình đi thẳng Mongo, không qua cache loader của engine.

1. Tổng quan

MụcGiá trị
Gatewayadmin-api-gateway · /api/v1/achievement/*
AuthCMS JWT, Authorization: Bearer <token>
SuccessHTTP 200 {"code":0,"msg":...}
Bind lỗiHTTP 400
Domain / internalHTTP 500
type là metric id. category + target + filter là cấu hình. Engine dùng chung một cách đo cho mọi achievement cùng type. Không cần handler Go mới khi thêm achievement.

2. Auth & role

RoleIDDùng cho
AchievementView90003GET constants, metrics, list, detail, user progress
AchievementEdit90004create / update / delete. Cũng được gọi GET constants

3. 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,
  "filter": {
    "game_ids": ["zeus"],
    "countries": ["KH"],
    "mission_periods": []
  },
  "created_at": 1756227600,
  "updated_at": 1756227600
}

type không đổi sau khi tạo. Filter rỗng nghĩa là tất cả. leaderboard_rank chưa hỗ trợ, create/update sẽ bị từ chối.

4. Metrics

typeĐoCategory
game_play_countSố vánslot, pvp, betting, minigame, fishing
game_played_amountTổng thắng + trị tuyệt đối tiền thuagame
game_win_amount / game_win_countTiền thắng / số ván thắnggame
win_multiplierMax tiền thắng / betgame
cashout_multiplierCùng tỉ lệ, chỉ game_id = crashminigame
win_streakChuỗi thắnggame
game_collectionSố game khác nhaugame
boss_kill_countSố boss bị hạfishing
jackpot_countSố lần nổ jackpotgame
deposit_amount / deposit_countNạp tiềntopup
referral_countMời bạninvite
mission_completed_countNhiệm vụ hoàn thànhmission
login_streakChuỗi ngày đăng nhập UTC+7login

5. Constants cho Create / Edit

GET /api/v1/achievement/constants

Gọi một lần khi mở form. Không hardcode danh sách type, category, filter. Role AchievementView hoặc AchievementEdit.

{
  "metrics": [
    {
      "value": "game_play_count",
      "label": "Game play count",
      "aggregation": "add",
      "categories": ["slot", "pvp", "betting", "minigame", "fishing"],
      "filters": ["game_ids", "countries"],
      "supported": true
    }
  ],
  "categories": [
    { "value": "slot", "label": "Slot" }
  ],
  "filters": [
    { "value": "game_ids", "label": "Game IDs" },
    { "value": "countries", "label": "Countries" },
    { "value": "mission_periods", "label": "Mission periods" }
  ],
  "mission_periods": [
    { "value": "daily", "label": "Daily" },
    { "value": "weekly", "label": "Weekly" },
    { "value": "monthly", "label": "Monthly" },
    { "value": "event", "label": "Event" }
  ]
}
Dropdown type chỉ hiện metric supported: true. Sau khi chọn type, category chỉ được chọn trong metrics[].categories, và chỉ hiện filter nằm trong metrics[].filters. mission_periods chỉ dùng khi filter đó được phép. leaderboard_rank có supported: false — không cho tạo.
value là giá trị lưu xuống API create/update. label chỉ để hiển thị trên CMS.

6. List metrics

GET /api/v1/achievement/metrics

[
  {
    "type": "game_play_count",
    "aggregation": "add",
    "categories": ["slot", "pvp", "betting", "minigame", "fishing"],
    "filters": ["game_ids", "countries"],
    "supported": true
  }
]

7. List

GET /api/v1/achievement?name=&page=1&page_size=20

name tìm một phần, không phân biệt hoa thường. Bỏ trống thì lấy tất cả, kể cả achievement tắt.

Chỉ page = 1 có total_records và total_pages. Trang 1 chưa đầy thì không đếm DB. Trang sau luôn trả tổng bằng 0.
{
  "list": [],
  "page": 1,
  "page_size": 20,
  "total_pages": 1,
  "total_records": 3
}

8. Get

GET /api/v1/achievement/detail?id=12 — đọc thẳng DB.

9. Create

POST /api/v1/achievement/create. Body là object achievement, không gửi id. Response là bản đã có id.

10. Update

POST /api/v1/achievement/update. Bắt buộc id. Đổi target/filter/category không reset progress và không hoàn thành/thu hồi tại lúc lưu.

11. Delete

POST /api/v1/achievement/delete

{ "id": 12 }

Xóa định nghĩa. Không xóa progress của user.

12. User progress

GET /api/v1/achievement/user-achievements

QueryÝ nghĩa
page, page_sizeMặc định 1 và 20. Quy tắc tổng giống list.
user_idTuỳ chọn. Bỏ hoặc 0 thì không lọc user.
achievement_idTuỳ chọn.
completedfalse bỏ qua. true chỉ lấy progress đã hoàn thành.
{
  "list": [
    {
      "user_id": 7,
      "achievement_id": 12,
      "progress": 10,
      "completed_at": 1756228000,
      "selected": true,
      "updated_at": 1756228000,
      "last_event_at": 1756228000,
      "distinct_ids": []
    }
  ],
  "page": 1,
  "page_size": 20,
  "total_pages": 1,
  "total_records": 1
}