diff --git a/contracts/admin-openapi.json b/contracts/admin-openapi.json index 90c4047..a0072da 100644 --- a/contracts/admin-openapi.json +++ b/contracts/admin-openapi.json @@ -1,4202 +1,3922 @@ { - "openapi": "3.1.0", - "info": { - "title": "HYApp Admin API", - "version": "0.1.0" - }, - "servers": [ - { - "url": "/api/v1" - } - ], - "paths": { - "/admin/activity/achievements": { - "get": { - "operationId": "listAchievementDefinitions", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "achievement:view", - "x-permissions": [ - "achievement:view" - ] - }, - "post": { - "operationId": "createAchievementDefinition", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "achievement:create", - "x-permissions": [ - "achievement:create" - ] - } + "openapi": "3.1.0", + "info": { + "title": "HYApp Admin API", + "version": "0.1.0" }, - "/admin/activity/achievements/{achievement_id}": { - "put": { - "operationId": "updateAchievementDefinition", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "achievement_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "achievement:update", - "x-permissions": [ - "achievement:update" - ] - } - }, - "/admin/activity/daily-tasks": { - "get": { - "operationId": "listTaskDefinitions", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "daily-task:view", - "x-permissions": [ - "daily-task:view" - ] - }, - "post": { - "operationId": "createTaskDefinition", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "daily-task:create", - "x-permissions": [ - "daily-task:create" - ] - } - }, - "/admin/activity/daily-tasks/{task_id}": { - "put": { - "operationId": "updateTaskDefinition", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "task_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "daily-task:update", - "x-permissions": [ - "daily-task:update" - ] - } - }, - "/admin/activity/daily-tasks/{task_id}/status": { - "post": { - "operationId": "setTaskDefinitionStatus", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "task_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "daily-task:status", - "x-permissions": [ - "daily-task:status" - ] - } - }, - "/admin/activity/user-leaderboards": { - "get": { - "operationId": "listUserLeaderboards", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "user-leaderboard:view", - "x-permissions": [ - "user-leaderboard:view" - ] - } - }, - "/admin/activity/red-packets": { - "get": { - "operationId": "listRedPackets", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "red-packet:view", - "x-permissions": [ - "red-packet:view" - ] - } - }, - "/admin/activity/red-packets/{packet_id}": { - "get": { - "operationId": "getRedPacket", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "packet_id", - "required": true, - "schema": { - "type": "string" - } - } - ], - "x-permission": "red-packet:view", - "x-permissions": [ - "red-packet:view" - ] - } - }, - "/admin/activity/red-packets/config": { - "get": { - "operationId": "getRedPacketConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "red-packet:view", - "x-permissions": [ - "red-packet:view" - ] - }, - "put": { - "operationId": "updateRedPacketConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "red-packet:update", - "x-permissions": [ - "red-packet:update" - ] - } - }, - "/admin/activity/lucky-gifts/config": { - "get": { - "operationId": "getLuckyGiftConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "lucky-gift:view", - "x-permissions": [ - "lucky-gift:view" - ] - }, - "put": { - "operationId": "upsertLuckyGiftConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "lucky-gift:update", - "x-permissions": [ - "lucky-gift:update" - ] - } - }, - "/admin/activity/lucky-gifts/configs": { - "get": { - "operationId": "listLuckyGiftConfigs", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "lucky-gift:view", - "x-permissions": [ - "lucky-gift:view" - ] - } - }, - "/admin/activity/lucky-gifts/draws": { - "get": { - "operationId": "listLuckyGiftDraws", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "lucky-gift:view", - "x-permissions": [ - "lucky-gift:view" - ] - } - }, - "/admin/activity/first-recharge-reward/claims": { - "get": { - "operationId": "listFirstRechargeRewardClaims", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "first-recharge-reward:view", - "x-permissions": [ - "first-recharge-reward:view" - ] - } - }, - "/admin/activity/registration-reward/claims": { - "get": { - "operationId": "listRegistrationRewardClaims", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "registration-reward:view", - "x-permissions": [ - "registration-reward:view" - ] - } - }, - "/admin/activity/first-recharge-reward/config": { - "get": { - "operationId": "getFirstRechargeRewardConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "first-recharge-reward:view", - "x-permissions": [ - "first-recharge-reward:view" - ] - }, - "put": { - "operationId": "updateFirstRechargeRewardConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "first-recharge-reward:update", - "x-permissions": [ - "first-recharge-reward:update" - ] - } - }, - "/admin/activity/registration-reward/config": { - "get": { - "operationId": "getRegistrationRewardConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "registration-reward:view", - "x-permissions": [ - "registration-reward:view" - ] - }, - "put": { - "operationId": "updateRegistrationRewardConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "registration-reward:update", - "x-permissions": [ - "registration-reward:update" - ] - } - }, - "/admin/activity/room-treasure/config": { - "get": { - "operationId": "getRoomTreasureConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "room-treasure:view", - "x-permissions": [ - "room-treasure:view" - ] - }, - "put": { - "operationId": "updateRoomTreasureConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "room-treasure:update", - "x-permissions": [ - "room-treasure:update" - ] - } - }, - "/admin/activity/seven-day-checkin/claims": { - "get": { - "operationId": "listSevenDayCheckInClaims", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "seven-day-checkin:view", - "x-permissions": [ - "seven-day-checkin:view" - ] - } - }, - "/admin/activity/seven-day-checkin/config": { - "get": { - "operationId": "getSevenDayCheckInConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "seven-day-checkin:view", - "x-permissions": [ - "seven-day-checkin:view" - ] - }, - "put": { - "operationId": "updateSevenDayCheckInConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "seven-day-checkin:update", - "x-permissions": [ - "seven-day-checkin:update" - ] - } - }, - "/admin/agencies": { - "get": { - "operationId": "listAgencies", - "parameters": [ - { - "$ref": "#/components/parameters/Page" - }, - { - "$ref": "#/components/parameters/PageSize" - }, - { - "$ref": "#/components/parameters/Keyword" - }, - { - "$ref": "#/components/parameters/Status" - }, - { - "$ref": "#/components/parameters/RegionId" - }, - { - "$ref": "#/components/parameters/ParentBdUserId" - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/AgencyPageResponse" - } - }, - "x-permission": "agency:view", - "x-permissions": [ - "agency:view" - ] - }, - "post": { - "operationId": "createAgency", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "agency:create", - "x-permissions": [ - "agency:create" - ] - } - }, - "/admin/agencies/{agency_id}/close": { - "post": { - "operationId": "closeAgency", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "agency_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "agency:status", - "x-permissions": [ - "agency:status" - ] - } - }, - "/admin/agencies/{agency_id}/join-enabled": { - "post": { - "operationId": "setAgencyJoinEnabled", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "agency_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "agency:status", - "x-permissions": [ - "agency:status" - ] - } - }, - "/admin/app-config/banners": { - "get": { - "operationId": "listBanners", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "app-config:view", - "x-permissions": [ - "app-config:view" - ] - }, - "post": { - "operationId": "createBanner", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "app-config:update", - "x-permissions": [ - "app-config:update" - ] - } - }, - "/admin/app-config/banners/{banner_id}": { - "put": { - "operationId": "updateBanner", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "banner_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "app-config:update", - "x-permissions": [ - "app-config:update" - ] - }, - "delete": { - "operationId": "deleteBanner", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "banner_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "app-config:update", - "x-permissions": [ - "app-config:update" - ] - } - }, - "/admin/app-config/h5-links": { - "get": { - "operationId": "listH5Links", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "app-config:view", - "x-permissions": [ - "app-config:view" - ] - }, - "put": { - "operationId": "updateH5Links", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "app-config:update", - "x-permissions": [ - "app-config:update" - ] - } - }, - "/admin/app-config/versions": { - "get": { - "operationId": "listAppVersions", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "app-version:view", - "x-permissions": [ - "app-version:view" - ] - }, - "post": { - "operationId": "createAppVersion", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "app-version:create", - "x-permissions": [ - "app-version:create" - ] - } - }, - "/admin/app-config/versions/{version_id}": { - "put": { - "operationId": "updateAppVersion", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "version_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "app-version:update", - "x-permissions": [ - "app-version:update" - ] - }, - "delete": { - "operationId": "deleteAppVersion", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "version_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "app-version:delete", - "x-permissions": [ - "app-version:delete" - ] - } - }, - "/admin/apps": { - "get": { - "operationId": "listApps", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } + "servers": [ + { + "url": "/api/v1" } - } - }, - "/admin/bd-leaders": { - "get": { - "operationId": "listBDLeaders", - "parameters": [ - { - "$ref": "#/components/parameters/Page" - }, - { - "$ref": "#/components/parameters/PageSize" - }, - { - "$ref": "#/components/parameters/Keyword" - }, - { - "$ref": "#/components/parameters/Status" - }, - { - "$ref": "#/components/parameters/RegionId" - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/BDProfilePageResponse" - } - }, - "x-permission": "bd:view", - "x-permissions": [ - "bd:view" - ] - }, - "post": { - "operationId": "createBDLeader", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "bd:create", - "x-permissions": [ - "bd:create" - ] - } - }, - "/admin/bd-leaders/{user_id}": { - "delete": { - "operationId": "deleteBDLeader", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "user_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "bd:update", - "x-permissions": [ - "bd:update" - ] - } - }, - "/admin/bd-leaders/{user_id}/status": { - "patch": { - "operationId": "setBDLeaderStatus", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "user_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "bd:update", - "x-permissions": [ - "bd:update" - ] - } - }, - "/admin/bds": { - "get": { - "operationId": "listBDs", - "parameters": [ - { - "$ref": "#/components/parameters/Page" - }, - { - "$ref": "#/components/parameters/PageSize" - }, - { - "$ref": "#/components/parameters/Keyword" - }, - { - "$ref": "#/components/parameters/Status" - }, - { - "$ref": "#/components/parameters/RegionId" - }, - { - "$ref": "#/components/parameters/ParentLeaderUserId" - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/BDProfilePageResponse" - } - }, - "x-permission": "bd:view", - "x-permissions": [ - "bd:view" - ] - }, - "post": { - "operationId": "createBD", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "bd:create", - "x-permissions": [ - "bd:create" - ] - } - }, - "/admin/bds/{user_id}/status": { - "patch": { - "operationId": "setBDStatus", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "user_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "bd:update", - "x-permissions": [ - "bd:update" - ] - } - }, - "/admin/coin-sellers": { - "get": { - "operationId": "listCoinSellers", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "coin-seller:view", - "x-permissions": [ - "coin-seller:view" - ] - }, - "post": { - "operationId": "createCoinSeller", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "coin-seller:create", - "x-permissions": [ - "coin-seller:create" - ] - } - }, - "/admin/coin-sellers/{user_id}/status": { - "patch": { - "operationId": "setCoinSellerStatus", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "user_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "coin-seller:update", - "x-permissions": [ - "coin-seller:update" - ] - } - }, - "/admin/coin-sellers/{user_id}/stock-credits": { - "post": { - "operationId": "creditCoinSellerStock", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "user_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "coin-seller:stock-credit", - "x-permissions": [ - "coin-seller:stock-credit" - ] - } - }, - "/admin/countries": { - "get": { - "operationId": "listCountries", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "country:view", - "x-permissions": [ - "country:view" - ] - }, - "post": { - "operationId": "createCountry", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "country:create", - "x-permissions": [ - "country:create" - ] - } - }, - "/admin/countries/{country_id}": { - "get": { - "operationId": "getCountry", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "country_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "country:view", - "x-permissions": [ - "country:view" - ] - }, - "patch": { - "operationId": "updateCountry", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "country_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "country:update", - "x-permissions": [ - "country:update" - ] - }, - "delete": { - "operationId": "deleteCountry", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "country_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "country:status", - "x-permissions": [ - "country:status" - ] - } - }, - "/admin/countries/{country_id}/disable": { - "post": { - "operationId": "disableCountry", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "country_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "country:status", - "x-permissions": [ - "country:status" - ] - } - }, - "/admin/countries/{country_id}/enable": { - "post": { - "operationId": "enableCountry", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "country_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "country:status", - "x-permissions": [ - "country:status" - ] - } - }, - "/admin/emoji-packs": { - "get": { - "operationId": "listEmojiPacks", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "emoji-pack:view", - "x-permissions": [ - "emoji-pack:view" - ] - }, - "post": { - "operationId": "createEmojiPack", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "emoji-pack:create", - "x-permissions": [ - "emoji-pack:create" - ] - } - }, - "/admin/emoji-packs/categories": { - "get": { - "operationId": "listEmojiPackCategories", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "emoji-pack:view", - "x-permissions": [ - "emoji-pack:view" - ] - } - }, - "/admin/files/image/upload": { - "post": { - "operationId": "uploadImage", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "upload:create", - "x-permissions": [ - "upload:create" - ] - } - }, - "/admin/files/upload": { - "post": { - "operationId": "uploadFile", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "upload:create", - "x-permissions": [ - "upload:create" - ] - } - }, - "/admin/game/games": { - "get": { - "operationId": "listCatalog", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "game:view", - "x-permissions": [ - "game:view" - ] - }, - "post": { - "operationId": "createCatalog", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "game:create", - "x-permissions": [ - "game:create" - ] - } - }, - "/admin/game/games/{game_id}": { - "patch": { - "operationId": "updateCatalog", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "game_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "game:update", - "x-permissions": [ - "game:update" - ] - }, - "delete": { - "operationId": "deleteCatalog", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "game_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "game:delete", - "x-permissions": [ - "game:delete" - ] - } - }, - "/admin/game/games/{game_id}/status": { - "patch": { - "operationId": "setGameStatus", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "game_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "game:status", - "x-permissions": [ - "game:status" - ] - } - }, - "/admin/game/platforms": { - "get": { - "operationId": "listPlatforms", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "game:view", - "x-permissions": [ - "game:view" - ] - }, - "post": { - "operationId": "createPlatform", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "game:update", - "x-permissions": [ - "game:update" - ] - } - }, - "/admin/game/platforms/{platform_code}": { - "patch": { - "operationId": "updatePlatform", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "platform_code", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "game:update", - "x-permissions": [ - "game:update" - ] - } - }, - "/admin/gift-types": { - "get": { - "operationId": "listGiftTypes", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "gift:view", - "x-permissions": [ - "gift:view" - ] - } - }, - "/admin/gift-types/{type_code}": { - "put": { - "operationId": "updateGiftType", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "type_code", - "required": true, - "schema": { - "type": "string" - } - } - ], - "x-permission": "gift:update", - "x-permissions": [ - "gift:update" - ] - } - }, - "/admin/gifts": { - "get": { - "operationId": "listGifts", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "gift:view", - "x-permissions": [ - "gift:view" - ] - }, - "post": { - "operationId": "createGift", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "gift:create", - "x-permissions": [ - "gift:create" - ] - } - }, - "/admin/gifts/{gift_id}": { - "put": { - "operationId": "updateGift", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "gift_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "gift:update", - "x-permissions": [ - "gift:update" - ] - } - }, - "/admin/gifts/{gift_id}/disable": { - "post": { - "operationId": "disableGift", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "gift_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "gift:status", - "x-permissions": [ - "gift:status" - ] - } - }, - "/admin/gifts/{gift_id}/enable": { - "post": { - "operationId": "enableGift", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "gift_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "gift:status", - "x-permissions": [ - "gift:status" - ] - } - }, - "/admin/hosts": { - "get": { - "operationId": "listHosts", - "parameters": [ - { - "$ref": "#/components/parameters/Page" - }, - { - "$ref": "#/components/parameters/PageSize" - }, - { - "$ref": "#/components/parameters/Keyword" - }, - { - "$ref": "#/components/parameters/Status" - }, - { - "$ref": "#/components/parameters/RegionId" - }, - { - "$ref": "#/components/parameters/AgencyId" - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/HostProfilePageResponse" - } - }, - "x-permission": "host:view", - "x-permissions": [ - "host:view" - ] - } - }, - "/admin/operations/coin-adjustments": { - "get": { - "operationId": "listCoinAdjustments", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "coin-adjustment:view", - "x-permissions": [ - "coin-adjustment:view" - ] - }, - "post": { - "operationId": "createCoinAdjustment", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "coin-adjustment:create", - "x-permissions": [ - "coin-adjustment:create" - ] - } - }, - "/admin/operations/coin-adjustments/target": { - "get": { - "operationId": "lookupCoinAdjustmentTarget", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "coin-adjustment:create", - "x-permissions": [ - "coin-adjustment:create" - ] - } - }, - "/admin/operations/coin-ledger": { - "get": { - "operationId": "listCoinLedger", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "coin-ledger:view", - "x-permissions": [ - "coin-ledger:view" - ] - } - }, - "/admin/payment/recharge-bills": { - "get": { - "operationId": "listRechargeBills", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "payment-bill:view", - "x-permissions": [ - "payment-bill:view" - ] - } - }, - "/admin/payment/recharge-products": { - "get": { - "operationId": "listRechargeProducts", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "payment-product:view", - "x-permissions": [ - "payment-product:view" - ] - }, - "post": { - "operationId": "createRechargeProduct", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "payment-product:create", - "x-permissions": [ - "payment-product:create" - ] - } - }, - "/admin/payment/recharge-products/{product_id}": { - "put": { - "operationId": "updateRechargeProduct", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "product_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "payment-product:update", - "x-permissions": [ - "payment-product:update" - ] - }, - "delete": { - "operationId": "deleteRechargeProduct", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "product_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "payment-product:delete", - "x-permissions": [ - "payment-product:delete" - ] - } - }, - "/admin/regions": { - "get": { - "operationId": "listRegions", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "region:view", - "x-permissions": [ - "region:view" - ] - }, - "post": { - "operationId": "createRegion", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "region:create", - "x-permissions": [ - "region:create" - ] - } - }, - "/admin/regions/{region_id}": { - "get": { - "operationId": "getRegion", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "region_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "region:view", - "x-permissions": [ - "region:view" - ] - }, - "patch": { - "operationId": "updateRegion", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "region_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "region:update", - "x-permissions": [ - "region:update" - ] - }, - "delete": { - "operationId": "disableRegion", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "region_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "region:status", - "x-permissions": [ - "region:status" - ] - } - }, - "/admin/regions/{region_id}/countries": { - "put": { - "operationId": "replaceRegionCountries", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "region_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "region:update", - "x-permissions": [ - "region:update" - ] - } - }, - "/admin/regions/{region_id}/enable": { - "post": { - "operationId": "enableRegion", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "region_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "region:status", - "x-permissions": [ - "region:status" - ] - } - }, - "/admin/resource-grants": { - "get": { - "operationId": "listResourceGrants", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "resource-grant:view", - "x-permissions": [ - "resource-grant:view" - ] - } - }, - "/admin/resource-grants/group": { - "post": { - "operationId": "grantResourceGroup", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "resource-grant:create", - "x-permissions": [ - "resource-grant:create" - ] - } - }, - "/admin/resource-grants/resource": { - "post": { - "operationId": "grantResource", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "resource-grant:create", - "x-permissions": [ - "resource-grant:create" - ] - } - }, - "/admin/resource-groups": { - "get": { - "operationId": "listResourceGroups", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "resource-group:view", - "x-permissions": [ - "resource-group:view" - ] - }, - "post": { - "operationId": "createResourceGroup", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "resource-group:create", - "x-permissions": [ - "resource-group:create" - ] - } - }, - "/admin/resource-groups/{group_id}": { - "get": { - "operationId": "getResourceGroup", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "group_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "resource-group:view", - "x-permissions": [ - "resource-group:view" - ] - }, - "put": { - "operationId": "updateResourceGroup", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "group_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "resource-group:update", - "x-permissions": [ - "resource-group:update" - ] - } - }, - "/admin/resource-groups/{group_id}/disable": { - "post": { - "operationId": "disableResourceGroup", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "group_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "resource-group:update", - "x-permissions": [ - "resource-group:update" - ] - } - }, - "/admin/resource-groups/{group_id}/enable": { - "post": { - "operationId": "enableResourceGroup", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "group_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "resource-group:update", - "x-permissions": [ - "resource-group:update" - ] - } - }, - "/admin/resource-groups/{group_id}/items": { - "put": { - "operationId": "updateResourceGroupItems", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "group_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "resource-group:update", - "x-permissions": [ - "resource-group:update" - ] - } - }, - "/admin/resources": { - "get": { - "operationId": "listResources", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "resource:view", - "x-permissions": [ - "resource:view" - ] - }, - "post": { - "operationId": "createResource", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "resource:create", - "x-permissions": [ - "resource:create" - ] - } - }, - "/admin/resources/{resource_id}": { - "get": { - "operationId": "getResource", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "resource_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "resource:view", - "x-permissions": [ - "resource:view" - ] - }, - "put": { - "operationId": "updateResource", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "resource_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "resource:update", - "x-permissions": [ - "resource:update" - ] - } - }, - "/admin/resources/{resource_id}/disable": { - "post": { - "operationId": "disableResource", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "resource_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "resource:update", - "x-permissions": [ - "resource:update" - ] - } - }, - "/admin/resources/{resource_id}/enable": { - "post": { - "operationId": "enableResource", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "resource_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "resource:update", - "x-permissions": [ - "resource:update" - ] - } - }, - "/admin/rooms": { - "get": { - "operationId": "listRooms", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "room:view", - "x-permissions": [ - "room:view" - ] - } - }, - "/admin/rooms/{room_id}": { - "patch": { - "operationId": "updateRoom", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "room_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "room:update", - "x-permissions": [ - "room:update" - ] - }, - "delete": { - "operationId": "deleteRoom", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "room_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "room:delete", - "x-permissions": [ - "room:delete" - ] - } - }, - "/admin/rooms/config": { - "get": { - "operationId": "getRoomConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "room-config:view", - "x-permissions": [ - "room-config:view" - ] - }, - "put": { - "operationId": "updateRoomConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "room-config:update", - "x-permissions": [ - "room-config:update" - ] - } - }, - "/admin/rooms/pins": { - "get": { - "operationId": "listRoomPins", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "room-pin:view", - "x-permissions": [ - "room-pin:view" - ] - }, - "post": { - "operationId": "createRoomPin", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "room-pin:create", - "x-permissions": [ - "room-pin:create" - ] - } - }, - "/admin/rooms/pins/{pin_id}": { - "delete": { - "operationId": "cancelRoomPin", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "pin_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "room-pin:cancel", - "x-permissions": [ - "room-pin:cancel" - ] - } - }, - "/admin/users/level-config": { - "get": { - "operationId": "listLevelConfig", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "level-config:view", - "x-permissions": [ - "level-config:view" - ] - } - }, - "/admin/users/level-config/rules/{track}/{level}": { - "put": { - "operationId": "upsertRule", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "track", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "in": "path", - "name": "level", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "level-config:update", - "x-permissions": [ - "level-config:update" - ] - } - }, - "/admin/users/level-config/tiers": { - "post": { - "operationId": "createTier", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "level-config:update", - "x-permissions": [ - "level-config:update" - ] - } - }, - "/admin/users/level-config/tiers/{tier_id}": { - "put": { - "operationId": "updateTier", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "tier_id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "level-config:update", - "x-permissions": [ - "level-config:update" - ] - } - }, - "/admin/users/level-config/tracks/{track}": { - "put": { - "operationId": "updateTrack", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "in": "path", - "name": "track", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "x-permission": "level-config:update", - "x-permissions": [ - "level-config:update" - ] - } - }, - "/admin/users/region-blocks": { - "get": { - "operationId": "listRegionBlocks", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "region-block:view", - "x-permissions": [ - "region-block:view" - ] - }, - "put": { - "operationId": "replaceRegionBlocks", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "region-block:update", - "x-permissions": [ - "region-block:update" - ] - } - }, - "/app/users": { - "get": { - "operationId": "appListUsers", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "app-user:view", - "x-permissions": [ - "app-user:view" - ] - } - }, - "/app/users/{id}": { - "get": { - "operationId": "appGetUser", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "x-permission": "app-user:view", - "x-permissions": [ - "app-user:view" - ] - }, - "patch": { - "operationId": "appUpdateUser", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "x-permission": "app-user:update", - "x-permissions": [ - "app-user:update" - ] - } - }, - "/app/users/{id}/ban": { - "post": { - "operationId": "appBanUser", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "x-permission": "app-user:status", - "x-permissions": [ - "app-user:status" - ] - } - }, - "/app/users/{id}/login-logs": { - "get": { - "operationId": "appListUserLoginLogs", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "x-permission": "app-user:view", - "x-permissions": [ - "app-user:view" - ] - } - }, - "/app/users/{id}/password": { - "post": { - "operationId": "appSetPassword", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "x-permission": "app-user:password", - "x-permissions": [ - "app-user:password" - ] - } - }, - "/app/users/{id}/unban": { - "post": { - "operationId": "appUnbanUser", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "x-permission": "app-user:status", - "x-permissions": [ - "app-user:status" - ] - } - }, - "/app/users/bans": { - "get": { - "operationId": "appListBannedUsers", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "app-user:view", - "x-permissions": [ - "app-user:view" - ] - } - }, - "/app/users/login-logs": { - "get": { - "operationId": "appListLoginLogs", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permission": "app-user:view", - "x-permissions": [ - "app-user:view" - ] - } - }, - "/auth/change-password": { - "post": { - "operationId": "changePassword", - "requestBody": { - "$ref": "#/components/requestBodies/ChangePasswordRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - } - } - }, - "/auth/login": { - "post": { - "operationId": "login", - "requestBody": { - "$ref": "#/components/requestBodies/LoginRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/SessionResponse" - } - } - } - }, - "/auth/logout": { - "post": { - "operationId": "logout", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - } - } - }, - "/auth/me": { - "get": { - "operationId": "me", - "responses": { - "200": { - "$ref": "#/components/responses/SessionResponse" - } - } - } - }, - "/auth/refresh": { - "post": { - "operationId": "refresh", - "responses": { - "200": { - "$ref": "#/components/responses/SessionResponse" - } - } - } - }, - "/dashboard/overview": { - "get": { - "operationId": "dashboardOverview", - "x-permission": "overview:view", - "responses": { - "200": { - "$ref": "#/components/responses/DashboardOverviewResponse" - } - }, - "x-permissions": [ - "overview:view" - ] - } - }, - "/logs/login": { - "get": { - "operationId": "listLoginLogs", - "x-permission": "log:view", - "parameters": [ - { - "$ref": "#/components/parameters/Page" - }, - { - "$ref": "#/components/parameters/PageSize" - }, - { - "$ref": "#/components/parameters/Keyword" - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/LogPageResponse" - } - }, - "x-permissions": [ - "log:view" - ] - } - }, - "/logs/login/export": { - "get": { - "operationId": "exportLoginLogs", - "x-permission": "log:export", - "responses": { - "200": { - "description": "CSV" - } - }, - "x-permissions": [ - "log:export" - ] - } - }, - "/logs/operations": { - "get": { - "operationId": "listOperationLogs", - "x-permission": "log:view", - "parameters": [ - { - "$ref": "#/components/parameters/Page" - }, - { - "$ref": "#/components/parameters/PageSize" - }, - { - "$ref": "#/components/parameters/Keyword" - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/LogPageResponse" - } - }, - "x-permissions": [ - "log:view" - ] - } - }, - "/logs/operations/export": { - "get": { - "operationId": "exportOperationLogs", - "x-permission": "log:export", - "responses": { - "200": { - "description": "CSV" - } - }, - "x-permissions": [ - "log:export" - ] - } - }, - "/navigation/menus": { - "get": { - "operationId": "navigationMenus", - "responses": { - "200": { - "$ref": "#/components/responses/MenuListResponse" - } - } - } - }, - "/permissions": { - "get": { - "operationId": "listPermissions", - "x-permission": "permission:view", - "responses": { - "200": { - "$ref": "#/components/responses/PermissionListResponse" - } - }, - "x-permissions": [ - "permission:view", - "role:permission", - "role:manage" - ] - }, - "post": { - "operationId": "createPermission", - "x-permission": "permission:create", - "requestBody": { - "$ref": "#/components/requestBodies/PermissionRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/PermissionResponse" - } - }, - "x-permissions": [ - "permission:create" - ] - } - }, - "/permissions/{id}": { - "patch": { - "operationId": "updatePermission", - "x-permission": "permission:update", - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "requestBody": { - "$ref": "#/components/requestBodies/PermissionRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/PermissionResponse" - } - }, - "x-permissions": [ - "permission:update" - ] - }, - "delete": { - "operationId": "deletePermission", - "x-permission": "permission:delete", - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permissions": [ - "permission:delete" - ] - } - }, - "/permissions/sync": { - "post": { - "operationId": "syncPermissions", - "x-permission": "permission:sync", - "responses": { - "200": { - "$ref": "#/components/responses/PermissionListResponse" - } - }, - "x-permissions": [ - "permission:sync" - ] - } - }, - "/roles": { - "get": { - "operationId": "listRoles", - "x-permission": "role:view", - "responses": { - "200": { - "$ref": "#/components/responses/RoleListResponse" - } - }, - "x-permissions": [ - "role:view" - ] - }, - "post": { - "operationId": "createRole", - "x-permission": "role:create", - "requestBody": { - "$ref": "#/components/requestBodies/RoleRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/RoleResponse" - } - }, - "x-permissions": [ - "role:create", - "role:manage" - ] - } - }, - "/roles/{id}": { - "patch": { - "operationId": "updateRole", - "x-permission": "role:update", - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "requestBody": { - "$ref": "#/components/requestBodies/RoleRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/RoleResponse" - } - }, - "x-permissions": [ - "role:update", - "role:manage" - ] - }, - "delete": { - "operationId": "deleteRole", - "x-permission": "role:delete", - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permissions": [ - "role:delete", - "role:manage" - ] - } - }, - "/roles/{id}/data-scopes": { - "get": { - "operationId": "getRoleDataScopes", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "x-permission": "role:data-scope", - "x-permissions": [ - "role:data-scope" - ] - }, - "put": { - "operationId": "replaceRoleDataScopes", - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "x-permission": "role:data-scope", - "x-permissions": [ - "role:data-scope" - ] - } - }, - "/roles/{id}/permissions": { - "put": { - "operationId": "replaceRolePermissions", - "x-permission": "role:permission", - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "requestBody": { - "$ref": "#/components/requestBodies/RolePermissionRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/RoleResponse" - } - }, - "x-permissions": [ - "role:permission", - "role:manage" - ] - } - }, - "/search": { - "get": { - "operationId": "search", - "parameters": [ - { - "$ref": "#/components/parameters/Keyword" - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/SearchResponse" - } - } - } - }, - "/system/menus": { - "get": { - "operationId": "listSystemMenus", - "x-permission": "menu:view", - "responses": { - "200": { - "$ref": "#/components/responses/MenuListResponse" - } - }, - "x-permissions": [ - "menu:view" - ] - }, - "post": { - "operationId": "createMenu", - "x-permission": "menu:create", - "requestBody": { - "$ref": "#/components/requestBodies/MenuRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/MenuResponse" - } - }, - "x-permissions": [ - "menu:create" - ] - } - }, - "/system/menus/{id}": { - "patch": { - "operationId": "updateMenu", - "x-permission": "menu:update", - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "requestBody": { - "$ref": "#/components/requestBodies/MenuRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/MenuResponse" - } - }, - "x-permissions": [ - "menu:update" - ] - }, - "delete": { - "operationId": "deleteMenu", - "x-permission": "menu:delete", - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permissions": [ - "menu:delete" - ] - } - }, - "/system/menus/{id}/visible": { - "patch": { - "operationId": "updateMenuVisible", - "x-permission": "menu:visible", - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "requestBody": { - "$ref": "#/components/requestBodies/MenuVisibleRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/MenuResponse" - } - }, - "x-permissions": [ - "menu:visible" - ] - } - }, - "/system/menus/sort": { - "put": { - "operationId": "sortMenus", - "x-permission": "menu:sort", - "requestBody": { - "$ref": "#/components/requestBodies/MenuSortRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/MenuListResponse" - } - }, - "x-permissions": [ - "menu:sort" - ] - } - }, - "/users": { - "get": { - "operationId": "listUsers", - "x-permission": "user:view", - "parameters": [ - { - "$ref": "#/components/parameters/Page" - }, - { - "$ref": "#/components/parameters/PageSize" - }, - { - "$ref": "#/components/parameters/Keyword" - }, - { - "name": "role", - "in": "query", - "schema": { - "type": "string" - } - }, - { - "$ref": "#/components/parameters/Status" - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/UserPageResponse" - } - }, - "x-permissions": [ - "user:view" - ] - }, - "post": { - "operationId": "createUser", - "x-permission": "user:create", - "requestBody": { - "$ref": "#/components/requestBodies/UserRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/CreateUserResponse" - } - }, - "x-permissions": [ - "user:create" - ] - } - }, - "/users/{id}": { - "get": { - "operationId": "getUser", - "x-permission": "user:view", - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/UserResponse" - } - }, - "x-permissions": [ - "user:view" - ] - }, - "patch": { - "operationId": "updateUser", - "x-permission": "user:update", - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "requestBody": { - "$ref": "#/components/requestBodies/UserRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/UserResponse" - } - }, - "x-permissions": [ - "user:update" - ] - } - }, - "/users/{id}/reset-password": { - "post": { - "operationId": "resetUserPassword", - "x-permission": "user:reset-password", - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "responses": { - "200": { - "$ref": "#/components/responses/ResetPasswordResponse" - } - }, - "x-permissions": [ - "user:reset-password" - ] - } - }, - "/users/{id}/status": { - "patch": { - "operationId": "updateUserStatus", - "x-permission": "user:status", - "parameters": [ - { - "$ref": "#/components/parameters/Id" - } - ], - "requestBody": { - "$ref": "#/components/requestBodies/StatusRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/UserResponse" - } - }, - "x-permissions": [ - "user:status" - ] - } - }, - "/users/batch/status": { - "post": { - "operationId": "batchUpdateUserStatus", - "x-permission": "user:status", - "requestBody": { - "$ref": "#/components/requestBodies/BatchStatusRequest" - }, - "responses": { - "200": { - "$ref": "#/components/responses/EmptyResponse" - } - }, - "x-permissions": [ - "user:status" - ] - } - }, - "/users/export": { - "get": { - "operationId": "exportUsers", - "x-permission": "user:export", - "responses": { - "200": { - "description": "CSV" - } - }, - "x-permissions": [ - "user:export" - ] - } - } - }, - "components": { - "parameters": { - "AgencyId": { - "name": "agency_id", - "in": "query", - "schema": { - "type": "integer" - } - }, - "Id": { - "name": "id", - "in": "path", - "required": true, - "schema": { - "type": "integer" - } - }, - "Keyword": { - "name": "keyword", - "in": "query", - "schema": { - "type": "string" - } - }, - "Page": { - "name": "page", - "in": "query", - "schema": { - "type": "integer", - "minimum": 1 - } - }, - "PageSize": { - "name": "page_size", - "in": "query", - "schema": { - "type": "integer", - "minimum": 1 - } - }, - "ParentBdUserId": { - "name": "parent_bd_user_id", - "in": "query", - "schema": { - "type": "integer" - } - }, - "ParentLeaderUserId": { - "name": "parent_leader_user_id", - "in": "query", - "schema": { - "type": "integer" - } - }, - "RegionId": { - "name": "region_id", - "in": "query", - "schema": { - "type": "integer" - } - }, - "Status": { - "name": "status", - "in": "query", - "schema": { - "type": "string" - } - } - }, - "requestBodies": { - "BatchStatusRequest": { - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "ids", - "status" - ], - "properties": { - "ids": { - "type": "array", - "items": { - "type": "integer" - } - }, - "status": { - "type": "string" - } - } - } - } - } - }, - "ChangePasswordRequest": { - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "oldPassword", - "newPassword" - ], - "properties": { - "oldPassword": { - "type": "string" - }, - "newPassword": { - "type": "string" - } - } - } - } - } - }, - "LoginRequest": { - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "username", - "password" - ], - "properties": { - "username": { - "type": "string" - }, - "password": { - "type": "string" - } - } - } - } - } - }, - "MenuRequest": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/MenuInput" - } - } - } - }, - "MenuSortRequest": { - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "items" - ], - "properties": { - "items": { - "type": "array", - "items": { - "type": "object", - "required": [ - "id", - "sort" - ], - "properties": { - "id": { - "type": "integer" - }, - "sort": { - "type": "integer" - } + ], + "paths": { + "/admin/activity/achievements": { + "get": { + "operationId": "listAchievementDefinitions", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "achievement:view", + "x-permissions": ["achievement:view"] + }, + "post": { + "operationId": "createAchievementDefinition", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "achievement:create", + "x-permissions": ["achievement:create"] + } + }, + "/admin/activity/achievements/{achievement_id}": { + "put": { + "operationId": "updateAchievementDefinition", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "achievement_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "achievement:update", + "x-permissions": ["achievement:update"] + } + }, + "/admin/activity/daily-tasks": { + "get": { + "operationId": "listTaskDefinitions", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "daily-task:view", + "x-permissions": ["daily-task:view"] + }, + "post": { + "operationId": "createTaskDefinition", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "daily-task:create", + "x-permissions": ["daily-task:create"] + } + }, + "/admin/activity/daily-tasks/{task_id}": { + "put": { + "operationId": "updateTaskDefinition", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "task_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "daily-task:update", + "x-permissions": ["daily-task:update"] + } + }, + "/admin/activity/daily-tasks/{task_id}/status": { + "post": { + "operationId": "setTaskDefinitionStatus", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "task_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "daily-task:status", + "x-permissions": ["daily-task:status"] + } + }, + "/admin/activity/user-leaderboards": { + "get": { + "operationId": "listUserLeaderboards", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "user-leaderboard:view", + "x-permissions": ["user-leaderboard:view"] + } + }, + "/admin/activity/red-packets": { + "get": { + "operationId": "listRedPackets", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "red-packet:view", + "x-permissions": ["red-packet:view"] + } + }, + "/admin/activity/red-packets/{packet_id}": { + "get": { + "operationId": "getRedPacket", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "packet_id", + "required": true, + "schema": { + "type": "string" + } + } + ], + "x-permission": "red-packet:view", + "x-permissions": ["red-packet:view"] + } + }, + "/admin/activity/red-packets/config": { + "get": { + "operationId": "getRedPacketConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "red-packet:view", + "x-permissions": ["red-packet:view"] + }, + "put": { + "operationId": "updateRedPacketConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "red-packet:update", + "x-permissions": ["red-packet:update"] + } + }, + "/admin/activity/lucky-gifts/config": { + "get": { + "operationId": "getLuckyGiftConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "lucky-gift:view", + "x-permissions": ["lucky-gift:view"] + }, + "put": { + "operationId": "upsertLuckyGiftConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "lucky-gift:update", + "x-permissions": ["lucky-gift:update"] + } + }, + "/admin/activity/lucky-gifts/configs": { + "get": { + "operationId": "listLuckyGiftConfigs", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "lucky-gift:view", + "x-permissions": ["lucky-gift:view"] + } + }, + "/admin/activity/lucky-gifts/draws": { + "get": { + "operationId": "listLuckyGiftDraws", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "lucky-gift:view", + "x-permissions": ["lucky-gift:view"] + } + }, + "/admin/activity/lucky-gifts/draw-summary": { + "get": { + "operationId": "getLuckyGiftDrawSummary", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "lucky-gift:view", + "x-permissions": ["lucky-gift:view"] + } + }, + "/admin/activity/first-recharge-reward/claims": { + "get": { + "operationId": "listFirstRechargeRewardClaims", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "first-recharge-reward:view", + "x-permissions": ["first-recharge-reward:view"] + } + }, + "/admin/activity/registration-reward/claims": { + "get": { + "operationId": "listRegistrationRewardClaims", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "registration-reward:view", + "x-permissions": ["registration-reward:view"] + } + }, + "/admin/activity/first-recharge-reward/config": { + "get": { + "operationId": "getFirstRechargeRewardConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "first-recharge-reward:view", + "x-permissions": ["first-recharge-reward:view"] + }, + "put": { + "operationId": "updateFirstRechargeRewardConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "first-recharge-reward:update", + "x-permissions": ["first-recharge-reward:update"] + } + }, + "/admin/activity/registration-reward/config": { + "get": { + "operationId": "getRegistrationRewardConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "registration-reward:view", + "x-permissions": ["registration-reward:view"] + }, + "put": { + "operationId": "updateRegistrationRewardConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "registration-reward:update", + "x-permissions": ["registration-reward:update"] + } + }, + "/admin/activity/room-treasure/config": { + "get": { + "operationId": "getRoomTreasureConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "room-treasure:view", + "x-permissions": ["room-treasure:view"] + }, + "put": { + "operationId": "updateRoomTreasureConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "room-treasure:update", + "x-permissions": ["room-treasure:update"] + } + }, + "/admin/activity/seven-day-checkin/claims": { + "get": { + "operationId": "listSevenDayCheckInClaims", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "seven-day-checkin:view", + "x-permissions": ["seven-day-checkin:view"] + } + }, + "/admin/activity/seven-day-checkin/config": { + "get": { + "operationId": "getSevenDayCheckInConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "seven-day-checkin:view", + "x-permissions": ["seven-day-checkin:view"] + }, + "put": { + "operationId": "updateSevenDayCheckInConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "seven-day-checkin:update", + "x-permissions": ["seven-day-checkin:update"] + } + }, + "/admin/agencies": { + "get": { + "operationId": "listAgencies", + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/Keyword" + }, + { + "$ref": "#/components/parameters/Status" + }, + { + "$ref": "#/components/parameters/RegionId" + }, + { + "$ref": "#/components/parameters/ParentBdUserId" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/AgencyPageResponse" + } + }, + "x-permission": "agency:view", + "x-permissions": ["agency:view"] + }, + "post": { + "operationId": "createAgency", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "agency:create", + "x-permissions": ["agency:create"] + } + }, + "/admin/agencies/{agency_id}/close": { + "post": { + "operationId": "closeAgency", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "agency_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "agency:status", + "x-permissions": ["agency:status"] + } + }, + "/admin/agencies/{agency_id}/join-enabled": { + "post": { + "operationId": "setAgencyJoinEnabled", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "agency_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "agency:status", + "x-permissions": ["agency:status"] + } + }, + "/admin/app-config/banners": { + "get": { + "operationId": "listBanners", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "app-config:view", + "x-permissions": ["app-config:view"] + }, + "post": { + "operationId": "createBanner", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "app-config:update", + "x-permissions": ["app-config:update"] + } + }, + "/admin/app-config/banners/{banner_id}": { + "put": { + "operationId": "updateBanner", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "banner_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "app-config:update", + "x-permissions": ["app-config:update"] + }, + "delete": { + "operationId": "deleteBanner", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "banner_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "app-config:update", + "x-permissions": ["app-config:update"] + } + }, + "/admin/app-config/h5-links": { + "get": { + "operationId": "listH5Links", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "app-config:view", + "x-permissions": ["app-config:view"] + }, + "post": { + "operationId": "createH5Link", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "app-config:update", + "x-permissions": ["app-config:update"] + }, + "put": { + "operationId": "updateH5Links", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "app-config:update", + "x-permissions": ["app-config:update"] + } + }, + "/admin/app-config/h5-links/{key}": { + "put": { + "operationId": "updateH5Link", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "key", + "required": true, + "schema": { + "type": "string" + } + } + ], + "x-permission": "app-config:update", + "x-permissions": ["app-config:update"] + }, + "delete": { + "operationId": "deleteH5Link", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "key", + "required": true, + "schema": { + "type": "string" + } + } + ], + "x-permission": "app-config:update", + "x-permissions": ["app-config:update"] + } + }, + "/admin/app-config/explore-tabs": { + "get": { + "operationId": "listExploreTabs", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "app-config:view", + "x-permissions": ["app-config:view"] + }, + "post": { + "operationId": "createExploreTab", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "app-config:update", + "x-permissions": ["app-config:update"] + } + }, + "/admin/app-config/explore-tabs/{tab_id}": { + "put": { + "operationId": "updateExploreTab", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "tab_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "app-config:update", + "x-permissions": ["app-config:update"] + }, + "delete": { + "operationId": "deleteExploreTab", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "tab_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "app-config:update", + "x-permissions": ["app-config:update"] + } + }, + "/admin/app-config/versions": { + "get": { + "operationId": "listAppVersions", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "app-version:view", + "x-permissions": ["app-version:view"] + }, + "post": { + "operationId": "createAppVersion", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "app-version:create", + "x-permissions": ["app-version:create"] + } + }, + "/admin/app-config/versions/{version_id}": { + "put": { + "operationId": "updateAppVersion", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "version_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "app-version:update", + "x-permissions": ["app-version:update"] + }, + "delete": { + "operationId": "deleteAppVersion", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "version_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "app-version:delete", + "x-permissions": ["app-version:delete"] + } + }, + "/admin/apps": { + "get": { + "operationId": "listApps", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" } - } } - } } - } - } - }, - "MenuVisibleRequest": { - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "visible" - ], - "properties": { - "visible": { - "type": "boolean" + }, + "/admin/bd-leaders": { + "get": { + "operationId": "listBDLeaders", + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/Keyword" + }, + { + "$ref": "#/components/parameters/Status" + }, + { + "$ref": "#/components/parameters/RegionId" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/BDProfilePageResponse" + } + }, + "x-permission": "bd:view", + "x-permissions": ["bd:view"] + }, + "post": { + "operationId": "createBDLeader", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "bd:create", + "x-permissions": ["bd:create"] + } + }, + "/admin/bd-leaders/{user_id}": { + "delete": { + "operationId": "deleteBDLeader", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "user_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "bd:update", + "x-permissions": ["bd:update"] + } + }, + "/admin/bd-leaders/{user_id}/status": { + "patch": { + "operationId": "setBDLeaderStatus", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "user_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "bd:update", + "x-permissions": ["bd:update"] + } + }, + "/admin/bds": { + "get": { + "operationId": "listBDs", + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/Keyword" + }, + { + "$ref": "#/components/parameters/Status" + }, + { + "$ref": "#/components/parameters/RegionId" + }, + { + "$ref": "#/components/parameters/ParentLeaderUserId" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/BDProfilePageResponse" + } + }, + "x-permission": "bd:view", + "x-permissions": ["bd:view"] + }, + "post": { + "operationId": "createBD", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "bd:create", + "x-permissions": ["bd:create"] + } + }, + "/admin/bds/{user_id}/status": { + "patch": { + "operationId": "setBDStatus", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "user_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "bd:update", + "x-permissions": ["bd:update"] + } + }, + "/admin/coin-sellers": { + "get": { + "operationId": "listCoinSellers", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "coin-seller:view", + "x-permissions": ["coin-seller:view"] + }, + "post": { + "operationId": "createCoinSeller", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "coin-seller:create", + "x-permissions": ["coin-seller:create"] + } + }, + "/admin/coin-sellers/{user_id}/status": { + "patch": { + "operationId": "setCoinSellerStatus", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "user_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "coin-seller:update", + "x-permissions": ["coin-seller:update"] + } + }, + "/admin/coin-sellers/{user_id}/stock-credits": { + "post": { + "operationId": "creditCoinSellerStock", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "user_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "coin-seller:stock-credit", + "x-permissions": ["coin-seller:stock-credit"] + } + }, + "/admin/countries": { + "get": { + "operationId": "listCountries", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "country:view", + "x-permissions": ["country:view"] + }, + "post": { + "operationId": "createCountry", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "country:create", + "x-permissions": ["country:create"] + } + }, + "/admin/countries/{country_id}": { + "get": { + "operationId": "getCountry", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "country_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "country:view", + "x-permissions": ["country:view"] + }, + "patch": { + "operationId": "updateCountry", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "country_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "country:update", + "x-permissions": ["country:update"] + }, + "delete": { + "operationId": "deleteCountry", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "country_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "country:status", + "x-permissions": ["country:status"] + } + }, + "/admin/countries/{country_id}/disable": { + "post": { + "operationId": "disableCountry", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "country_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "country:status", + "x-permissions": ["country:status"] + } + }, + "/admin/countries/{country_id}/enable": { + "post": { + "operationId": "enableCountry", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "country_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "country:status", + "x-permissions": ["country:status"] + } + }, + "/admin/emoji-packs": { + "get": { + "operationId": "listEmojiPacks", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "emoji-pack:view", + "x-permissions": ["emoji-pack:view"] + }, + "post": { + "operationId": "createEmojiPack", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "emoji-pack:create", + "x-permissions": ["emoji-pack:create"] + } + }, + "/admin/emoji-packs/categories": { + "get": { + "operationId": "listEmojiPackCategories", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "emoji-pack:view", + "x-permissions": ["emoji-pack:view"] + } + }, + "/admin/files/image/upload": { + "post": { + "operationId": "uploadImage", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "upload:create", + "x-permissions": ["upload:create"] + } + }, + "/admin/files/upload": { + "post": { + "operationId": "uploadFile", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "upload:create", + "x-permissions": ["upload:create"] + } + }, + "/admin/game/games": { + "get": { + "operationId": "listCatalog", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "game:view", + "x-permissions": ["game:view"] + }, + "post": { + "operationId": "createCatalog", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "game:create", + "x-permissions": ["game:create"] + } + }, + "/admin/game/games/{game_id}": { + "patch": { + "operationId": "updateCatalog", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "game_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "game:update", + "x-permissions": ["game:update"] + }, + "delete": { + "operationId": "deleteCatalog", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "game_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "game:delete", + "x-permissions": ["game:delete"] + } + }, + "/admin/game/games/{game_id}/status": { + "patch": { + "operationId": "setGameStatus", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "game_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "game:status", + "x-permissions": ["game:status"] + } + }, + "/admin/game/platforms": { + "get": { + "operationId": "listPlatforms", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "game:view", + "x-permissions": ["game:view"] + }, + "post": { + "operationId": "createPlatform", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "game:update", + "x-permissions": ["game:update"] + } + }, + "/admin/game/platforms/{platform_code}": { + "patch": { + "operationId": "updatePlatform", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "platform_code", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "game:update", + "x-permissions": ["game:update"] + } + }, + "/admin/gift-types": { + "get": { + "operationId": "listGiftTypes", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "gift:view", + "x-permissions": ["gift:view"] + } + }, + "/admin/gift-types/{type_code}": { + "put": { + "operationId": "updateGiftType", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "type_code", + "required": true, + "schema": { + "type": "string" + } + } + ], + "x-permission": "gift:update", + "x-permissions": ["gift:update"] + } + }, + "/admin/gifts": { + "get": { + "operationId": "listGifts", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "gift:view", + "x-permissions": ["gift:view"] + }, + "post": { + "operationId": "createGift", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "gift:create", + "x-permissions": ["gift:create"] + } + }, + "/admin/gifts/{gift_id}": { + "put": { + "operationId": "updateGift", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "gift_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "gift:update", + "x-permissions": ["gift:update"] + } + }, + "/admin/gifts/{gift_id}/disable": { + "post": { + "operationId": "disableGift", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "gift_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "gift:status", + "x-permissions": ["gift:status"] + } + }, + "/admin/gifts/{gift_id}/enable": { + "post": { + "operationId": "enableGift", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "gift_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "gift:status", + "x-permissions": ["gift:status"] + } + }, + "/admin/hosts": { + "get": { + "operationId": "listHosts", + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/Keyword" + }, + { + "$ref": "#/components/parameters/Status" + }, + { + "$ref": "#/components/parameters/RegionId" + }, + { + "$ref": "#/components/parameters/AgencyId" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/HostProfilePageResponse" + } + }, + "x-permission": "host:view", + "x-permissions": ["host:view"] + } + }, + "/admin/operations/coin-adjustments": { + "get": { + "operationId": "listCoinAdjustments", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "coin-adjustment:view", + "x-permissions": ["coin-adjustment:view"] + }, + "post": { + "operationId": "createCoinAdjustment", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "coin-adjustment:create", + "x-permissions": ["coin-adjustment:create"] + } + }, + "/admin/operations/coin-adjustments/target": { + "get": { + "operationId": "lookupCoinAdjustmentTarget", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "coin-adjustment:create", + "x-permissions": ["coin-adjustment:create"] + } + }, + "/admin/operations/coin-ledger": { + "get": { + "operationId": "listCoinLedger", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "coin-ledger:view", + "x-permissions": ["coin-ledger:view"] + } + }, + "/admin/payment/recharge-bills": { + "get": { + "operationId": "listRechargeBills", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "payment-bill:view", + "x-permissions": ["payment-bill:view"] + } + }, + "/admin/payment/recharge-products": { + "get": { + "operationId": "listRechargeProducts", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "payment-product:view", + "x-permissions": ["payment-product:view"] + }, + "post": { + "operationId": "createRechargeProduct", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "payment-product:create", + "x-permissions": ["payment-product:create"] + } + }, + "/admin/payment/recharge-products/{product_id}": { + "put": { + "operationId": "updateRechargeProduct", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "product_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "payment-product:update", + "x-permissions": ["payment-product:update"] + }, + "delete": { + "operationId": "deleteRechargeProduct", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "product_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "payment-product:delete", + "x-permissions": ["payment-product:delete"] + } + }, + "/admin/regions": { + "get": { + "operationId": "listRegions", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "region:view", + "x-permissions": ["region:view"] + }, + "post": { + "operationId": "createRegion", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "region:create", + "x-permissions": ["region:create"] + } + }, + "/admin/regions/{region_id}": { + "get": { + "operationId": "getRegion", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "region_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "region:view", + "x-permissions": ["region:view"] + }, + "patch": { + "operationId": "updateRegion", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "region_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "region:update", + "x-permissions": ["region:update"] + }, + "delete": { + "operationId": "disableRegion", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "region_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "region:status", + "x-permissions": ["region:status"] + } + }, + "/admin/regions/{region_id}/countries": { + "put": { + "operationId": "replaceRegionCountries", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "region_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "region:update", + "x-permissions": ["region:update"] + } + }, + "/admin/regions/{region_id}/enable": { + "post": { + "operationId": "enableRegion", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "region_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "region:status", + "x-permissions": ["region:status"] + } + }, + "/admin/resource-grants": { + "get": { + "operationId": "listResourceGrants", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "resource-grant:view", + "x-permissions": ["resource-grant:view"] + } + }, + "/admin/resource-grants/group": { + "post": { + "operationId": "grantResourceGroup", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "resource-grant:create", + "x-permissions": ["resource-grant:create"] + } + }, + "/admin/resource-grants/resource": { + "post": { + "operationId": "grantResource", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "resource-grant:create", + "x-permissions": ["resource-grant:create"] + } + }, + "/admin/resource-groups": { + "get": { + "operationId": "listResourceGroups", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "resource-group:view", + "x-permissions": ["resource-group:view"] + }, + "post": { + "operationId": "createResourceGroup", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "resource-group:create", + "x-permissions": ["resource-group:create"] + } + }, + "/admin/resource-groups/{group_id}": { + "get": { + "operationId": "getResourceGroup", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "group_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "resource-group:view", + "x-permissions": ["resource-group:view"] + }, + "put": { + "operationId": "updateResourceGroup", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "group_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "resource-group:update", + "x-permissions": ["resource-group:update"] + } + }, + "/admin/resource-groups/{group_id}/disable": { + "post": { + "operationId": "disableResourceGroup", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "group_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "resource-group:update", + "x-permissions": ["resource-group:update"] + } + }, + "/admin/resource-groups/{group_id}/enable": { + "post": { + "operationId": "enableResourceGroup", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "group_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "resource-group:update", + "x-permissions": ["resource-group:update"] + } + }, + "/admin/resource-groups/{group_id}/items": { + "put": { + "operationId": "updateResourceGroupItems", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "group_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "resource-group:update", + "x-permissions": ["resource-group:update"] + } + }, + "/admin/resources": { + "get": { + "operationId": "listResources", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "resource:view", + "x-permissions": ["resource:view"] + }, + "post": { + "operationId": "createResource", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "resource:create", + "x-permissions": ["resource:create"] + } + }, + "/admin/resources/{resource_id}": { + "get": { + "operationId": "getResource", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "resource_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "resource:view", + "x-permissions": ["resource:view"] + }, + "put": { + "operationId": "updateResource", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "resource_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "resource:update", + "x-permissions": ["resource:update"] + } + }, + "/admin/resources/{resource_id}/disable": { + "post": { + "operationId": "disableResource", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "resource_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "resource:update", + "x-permissions": ["resource:update"] + } + }, + "/admin/resources/{resource_id}/enable": { + "post": { + "operationId": "enableResource", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "resource_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "resource:update", + "x-permissions": ["resource:update"] + } + }, + "/admin/rooms": { + "get": { + "operationId": "listRooms", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "room:view", + "x-permissions": ["room:view"] + } + }, + "/admin/rooms/{room_id}": { + "patch": { + "operationId": "updateRoom", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "room_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "room:update", + "x-permissions": ["room:update"] + }, + "delete": { + "operationId": "deleteRoom", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "room_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "room:delete", + "x-permissions": ["room:delete"] + } + }, + "/admin/rooms/config": { + "get": { + "operationId": "getRoomConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "room-config:view", + "x-permissions": ["room-config:view"] + }, + "put": { + "operationId": "updateRoomConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "room-config:update", + "x-permissions": ["room-config:update"] + } + }, + "/admin/rooms/pins": { + "get": { + "operationId": "listRoomPins", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "room-pin:view", + "x-permissions": ["room-pin:view"] + }, + "post": { + "operationId": "createRoomPin", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "room-pin:create", + "x-permissions": ["room-pin:create"] + } + }, + "/admin/rooms/pins/{pin_id}": { + "delete": { + "operationId": "cancelRoomPin", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "pin_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "room-pin:cancel", + "x-permissions": ["room-pin:cancel"] + } + }, + "/admin/users/level-config": { + "get": { + "operationId": "listLevelConfig", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "level-config:view", + "x-permissions": ["level-config:view"] + } + }, + "/admin/users/level-config/rules/{track}/{level}": { + "put": { + "operationId": "upsertRule", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "track", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "in": "path", + "name": "level", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "level-config:update", + "x-permissions": ["level-config:update"] + } + }, + "/admin/users/level-config/tiers": { + "post": { + "operationId": "createTier", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "level-config:update", + "x-permissions": ["level-config:update"] + } + }, + "/admin/users/level-config/tiers/{tier_id}": { + "put": { + "operationId": "updateTier", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "tier_id", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "level-config:update", + "x-permissions": ["level-config:update"] + } + }, + "/admin/users/level-config/tracks/{track}": { + "put": { + "operationId": "updateTrack", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "in": "path", + "name": "track", + "required": true, + "schema": { + "type": "integer" + } + } + ], + "x-permission": "level-config:update", + "x-permissions": ["level-config:update"] + } + }, + "/admin/users/region-blocks": { + "get": { + "operationId": "listRegionBlocks", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "region-block:view", + "x-permissions": ["region-block:view"] + }, + "put": { + "operationId": "replaceRegionBlocks", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "region-block:update", + "x-permissions": ["region-block:update"] + } + }, + "/app/users": { + "get": { + "operationId": "appListUsers", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "app-user:view", + "x-permissions": ["app-user:view"] + } + }, + "/app/users/{id}": { + "get": { + "operationId": "appGetUser", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "x-permission": "app-user:view", + "x-permissions": ["app-user:view"] + }, + "patch": { + "operationId": "appUpdateUser", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "x-permission": "app-user:update", + "x-permissions": ["app-user:update"] + } + }, + "/app/users/{id}/ban": { + "post": { + "operationId": "appBanUser", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "x-permission": "app-user:status", + "x-permissions": ["app-user:status"] + } + }, + "/app/users/{id}/login-logs": { + "get": { + "operationId": "appListUserLoginLogs", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "x-permission": "app-user:view", + "x-permissions": ["app-user:view"] + } + }, + "/app/users/{id}/password": { + "post": { + "operationId": "appSetPassword", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "x-permission": "app-user:password", + "x-permissions": ["app-user:password"] + } + }, + "/app/users/{id}/unban": { + "post": { + "operationId": "appUnbanUser", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "x-permission": "app-user:status", + "x-permissions": ["app-user:status"] + } + }, + "/app/users/bans": { + "get": { + "operationId": "appListBannedUsers", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "app-user:view", + "x-permissions": ["app-user:view"] + } + }, + "/app/users/login-logs": { + "get": { + "operationId": "appListLoginLogs", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "app-user:view", + "x-permissions": ["app-user:view"] + } + }, + "/auth/change-password": { + "post": { + "operationId": "changePassword", + "requestBody": { + "$ref": "#/components/requestBodies/ChangePasswordRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } } - } } - } - } - }, - "PermissionRequest": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/PermissionInput" + }, + "/auth/login": { + "post": { + "operationId": "login", + "requestBody": { + "$ref": "#/components/requestBodies/LoginRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/SessionResponse" + } + } + } + }, + "/auth/logout": { + "post": { + "operationId": "logout", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + } + } + }, + "/auth/me": { + "get": { + "operationId": "me", + "responses": { + "200": { + "$ref": "#/components/responses/SessionResponse" + } + } + } + }, + "/auth/refresh": { + "post": { + "operationId": "refresh", + "responses": { + "200": { + "$ref": "#/components/responses/SessionResponse" + } + } + } + }, + "/dashboard/overview": { + "get": { + "operationId": "dashboardOverview", + "x-permission": "overview:view", + "responses": { + "200": { + "$ref": "#/components/responses/DashboardOverviewResponse" + } + }, + "x-permissions": ["overview:view"] + } + }, + "/logs/login": { + "get": { + "operationId": "listLoginLogs", + "x-permission": "log:view", + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/Keyword" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/LogPageResponse" + } + }, + "x-permissions": ["log:view"] + } + }, + "/logs/login/export": { + "get": { + "operationId": "exportLoginLogs", + "x-permission": "log:export", + "responses": { + "200": { + "description": "CSV" + } + }, + "x-permissions": ["log:export"] + } + }, + "/logs/operations": { + "get": { + "operationId": "listOperationLogs", + "x-permission": "log:view", + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/Keyword" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/LogPageResponse" + } + }, + "x-permissions": ["log:view"] + } + }, + "/logs/operations/export": { + "get": { + "operationId": "exportOperationLogs", + "x-permission": "log:export", + "responses": { + "200": { + "description": "CSV" + } + }, + "x-permissions": ["log:export"] + } + }, + "/navigation/menus": { + "get": { + "operationId": "navigationMenus", + "responses": { + "200": { + "$ref": "#/components/responses/MenuListResponse" + } + } + } + }, + "/permissions": { + "get": { + "operationId": "listPermissions", + "x-permission": "permission:view", + "responses": { + "200": { + "$ref": "#/components/responses/PermissionListResponse" + } + }, + "x-permissions": ["permission:view", "role:permission", "role:manage"] + }, + "post": { + "operationId": "createPermission", + "x-permission": "permission:create", + "requestBody": { + "$ref": "#/components/requestBodies/PermissionRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/PermissionResponse" + } + }, + "x-permissions": ["permission:create"] + } + }, + "/permissions/{id}": { + "patch": { + "operationId": "updatePermission", + "x-permission": "permission:update", + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/PermissionRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/PermissionResponse" + } + }, + "x-permissions": ["permission:update"] + }, + "delete": { + "operationId": "deletePermission", + "x-permission": "permission:delete", + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permissions": ["permission:delete"] + } + }, + "/permissions/sync": { + "post": { + "operationId": "syncPermissions", + "x-permission": "permission:sync", + "responses": { + "200": { + "$ref": "#/components/responses/PermissionListResponse" + } + }, + "x-permissions": ["permission:sync"] + } + }, + "/roles": { + "get": { + "operationId": "listRoles", + "x-permission": "role:view", + "responses": { + "200": { + "$ref": "#/components/responses/RoleListResponse" + } + }, + "x-permissions": ["role:view"] + }, + "post": { + "operationId": "createRole", + "x-permission": "role:create", + "requestBody": { + "$ref": "#/components/requestBodies/RoleRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/RoleResponse" + } + }, + "x-permissions": ["role:create", "role:manage"] + } + }, + "/roles/{id}": { + "patch": { + "operationId": "updateRole", + "x-permission": "role:update", + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/RoleRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/RoleResponse" + } + }, + "x-permissions": ["role:update", "role:manage"] + }, + "delete": { + "operationId": "deleteRole", + "x-permission": "role:delete", + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permissions": ["role:delete", "role:manage"] + } + }, + "/roles/{id}/data-scopes": { + "get": { + "operationId": "getRoleDataScopes", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "x-permission": "role:data-scope", + "x-permissions": ["role:data-scope"] + }, + "put": { + "operationId": "replaceRoleDataScopes", + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "x-permission": "role:data-scope", + "x-permissions": ["role:data-scope"] + } + }, + "/roles/{id}/permissions": { + "put": { + "operationId": "replaceRolePermissions", + "x-permission": "role:permission", + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/RolePermissionRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/RoleResponse" + } + }, + "x-permissions": ["role:permission", "role:manage"] + } + }, + "/search": { + "get": { + "operationId": "search", + "parameters": [ + { + "$ref": "#/components/parameters/Keyword" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/SearchResponse" + } + } + } + }, + "/system/menus": { + "get": { + "operationId": "listSystemMenus", + "x-permission": "menu:view", + "responses": { + "200": { + "$ref": "#/components/responses/MenuListResponse" + } + }, + "x-permissions": ["menu:view"] + }, + "post": { + "operationId": "createMenu", + "x-permission": "menu:create", + "requestBody": { + "$ref": "#/components/requestBodies/MenuRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/MenuResponse" + } + }, + "x-permissions": ["menu:create"] + } + }, + "/system/menus/{id}": { + "patch": { + "operationId": "updateMenu", + "x-permission": "menu:update", + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/MenuRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/MenuResponse" + } + }, + "x-permissions": ["menu:update"] + }, + "delete": { + "operationId": "deleteMenu", + "x-permission": "menu:delete", + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permissions": ["menu:delete"] + } + }, + "/system/menus/{id}/visible": { + "patch": { + "operationId": "updateMenuVisible", + "x-permission": "menu:visible", + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/MenuVisibleRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/MenuResponse" + } + }, + "x-permissions": ["menu:visible"] + } + }, + "/system/menus/sort": { + "put": { + "operationId": "sortMenus", + "x-permission": "menu:sort", + "requestBody": { + "$ref": "#/components/requestBodies/MenuSortRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/MenuListResponse" + } + }, + "x-permissions": ["menu:sort"] + } + }, + "/users": { + "get": { + "operationId": "listUsers", + "x-permission": "user:view", + "parameters": [ + { + "$ref": "#/components/parameters/Page" + }, + { + "$ref": "#/components/parameters/PageSize" + }, + { + "$ref": "#/components/parameters/Keyword" + }, + { + "name": "role", + "in": "query", + "schema": { + "type": "string" + } + }, + { + "$ref": "#/components/parameters/Status" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/UserPageResponse" + } + }, + "x-permissions": ["user:view"] + }, + "post": { + "operationId": "createUser", + "x-permission": "user:create", + "requestBody": { + "$ref": "#/components/requestBodies/UserRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/CreateUserResponse" + } + }, + "x-permissions": ["user:create"] + } + }, + "/users/{id}": { + "get": { + "operationId": "getUser", + "x-permission": "user:view", + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/UserResponse" + } + }, + "x-permissions": ["user:view"] + }, + "patch": { + "operationId": "updateUser", + "x-permission": "user:update", + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/UserRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/UserResponse" + } + }, + "x-permissions": ["user:update"] + } + }, + "/users/{id}/reset-password": { + "post": { + "operationId": "resetUserPassword", + "x-permission": "user:reset-password", + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "responses": { + "200": { + "$ref": "#/components/responses/ResetPasswordResponse" + } + }, + "x-permissions": ["user:reset-password"] + } + }, + "/users/{id}/status": { + "patch": { + "operationId": "updateUserStatus", + "x-permission": "user:status", + "parameters": [ + { + "$ref": "#/components/parameters/Id" + } + ], + "requestBody": { + "$ref": "#/components/requestBodies/StatusRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/UserResponse" + } + }, + "x-permissions": ["user:status"] + } + }, + "/users/batch/status": { + "post": { + "operationId": "batchUpdateUserStatus", + "x-permission": "user:status", + "requestBody": { + "$ref": "#/components/requestBodies/BatchStatusRequest" + }, + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permissions": ["user:status"] + } + }, + "/users/export": { + "get": { + "operationId": "exportUsers", + "x-permission": "user:export", + "responses": { + "200": { + "description": "CSV" + } + }, + "x-permissions": ["user:export"] } - } } - }, - "RolePermissionRequest": { - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "permissionIds" - ], - "properties": { - "permissionIds": { - "type": "array", - "items": { + }, + "components": { + "parameters": { + "AgencyId": { + "name": "agency_id", + "in": "query", + "schema": { "type": "integer" - } } - } - } - } - } - }, - "RoleRequest": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/RoleInput" - } - } - } - }, - "StatusRequest": { - "content": { - "application/json": { - "schema": { - "type": "object", - "required": [ - "status" - ], - "properties": { - "status": { - "type": "string" + }, + "Id": { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer" } - } - } - } - } - }, - "UserRequest": { - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/UserInput" - } - } - } - } - }, - "responses": { - "AgencyPageResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseAgencyPage" - } - } - } - }, - "BDProfilePageResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseBDProfilePage" - } - } - } - }, - "CreateUserResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseCreateUserResult" - } - } - } - }, - "DashboardOverviewResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseDashboardOverview" - } - } - } - }, - "EmptyResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseEmpty" - } - } - } - }, - "HostProfilePageResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseHostProfilePage" - } - } - } - }, - "LogPageResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseLogPage" - } - } - } - }, - "MenuListResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseMenuList" - } - } - } - }, - "MenuResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseMenu" - } - } - } - }, - "PermissionListResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponsePermissionList" - } - } - } - }, - "PermissionResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponsePermission" - } - } - } - }, - "ResetPasswordResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseResetPasswordResult" - } - } - } - }, - "RoleListResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseRoleList" - } - } - } - }, - "RoleResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseRole" - } - } - } - }, - "SearchResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseSearchList" - } - } - } - }, - "SessionResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseSession" - } - } - } - }, - "UserPageResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseUserPage" - } - } - } - }, - "UserResponse": { - "description": "OK", - "content": { - "application/json": { - "schema": { - "$ref": "#/components/schemas/ApiResponseUser" - } - } - } - } - }, - "schemas": { - "ApiPageAgency": { - "type": "object", - "required": [ - "items", - "page", - "pageSize", - "total" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Agency" - } - }, - "page": { - "type": "integer" - }, - "pageSize": { - "type": "integer" - }, - "total": { - "type": "integer" - } - } - }, - "ApiPageBDProfile": { - "type": "object", - "required": [ - "items", - "page", - "pageSize", - "total" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/BDProfile" - } - }, - "page": { - "type": "integer" - }, - "pageSize": { - "type": "integer" - }, - "total": { - "type": "integer" - } - } - }, - "ApiPageHostProfile": { - "type": "object", - "required": [ - "items", - "page", - "pageSize", - "total" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/HostProfile" - } - }, - "page": { - "type": "integer" - }, - "pageSize": { - "type": "integer" - }, - "total": { - "type": "integer" - } - } - }, - "ApiPageLog": { - "type": "object", - "required": [ - "items", - "page", - "pageSize", - "total" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Log" - } - }, - "page": { - "type": "integer" - }, - "pageSize": { - "type": "integer" - }, - "total": { - "type": "integer" - } - } - }, - "ApiPageUser": { - "type": "object", - "required": [ - "items", - "page", - "pageSize", - "total" - ], - "properties": { - "items": { - "type": "array", - "items": { - "$ref": "#/components/schemas/AdminUser" - } - }, - "page": { - "type": "integer" - }, - "pageSize": { - "type": "integer" - }, - "total": { - "type": "integer" - } - } - }, - "ApiResponseCreateUserResult": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/CreateUserResult" - } - } - } - ] - }, - "ApiResponseAgencyPage": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ApiPageAgency" - } - } - } - ] - }, - "ApiResponseBDProfilePage": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ApiPageBDProfile" - } - } - } - ] - }, - "ApiResponseDashboardOverview": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/DashboardOverview" - } - } - } - ] - }, - "ApiResponseEmpty": { - "$ref": "#/components/schemas/Envelope" - }, - "ApiResponseHostProfilePage": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ApiPageHostProfile" - } - } - } - ] - }, - "ApiResponseLogPage": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ApiPageLog" - } - } - } - ] - }, - "ApiResponseMenu": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/Menu" - } - } - } - ] - }, - "ApiResponseMenuList": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Menu" + }, + "Keyword": { + "name": "keyword", + "in": "query", + "schema": { + "type": "string" } - } - } - } - ] - }, - "ApiResponsePermission": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/Permission" - } - } - } - ] - }, - "ApiResponsePermissionList": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Permission" + }, + "Page": { + "name": "page", + "in": "query", + "schema": { + "type": "integer", + "minimum": 1 } - } - } - } - ] - }, - "ApiResponseResetPasswordResult": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ResetPasswordResult" - } - } - } - ] - }, - "ApiResponseRole": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/Role" - } - } - } - ] - }, - "ApiResponseRoleList": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/Role" + }, + "PageSize": { + "name": "page_size", + "in": "query", + "schema": { + "type": "integer", + "minimum": 1 } - } - } - } - ] - }, - "ApiResponseSearchList": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "type": "array", - "items": { - "$ref": "#/components/schemas/SearchResult" + }, + "ParentBdUserId": { + "name": "parent_bd_user_id", + "in": "query", + "schema": { + "type": "integer" + } + }, + "ParentLeaderUserId": { + "name": "parent_leader_user_id", + "in": "query", + "schema": { + "type": "integer" + } + }, + "RegionId": { + "name": "region_id", + "in": "query", + "schema": { + "type": "integer" + } + }, + "Status": { + "name": "status", + "in": "query", + "schema": { + "type": "string" } - } } - } - ] - }, - "ApiResponseSession": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/Session" - } + }, + "requestBodies": { + "BatchStatusRequest": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["ids", "status"], + "properties": { + "ids": { + "type": "array", + "items": { + "type": "integer" + } + }, + "status": { + "type": "string" + } + } + } + } + } + }, + "ChangePasswordRequest": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["oldPassword", "newPassword"], + "properties": { + "oldPassword": { + "type": "string" + }, + "newPassword": { + "type": "string" + } + } + } + } + } + }, + "LoginRequest": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["username", "password"], + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + } + } + } + } + } + }, + "MenuRequest": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/MenuInput" + } + } + } + }, + "MenuSortRequest": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["items"], + "properties": { + "items": { + "type": "array", + "items": { + "type": "object", + "required": ["id", "sort"], + "properties": { + "id": { + "type": "integer" + }, + "sort": { + "type": "integer" + } + } + } + } + } + } + } + } + }, + "MenuVisibleRequest": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["visible"], + "properties": { + "visible": { + "type": "boolean" + } + } + } + } + } + }, + "PermissionRequest": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PermissionInput" + } + } + } + }, + "RolePermissionRequest": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["permissionIds"], + "properties": { + "permissionIds": { + "type": "array", + "items": { + "type": "integer" + } + } + } + } + } + } + }, + "RoleRequest": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/RoleInput" + } + } + } + }, + "StatusRequest": { + "content": { + "application/json": { + "schema": { + "type": "object", + "required": ["status"], + "properties": { + "status": { + "type": "string" + } + } + } + } + } + }, + "UserRequest": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserInput" + } + } + } } - } - ] - }, - "ApiResponseUser": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/AdminUser" - } + }, + "responses": { + "AgencyPageResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseAgencyPage" + } + } + } + }, + "BDProfilePageResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseBDProfilePage" + } + } + } + }, + "CreateUserResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseCreateUserResult" + } + } + } + }, + "DashboardOverviewResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseDashboardOverview" + } + } + } + }, + "EmptyResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseEmpty" + } + } + } + }, + "HostProfilePageResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseHostProfilePage" + } + } + } + }, + "LogPageResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseLogPage" + } + } + } + }, + "MenuListResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseMenuList" + } + } + } + }, + "MenuResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseMenu" + } + } + } + }, + "PermissionListResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponsePermissionList" + } + } + } + }, + "PermissionResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponsePermission" + } + } + } + }, + "ResetPasswordResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseResetPasswordResult" + } + } + } + }, + "RoleListResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseRoleList" + } + } + } + }, + "RoleResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseRole" + } + } + } + }, + "SearchResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseSearchList" + } + } + } + }, + "SessionResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseSession" + } + } + } + }, + "UserPageResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseUserPage" + } + } + } + }, + "UserResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseUser" + } + } + } } - } - ] - }, - "ApiResponseUserPage": { - "allOf": [ - { - "$ref": "#/components/schemas/Envelope" - }, - { - "type": "object", - "properties": { - "data": { - "$ref": "#/components/schemas/ApiPageUser" - } + }, + "schemas": { + "ApiPageAgency": { + "type": "object", + "required": ["items", "page", "pageSize", "total"], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Agency" + } + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, + "ApiPageBDProfile": { + "type": "object", + "required": ["items", "page", "pageSize", "total"], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/BDProfile" + } + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, + "ApiPageHostProfile": { + "type": "object", + "required": ["items", "page", "pageSize", "total"], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/HostProfile" + } + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, + "ApiPageLog": { + "type": "object", + "required": ["items", "page", "pageSize", "total"], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Log" + } + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, + "ApiPageUser": { + "type": "object", + "required": ["items", "page", "pageSize", "total"], + "properties": { + "items": { + "type": "array", + "items": { + "$ref": "#/components/schemas/AdminUser" + } + }, + "page": { + "type": "integer" + }, + "pageSize": { + "type": "integer" + }, + "total": { + "type": "integer" + } + } + }, + "ApiResponseCreateUserResult": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/CreateUserResult" + } + } + } + ] + }, + "ApiResponseAgencyPage": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ApiPageAgency" + } + } + } + ] + }, + "ApiResponseBDProfilePage": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ApiPageBDProfile" + } + } + } + ] + }, + "ApiResponseDashboardOverview": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/DashboardOverview" + } + } + } + ] + }, + "ApiResponseEmpty": { + "$ref": "#/components/schemas/Envelope" + }, + "ApiResponseHostProfilePage": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ApiPageHostProfile" + } + } + } + ] + }, + "ApiResponseLogPage": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ApiPageLog" + } + } + } + ] + }, + "ApiResponseMenu": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/Menu" + } + } + } + ] + }, + "ApiResponseMenuList": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Menu" + } + } + } + } + ] + }, + "ApiResponsePermission": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/Permission" + } + } + } + ] + }, + "ApiResponsePermissionList": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Permission" + } + } + } + } + ] + }, + "ApiResponseResetPasswordResult": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ResetPasswordResult" + } + } + } + ] + }, + "ApiResponseRole": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/Role" + } + } + } + ] + }, + "ApiResponseRoleList": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Role" + } + } + } + } + ] + }, + "ApiResponseSearchList": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "type": "array", + "items": { + "$ref": "#/components/schemas/SearchResult" + } + } + } + } + ] + }, + "ApiResponseSession": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/Session" + } + } + } + ] + }, + "ApiResponseUser": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/AdminUser" + } + } + } + ] + }, + "ApiResponseUserPage": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/ApiPageUser" + } + } + } + ] + }, + "AdminUser": { + "type": "object", + "required": ["account", "id", "name", "status"], + "properties": { + "account": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "lastLogin": { + "type": "string" + }, + "mfa": { + "type": "string" + }, + "mfaEnabled": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "role": { + "type": "string" + }, + "roleIds": { + "type": "array", + "items": { + "type": "integer" + } + }, + "status": { + "type": "string" + }, + "team": { + "type": "string" + } + } + }, + "Agency": { + "type": "object", + "required": ["agencyId"], + "properties": { + "agencyId": { + "type": "integer" + }, + "createdAtMs": { + "type": "integer" + }, + "createdByUserId": { + "type": "integer" + }, + "joinEnabled": { + "type": "boolean" + }, + "maxHosts": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "ownerUserId": { + "type": "integer" + }, + "parentBdUserId": { + "type": "integer" + }, + "regionId": { + "type": "integer" + }, + "status": { + "type": "string" + }, + "updatedAtMs": { + "type": "integer" + } + } + }, + "BDProfile": { + "type": "object", + "required": ["userId"], + "properties": { + "createdAtMs": { + "type": "integer" + }, + "createdByUserId": { + "type": "integer" + }, + "parentLeaderUserId": { + "type": "integer" + }, + "regionId": { + "type": "integer" + }, + "role": { + "type": "string" + }, + "status": { + "type": "string" + }, + "updatedAtMs": { + "type": "integer" + }, + "userId": { + "type": "integer" + } + } + }, + "CreateUserResult": { + "type": "object", + "properties": { + "initialPassword": { + "type": "string" + } + } + }, + "DashboardOverview": { + "type": "object", + "additionalProperties": true + }, + "Envelope": { + "type": "object", + "properties": { + "code": { + "type": "integer" + }, + "data": {}, + "message": { + "type": "string" + } + } + }, + "HostProfile": { + "type": "object", + "required": ["userId"], + "properties": { + "createdAtMs": { + "type": "integer" + }, + "currentAgencyId": { + "type": "integer" + }, + "currentMembershipId": { + "type": "integer" + }, + "firstBecameHostAtMs": { + "type": "integer" + }, + "regionId": { + "type": "integer" + }, + "source": { + "type": "string" + }, + "status": { + "type": "string" + }, + "updatedAtMs": { + "type": "integer" + }, + "userId": { + "type": "integer" + } + } + }, + "Log": { + "type": "object", + "additionalProperties": true + }, + "Menu": { + "type": "object", + "additionalProperties": true + }, + "MenuInput": { + "type": "object", + "required": ["code", "label"], + "additionalProperties": true + }, + "Permission": { + "type": "object", + "additionalProperties": true + }, + "PermissionInput": { + "type": "object", + "required": ["code", "kind", "name"], + "additionalProperties": true + }, + "ResetPasswordResult": { + "type": "object", + "properties": { + "initialPassword": { + "type": "string" + } + } + }, + "Role": { + "type": "object", + "additionalProperties": true + }, + "RoleInput": { + "type": "object", + "required": ["code", "name"], + "additionalProperties": true + }, + "SearchResult": { + "type": "object", + "additionalProperties": true + }, + "Session": { + "type": "object", + "additionalProperties": true + }, + "UserInput": { + "type": "object", + "required": ["name"], + "additionalProperties": true } - } - ] - }, - "AdminUser": { - "type": "object", - "required": [ - "account", - "id", - "name", - "status" - ], - "properties": { - "account": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "lastLogin": { - "type": "string" - }, - "mfa": { - "type": "string" - }, - "mfaEnabled": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "role": { - "type": "string" - }, - "roleIds": { - "type": "array", - "items": { - "type": "integer" - } - }, - "status": { - "type": "string" - }, - "team": { - "type": "string" - } } - }, - "Agency": { - "type": "object", - "required": [ - "agencyId" - ], - "properties": { - "agencyId": { - "type": "integer" - }, - "createdAtMs": { - "type": "integer" - }, - "createdByUserId": { - "type": "integer" - }, - "joinEnabled": { - "type": "boolean" - }, - "maxHosts": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "ownerUserId": { - "type": "integer" - }, - "parentBdUserId": { - "type": "integer" - }, - "regionId": { - "type": "integer" - }, - "status": { - "type": "string" - }, - "updatedAtMs": { - "type": "integer" - } - } - }, - "BDProfile": { - "type": "object", - "required": [ - "userId" - ], - "properties": { - "createdAtMs": { - "type": "integer" - }, - "createdByUserId": { - "type": "integer" - }, - "parentLeaderUserId": { - "type": "integer" - }, - "regionId": { - "type": "integer" - }, - "role": { - "type": "string" - }, - "status": { - "type": "string" - }, - "updatedAtMs": { - "type": "integer" - }, - "userId": { - "type": "integer" - } - } - }, - "CreateUserResult": { - "type": "object", - "properties": { - "initialPassword": { - "type": "string" - } - } - }, - "DashboardOverview": { - "type": "object", - "additionalProperties": true - }, - "Envelope": { - "type": "object", - "properties": { - "code": { - "type": "integer" - }, - "data": {}, - "message": { - "type": "string" - } - } - }, - "HostProfile": { - "type": "object", - "required": [ - "userId" - ], - "properties": { - "createdAtMs": { - "type": "integer" - }, - "currentAgencyId": { - "type": "integer" - }, - "currentMembershipId": { - "type": "integer" - }, - "firstBecameHostAtMs": { - "type": "integer" - }, - "regionId": { - "type": "integer" - }, - "source": { - "type": "string" - }, - "status": { - "type": "string" - }, - "updatedAtMs": { - "type": "integer" - }, - "userId": { - "type": "integer" - } - } - }, - "Log": { - "type": "object", - "additionalProperties": true - }, - "Menu": { - "type": "object", - "additionalProperties": true - }, - "MenuInput": { - "type": "object", - "required": [ - "code", - "label" - ], - "additionalProperties": true - }, - "Permission": { - "type": "object", - "additionalProperties": true - }, - "PermissionInput": { - "type": "object", - "required": [ - "code", - "kind", - "name" - ], - "additionalProperties": true - }, - "ResetPasswordResult": { - "type": "object", - "properties": { - "initialPassword": { - "type": "string" - } - } - }, - "Role": { - "type": "object", - "additionalProperties": true - }, - "RoleInput": { - "type": "object", - "required": [ - "code", - "name" - ], - "additionalProperties": true - }, - "SearchResult": { - "type": "object", - "additionalProperties": true - }, - "Session": { - "type": "object", - "additionalProperties": true - }, - "UserInput": { - "type": "object", - "required": [ - "name" - ], - "additionalProperties": true - } } - } } diff --git a/src/app/navigation/menu.js b/src/app/navigation/menu.js index c0bc04f..ec79baf 100644 --- a/src/app/navigation/menu.js +++ b/src/app/navigation/menu.js @@ -42,6 +42,7 @@ const iconMap = { category: CategoryOutlined, dashboard: DashboardOutlined, event_available: EventAvailableOutlined, + explore: MapOutlined, gift: CardGiftcardOutlined, inventory: Inventory2Outlined, leaderboard: LeaderboardOutlined, @@ -114,6 +115,7 @@ export const fallbackNavigation = [ children: [ routeNavItem("app-config-h5", { icon: SettingsApplicationsOutlined }), routeNavItem("app-config-banners", { icon: ImageOutlined }), + routeNavItem("app-config-explore", { icon: MapOutlined }), routeNavItem("payment-recharge-products", { icon: WalletOutlined }), routeNavItem("app-config-versions", { icon: SettingsApplicationsOutlined }), ], diff --git a/src/app/permissions.ts b/src/app/permissions.ts index 16167ed..f9c4f4f 100644 --- a/src/app/permissions.ts +++ b/src/app/permissions.ts @@ -146,6 +146,7 @@ export const MENU_CODES = { appConfig: "app-config", appConfigH5: "app-config-h5", appConfigBanners: "app-config-banners", + appConfigExplore: "app-config-explore", appConfigVersions: "app-config-versions", resources: "resources", resourceList: "resource-list", diff --git a/src/features/app-config/api.ts b/src/features/app-config/api.ts index 38a8ceb..2969804 100644 --- a/src/features/app-config/api.ts +++ b/src/features/app-config/api.ts @@ -7,7 +7,10 @@ import type { AppVersionDto, AppVersionPayload, EntityId, + ExploreTabDto, + ExploreTabPayload, H5LinkConfigDto, + H5LinkConfigPayload, H5LinkConfigUpdatePayload, PageQuery, } from "@/shared/api/types"; @@ -27,6 +30,60 @@ export function updateH5Links(payload: H5LinkConfigUpdatePayload): Promise { + const endpoint = API_ENDPOINTS.createH5Link; + return apiRequest(apiEndpointPath(API_OPERATIONS.createH5Link), { + body: payload, + method: endpoint.method + }); +} + +export function updateH5Link(key: EntityId, payload: H5LinkConfigPayload): Promise { + const endpoint = API_ENDPOINTS.updateH5Link; + return apiRequest(apiEndpointPath(API_OPERATIONS.updateH5Link, { key }), { + body: payload, + method: endpoint.method + }); +} + +export function deleteH5Link(key: EntityId): Promise<{ deleted: boolean }> { + const endpoint = API_ENDPOINTS.deleteH5Link; + return apiRequest<{ deleted: boolean }>(apiEndpointPath(API_OPERATIONS.deleteH5Link, { key }), { + method: endpoint.method + }); +} + +export function listExploreTabs(query: PageQuery = {}): Promise> { + const endpoint = API_ENDPOINTS.listExploreTabs; + return apiRequest>(apiEndpointPath(API_OPERATIONS.listExploreTabs), { + method: endpoint.method, + query + }); +} + +export function createExploreTab(payload: ExploreTabPayload): Promise { + const endpoint = API_ENDPOINTS.createExploreTab; + return apiRequest(apiEndpointPath(API_OPERATIONS.createExploreTab), { + body: payload, + method: endpoint.method + }); +} + +export function updateExploreTab(tabId: EntityId, payload: ExploreTabPayload): Promise { + const endpoint = API_ENDPOINTS.updateExploreTab; + return apiRequest(apiEndpointPath(API_OPERATIONS.updateExploreTab, { tab_id: tabId }), { + body: payload, + method: endpoint.method + }); +} + +export function deleteExploreTab(tabId: EntityId): Promise<{ deleted: boolean }> { + const endpoint = API_ENDPOINTS.deleteExploreTab; + return apiRequest<{ deleted: boolean }>(apiEndpointPath(API_OPERATIONS.deleteExploreTab, { tab_id: tabId }), { + method: endpoint.method + }); +} + export function listBanners(query: PageQuery = {}): Promise> { const endpoint = API_ENDPOINTS.listBanners; return apiRequest>(apiEndpointPath(API_OPERATIONS.listBanners), { diff --git a/src/features/app-config/app-config.module.css b/src/features/app-config/app-config.module.css index 3aa2f95..32ff7bb 100644 --- a/src/features/app-config/app-config.module.css +++ b/src/features/app-config/app-config.module.css @@ -27,3 +27,8 @@ .formWideField { grid-column: 1 / -1; } + +.statusCell { + display: inline-flex; + align-items: center; +} diff --git a/src/features/app-config/hooks/useExploreConfigPage.js b/src/features/app-config/hooks/useExploreConfigPage.js new file mode 100644 index 0000000..0d57f68 --- /dev/null +++ b/src/features/app-config/hooks/useExploreConfigPage.js @@ -0,0 +1,171 @@ +import { useCallback, useMemo, useState } from "react"; +import { createExploreTab, deleteExploreTab, listExploreTabs, updateExploreTab } from "@/features/app-config/api"; +import { useAppConfigAbilities } from "@/features/app-config/permissions.js"; +import { exploreTabSchema } from "@/features/app-config/schema"; +import { parseForm } from "@/shared/forms/validation"; +import { useAdminQuery } from "@/shared/hooks/useAdminQuery.js"; +import { useConfirm } from "@/shared/ui/ConfirmProvider.jsx"; +import { useToast } from "@/shared/ui/ToastProvider.jsx"; + +const emptyData = { items: [], total: 0 }; + +const emptyForm = () => ({ + enabled: true, + h5Url: "", + sortOrder: "0", + tab: "", +}); + +export function useExploreConfigPage() { + const abilities = useAppConfigAbilities(); + const confirm = useConfirm(); + const { showToast } = useToast(); + const [keyword, setKeyword] = useState(""); + const [enabled, setEnabled] = useState(""); + const [activeAction, setActiveAction] = useState(""); + const [editingItem, setEditingItem] = useState(null); + const [form, setFormState] = useState(emptyForm); + const [loadingAction, setLoadingAction] = useState(""); + + const filters = useMemo(() => ({ enabled, keyword }), [enabled, keyword]); + const queryFn = useCallback(() => listExploreTabs(filters), [filters]); + const { + data = emptyData, + error, + loading, + reload, + } = useAdminQuery(queryFn, { + errorMessage: "加载 Explore 配置失败", + initialData: emptyData, + queryKey: ["app-config", "explore-tabs", filters], + }); + + const setForm = (patch) => { + setFormState((current) => ({ ...current, ...patch })); + }; + + const openCreate = () => { + setEditingItem(null); + setFormState(emptyForm()); + setActiveAction("create"); + }; + + const openEdit = (item) => { + setEditingItem(item); + setFormState(formFromExploreTab(item)); + setActiveAction("edit"); + }; + + const closeDialog = () => { + setActiveAction(""); + setEditingItem(null); + setFormState(emptyForm()); + }; + + const resetFilters = () => { + setKeyword(""); + setEnabled(""); + }; + + const submitExploreTab = async (event) => { + event.preventDefault(); + const payload = parseForm(exploreTabSchema, normalizeForm(form)); + const action = editingItem ? "edit" : "create"; + setLoadingAction(action); + try { + if (editingItem) { + await updateExploreTab(editingItem.id, payload); + showToast("Explore 配置已更新", "success"); + } else { + await createExploreTab(payload); + showToast("Explore 配置已新增", "success"); + } + closeDialog(); + await reload(); + } catch (err) { + showToast(err.message || "操作失败", "error"); + } finally { + setLoadingAction(""); + } + }; + + const toggleExploreTab = async (item, nextEnabled) => { + setLoadingAction(`toggle:${item.id}`); + try { + await updateExploreTab(item.id, { + enabled: nextEnabled, + h5Url: item.h5Url || "", + sortOrder: item.sortOrder || 0, + tab: item.tab || "", + }); + await reload(); + showToast(nextEnabled ? "Explore tab 已启用" : "Explore tab 已关闭", "success"); + } catch (err) { + showToast(err.message || "操作失败", "error"); + } finally { + setLoadingAction(""); + } + }; + + const removeExploreTab = async (item) => { + const ok = await confirm({ + confirmText: "删除", + message: item.tab || `Explore ${item.id}`, + title: "删除 Explore tab", + tone: "danger", + }); + if (!ok) { + return; + } + setLoadingAction(`delete:${item.id}`); + try { + await deleteExploreTab(item.id); + await reload(); + showToast("Explore 配置已删除", "success"); + } catch (err) { + showToast(err.message || "删除失败", "error"); + } finally { + setLoadingAction(""); + } + }; + + return { + abilities, + activeAction, + closeDialog, + data, + editingItem, + enabled, + error, + form, + keyword, + loading, + loadingAction, + openCreate, + openEdit, + reload, + removeExploreTab, + resetFilters, + setEnabled, + setForm, + setKeyword, + submitExploreTab, + toggleExploreTab, + }; +} + +function normalizeForm(form) { + return { + ...form, + sortOrder: form.sortOrder || 0, + }; +} + +function formFromExploreTab(item) { + return { + enabled: Boolean(item.enabled), + h5Url: item.h5Url || "", + sortOrder: String(item.sortOrder || 0), + tab: item.tab || "", + }; +} diff --git a/src/features/app-config/hooks/useH5ConfigPage.js b/src/features/app-config/hooks/useH5ConfigPage.js index e9fe7f7..05feb70 100644 --- a/src/features/app-config/hooks/useH5ConfigPage.js +++ b/src/features/app-config/hooks/useH5ConfigPage.js @@ -1,17 +1,20 @@ import { useCallback, useState } from "react"; import { parseForm } from "@/shared/forms/validation"; import { useAdminQuery } from "@/shared/hooks/useAdminQuery.js"; +import { useConfirm } from "@/shared/ui/ConfirmProvider.jsx"; import { useToast } from "@/shared/ui/ToastProvider.jsx"; -import { listH5Links, updateH5Links } from "@/features/app-config/api"; +import { createH5Link, deleteH5Link, listH5Links, updateH5Link } from "@/features/app-config/api"; import { useAppConfigAbilities } from "@/features/app-config/permissions.js"; import { h5LinkUpdateSchema } from "@/features/app-config/schema"; const emptyData = { items: [], total: 0 }; -const emptyForm = () => ({ url: "" }); +const emptyForm = () => ({ key: "", label: "", url: "" }); export function useH5ConfigPage() { const abilities = useAppConfigAbilities(); + const confirm = useConfirm(); const { showToast } = useToast(); + const [activeAction, setActiveAction] = useState(""); const [editingItem, setEditingItem] = useState(null); const [form, setForm] = useState(emptyForm); const [loadingAction, setLoadingAction] = useState(""); @@ -22,12 +25,20 @@ export function useH5ConfigPage() { queryKey: ["app-config", "h5-links"] }); + const openCreate = () => { + setEditingItem(null); + setForm(emptyForm()); + setActiveAction("create"); + }; + const openEdit = (item) => { setEditingItem(item); - setForm({ url: item.url || "" }); + setForm({ key: item.key || "", label: item.label || "", url: item.url || "" }); + setActiveAction("edit"); }; const closeEdit = () => { + setActiveAction(""); setEditingItem(null); setForm(emptyForm()); }; @@ -35,12 +46,24 @@ export function useH5ConfigPage() { const submitEdit = async (event) => { event.preventDefault(); if (!editingItem) { + const payload = parseForm(h5LinkUpdateSchema, form); + setLoadingAction("create"); + try { + await createH5Link(payload); + closeEdit(); + await reload(); + showToast("H5配置已新增", "success"); + } catch (err) { + showToast(err.message || "操作失败", "error"); + } finally { + setLoadingAction(""); + } return; } - const payload = parseForm(h5LinkUpdateSchema, { key: editingItem.key, url: form.url }); + const payload = parseForm(h5LinkUpdateSchema, { ...form, key: editingItem.key }); setLoadingAction("edit"); try { - await updateH5Links({ items: [payload] }); + await updateH5Link(editingItem.key, payload); closeEdit(); await reload(); showToast("H5配置已更新", "success"); @@ -51,7 +74,30 @@ export function useH5ConfigPage() { } }; + const removeH5Link = async (item) => { + const ok = await confirm({ + confirmText: "删除", + message: item.label || item.key, + title: "删除H5配置", + tone: "danger" + }); + if (!ok) { + return; + } + setLoadingAction(`delete:${item.key}`); + try { + await deleteH5Link(item.key); + await reload(); + showToast("H5配置已删除", "success"); + } catch (err) { + showToast(err.message || "删除失败", "error"); + } finally { + setLoadingAction(""); + } + }; + return { + activeAction, abilities, closeEdit, data, @@ -60,8 +106,10 @@ export function useH5ConfigPage() { form, loading, loadingAction, + openCreate, openEdit, reload, + removeH5Link, setForm, submitEdit }; diff --git a/src/features/app-config/pages/BannerConfigPage.jsx b/src/features/app-config/pages/BannerConfigPage.jsx index 65ea4aa..8901dba 100644 --- a/src/features/app-config/pages/BannerConfigPage.jsx +++ b/src/features/app-config/pages/BannerConfigPage.jsx @@ -8,7 +8,6 @@ import { useMemo } from "react"; import { APP_BANNER_DISPLAY_SCOPE_OPTIONS } from "@/features/app-config/constants"; import { useBannerConfigPage } from "@/features/app-config/hooks/useBannerConfigPage.js"; import styles from "@/features/app-config/app-config.module.css"; -import { Button } from "@/shared/ui/Button.jsx"; import { AdminFormDialog, AdminFormFieldGrid, @@ -59,13 +58,9 @@ export function BannerConfigPage() { } - variant="primary" - onClick={page.openCreate} - > - 新增BANNER - + + + ) : null } /> @@ -73,14 +68,16 @@ export function BannerConfigPage() { item.id} /> -
- {items.length} 条 -
diff --git a/src/features/app-config/pages/ExploreConfigPage.jsx b/src/features/app-config/pages/ExploreConfigPage.jsx new file mode 100644 index 0000000..c42abfa --- /dev/null +++ b/src/features/app-config/pages/ExploreConfigPage.jsx @@ -0,0 +1,216 @@ +import AddOutlined from "@mui/icons-material/AddOutlined"; +import DeleteOutlineOutlined from "@mui/icons-material/DeleteOutlineOutlined"; +import EditOutlined from "@mui/icons-material/EditOutlined"; +import LinkOutlined from "@mui/icons-material/LinkOutlined"; +import TextField from "@mui/material/TextField"; +import { useMemo } from "react"; +import { useExploreConfigPage } from "@/features/app-config/hooks/useExploreConfigPage.js"; +import styles from "@/features/app-config/app-config.module.css"; +import { Button } from "@/shared/ui/Button.jsx"; +import { + AdminFormDialog, + AdminFormFieldGrid, + AdminFormSection, + AdminFormSwitchField, +} from "@/shared/ui/AdminFormDialog.jsx"; +import { + AdminActionIconButton, + AdminFilterResetButton, + AdminFilterSelect, + AdminListBody, + AdminListPage, + AdminListToolbar, + AdminRowActions, + AdminSearchBox, +} from "@/shared/ui/AdminListLayout.jsx"; +import { AdminSwitch } from "@/shared/ui/AdminSwitch.jsx"; +import { DataState } from "@/shared/ui/DataState.jsx"; +import { DataTable } from "@/shared/ui/DataTable.jsx"; +import { formatMillis } from "@/shared/utils/time.js"; + +const enabledOptions = [ + ["", "全部状态"], + ["true", "启用"], + ["false", "关闭"], +]; + +export function ExploreConfigPage() { + const page = useExploreConfigPage(); + const items = page.data.items || []; + const columns = useMemo(() => exploreColumns(page), [page]); + const saving = page.loadingAction === "create" || page.loadingAction === "edit"; + + return ( + + } variant="primary" onClick={page.openCreate}> + 新增 Explore tab + + ) : null + } + filters={ + <> + + + + + } + /> + + + item.id} + /> + + + + + + + page.setForm({ tab: event.target.value })} + /> + page.setForm({ sortOrder: event.target.value })} + /> + page.setForm({ h5Url: event.target.value })} + /> + page.setForm({ enabled: checked })} + /> + + + + + ); +} + +function exploreColumns(page) { + const baseColumns = [ + { + key: "tab", + label: "tab", + width: "minmax(180px, 0.8fr)", + }, + { + key: "h5Url", + label: "H5链接", + render: (item) => {item.h5Url || "-"}, + width: "minmax(360px, 1.6fr)", + }, + { + key: "enabled", + label: "状态", + render: (item) => , + width: "minmax(120px, 0.5fr)", + }, + { + key: "sortOrder", + label: "排序", + render: (item) => item.sortOrder ?? 0, + width: "minmax(100px, 0.4fr)", + }, + { + key: "updatedAtMs", + label: "更新时间", + render: (item) => formatMillis(item.updatedAtMs), + width: "minmax(170px, 0.7fr)", + }, + ]; + + if (!page.abilities.canUpdate) { + return baseColumns; + } + + return [ + ...baseColumns, + { + key: "actions", + label: "操作", + render: (item) => , + width: "minmax(124px, 0.5fr)", + }, + ]; +} + +function ExploreStatusSwitch({ item, page }) { + const disabled = !page.abilities.canUpdate || page.loadingAction === `toggle:${item.id}`; + return ( +
+ page.toggleExploreTab(item, event.target.checked)} + /> +
+ ); +} + +function ExploreRowActions({ item, page }) { + return ( + + page.openEdit(item)}> + {item.h5Url ? : } + + page.removeExploreTab(item)} + > + + + + ); +} diff --git a/src/features/app-config/pages/H5ConfigPage.jsx b/src/features/app-config/pages/H5ConfigPage.jsx index b9b3bbb..9fddcb6 100644 --- a/src/features/app-config/pages/H5ConfigPage.jsx +++ b/src/features/app-config/pages/H5ConfigPage.jsx @@ -1,14 +1,18 @@ +import AddOutlined from "@mui/icons-material/AddOutlined"; +import DeleteOutlineOutlined from "@mui/icons-material/DeleteOutlineOutlined"; import EditOutlined from "@mui/icons-material/EditOutlined"; import LinkOutlined from "@mui/icons-material/LinkOutlined"; import TextField from "@mui/material/TextField"; import { formatMillis } from "@/shared/utils/time.js"; -import { AdminFormDialog, AdminFormSection } from "@/shared/ui/AdminFormDialog.jsx"; +import { AdminFormDialog, AdminFormFieldGrid, AdminFormSection } from "@/shared/ui/AdminFormDialog.jsx"; +import { Button } from "@/shared/ui/Button.jsx"; import { DataState } from "@/shared/ui/DataState.jsx"; import { DataTable } from "@/shared/ui/DataTable.jsx"; import { AdminActionIconButton, AdminListBody, AdminListPage, + AdminListToolbar, AdminRowActions } from "@/shared/ui/AdminListLayout.jsx"; import { useH5ConfigPage } from "@/features/app-config/hooks/useH5ConfigPage.js"; @@ -42,6 +46,7 @@ const baseColumns = [ export function H5ConfigPage() { const page = useH5ConfigPage(); const items = page.data.items || []; + const saving = page.loadingAction === "create" || page.loadingAction === "edit"; const columns = page.abilities.canUpdate ? [ ...baseColumns, @@ -49,39 +54,73 @@ export function H5ConfigPage() { key: "actions", label: "操作", render: (item) => , - width: "minmax(88px, 0.4fr)" + width: "minmax(124px, 0.5fr)" } ] : baseColumns; return ( + } variant="primary" onClick={page.openCreate}> + 新增H5配置 + + ) : null + } + /> - item.key} /> -
- {items.length} 条 -
+ item.key} + />
- page.setForm({ url: event.target.value })} - /> + + page.setForm({ ...page.form, label: event.target.value })} + /> + page.setForm({ ...page.form, key: event.target.value })} + /> + page.setForm({ ...page.form, url: event.target.value })} + /> +
@@ -94,6 +133,13 @@ function H5LinkActions({ item, page }) { page.openEdit(item)}> {item.url ? : } + page.removeH5Link(item)} + > + + ); } diff --git a/src/features/app-config/routes.js b/src/features/app-config/routes.js index 0836c7c..5c00b5f 100644 --- a/src/features/app-config/routes.js +++ b/src/features/app-config/routes.js @@ -17,6 +17,14 @@ export const appConfigRoutes = [ path: "/app-config/banners", permission: PERMISSIONS.appConfigView }, + { + label: "Explore配置", + loader: () => import("./pages/ExploreConfigPage.jsx").then((module) => module.ExploreConfigPage), + menuCode: MENU_CODES.appConfigExplore, + pageKey: "app-config-explore", + path: "/app-config/explore", + permission: PERMISSIONS.appConfigView + }, { label: "内购配置", loader: () => diff --git a/src/features/app-config/schema.test.ts b/src/features/app-config/schema.test.ts index 977de83..1dea04a 100644 --- a/src/features/app-config/schema.test.ts +++ b/src/features/app-config/schema.test.ts @@ -1,5 +1,5 @@ import { describe, expect, test } from "vitest"; -import { appBannerSchema } from "@/features/app-config/schema"; +import { appBannerSchema, exploreTabSchema, h5LinkUpdateSchema } from "@/features/app-config/schema"; import { FormValidationError, parseForm } from "@/shared/forms/validation"; const validBannerForm = { @@ -19,6 +19,27 @@ const validBannerForm = { }; describe("app config form schema", () => { + test("validates dynamic h5 config item", () => { + const payload = parseForm(h5LinkUpdateSchema, { + key: "host-center.v2", + label: "Host Center", + url: "https://h5.example.com/host", + }); + + expect(payload.key).toBe("host-center.v2"); + expect(payload.label).toBe("Host Center"); + }); + + test("rejects dynamic h5 config key with spaces", () => { + expect(() => + parseForm(h5LinkUpdateSchema, { + key: "host center", + label: "Host Center", + url: "https://h5.example.com/host", + }), + ).toThrow(FormValidationError); + }); + test("keeps banner display scope and delivery time fields", () => { const payload = parseForm(appBannerSchema, validBannerForm); @@ -46,4 +67,27 @@ describe("app config form schema", () => { }), ).toThrow(FormValidationError); }); + + test("validates explore tab h5 url and sort order", () => { + const payload = parseForm(exploreTabSchema, { + enabled: true, + h5Url: "https://h5.example.com/explore/live", + sortOrder: "3", + tab: "Live", + }); + + expect(payload.sortOrder).toBe(3); + expect(payload.h5Url).toBe("https://h5.example.com/explore/live"); + }); + + test("rejects explore tab url with whitespace", () => { + expect(() => + parseForm(exploreTabSchema, { + enabled: true, + h5Url: "https://h5.example.com/explore live", + sortOrder: "0", + tab: "Live", + }), + ).toThrow(FormValidationError); + }); }); diff --git a/src/features/app-config/schema.ts b/src/features/app-config/schema.ts index 73e1d91..50718d6 100644 --- a/src/features/app-config/schema.ts +++ b/src/features/app-config/schema.ts @@ -1,20 +1,36 @@ import { z } from "zod"; -import { H5_LINK_KEYS } from "@/features/app-config/constants"; -const h5LinkURLSchema = z +const requiredH5LinkURLSchema = z .string() .trim() + .min(1, "请填写 H5 链接") .max(2048, "H5 链接不能超过 2048 个字符") - .refine((value) => !/\s/.test(value), "H5 链接不能包含空白字符") - .default(""); + .refine((value) => !/\s/.test(value), "H5 链接不能包含空白字符"); + +const h5LinkKeySchema = z + .string() + .trim() + .min(1, "请填写 key") + .max(80, "key 不能超过 80 个字符") + .regex(/^[A-Za-z0-9_.:-]+$/, "key 只能包含字母、数字、下划线、中横线、点和冒号"); export const h5LinkUpdateSchema = z.object({ - key: z.enum(H5_LINK_KEYS), - url: h5LinkURLSchema, + key: h5LinkKeySchema, + label: z.string().trim().min(1, "请填写配置项").max(80, "配置项不能超过 80 个字符"), + url: requiredH5LinkURLSchema, }); export type H5LinkUpdateForm = z.infer; +export const exploreTabSchema = z.object({ + enabled: z.boolean(), + h5Url: requiredH5LinkURLSchema, + sortOrder: z.coerce.number().int("排序必须是整数").default(0), + tab: z.string().trim().min(1, "请填写 tab").max(40, "tab 不能超过 40 个字符"), +}); + +export type ExploreTabForm = z.infer; + export const appBannerSchema = z .object({ bannerType: z.enum(["h5", "app"]), diff --git a/src/features/games/api.ts b/src/features/games/api.ts index 75ce2d3..ab4e920 100644 --- a/src/features/games/api.ts +++ b/src/features/games/api.ts @@ -46,6 +46,8 @@ export interface GameCatalogPage { nextCursor?: string; pageSize?: number; serverTimeMs?: number; + total?: number; + totalPages?: number; } export interface GamePlatformPage { diff --git a/src/features/games/games.module.css b/src/features/games/games.module.css index 23ea8db..ad82b01 100644 --- a/src/features/games/games.module.css +++ b/src/features/games/games.module.css @@ -31,8 +31,7 @@ white-space: nowrap; } -.meta, -.tags { +.meta { overflow: hidden; color: var(--text-tertiary); font-size: 12px; @@ -40,10 +39,6 @@ white-space: nowrap; } -.tags { - color: var(--text-secondary); -} - .secretMeta { font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; overflow-wrap: anywhere; diff --git a/src/features/games/hooks/useGamesPage.js b/src/features/games/hooks/useGamesPage.js index 0e01581..078bede 100644 --- a/src/features/games/hooks/useGamesPage.js +++ b/src/features/games/hooks/useGamesPage.js @@ -1,4 +1,4 @@ -import { useCallback, useEffect, useMemo, useState } from "react"; +import { useCallback, useEffect, useMemo, useRef, useState } from "react"; import { deleteGameCatalog, listGameCatalog, @@ -57,9 +57,12 @@ export function useGamesPage() { const { showToast } = useToast(); const [platformCode, setPlatformCode] = useState(""); const [status, setStatus] = useState(""); - const [page, setPage] = useState(1); - const [pageCursors, setPageCursors] = useState({ 1: "" }); const [pageSize, setPageSize] = useState(defaultPageSize); + const [catalogItems, setCatalogItems] = useState([]); + const [catalogMeta, setCatalogMeta] = useState(emptyCatalog); + const [catalogError, setCatalogError] = useState(""); + const [catalogLoading, setCatalogLoading] = useState(true); + const [catalogLoadingMore, setCatalogLoadingMore] = useState(false); const [activeAction, setActiveAction] = useState(""); const [editingGameId, setEditingGameId] = useState(""); const [editingPlatformCode, setEditingPlatformCode] = useState(""); @@ -69,6 +72,7 @@ export function useGamesPage() { const [syncPlatform, setSyncPlatform] = useState(null); const [syncCandidates, setSyncCandidates] = useState([]); const [selectedSyncGameIds, setSelectedSyncGameIds] = useState([]); + const catalogRequestRef = useRef(0); const platformsQueryFn = useCallback(() => listGamePlatforms(), []); const { @@ -82,26 +86,52 @@ export function useGamesPage() { queryKey: ["games", "platforms"], }); - const catalogQueryFn = useCallback( - () => listGameCatalog({ cursor: pageCursors[page] || "", platformCode, status, pageSize }), - [page, pageCursors, pageSize, platformCode, status], + const loadCatalog = useCallback( + async (cursor = "", append = false) => { + const requestId = catalogRequestRef.current + 1; + catalogRequestRef.current = requestId; + if (append) { + setCatalogLoadingMore(true); + } else { + setCatalogLoading(true); + } + setCatalogError(""); + + try { + const result = await listGameCatalog({ cursor, platformCode, status, pageSize }); + if (catalogRequestRef.current !== requestId) { + return result; + } + setCatalogMeta(result); + setCatalogItems((current) => (append ? mergeCatalogItems(current, result.items || []) : result.items || [])); + return result; + } catch (err) { + if (catalogRequestRef.current === requestId) { + setCatalogError(err.message || "加载游戏列表失败"); + } + return null; + } finally { + if (catalogRequestRef.current === requestId) { + setCatalogLoading(false); + setCatalogLoadingMore(false); + } + } + }, + [pageSize, platformCode, status], ); - const { - data = emptyCatalog, - error, - loading, - reload, - } = useAdminQuery(catalogQueryFn, { - errorMessage: "加载游戏列表失败", - initialData: emptyCatalog, - keepPreviousData: true, - queryKey: ["games", "catalog", platformCode, status, pageSize, page, pageCursors[page] || ""], - }); + + useEffect(() => { + loadCatalog("", false); + }, [loadCatalog]); const platformOptions = useMemo( () => (platformData.items || []).map((platform) => [platform.platformCode, platform.platformName]), [platformData.items], ); + const resolveGameURL = useCallback( + (game) => resolveGameURLFromPlatforms(platformData.items || [], game), + [platformData.items], + ); useEffect(() => { if (!gameForm.platformCode && platformOptions.length > 0 && activeAction === "create-game") { @@ -110,8 +140,8 @@ export function useGamesPage() { }, [activeAction, gameForm.platformCode, platformOptions]); const resetCatalogPage = () => { - setPage(1); - setPageCursors({ 1: "" }); + setCatalogItems([]); + setCatalogMeta(emptyCatalog); }; const changePlatformCode = (value) => { @@ -129,17 +159,15 @@ export function useGamesPage() { resetCatalogPage(); }; - const changePage = (nextPage) => { - if (nextPage < 1 || nextPage === page) { - return; + const loadNextPage = () => { + if (!catalogMeta.nextCursor || catalogLoading || catalogLoadingMore) { + return null; } - if (nextPage === page + 1) { - if (!data.nextCursor) { - return; - } - setPageCursors((current) => ({ ...current, [nextPage]: data.nextCursor })); - } - setPage(nextPage); + return loadCatalog(catalogMeta.nextCursor, true); + }; + + const reloadCatalog = () => { + return loadCatalog("", false); }; const resetFilters = () => { @@ -196,7 +224,7 @@ export function useGamesPage() { await upsertGameCatalog(payload, editingGameId); await saveGameUrl(platformData.items || [], payload, gameForm.gameUrl); await reloadPlatforms(); - await reload(); + await reloadCatalog(); showToast(editingGameId ? "游戏已更新" : "游戏已创建", "success"); closeAction(); } catch (err) { @@ -219,7 +247,7 @@ export function useGamesPage() { try { await upsertGamePlatform(payload, editingPlatformCode); await reloadPlatforms(); - await reload(); + await reloadCatalog(); showToast(editingPlatformCode ? "平台已更新" : "平台已创建", "success"); closeAction(); } catch (err) { @@ -234,7 +262,7 @@ export function useGamesPage() { setLoadingAction(`status-${game.gameId}`); try { await setGameStatus(game.gameId, nextStatus); - await reload(); + await reloadCatalog(); showToast("游戏状态已更新", "success"); } catch (err) { showToast(err.message || "状态更新失败", "error"); @@ -256,7 +284,7 @@ export function useGamesPage() { setLoadingAction(`delete-${game.gameId}`); try { await deleteGameCatalog(game.gameId); - await reload(); + await reloadCatalog(); showToast("游戏已删除", "success"); } catch (err) { showToast(err.message || "删除游戏失败", "error"); @@ -315,7 +343,7 @@ export function useGamesPage() { status: "disabled", }); await reloadPlatforms(); - await reload(); + await reloadCatalog(); showToast(`已添加 ${result.synced} 个游戏,默认下架`, "success"); closeAction(); } catch (err) { @@ -336,7 +364,7 @@ export function useGamesPage() { status: "disabled", }); await reloadPlatforms(); - await reload(); + await reloadCatalog(); setSelectedSyncGameIds((current) => current.filter((item) => item !== game.providerGameId)); setSyncCandidates((current) => current.filter((item) => item.providerGameId !== game.providerGameId)); showToast("游戏已添加,默认下架", "success"); @@ -354,12 +382,18 @@ export function useGamesPage() { changeGameStatus, deleteGame, closeAction, - data, - error: error || platformError, + data: { + ...catalogMeta, + items: catalogItems, + loadedCount: catalogItems.length, + loadedPages: Math.max(1, Math.ceil(catalogItems.length / pageSize)), + }, + error: catalogError || platformError, gameForm, - loading: loading || platformsLoading, + loading: (catalogLoading && catalogItems.length === 0) || platformsLoading, loadingAction, - page, + loadingMore: catalogLoadingMore || (catalogLoading && catalogItems.length > 0), + page: Math.max(1, Math.ceil(catalogItems.length / pageSize)), fetchPlatformGames, importSelectedSyncGames, importSingleSyncGame, @@ -373,9 +407,10 @@ export function useGamesPage() { platformData, platformForm, platformOptions, - reload, + loadNextPage, + reload: reloadCatalog, resetFilters, - changePage, + resolveGameURL, changePageSize, setGameForm, setPlatformCode: changePlatformCode, @@ -392,6 +427,18 @@ export function useGamesPage() { }; } +function mergeCatalogItems(current, nextItems) { + const seen = new Set(); + return [...current, ...nextItems].filter((item) => { + const key = item.gameId || `${item.platformCode}:${item.providerGameId}`; + if (seen.has(key)) { + return false; + } + seen.add(key); + return true; + }); +} + async function saveGameUrl(platforms, game, gameUrl) { const platform = platforms.find((item) => item.platformCode === game.platformCode); if (!platform) { diff --git a/src/features/games/pages/GameListPage.jsx b/src/features/games/pages/GameListPage.jsx index e82d42d..4ad095d 100644 --- a/src/features/games/pages/GameListPage.jsx +++ b/src/features/games/pages/GameListPage.jsx @@ -168,16 +168,24 @@ export function GameListPage() { game.gameId} /> @@ -222,7 +230,6 @@ function GameIdentity({ game }) {
{game.gameName || game.gameId} {game.gameId} - {(game.tags || []).slice(0, 3).join(" / ")}
); diff --git a/src/features/lucky-gift/api.ts b/src/features/lucky-gift/api.ts index 56fad1c..66bc6cd 100644 --- a/src/features/lucky-gift/api.ts +++ b/src/features/lucky-gift/api.ts @@ -1,6 +1,5 @@ import { apiRequest } from "@/shared/api/request"; import { API_ENDPOINTS, API_OPERATIONS, apiEndpointPath } from "@/shared/api/generated/endpoints"; -import type { ApiPage, PageQuery } from "@/shared/api/types"; export interface LuckyGiftTierDto { pool: string; @@ -99,32 +98,26 @@ export interface LuckyGiftConfigPayload { }>; } -export interface LuckyGiftDrawDto { - drawId: string; - commandId?: string; +export interface LuckyGiftDrawSummaryDto { poolId: string; - giftId: string; - ruleVersion: number; - experiencePool: string; - selectedTierId: string; + totalDraws: number; + uniqueUsers: number; + uniqueRooms: number; + totalSpentCoins: number; + totalRewardCoins: number; baseRewardCoins: number; roomAtmosphereRewardCoins: number; activitySubsidyCoins: number; - effectiveRewardCoins: number; - budgetSourcesJson?: string; - rewardStatus?: string; - rtpWindowIndex: number; - giftRTPWindowIndex: number; - globalBaseRTPPPM: number; - giftBaseRTPPPM: number; - stageFeedback: boolean; - highMultiplier: boolean; - createdAtMs?: number; + actualRTPPPM: number; + pendingDraws: number; + grantedDraws: number; + failedDraws: number; } type RawConfig = LuckyGiftConfigDto & Record; type RawTier = LuckyGiftTierDto & Record; -type RawDraw = LuckyGiftDrawDto & Record; +type RawSummary = LuckyGiftDrawSummaryDto & Record; +type LuckyGiftDrawSummaryQuery = Record; export function getLuckyGiftConfig(poolId: string): Promise { const endpoint = API_ENDPOINTS.getLuckyGiftConfig; @@ -143,25 +136,19 @@ export function listLuckyGiftConfigs(): Promise { export function updateLuckyGiftConfig(payload: LuckyGiftConfigPayload): Promise { const endpoint = API_ENDPOINTS.upsertLuckyGiftConfig; - return apiRequest( - apiEndpointPath(API_OPERATIONS.upsertLuckyGiftConfig), - { - body: payload, - method: endpoint.method, - query: { pool_id: payload.pool_id }, - }, - ).then(normalizeConfig); + return apiRequest(apiEndpointPath(API_OPERATIONS.upsertLuckyGiftConfig), { + body: payload, + method: endpoint.method, + query: { pool_id: payload.pool_id }, + }).then(normalizeConfig); } -export function listLuckyGiftDraws(query: PageQuery = {}): Promise> { - const endpoint = API_ENDPOINTS.listLuckyGiftDraws; - return apiRequest>(apiEndpointPath(API_OPERATIONS.listLuckyGiftDraws), { +export function getLuckyGiftDrawSummary(query: LuckyGiftDrawSummaryQuery = {}): Promise { + const endpoint = API_ENDPOINTS.getLuckyGiftDrawSummary; + return apiRequest(apiEndpointPath(API_OPERATIONS.getLuckyGiftDrawSummary), { method: endpoint.method, query, - }).then((page) => ({ - ...page, - items: (page.items || []).map(normalizeDraw), - })); + }).then(normalizeSummary); } function normalizeConfig(item: RawConfig): LuckyGiftConfigDto { @@ -221,30 +208,21 @@ function normalizeTier(raw: unknown): LuckyGiftTierDto { }; } -function normalizeDraw(item: RawDraw): LuckyGiftDrawDto { +function normalizeSummary(item: RawSummary): LuckyGiftDrawSummaryDto { return { - drawId: stringValue(item.drawId ?? item.draw_id), - commandId: stringValue(item.commandId ?? item.command_id), poolId: stringValue(item.poolId ?? item.pool_id), - giftId: stringValue(item.giftId ?? item.gift_id), - ruleVersion: numberValue(item.ruleVersion ?? item.rule_version), - experiencePool: stringValue(item.experiencePool ?? item.experience_pool), - selectedTierId: stringValue(item.selectedTierId ?? item.selected_tier_id), + totalDraws: numberValue(item.totalDraws ?? item.total_draws), + uniqueUsers: numberValue(item.uniqueUsers ?? item.unique_users), + uniqueRooms: numberValue(item.uniqueRooms ?? item.unique_rooms), + totalSpentCoins: numberValue(item.totalSpentCoins ?? item.total_spent_coins), + totalRewardCoins: numberValue(item.totalRewardCoins ?? item.total_reward_coins), baseRewardCoins: numberValue(item.baseRewardCoins ?? item.base_reward_coins), - roomAtmosphereRewardCoins: numberValue( - item.roomAtmosphereRewardCoins ?? item.room_atmosphere_reward_coins, - ), + roomAtmosphereRewardCoins: numberValue(item.roomAtmosphereRewardCoins ?? item.room_atmosphere_reward_coins), activitySubsidyCoins: numberValue(item.activitySubsidyCoins ?? item.activity_subsidy_coins), - effectiveRewardCoins: numberValue(item.effectiveRewardCoins ?? item.effective_reward_coins), - budgetSourcesJson: stringValue(item.budgetSourcesJson ?? item.budget_sources_json), - rewardStatus: stringValue(item.rewardStatus ?? item.reward_status), - rtpWindowIndex: numberValue(item.rtpWindowIndex ?? item.rtp_window_index), - giftRTPWindowIndex: numberValue(item.giftRTPWindowIndex ?? item.gift_rtp_window_index), - globalBaseRTPPPM: numberValue(item.globalBaseRTPPPM ?? item.global_base_rtp_ppm), - giftBaseRTPPPM: numberValue(item.giftBaseRTPPPM ?? item.gift_base_rtp_ppm), - stageFeedback: booleanValue(item.stageFeedback ?? item.stage_feedback), - highMultiplier: booleanValue(item.highMultiplier ?? item.high_multiplier), - createdAtMs: numberValue(item.createdAtMs ?? item.created_at_ms), + actualRTPPPM: numberValue(item.actualRTPPPM ?? item.actual_rtp_ppm), + pendingDraws: numberValue(item.pendingDraws ?? item.pending_draws), + grantedDraws: numberValue(item.grantedDraws ?? item.granted_draws), + failedDraws: numberValue(item.failedDraws ?? item.failed_draws), }; } diff --git a/src/features/lucky-gift/components/LuckyGiftSimulationPanel.jsx b/src/features/lucky-gift/components/LuckyGiftSimulationPanel.jsx index 57204ac..01e3662 100644 --- a/src/features/lucky-gift/components/LuckyGiftSimulationPanel.jsx +++ b/src/features/lucky-gift/components/LuckyGiftSimulationPanel.jsx @@ -1,5 +1,7 @@ import PlayArrowOutlined from "@mui/icons-material/PlayArrowOutlined"; import DownloadOutlined from "@mui/icons-material/DownloadOutlined"; +import ExpandLessOutlined from "@mui/icons-material/ExpandLessOutlined"; +import ExpandMoreOutlined from "@mui/icons-material/ExpandMoreOutlined"; import TextField from "@mui/material/TextField"; import { useEffect, useState } from "react"; import { Button } from "@/shared/ui/Button.jsx"; @@ -26,6 +28,7 @@ const defaultInput = { }; export function LuckyGiftSimulationPanel({ config }) { + const [expanded, setExpanded] = useState(false); const [input, setInput] = useState(defaultInput); const [result, setResult] = useState(null); const [csvUrl, setCsvUrl] = useState(""); @@ -59,61 +62,89 @@ export function LuckyGiftSimulationPanel({ config }) { 随机模拟测试
- - {csvUrl ? ( - + {expanded ? ( + <> + + {csvUrl ? ( + + ) : null} + ) : null} +
-
- updateInput(setInput, "users", value)} - /> - updateInput(setInput, "rooms", value)} - /> - updateInput(setInput, "costMin", value)} - /> - updateInput(setInput, "costMax", value)} - /> - updateInput(setInput, "drawsMin", value)} - /> - updateInput(setInput, "drawsMax", value)} - /> -
- {result ? : null} + {expanded ? ( + <> +
+ updateInput(setInput, "users", value)} + /> + updateInput(setInput, "rooms", value)} + /> + updateInput(setInput, "costMin", value)} + /> + updateInput(setInput, "costMax", value)} + /> + updateInput(setInput, "drawsMin", value)} + /> + updateInput(setInput, "drawsMax", value)} + /> +
+ {result ? : null} + + ) : null} ); } diff --git a/src/features/lucky-gift/hooks/useLuckyGiftPage.js b/src/features/lucky-gift/hooks/useLuckyGiftPage.js index 7957663..49dae56 100644 --- a/src/features/lucky-gift/hooks/useLuckyGiftPage.js +++ b/src/features/lucky-gift/hooks/useLuckyGiftPage.js @@ -1,15 +1,32 @@ import { useCallback, useEffect, useMemo, useState } from "react"; import { parseForm } from "@/shared/forms/validation"; -import { usePaginatedQuery } from "@/shared/hooks/usePaginatedQuery.js"; import { useToast } from "@/shared/ui/ToastProvider.jsx"; -import { getLuckyGiftConfig, listLuckyGiftConfigs, listLuckyGiftDraws, updateLuckyGiftConfig } from "@/features/lucky-gift/api"; +import { + getLuckyGiftConfig, + getLuckyGiftDrawSummary, + listLuckyGiftConfigs, + updateLuckyGiftConfig, +} from "@/features/lucky-gift/api"; import { emptyLuckyGiftForm, formFromConfig, payloadFromLuckyGiftForm } from "@/features/lucky-gift/configModel.js"; import { useLuckyGiftAbilities } from "@/features/lucky-gift/permissions.js"; import { luckyGiftConfigFormSchema } from "@/features/lucky-gift/schema"; -const pageSize = 10; -const emptyDraws = { items: [], page: 1, pageSize, total: 0 }; const defaultPoolId = "default"; +const emptySummary = { + actualRTPPPM: 0, + activitySubsidyCoins: 0, + baseRewardCoins: 0, + failedDraws: 0, + grantedDraws: 0, + pendingDraws: 0, + poolId: defaultPoolId, + roomAtmosphereRewardCoins: 0, + totalDraws: 0, + totalRewardCoins: 0, + totalSpentCoins: 0, + uniqueRooms: 0, + uniqueUsers: 0, +}; export function useLuckyGiftPage() { const abilities = useLuckyGiftAbilities(); @@ -27,25 +44,14 @@ export function useLuckyGiftPage() { const [userId, setUserId] = useState(""); const [roomId, setRoomId] = useState(""); const [status, setStatus] = useState(""); - const [page, setPage] = useState(1); + const [drawSummary, setDrawSummary] = useState(emptySummary); + const [drawSummaryLoading, setDrawSummaryLoading] = useState(false); + const [drawSummaryError, setDrawSummaryError] = useState(""); const drawFilters = useMemo( () => ({ gift_id: giftId, pool_id: poolId, room_id: roomId, status, user_id: userId }), [giftId, poolId, roomId, status, userId], ); - const { - data: draws = emptyDraws, - error: drawsError, - loading: drawsLoading, - reload: reloadDraws, - } = usePaginatedQuery({ - errorMessage: "加载幸运礼物记录失败", - fetcher: listLuckyGiftDraws, - filters: drawFilters, - page, - pageSize, - queryKey: ["lucky-gift-draws", drawFilters, page], - }); const poolOptions = useMemo(() => { const ids = new Set([poolId]); for (const item of configs) { @@ -56,6 +62,23 @@ export function useLuckyGiftPage() { return Array.from(ids); }, [configs, poolId]); + const reloadDrawSummary = useCallback(async () => { + setDrawSummaryLoading(true); + setDrawSummaryError(""); + try { + const summary = await getLuckyGiftDrawSummary(drawFilters); + setDrawSummary(summary); + } catch (err) { + setDrawSummaryError(err.message || "加载幸运礼物抽奖汇总失败"); + } finally { + setDrawSummaryLoading(false); + } + }, [drawFilters]); + + useEffect(() => { + void reloadDrawSummary(); + }, [reloadDrawSummary]); + const reloadConfigs = useCallback(async () => { try { const nextConfigs = await listLuckyGiftConfigs(); @@ -111,7 +134,7 @@ export function useLuckyGiftPage() { setPoolId(saved.poolId || poolId); setConfigDrawerOpen(false); showToast("幸运礼物配置已保存", "success"); - await reloadDraws(); + await reloadDrawSummary(); } catch (err) { showToast(err.message || "保存幸运礼物配置失败", "error"); } finally { @@ -121,11 +144,9 @@ export function useLuckyGiftPage() { const changeGiftId = (value) => { setGiftId(value); - setPage(1); }; const changePoolId = (value) => { setPoolId(value.trim() || defaultPoolId); - setPage(1); }; const openAddPool = () => { setAddPoolId(""); @@ -148,26 +169,21 @@ export function useLuckyGiftPage() { setAddPoolOpen(false); setAddPoolId(""); setConfigDrawerOpen(true); - setPage(1); }; const changeUserId = (value) => { setUserId(value); - setPage(1); }; const changeRoomId = (value) => { setRoomId(value); - setPage(1); }; const changeStatus = (value) => { setStatus(value); - setPage(1); }; const resetDrawFilters = () => { setGiftId(""); setUserId(""); setRoomId(""); setStatus(""); - setPage(1); }; return { @@ -185,24 +201,22 @@ export function useLuckyGiftPage() { configDrawerOpen, configLoading, configSaving, - draws, - drawsError, - drawsLoading, + drawSummary, + drawSummaryError, + drawSummaryLoading, form, giftId, openConfigDrawer, openAddPool, - page, poolId, poolOptions, reloadConfig, reloadConfigs, - reloadDraws, + reloadDrawSummary, resetDrawFilters, roomId, setForm, setAddPoolId, - setPage, status, submitConfig, submitAddPool, diff --git a/src/features/lucky-gift/lucky-gift.module.css b/src/features/lucky-gift/lucky-gift.module.css index 782ae8a..8330cb9 100644 --- a/src/features/lucky-gift/lucky-gift.module.css +++ b/src/features/lucky-gift/lucky-gift.module.css @@ -237,6 +237,52 @@ gap: var(--space-3); } +.drawSummaryPanel { + display: grid; + gap: var(--space-4); + padding: var(--space-4) var(--space-5); +} + +.drawSummaryHeader { + display: flex; + min-width: 0; + align-items: center; + justify-content: space-between; + gap: var(--space-3); +} + +.sectionTitle { + margin: 0; + color: var(--text-primary); + font-size: 18px; + font-weight: 760; + line-height: 1.35; +} + +.drawSummaryFilters { + display: flex; + min-width: 0; + flex-wrap: wrap; + align-items: center; + gap: var(--space-3); +} + +.drawSummaryGrid { + display: grid; + grid-template-columns: repeat(3, minmax(180px, 1fr)); + gap: var(--space-3); +} + +.summaryError { + display: flex; + min-height: 120px; + align-items: center; + justify-content: center; + gap: var(--space-3); + color: var(--text-secondary); + font-weight: 650; +} + .metricItem { display: grid; min-width: 0; @@ -264,6 +310,15 @@ white-space: nowrap; } +.metricItem small { + overflow: hidden; + color: var(--text-tertiary); + font-size: 12px; + line-height: 1.4; + text-overflow: ellipsis; + white-space: nowrap; +} + .stack { display: grid; min-width: 0; @@ -306,8 +361,14 @@ flex-direction: column; } + .drawSummaryHeader { + align-items: flex-start; + flex-direction: column; + } + .simulationGrid, .simulationOverview, + .drawSummaryGrid, .multiplierList { grid-template-columns: repeat(2, minmax(140px, 1fr)); } @@ -317,7 +378,8 @@ .configGrid, .subsidyInputs, .simulationGrid, - .simulationOverview { + .simulationOverview, + .drawSummaryGrid { grid-template-columns: minmax(0, 1fr); } } diff --git a/src/features/lucky-gift/pages/LuckyGiftConfigPage.jsx b/src/features/lucky-gift/pages/LuckyGiftConfigPage.jsx index 7d84685..97d6a78 100644 --- a/src/features/lucky-gift/pages/LuckyGiftConfigPage.jsx +++ b/src/features/lucky-gift/pages/LuckyGiftConfigPage.jsx @@ -2,6 +2,7 @@ import Dialog from "@mui/material/Dialog"; import DialogActions from "@mui/material/DialogActions"; import DialogContent from "@mui/material/DialogContent"; import DialogTitle from "@mui/material/DialogTitle"; +import RefreshOutlined from "@mui/icons-material/RefreshOutlined"; import TextField from "@mui/material/TextField"; import { LuckyGiftConfigDrawer } from "@/features/lucky-gift/components/LuckyGiftConfigDrawer.jsx"; import { LuckyGiftConfigSummary } from "@/features/lucky-gift/components/LuckyGiftConfigSummary.jsx"; @@ -9,90 +10,11 @@ import { LuckyGiftSimulationPanel } from "@/features/lucky-gift/components/Lucky import { drawStatusOptions } from "@/features/lucky-gift/constants.js"; import { useLuckyGiftPage } from "@/features/lucky-gift/hooks/useLuckyGiftPage.js"; import styles from "@/features/lucky-gift/lucky-gift.module.css"; -import { - AdminFilterResetButton, - AdminFilterSelect, - AdminListBody, - AdminListPage, - AdminListToolbar, -} from "@/shared/ui/AdminListLayout.jsx"; +import { AdminFilterResetButton, AdminFilterSelect, AdminListPage } from "@/shared/ui/AdminListLayout.jsx"; import { Button } from "@/shared/ui/Button.jsx"; -import { DataState } from "@/shared/ui/DataState.jsx"; -import { DataTable } from "@/shared/ui/DataTable.jsx"; -import { formatMillis } from "@/shared/utils/time.js"; - -const columnsBase = [ - { - key: "draw", - label: "抽奖记录", - width: "minmax(260px, 1.2fr)", - render: (draw) => ( -
- {draw.drawId} - - {draw.poolId ? `${draw.poolId} / ` : ""} - {draw.giftId || draw.commandId || "-"} - -
- ), - }, - { - key: "reward", - label: "奖励", - width: "minmax(180px, 0.8fr)", - render: (draw) => ( -
- {formatNumber(draw.effectiveRewardCoins)} - {draw.selectedTierId || "-"} -
- ), - }, - { - key: "pool", - label: "体验池", - width: "minmax(120px, 0.55fr)", - render: (draw) => poolLabel(draw.experiencePool), - }, - { - key: "status", - label: "状态", - width: "minmax(120px, 0.55fr)", - render: (draw) => , - }, - { - key: "rtp", - label: "窗口 RTP", - width: "minmax(160px, 0.7fr)", - render: (draw) => ( -
- {formatPPM(draw.globalBaseRTPPPM)} - 整体 {formatPPM(draw.giftBaseRTPPPM)} -
- ), - }, - { - key: "source", - label: "预算来源", - width: "minmax(180px, 0.8fr)", - render: (draw) => budgetSourceLabel(draw), - }, - { - key: "flags", - label: "标记", - width: "minmax(150px, 0.65fr)", - render: (draw) => flagLabel(draw), - }, - { - key: "createdAtMs", - label: "时间", - width: "minmax(180px, 0.85fr)", - render: (draw) => formatMillis(draw.createdAtMs), - }, -]; export function LuckyGiftConfigPage() { const page = useLuckyGiftPage(); - const total = page.draws.total || 0; return ( @@ -108,66 +30,7 @@ export function LuckyGiftConfigPage() { onRefresh={page.reloadConfig} /> - - - page.changeGiftId(event.target.value)} - /> - page.changeUserId(event.target.value)} - /> - page.changeRoomId(event.target.value)} - /> - - - - } - /> - - - 0 - ? { - page: page.page, - pageSize: page.draws.pageSize || 10, - total, - onPageChange: page.setPage, - } - : undefined - } - rowKey={(draw) => draw.drawId} - /> - - + +
+
+

抽奖数据概览

+ 奖池 {summary.poolId || page.poolId} +
+ +
+
+ + page.changeGiftId(event.target.value)} + /> + page.changeUserId(event.target.value)} + /> + page.changeRoomId(event.target.value)} + /> + + +
+ {page.drawSummaryError ? ( +
+ {page.drawSummaryError} + +
+ ) : ( +
+ {stats.map((item) => ( +
+ {item.label} + {page.drawSummaryLoading ? "-" : item.value} + {page.drawSummaryLoading ? "" : item.hint} +
+ ))} +
+ )} + + ); +} + function AddPoolDialog({ disabled, onChange, onClose, onSubmit, open, value }) { return ( @@ -220,53 +189,6 @@ function AddPoolDialog({ disabled, onChange, onClose, onSubmit, open, value }) { ); } -function DrawStatus({ status }) { - const tone = status === "granted" ? "running" : status === "failed" ? "danger" : "warning"; - return ( - - - {drawStatusOptions.find(([value]) => value === status)?.[1] || status || "-"} - - ); -} - -function poolLabel(value) { - if (value === "novice") { - return "新手池"; - } - if (value === "intermediate") { - return "中级池"; - } - if (value === "advanced") { - return "高级池"; - } - return value || "-"; -} - -function flagLabel(draw) { - const labels = []; - if (draw.highMultiplier) { - labels.push("高倍"); - } - if (draw.stageFeedback) { - labels.push("阶段反馈"); - } - return labels.length ? labels.join(" / ") : "-"; -} - -function budgetSourceLabel(draw) { - if (draw.activitySubsidyCoins > 0) { - return "活动补贴"; - } - if (draw.roomAtmosphereRewardCoins > 0) { - return "房间气氛"; - } - if (draw.baseRewardCoins > 0) { - return "基础 RTP"; - } - return "-"; -} - function formatPPM(value) { return `${(Number(value || 0) / 10_000).toFixed(2).replace(/\.?0+$/, "")}%`; } diff --git a/src/features/resources/api.test.ts b/src/features/resources/api.test.ts index 83569b6..8f2cef6 100644 --- a/src/features/resources/api.test.ts +++ b/src/features/resources/api.test.ts @@ -42,24 +42,26 @@ test("resource APIs use generated admin paths", async () => { await createResource({ amount: 0, assetUrl: "https://media.haiyihy.com/resource/material.png", + badgeForm: "strip", coinPrice: 10, - name: "Rose", + name: "VIP Badge", previewUrl: "https://media.haiyihy.com/resource/cover.png", priceType: "coin", - resourceCode: "gift_rose_test", - resourceType: "gift", + resourceCode: "badge_vip_test", + resourceType: "badge", sortOrder: 0, status: "active", }); await updateResource(11, { amount: 0, assetUrl: "https://media.haiyihy.com/resource/material-updated.png", + badgeForm: "tile", coinPrice: 20, - name: "Rose Updated", + name: "VIP Badge Updated", previewUrl: "https://media.haiyihy.com/resource/cover-updated.png", priceType: "coin", - resourceCode: "gift_rose_test", - resourceType: "gift", + resourceCode: "badge_vip_test", + resourceType: "badge", sortOrder: 0, status: "active", }); @@ -177,9 +179,15 @@ test("resource APIs use generated admin paths", async () => { expect(listInit?.method).toBe("GET"); expect(String(createUrl)).toContain("/api/v1/admin/resources"); expect(createInit?.method).toBe("POST"); - expect(JSON.parse(String(createInit?.body))).toMatchObject({ resourceCode: "gift_rose_test", status: "active" }); + expect(JSON.parse(String(createInit?.body))).toMatchObject({ + badgeForm: "strip", + resourceCode: "badge_vip_test", + resourceType: "badge", + status: "active", + }); expect(String(updateUrl)).toContain("/api/v1/admin/resources/11"); expect(updateInit?.method).toBe("PUT"); + expect(JSON.parse(String(updateInit?.body))).toMatchObject({ badgeForm: "tile" }); expect(String(giftListUrl)).toContain("/api/v1/admin/gifts?"); expect(String(giftListUrl)).toContain("region_id=1001"); expect(giftListInit?.method).toBe("GET"); diff --git a/src/features/resources/api.ts b/src/features/resources/api.ts index b987f00..f789f7b 100644 --- a/src/features/resources/api.ts +++ b/src/features/resources/api.ts @@ -16,6 +16,7 @@ export interface ResourceDto { priceType?: string; coinPrice?: number; giftPointAmount?: number; + badgeForm?: string; usageScopes?: string[]; assetUrl?: string; previewUrl?: string; @@ -30,6 +31,7 @@ export interface ResourcePayload { amount: number; animationUrl?: string; assetUrl: string; + badgeForm?: string; coinPrice: number; name: string; previewUrl: string; diff --git a/src/features/resources/constants.js b/src/features/resources/constants.js index 02afcbf..60c5c3b 100644 --- a/src/features/resources/constants.js +++ b/src/features/resources/constants.js @@ -48,6 +48,13 @@ export const resourcePriceTypeOptions = [ export const resourcePriceTypeLabels = Object.fromEntries(resourcePriceTypeOptions); +export const badgeFormOptions = [ + ["strip", "长徽章"], + ["tile", "短徽章"], +]; + +export const badgeFormLabels = Object.fromEntries(badgeFormOptions); + export const resourceTypeFilters = [ ["", "全部类型"], ["avatar_frame", "头像框"], diff --git a/src/features/resources/hooks/useResourcePages.js b/src/features/resources/hooks/useResourcePages.js index 5e1b74e..0aeb22d 100644 --- a/src/features/resources/hooks/useResourcePages.js +++ b/src/features/resources/hooks/useResourcePages.js @@ -44,6 +44,7 @@ const dayMillis = 24 * 60 * 60 * 1000; const emptyData = { items: [], page: 1, pageSize, total: 0 }; const emptyResourceForm = (resource = {}) => ({ animationUrl: resource.animationUrl || resource.assetUrl || "", + badgeForm: resource.resourceType === "badge" ? resource.badgeForm || badgeFormFromMetadata(resource.metadataJson) || "tile" : "tile", coinPrice: resource.coinPrice === 0 || resource.coinPrice ? String(resource.coinPrice) : "", enabled: resource.status ? resource.status === "active" : true, name: resource.name || "", @@ -1022,6 +1023,7 @@ function buildResourcePayload(form) { amount: isCoin ? Number(form.walletAssetAmount) : 0, animationUrl, assetUrl: animationUrl, + badgeForm: resourceType === "badge" ? form.badgeForm : undefined, coinPrice: form.priceType === "coin" ? Number(form.coinPrice) : 0, name: form.name.trim(), previewUrl: form.previewUrl.trim(), @@ -1033,6 +1035,22 @@ function buildResourcePayload(form) { }; } +function badgeFormFromMetadata(metadataJson) { + if (!metadataJson) { + return ""; + } + try { + const metadata = JSON.parse(metadataJson); + const badgeForm = String(metadata?.badge_form || "").trim().toLowerCase(); + if (badgeForm === "strip" || badgeForm === "tile") { + return badgeForm; + } + } catch { + return ""; + } + return ""; +} + function buildEmojiPackPayload(form) { const regionIds = (form.regionIds || []) .map(Number) diff --git a/src/features/resources/pages/ResourceListPage.jsx b/src/features/resources/pages/ResourceListPage.jsx index 36f0c8d..b2a19f0 100644 --- a/src/features/resources/pages/ResourceListPage.jsx +++ b/src/features/resources/pages/ResourceListPage.jsx @@ -23,6 +23,8 @@ import { import { createOptionsColumnFilter, createTextColumnFilter } from "@/shared/ui/tableFilters.js"; import { formatMillis } from "@/shared/utils/time.js"; import { + badgeFormLabels, + badgeFormOptions, resourceStatusFilters, resourcePriceTypeLabels, resourcePriceTypeOptions, @@ -53,6 +55,12 @@ const baseColumns = [ width: "minmax(120px, 0.65fr)", render: (resource) => resourcePriceLabel(resource), }, + { + key: "badgeForm", + label: "徽章属性", + width: "minmax(120px, 0.65fr)", + render: (resource) => badgeFormLabel(resource), + }, { key: "status", label: "状态", @@ -131,7 +139,7 @@ export function ResourceListPage() { 0 ? { @@ -212,9 +220,15 @@ function ResourceFormDialog({ disabled, form, loading, mode, onClose, onSubmit, required select value={form.resourceType} - onChange={(event) => - setForm({ ...form, resourceType: event.target.value, walletAssetAmount: "" }) - } + onChange={(event) => { + const resourceType = event.target.value; + setForm({ + ...form, + badgeForm: resourceType === "badge" ? form.badgeForm || "tile" : form.badgeForm, + resourceType, + walletAssetAmount: "", + }); + }} > {resourceTypeOptions.map(([value, label]) => ( @@ -232,6 +246,22 @@ function ResourceFormDialog({ disabled, form, loading, mode, onClose, onSubmit, onChange={(event) => setForm({ ...form, walletAssetAmount: event.target.value })} /> ) : null} + {form.resourceType === "badge" ? ( + setForm({ ...form, badgeForm: event.target.value })} + > + {badgeFormOptions.map(([value, label]) => ( + + {label} + + ))} + + ) : null} @@ -335,6 +365,26 @@ function resourcePriceLabel(resource) { return "未配置"; } +function badgeFormLabel(resource) { + if (resource.resourceType !== "badge") { + return "-"; + } + return badgeFormLabels[resource.badgeForm || badgeFormFromMetadata(resource.metadataJson)] || "未配置"; +} + +function badgeFormFromMetadata(metadataJson) { + if (!metadataJson) { + return ""; + } + try { + const metadata = JSON.parse(metadataJson); + const badgeForm = String(metadata?.badge_form || "").trim().toLowerCase(); + return badgeForm === "strip" || badgeForm === "tile" ? badgeForm : ""; + } catch { + return ""; + } +} + function imageURL(value) { const url = String(value || "").trim(); if (!url) { diff --git a/src/features/resources/schema.js b/src/features/resources/schema.js index ddf97aa..89f3207 100644 --- a/src/features/resources/schema.js +++ b/src/features/resources/schema.js @@ -15,6 +15,7 @@ const resourceTypes = [ ]; const walletAssetTypes = ["COIN", "DIAMOND"]; const resourcePriceTypes = ["coin", "free"]; +const badgeForms = ["strip", "tile"]; const optionalWalletAssetTypeSchema = z .preprocess((value) => { if (typeof value !== "string") { @@ -28,6 +29,7 @@ const optionalWalletAssetTypeSchema = z export const resourceCreateFormSchema = z .object({ animationUrl: z.string().trim().min(1, "请上传动效素材").max(512, "动效素材不能超过 512 个字符"), + badgeForm: z.enum(badgeForms).optional(), enabled: z.boolean(), name: z.string().trim().min(1, "请输入资源名称").max(128, "资源名称不能超过 128 个字符"), coinPrice: z.union([z.string(), z.number()]).optional(), @@ -39,15 +41,22 @@ export const resourceCreateFormSchema = z }) .superRefine((value, context) => { if (value.resourceType !== "coin") { - return; - } - const amount = Number(value.walletAssetAmount); - if (!Number.isInteger(amount) || amount <= 0) { - context.addIssue({ - code: "custom", - message: "请输入金币数量", - path: ["walletAssetAmount"], - }); + if (value.resourceType === "badge" && !value.badgeForm) { + context.addIssue({ + code: "custom", + message: "请选择徽章属性", + path: ["badgeForm"], + }); + } + } else { + const amount = Number(value.walletAssetAmount); + if (!Number.isInteger(amount) || amount <= 0) { + context.addIssue({ + code: "custom", + message: "请输入金币数量", + path: ["walletAssetAmount"], + }); + } } if (value.priceType === "coin") { const coinPrice = Number(value.coinPrice); diff --git a/src/features/resources/schema.test.ts b/src/features/resources/schema.test.ts index 72465e8..b3698bf 100644 --- a/src/features/resources/schema.test.ts +++ b/src/features/resources/schema.test.ts @@ -12,6 +12,7 @@ describe("resource form schema", () => { test("allows profile card resources", () => { const payload = parseForm(resourceFormSchema, { animationUrl: "https://media.haiyihy.com/resource/profile-card.pag", + badgeForm: "tile", enabled: true, name: "Profile Card", previewUrl: "https://media.haiyihy.com/resource/profile-card-cover.png", @@ -24,6 +25,34 @@ describe("resource form schema", () => { expect(payload.resourceType).toBe("profile_card"); }); + test("requires badge form for badge resources", () => { + const payload = parseForm(resourceFormSchema, { + animationUrl: "https://media.haiyihy.com/resource/badge.pag", + badgeForm: "strip", + enabled: true, + name: "VIP Badge", + previewUrl: "https://media.haiyihy.com/resource/badge.png", + priceType: "free", + resourceCode: "badge_vip", + resourceType: "badge", + walletAssetAmount: "", + }); + + expect(payload.badgeForm).toBe("strip"); + expect(() => + parseForm(resourceFormSchema, { + animationUrl: "https://media.haiyihy.com/resource/badge.pag", + enabled: true, + name: "VIP Badge", + previewUrl: "https://media.haiyihy.com/resource/badge.png", + priceType: "free", + resourceCode: "badge_vip", + resourceType: "badge", + walletAssetAmount: "", + }), + ).toThrow(FormValidationError); + }); + test("allows resource group resource items without wallet asset type", () => { const payload = parseForm(resourceGroupCreateFormSchema, { description: "", diff --git a/src/shared/api/generated/endpoints.ts b/src/shared/api/generated/endpoints.ts index 3586050..c0b9080 100644 --- a/src/shared/api/generated/endpoints.ts +++ b/src/shared/api/generated/endpoints.ts @@ -5,1423 +5,1487 @@ import type { PermissionCode } from "@/app/permissions"; export type ApiHttpMethod = "DELETE" | "GET" | "PATCH" | "POST" | "PUT"; export interface ApiEndpoint { - method: ApiHttpMethod; - operationId: string; - path: string; - permission?: PermissionCode; - permissions?: PermissionCode[]; + method: ApiHttpMethod; + operationId: string; + path: string; + permission?: PermissionCode; + permissions?: PermissionCode[]; } export const API_OPERATIONS = { - appBanUser: "appBanUser", - appGetUser: "appGetUser", - appListBannedUsers: "appListBannedUsers", - appListLoginLogs: "appListLoginLogs", - appListUserLoginLogs: "appListUserLoginLogs", - appListUsers: "appListUsers", - appSetPassword: "appSetPassword", - appUnbanUser: "appUnbanUser", - appUpdateUser: "appUpdateUser", - batchUpdateUserStatus: "batchUpdateUserStatus", - cancelRoomPin: "cancelRoomPin", - changePassword: "changePassword", - closeAgency: "closeAgency", - createAchievementDefinition: "createAchievementDefinition", - createAgency: "createAgency", - createAppVersion: "createAppVersion", - createBanner: "createBanner", - createBD: "createBD", - createBDLeader: "createBDLeader", - createCatalog: "createCatalog", - createCoinAdjustment: "createCoinAdjustment", - createCoinSeller: "createCoinSeller", - createCountry: "createCountry", - createEmojiPack: "createEmojiPack", - createGift: "createGift", - createMenu: "createMenu", - createPermission: "createPermission", - createPlatform: "createPlatform", - createRechargeProduct: "createRechargeProduct", - createRegion: "createRegion", - createResource: "createResource", - createResourceGroup: "createResourceGroup", - createRole: "createRole", - createRoomPin: "createRoomPin", - createTaskDefinition: "createTaskDefinition", - createTier: "createTier", - createUser: "createUser", - creditCoinSellerStock: "creditCoinSellerStock", - dashboardOverview: "dashboardOverview", - deleteAppVersion: "deleteAppVersion", - deleteBanner: "deleteBanner", - deleteBDLeader: "deleteBDLeader", - deleteCatalog: "deleteCatalog", - deleteCountry: "deleteCountry", - deleteMenu: "deleteMenu", - deletePermission: "deletePermission", - deleteRechargeProduct: "deleteRechargeProduct", - deleteRole: "deleteRole", - deleteRoom: "deleteRoom", - disableCountry: "disableCountry", - disableGift: "disableGift", - disableRegion: "disableRegion", - disableResource: "disableResource", - disableResourceGroup: "disableResourceGroup", - enableCountry: "enableCountry", - enableGift: "enableGift", - enableRegion: "enableRegion", - enableResource: "enableResource", - enableResourceGroup: "enableResourceGroup", - exportLoginLogs: "exportLoginLogs", - exportOperationLogs: "exportOperationLogs", - exportUsers: "exportUsers", - getCountry: "getCountry", - getFirstRechargeRewardConfig: "getFirstRechargeRewardConfig", - getLuckyGiftConfig: "getLuckyGiftConfig", - getRedPacket: "getRedPacket", - getRedPacketConfig: "getRedPacketConfig", - getRegion: "getRegion", - getRegistrationRewardConfig: "getRegistrationRewardConfig", - getResource: "getResource", - getResourceGroup: "getResourceGroup", - getRoleDataScopes: "getRoleDataScopes", - getRoomConfig: "getRoomConfig", - getRoomTreasureConfig: "getRoomTreasureConfig", - getSevenDayCheckInConfig: "getSevenDayCheckInConfig", - getUser: "getUser", - grantResource: "grantResource", - grantResourceGroup: "grantResourceGroup", - listAchievementDefinitions: "listAchievementDefinitions", - listAgencies: "listAgencies", - listApps: "listApps", - listAppVersions: "listAppVersions", - listBanners: "listBanners", - listBDLeaders: "listBDLeaders", - listBDs: "listBDs", - listCatalog: "listCatalog", - listCoinAdjustments: "listCoinAdjustments", - listCoinLedger: "listCoinLedger", - listCoinSellers: "listCoinSellers", - listCountries: "listCountries", - listEmojiPackCategories: "listEmojiPackCategories", - listEmojiPacks: "listEmojiPacks", - listFirstRechargeRewardClaims: "listFirstRechargeRewardClaims", - listGifts: "listGifts", - listGiftTypes: "listGiftTypes", - listH5Links: "listH5Links", - listHosts: "listHosts", - listLevelConfig: "listLevelConfig", - listLoginLogs: "listLoginLogs", - listLuckyGiftConfigs: "listLuckyGiftConfigs", - listLuckyGiftDraws: "listLuckyGiftDraws", - listOperationLogs: "listOperationLogs", - listPermissions: "listPermissions", - listPlatforms: "listPlatforms", - listRechargeBills: "listRechargeBills", - listRechargeProducts: "listRechargeProducts", - listRedPackets: "listRedPackets", - listRegionBlocks: "listRegionBlocks", - listRegions: "listRegions", - listRegistrationRewardClaims: "listRegistrationRewardClaims", - listResourceGrants: "listResourceGrants", - listResourceGroups: "listResourceGroups", - listResources: "listResources", - listRoles: "listRoles", - listRoomPins: "listRoomPins", - listRooms: "listRooms", - listSevenDayCheckInClaims: "listSevenDayCheckInClaims", - listSystemMenus: "listSystemMenus", - listTaskDefinitions: "listTaskDefinitions", - listUserLeaderboards: "listUserLeaderboards", - listUsers: "listUsers", - login: "login", - logout: "logout", - lookupCoinAdjustmentTarget: "lookupCoinAdjustmentTarget", - me: "me", - navigationMenus: "navigationMenus", - refresh: "refresh", - replaceRegionBlocks: "replaceRegionBlocks", - replaceRegionCountries: "replaceRegionCountries", - replaceRoleDataScopes: "replaceRoleDataScopes", - replaceRolePermissions: "replaceRolePermissions", - resetUserPassword: "resetUserPassword", - search: "search", - setAgencyJoinEnabled: "setAgencyJoinEnabled", - setBDLeaderStatus: "setBDLeaderStatus", - setBDStatus: "setBDStatus", - setCoinSellerStatus: "setCoinSellerStatus", - setGameStatus: "setGameStatus", - setTaskDefinitionStatus: "setTaskDefinitionStatus", - sortMenus: "sortMenus", - syncPermissions: "syncPermissions", - updateAchievementDefinition: "updateAchievementDefinition", - updateAppVersion: "updateAppVersion", - updateBanner: "updateBanner", - updateCatalog: "updateCatalog", - updateCountry: "updateCountry", - updateFirstRechargeRewardConfig: "updateFirstRechargeRewardConfig", - updateGift: "updateGift", - updateGiftType: "updateGiftType", - updateH5Links: "updateH5Links", - updateMenu: "updateMenu", - updateMenuVisible: "updateMenuVisible", - updatePermission: "updatePermission", - updatePlatform: "updatePlatform", - updateRechargeProduct: "updateRechargeProduct", - updateRedPacketConfig: "updateRedPacketConfig", - updateRegion: "updateRegion", - updateRegistrationRewardConfig: "updateRegistrationRewardConfig", - updateResource: "updateResource", - updateResourceGroup: "updateResourceGroup", - updateResourceGroupItems: "updateResourceGroupItems", - updateRole: "updateRole", - updateRoom: "updateRoom", - updateRoomConfig: "updateRoomConfig", - updateRoomTreasureConfig: "updateRoomTreasureConfig", - updateSevenDayCheckInConfig: "updateSevenDayCheckInConfig", - updateTaskDefinition: "updateTaskDefinition", - updateTier: "updateTier", - updateTrack: "updateTrack", - updateUser: "updateUser", - updateUserStatus: "updateUserStatus", - uploadFile: "uploadFile", - uploadImage: "uploadImage", - upsertLuckyGiftConfig: "upsertLuckyGiftConfig", - upsertRule: "upsertRule" + appBanUser: "appBanUser", + appGetUser: "appGetUser", + appListBannedUsers: "appListBannedUsers", + appListLoginLogs: "appListLoginLogs", + appListUserLoginLogs: "appListUserLoginLogs", + appListUsers: "appListUsers", + appSetPassword: "appSetPassword", + appUnbanUser: "appUnbanUser", + appUpdateUser: "appUpdateUser", + batchUpdateUserStatus: "batchUpdateUserStatus", + cancelRoomPin: "cancelRoomPin", + changePassword: "changePassword", + closeAgency: "closeAgency", + createAchievementDefinition: "createAchievementDefinition", + createAgency: "createAgency", + createAppVersion: "createAppVersion", + createBanner: "createBanner", + createBD: "createBD", + createBDLeader: "createBDLeader", + createCatalog: "createCatalog", + createCoinAdjustment: "createCoinAdjustment", + createCoinSeller: "createCoinSeller", + createCountry: "createCountry", + createEmojiPack: "createEmojiPack", + createExploreTab: "createExploreTab", + createGift: "createGift", + createH5Link: "createH5Link", + createMenu: "createMenu", + createPermission: "createPermission", + createPlatform: "createPlatform", + createRechargeProduct: "createRechargeProduct", + createRegion: "createRegion", + createResource: "createResource", + createResourceGroup: "createResourceGroup", + createRole: "createRole", + createRoomPin: "createRoomPin", + createTaskDefinition: "createTaskDefinition", + createTier: "createTier", + createUser: "createUser", + creditCoinSellerStock: "creditCoinSellerStock", + dashboardOverview: "dashboardOverview", + deleteAppVersion: "deleteAppVersion", + deleteBanner: "deleteBanner", + deleteBDLeader: "deleteBDLeader", + deleteCatalog: "deleteCatalog", + deleteCountry: "deleteCountry", + deleteExploreTab: "deleteExploreTab", + deleteH5Link: "deleteH5Link", + deleteMenu: "deleteMenu", + deletePermission: "deletePermission", + deleteRechargeProduct: "deleteRechargeProduct", + deleteRole: "deleteRole", + deleteRoom: "deleteRoom", + disableCountry: "disableCountry", + disableGift: "disableGift", + disableRegion: "disableRegion", + disableResource: "disableResource", + disableResourceGroup: "disableResourceGroup", + enableCountry: "enableCountry", + enableGift: "enableGift", + enableRegion: "enableRegion", + enableResource: "enableResource", + enableResourceGroup: "enableResourceGroup", + exportLoginLogs: "exportLoginLogs", + exportOperationLogs: "exportOperationLogs", + exportUsers: "exportUsers", + getCountry: "getCountry", + getFirstRechargeRewardConfig: "getFirstRechargeRewardConfig", + getLuckyGiftConfig: "getLuckyGiftConfig", + getLuckyGiftDrawSummary: "getLuckyGiftDrawSummary", + getRedPacket: "getRedPacket", + getRedPacketConfig: "getRedPacketConfig", + getRegion: "getRegion", + getRegistrationRewardConfig: "getRegistrationRewardConfig", + getResource: "getResource", + getResourceGroup: "getResourceGroup", + getRoleDataScopes: "getRoleDataScopes", + getRoomConfig: "getRoomConfig", + getRoomTreasureConfig: "getRoomTreasureConfig", + getSevenDayCheckInConfig: "getSevenDayCheckInConfig", + getUser: "getUser", + grantResource: "grantResource", + grantResourceGroup: "grantResourceGroup", + listAchievementDefinitions: "listAchievementDefinitions", + listAgencies: "listAgencies", + listApps: "listApps", + listAppVersions: "listAppVersions", + listBanners: "listBanners", + listBDLeaders: "listBDLeaders", + listBDs: "listBDs", + listCatalog: "listCatalog", + listCoinAdjustments: "listCoinAdjustments", + listCoinLedger: "listCoinLedger", + listCoinSellers: "listCoinSellers", + listCountries: "listCountries", + listEmojiPackCategories: "listEmojiPackCategories", + listEmojiPacks: "listEmojiPacks", + listExploreTabs: "listExploreTabs", + listFirstRechargeRewardClaims: "listFirstRechargeRewardClaims", + listGifts: "listGifts", + listGiftTypes: "listGiftTypes", + listH5Links: "listH5Links", + listHosts: "listHosts", + listLevelConfig: "listLevelConfig", + listLoginLogs: "listLoginLogs", + listLuckyGiftConfigs: "listLuckyGiftConfigs", + listLuckyGiftDraws: "listLuckyGiftDraws", + listOperationLogs: "listOperationLogs", + listPermissions: "listPermissions", + listPlatforms: "listPlatforms", + listRechargeBills: "listRechargeBills", + listRechargeProducts: "listRechargeProducts", + listRedPackets: "listRedPackets", + listRegionBlocks: "listRegionBlocks", + listRegions: "listRegions", + listRegistrationRewardClaims: "listRegistrationRewardClaims", + listResourceGrants: "listResourceGrants", + listResourceGroups: "listResourceGroups", + listResources: "listResources", + listRoles: "listRoles", + listRoomPins: "listRoomPins", + listRooms: "listRooms", + listSevenDayCheckInClaims: "listSevenDayCheckInClaims", + listSystemMenus: "listSystemMenus", + listTaskDefinitions: "listTaskDefinitions", + listUserLeaderboards: "listUserLeaderboards", + listUsers: "listUsers", + login: "login", + logout: "logout", + lookupCoinAdjustmentTarget: "lookupCoinAdjustmentTarget", + me: "me", + navigationMenus: "navigationMenus", + refresh: "refresh", + replaceRegionBlocks: "replaceRegionBlocks", + replaceRegionCountries: "replaceRegionCountries", + replaceRoleDataScopes: "replaceRoleDataScopes", + replaceRolePermissions: "replaceRolePermissions", + resetUserPassword: "resetUserPassword", + search: "search", + setAgencyJoinEnabled: "setAgencyJoinEnabled", + setBDLeaderStatus: "setBDLeaderStatus", + setBDStatus: "setBDStatus", + setCoinSellerStatus: "setCoinSellerStatus", + setGameStatus: "setGameStatus", + setTaskDefinitionStatus: "setTaskDefinitionStatus", + sortMenus: "sortMenus", + syncPermissions: "syncPermissions", + updateAchievementDefinition: "updateAchievementDefinition", + updateAppVersion: "updateAppVersion", + updateBanner: "updateBanner", + updateCatalog: "updateCatalog", + updateCountry: "updateCountry", + updateExploreTab: "updateExploreTab", + updateFirstRechargeRewardConfig: "updateFirstRechargeRewardConfig", + updateGift: "updateGift", + updateGiftType: "updateGiftType", + updateH5Link: "updateH5Link", + updateH5Links: "updateH5Links", + updateMenu: "updateMenu", + updateMenuVisible: "updateMenuVisible", + updatePermission: "updatePermission", + updatePlatform: "updatePlatform", + updateRechargeProduct: "updateRechargeProduct", + updateRedPacketConfig: "updateRedPacketConfig", + updateRegion: "updateRegion", + updateRegistrationRewardConfig: "updateRegistrationRewardConfig", + updateResource: "updateResource", + updateResourceGroup: "updateResourceGroup", + updateResourceGroupItems: "updateResourceGroupItems", + updateRole: "updateRole", + updateRoom: "updateRoom", + updateRoomConfig: "updateRoomConfig", + updateRoomTreasureConfig: "updateRoomTreasureConfig", + updateSevenDayCheckInConfig: "updateSevenDayCheckInConfig", + updateTaskDefinition: "updateTaskDefinition", + updateTier: "updateTier", + updateTrack: "updateTrack", + updateUser: "updateUser", + updateUserStatus: "updateUserStatus", + uploadFile: "uploadFile", + uploadImage: "uploadImage", + upsertLuckyGiftConfig: "upsertLuckyGiftConfig", + upsertRule: "upsertRule", } as const; export type ApiOperationId = (typeof API_OPERATIONS)[keyof typeof API_OPERATIONS]; export const API_ENDPOINTS: Record = { - appBanUser: { - method: "POST", - operationId: API_OPERATIONS.appBanUser, - path: "/v1/app/users/{id}/ban", - permission: "app-user:status", - permissions: ["app-user:status"] - }, - appGetUser: { - method: "GET", - operationId: API_OPERATIONS.appGetUser, - path: "/v1/app/users/{id}", - permission: "app-user:view", - permissions: ["app-user:view"] - }, - appListBannedUsers: { - method: "GET", - operationId: API_OPERATIONS.appListBannedUsers, - path: "/v1/app/users/bans", - permission: "app-user:view", - permissions: ["app-user:view"] - }, - appListLoginLogs: { - method: "GET", - operationId: API_OPERATIONS.appListLoginLogs, - path: "/v1/app/users/login-logs", - permission: "app-user:view", - permissions: ["app-user:view"] - }, - appListUserLoginLogs: { - method: "GET", - operationId: API_OPERATIONS.appListUserLoginLogs, - path: "/v1/app/users/{id}/login-logs", - permission: "app-user:view", - permissions: ["app-user:view"] - }, - appListUsers: { - method: "GET", - operationId: API_OPERATIONS.appListUsers, - path: "/v1/app/users", - permission: "app-user:view", - permissions: ["app-user:view"] - }, - appSetPassword: { - method: "POST", - operationId: API_OPERATIONS.appSetPassword, - path: "/v1/app/users/{id}/password", - permission: "app-user:password", - permissions: ["app-user:password"] - }, - appUnbanUser: { - method: "POST", - operationId: API_OPERATIONS.appUnbanUser, - path: "/v1/app/users/{id}/unban", - permission: "app-user:status", - permissions: ["app-user:status"] - }, - appUpdateUser: { - method: "PATCH", - operationId: API_OPERATIONS.appUpdateUser, - path: "/v1/app/users/{id}", - permission: "app-user:update", - permissions: ["app-user:update"] - }, - batchUpdateUserStatus: { - method: "POST", - operationId: API_OPERATIONS.batchUpdateUserStatus, - path: "/v1/users/batch/status", - permission: "user:status", - permissions: ["user:status"] - }, - cancelRoomPin: { - method: "DELETE", - operationId: API_OPERATIONS.cancelRoomPin, - path: "/v1/admin/rooms/pins/{pin_id}", - permission: "room-pin:cancel", - permissions: ["room-pin:cancel"] - }, - changePassword: { - method: "POST", - operationId: API_OPERATIONS.changePassword, - path: "/v1/auth/change-password" - }, - closeAgency: { - method: "POST", - operationId: API_OPERATIONS.closeAgency, - path: "/v1/admin/agencies/{agency_id}/close", - permission: "agency:status", - permissions: ["agency:status"] - }, - createAchievementDefinition: { - method: "POST", - operationId: API_OPERATIONS.createAchievementDefinition, - path: "/v1/admin/activity/achievements", - permission: "achievement:create", - permissions: ["achievement:create"] - }, - createAgency: { - method: "POST", - operationId: API_OPERATIONS.createAgency, - path: "/v1/admin/agencies", - permission: "agency:create", - permissions: ["agency:create"] - }, - createAppVersion: { - method: "POST", - operationId: API_OPERATIONS.createAppVersion, - path: "/v1/admin/app-config/versions", - permission: "app-version:create", - permissions: ["app-version:create"] - }, - createBanner: { - method: "POST", - operationId: API_OPERATIONS.createBanner, - path: "/v1/admin/app-config/banners", - permission: "app-config:update", - permissions: ["app-config:update"] - }, - createBD: { - method: "POST", - operationId: API_OPERATIONS.createBD, - path: "/v1/admin/bds", - permission: "bd:create", - permissions: ["bd:create"] - }, - createBDLeader: { - method: "POST", - operationId: API_OPERATIONS.createBDLeader, - path: "/v1/admin/bd-leaders", - permission: "bd:create", - permissions: ["bd:create"] - }, - createCatalog: { - method: "POST", - operationId: API_OPERATIONS.createCatalog, - path: "/v1/admin/game/games", - permission: "game:create", - permissions: ["game:create"] - }, - createCoinAdjustment: { - method: "POST", - operationId: API_OPERATIONS.createCoinAdjustment, - path: "/v1/admin/operations/coin-adjustments", - permission: "coin-adjustment:create", - permissions: ["coin-adjustment:create"] - }, - createCoinSeller: { - method: "POST", - operationId: API_OPERATIONS.createCoinSeller, - path: "/v1/admin/coin-sellers", - permission: "coin-seller:create", - permissions: ["coin-seller:create"] - }, - createCountry: { - method: "POST", - operationId: API_OPERATIONS.createCountry, - path: "/v1/admin/countries", - permission: "country:create", - permissions: ["country:create"] - }, - createEmojiPack: { - method: "POST", - operationId: API_OPERATIONS.createEmojiPack, - path: "/v1/admin/emoji-packs", - permission: "emoji-pack:create", - permissions: ["emoji-pack:create"] - }, - createGift: { - method: "POST", - operationId: API_OPERATIONS.createGift, - path: "/v1/admin/gifts", - permission: "gift:create", - permissions: ["gift:create"] - }, - createMenu: { - method: "POST", - operationId: API_OPERATIONS.createMenu, - path: "/v1/system/menus", - permission: "menu:create", - permissions: ["menu:create"] - }, - createPermission: { - method: "POST", - operationId: API_OPERATIONS.createPermission, - path: "/v1/permissions", - permission: "permission:create", - permissions: ["permission:create"] - }, - createPlatform: { - method: "POST", - operationId: API_OPERATIONS.createPlatform, - path: "/v1/admin/game/platforms", - permission: "game:update", - permissions: ["game:update"] - }, - createRechargeProduct: { - method: "POST", - operationId: API_OPERATIONS.createRechargeProduct, - path: "/v1/admin/payment/recharge-products", - permission: "payment-product:create", - permissions: ["payment-product:create"] - }, - createRegion: { - method: "POST", - operationId: API_OPERATIONS.createRegion, - path: "/v1/admin/regions", - permission: "region:create", - permissions: ["region:create"] - }, - createResource: { - method: "POST", - operationId: API_OPERATIONS.createResource, - path: "/v1/admin/resources", - permission: "resource:create", - permissions: ["resource:create"] - }, - createResourceGroup: { - method: "POST", - operationId: API_OPERATIONS.createResourceGroup, - path: "/v1/admin/resource-groups", - permission: "resource-group:create", - permissions: ["resource-group:create"] - }, - createRole: { - method: "POST", - operationId: API_OPERATIONS.createRole, - path: "/v1/roles", - permission: "role:create", - permissions: ["role:create","role:manage"] - }, - createRoomPin: { - method: "POST", - operationId: API_OPERATIONS.createRoomPin, - path: "/v1/admin/rooms/pins", - permission: "room-pin:create", - permissions: ["room-pin:create"] - }, - createTaskDefinition: { - method: "POST", - operationId: API_OPERATIONS.createTaskDefinition, - path: "/v1/admin/activity/daily-tasks", - permission: "daily-task:create", - permissions: ["daily-task:create"] - }, - createTier: { - method: "POST", - operationId: API_OPERATIONS.createTier, - path: "/v1/admin/users/level-config/tiers", - permission: "level-config:update", - permissions: ["level-config:update"] - }, - createUser: { - method: "POST", - operationId: API_OPERATIONS.createUser, - path: "/v1/users", - permission: "user:create", - permissions: ["user:create"] - }, - creditCoinSellerStock: { - method: "POST", - operationId: API_OPERATIONS.creditCoinSellerStock, - path: "/v1/admin/coin-sellers/{user_id}/stock-credits", - permission: "coin-seller:stock-credit", - permissions: ["coin-seller:stock-credit"] - }, - dashboardOverview: { - method: "GET", - operationId: API_OPERATIONS.dashboardOverview, - path: "/v1/dashboard/overview", - permission: "overview:view", - permissions: ["overview:view"] - }, - deleteAppVersion: { - method: "DELETE", - operationId: API_OPERATIONS.deleteAppVersion, - path: "/v1/admin/app-config/versions/{version_id}", - permission: "app-version:delete", - permissions: ["app-version:delete"] - }, - deleteBanner: { - method: "DELETE", - operationId: API_OPERATIONS.deleteBanner, - path: "/v1/admin/app-config/banners/{banner_id}", - permission: "app-config:update", - permissions: ["app-config:update"] - }, - deleteBDLeader: { - method: "DELETE", - operationId: API_OPERATIONS.deleteBDLeader, - path: "/v1/admin/bd-leaders/{user_id}", - permission: "bd:update", - permissions: ["bd:update"] - }, - deleteCatalog: { - method: "DELETE", - operationId: API_OPERATIONS.deleteCatalog, - path: "/v1/admin/game/games/{game_id}", - permission: "game:delete", - permissions: ["game:delete"] - }, - deleteCountry: { - method: "DELETE", - operationId: API_OPERATIONS.deleteCountry, - path: "/v1/admin/countries/{country_id}", - permission: "country:status", - permissions: ["country:status"] - }, - deleteMenu: { - method: "DELETE", - operationId: API_OPERATIONS.deleteMenu, - path: "/v1/system/menus/{id}", - permission: "menu:delete", - permissions: ["menu:delete"] - }, - deletePermission: { - method: "DELETE", - operationId: API_OPERATIONS.deletePermission, - path: "/v1/permissions/{id}", - permission: "permission:delete", - permissions: ["permission:delete"] - }, - deleteRechargeProduct: { - method: "DELETE", - operationId: API_OPERATIONS.deleteRechargeProduct, - path: "/v1/admin/payment/recharge-products/{product_id}", - permission: "payment-product:delete", - permissions: ["payment-product:delete"] - }, - deleteRole: { - method: "DELETE", - operationId: API_OPERATIONS.deleteRole, - path: "/v1/roles/{id}", - permission: "role:delete", - permissions: ["role:delete","role:manage"] - }, - deleteRoom: { - method: "DELETE", - operationId: API_OPERATIONS.deleteRoom, - path: "/v1/admin/rooms/{room_id}", - permission: "room:delete", - permissions: ["room:delete"] - }, - disableCountry: { - method: "POST", - operationId: API_OPERATIONS.disableCountry, - path: "/v1/admin/countries/{country_id}/disable", - permission: "country:status", - permissions: ["country:status"] - }, - disableGift: { - method: "POST", - operationId: API_OPERATIONS.disableGift, - path: "/v1/admin/gifts/{gift_id}/disable", - permission: "gift:status", - permissions: ["gift:status"] - }, - disableRegion: { - method: "DELETE", - operationId: API_OPERATIONS.disableRegion, - path: "/v1/admin/regions/{region_id}", - permission: "region:status", - permissions: ["region:status"] - }, - disableResource: { - method: "POST", - operationId: API_OPERATIONS.disableResource, - path: "/v1/admin/resources/{resource_id}/disable", - permission: "resource:update", - permissions: ["resource:update"] - }, - disableResourceGroup: { - method: "POST", - operationId: API_OPERATIONS.disableResourceGroup, - path: "/v1/admin/resource-groups/{group_id}/disable", - permission: "resource-group:update", - permissions: ["resource-group:update"] - }, - enableCountry: { - method: "POST", - operationId: API_OPERATIONS.enableCountry, - path: "/v1/admin/countries/{country_id}/enable", - permission: "country:status", - permissions: ["country:status"] - }, - enableGift: { - method: "POST", - operationId: API_OPERATIONS.enableGift, - path: "/v1/admin/gifts/{gift_id}/enable", - permission: "gift:status", - permissions: ["gift:status"] - }, - enableRegion: { - method: "POST", - operationId: API_OPERATIONS.enableRegion, - path: "/v1/admin/regions/{region_id}/enable", - permission: "region:status", - permissions: ["region:status"] - }, - enableResource: { - method: "POST", - operationId: API_OPERATIONS.enableResource, - path: "/v1/admin/resources/{resource_id}/enable", - permission: "resource:update", - permissions: ["resource:update"] - }, - enableResourceGroup: { - method: "POST", - operationId: API_OPERATIONS.enableResourceGroup, - path: "/v1/admin/resource-groups/{group_id}/enable", - permission: "resource-group:update", - permissions: ["resource-group:update"] - }, - exportLoginLogs: { - method: "GET", - operationId: API_OPERATIONS.exportLoginLogs, - path: "/v1/logs/login/export", - permission: "log:export", - permissions: ["log:export"] - }, - exportOperationLogs: { - method: "GET", - operationId: API_OPERATIONS.exportOperationLogs, - path: "/v1/logs/operations/export", - permission: "log:export", - permissions: ["log:export"] - }, - exportUsers: { - method: "GET", - operationId: API_OPERATIONS.exportUsers, - path: "/v1/users/export", - permission: "user:export", - permissions: ["user:export"] - }, - getCountry: { - method: "GET", - operationId: API_OPERATIONS.getCountry, - path: "/v1/admin/countries/{country_id}", - permission: "country:view", - permissions: ["country:view"] - }, - getFirstRechargeRewardConfig: { - method: "GET", - operationId: API_OPERATIONS.getFirstRechargeRewardConfig, - path: "/v1/admin/activity/first-recharge-reward/config", - permission: "first-recharge-reward:view", - permissions: ["first-recharge-reward:view"] - }, - getLuckyGiftConfig: { - method: "GET", - operationId: API_OPERATIONS.getLuckyGiftConfig, - path: "/v1/admin/activity/lucky-gifts/config", - permission: "lucky-gift:view", - permissions: ["lucky-gift:view"] - }, - getRedPacket: { - method: "GET", - operationId: API_OPERATIONS.getRedPacket, - path: "/v1/admin/activity/red-packets/{packet_id}", - permission: "red-packet:view", - permissions: ["red-packet:view"] - }, - getRedPacketConfig: { - method: "GET", - operationId: API_OPERATIONS.getRedPacketConfig, - path: "/v1/admin/activity/red-packets/config", - permission: "red-packet:view", - permissions: ["red-packet:view"] - }, - getRegion: { - method: "GET", - operationId: API_OPERATIONS.getRegion, - path: "/v1/admin/regions/{region_id}", - permission: "region:view", - permissions: ["region:view"] - }, - getRegistrationRewardConfig: { - method: "GET", - operationId: API_OPERATIONS.getRegistrationRewardConfig, - path: "/v1/admin/activity/registration-reward/config", - permission: "registration-reward:view", - permissions: ["registration-reward:view"] - }, - getResource: { - method: "GET", - operationId: API_OPERATIONS.getResource, - path: "/v1/admin/resources/{resource_id}", - permission: "resource:view", - permissions: ["resource:view"] - }, - getResourceGroup: { - method: "GET", - operationId: API_OPERATIONS.getResourceGroup, - path: "/v1/admin/resource-groups/{group_id}", - permission: "resource-group:view", - permissions: ["resource-group:view"] - }, - getRoleDataScopes: { - method: "GET", - operationId: API_OPERATIONS.getRoleDataScopes, - path: "/v1/roles/{id}/data-scopes", - permission: "role:data-scope", - permissions: ["role:data-scope"] - }, - getRoomConfig: { - method: "GET", - operationId: API_OPERATIONS.getRoomConfig, - path: "/v1/admin/rooms/config", - permission: "room-config:view", - permissions: ["room-config:view"] - }, - getRoomTreasureConfig: { - method: "GET", - operationId: API_OPERATIONS.getRoomTreasureConfig, - path: "/v1/admin/activity/room-treasure/config", - permission: "room-treasure:view", - permissions: ["room-treasure:view"] - }, - getSevenDayCheckInConfig: { - method: "GET", - operationId: API_OPERATIONS.getSevenDayCheckInConfig, - path: "/v1/admin/activity/seven-day-checkin/config", - permission: "seven-day-checkin:view", - permissions: ["seven-day-checkin:view"] - }, - getUser: { - method: "GET", - operationId: API_OPERATIONS.getUser, - path: "/v1/users/{id}", - permission: "user:view", - permissions: ["user:view"] - }, - grantResource: { - method: "POST", - operationId: API_OPERATIONS.grantResource, - path: "/v1/admin/resource-grants/resource", - permission: "resource-grant:create", - permissions: ["resource-grant:create"] - }, - grantResourceGroup: { - method: "POST", - operationId: API_OPERATIONS.grantResourceGroup, - path: "/v1/admin/resource-grants/group", - permission: "resource-grant:create", - permissions: ["resource-grant:create"] - }, - listAchievementDefinitions: { - method: "GET", - operationId: API_OPERATIONS.listAchievementDefinitions, - path: "/v1/admin/activity/achievements", - permission: "achievement:view", - permissions: ["achievement:view"] - }, - listAgencies: { - method: "GET", - operationId: API_OPERATIONS.listAgencies, - path: "/v1/admin/agencies", - permission: "agency:view", - permissions: ["agency:view"] - }, - listApps: { - method: "GET", - operationId: API_OPERATIONS.listApps, - path: "/v1/admin/apps" - }, - listAppVersions: { - method: "GET", - operationId: API_OPERATIONS.listAppVersions, - path: "/v1/admin/app-config/versions", - permission: "app-version:view", - permissions: ["app-version:view"] - }, - listBanners: { - method: "GET", - operationId: API_OPERATIONS.listBanners, - path: "/v1/admin/app-config/banners", - permission: "app-config:view", - permissions: ["app-config:view"] - }, - listBDLeaders: { - method: "GET", - operationId: API_OPERATIONS.listBDLeaders, - path: "/v1/admin/bd-leaders", - permission: "bd:view", - permissions: ["bd:view"] - }, - listBDs: { - method: "GET", - operationId: API_OPERATIONS.listBDs, - path: "/v1/admin/bds", - permission: "bd:view", - permissions: ["bd:view"] - }, - listCatalog: { - method: "GET", - operationId: API_OPERATIONS.listCatalog, - path: "/v1/admin/game/games", - permission: "game:view", - permissions: ["game:view"] - }, - listCoinAdjustments: { - method: "GET", - operationId: API_OPERATIONS.listCoinAdjustments, - path: "/v1/admin/operations/coin-adjustments", - permission: "coin-adjustment:view", - permissions: ["coin-adjustment:view"] - }, - listCoinLedger: { - method: "GET", - operationId: API_OPERATIONS.listCoinLedger, - path: "/v1/admin/operations/coin-ledger", - permission: "coin-ledger:view", - permissions: ["coin-ledger:view"] - }, - listCoinSellers: { - method: "GET", - operationId: API_OPERATIONS.listCoinSellers, - path: "/v1/admin/coin-sellers", - permission: "coin-seller:view", - permissions: ["coin-seller:view"] - }, - listCountries: { - method: "GET", - operationId: API_OPERATIONS.listCountries, - path: "/v1/admin/countries", - permission: "country:view", - permissions: ["country:view"] - }, - listEmojiPackCategories: { - method: "GET", - operationId: API_OPERATIONS.listEmojiPackCategories, - path: "/v1/admin/emoji-packs/categories", - permission: "emoji-pack:view", - permissions: ["emoji-pack:view"] - }, - listEmojiPacks: { - method: "GET", - operationId: API_OPERATIONS.listEmojiPacks, - path: "/v1/admin/emoji-packs", - permission: "emoji-pack:view", - permissions: ["emoji-pack:view"] - }, - listFirstRechargeRewardClaims: { - method: "GET", - operationId: API_OPERATIONS.listFirstRechargeRewardClaims, - path: "/v1/admin/activity/first-recharge-reward/claims", - permission: "first-recharge-reward:view", - permissions: ["first-recharge-reward:view"] - }, - listGifts: { - method: "GET", - operationId: API_OPERATIONS.listGifts, - path: "/v1/admin/gifts", - permission: "gift:view", - permissions: ["gift:view"] - }, - listGiftTypes: { - method: "GET", - operationId: API_OPERATIONS.listGiftTypes, - path: "/v1/admin/gift-types", - permission: "gift:view", - permissions: ["gift:view"] - }, - listH5Links: { - method: "GET", - operationId: API_OPERATIONS.listH5Links, - path: "/v1/admin/app-config/h5-links", - permission: "app-config:view", - permissions: ["app-config:view"] - }, - listHosts: { - method: "GET", - operationId: API_OPERATIONS.listHosts, - path: "/v1/admin/hosts", - permission: "host:view", - permissions: ["host:view"] - }, - listLevelConfig: { - method: "GET", - operationId: API_OPERATIONS.listLevelConfig, - path: "/v1/admin/users/level-config", - permission: "level-config:view", - permissions: ["level-config:view"] - }, - listLoginLogs: { - method: "GET", - operationId: API_OPERATIONS.listLoginLogs, - path: "/v1/logs/login", - permission: "log:view", - permissions: ["log:view"] - }, - listLuckyGiftConfigs: { - method: "GET", - operationId: API_OPERATIONS.listLuckyGiftConfigs, - path: "/v1/admin/activity/lucky-gifts/configs", - permission: "lucky-gift:view", - permissions: ["lucky-gift:view"] - }, - listLuckyGiftDraws: { - method: "GET", - operationId: API_OPERATIONS.listLuckyGiftDraws, - path: "/v1/admin/activity/lucky-gifts/draws", - permission: "lucky-gift:view", - permissions: ["lucky-gift:view"] - }, - listOperationLogs: { - method: "GET", - operationId: API_OPERATIONS.listOperationLogs, - path: "/v1/logs/operations", - permission: "log:view", - permissions: ["log:view"] - }, - listPermissions: { - method: "GET", - operationId: API_OPERATIONS.listPermissions, - path: "/v1/permissions", - permission: "permission:view", - permissions: ["permission:view","role:permission","role:manage"] - }, - listPlatforms: { - method: "GET", - operationId: API_OPERATIONS.listPlatforms, - path: "/v1/admin/game/platforms", - permission: "game:view", - permissions: ["game:view"] - }, - listRechargeBills: { - method: "GET", - operationId: API_OPERATIONS.listRechargeBills, - path: "/v1/admin/payment/recharge-bills", - permission: "payment-bill:view", - permissions: ["payment-bill:view"] - }, - listRechargeProducts: { - method: "GET", - operationId: API_OPERATIONS.listRechargeProducts, - path: "/v1/admin/payment/recharge-products", - permission: "payment-product:view", - permissions: ["payment-product:view"] - }, - listRedPackets: { - method: "GET", - operationId: API_OPERATIONS.listRedPackets, - path: "/v1/admin/activity/red-packets", - permission: "red-packet:view", - permissions: ["red-packet:view"] - }, - listRegionBlocks: { - method: "GET", - operationId: API_OPERATIONS.listRegionBlocks, - path: "/v1/admin/users/region-blocks", - permission: "region-block:view", - permissions: ["region-block:view"] - }, - listRegions: { - method: "GET", - operationId: API_OPERATIONS.listRegions, - path: "/v1/admin/regions", - permission: "region:view", - permissions: ["region:view"] - }, - listRegistrationRewardClaims: { - method: "GET", - operationId: API_OPERATIONS.listRegistrationRewardClaims, - path: "/v1/admin/activity/registration-reward/claims", - permission: "registration-reward:view", - permissions: ["registration-reward:view"] - }, - listResourceGrants: { - method: "GET", - operationId: API_OPERATIONS.listResourceGrants, - path: "/v1/admin/resource-grants", - permission: "resource-grant:view", - permissions: ["resource-grant:view"] - }, - listResourceGroups: { - method: "GET", - operationId: API_OPERATIONS.listResourceGroups, - path: "/v1/admin/resource-groups", - permission: "resource-group:view", - permissions: ["resource-group:view"] - }, - listResources: { - method: "GET", - operationId: API_OPERATIONS.listResources, - path: "/v1/admin/resources", - permission: "resource:view", - permissions: ["resource:view"] - }, - listRoles: { - method: "GET", - operationId: API_OPERATIONS.listRoles, - path: "/v1/roles", - permission: "role:view", - permissions: ["role:view"] - }, - listRoomPins: { - method: "GET", - operationId: API_OPERATIONS.listRoomPins, - path: "/v1/admin/rooms/pins", - permission: "room-pin:view", - permissions: ["room-pin:view"] - }, - listRooms: { - method: "GET", - operationId: API_OPERATIONS.listRooms, - path: "/v1/admin/rooms", - permission: "room:view", - permissions: ["room:view"] - }, - listSevenDayCheckInClaims: { - method: "GET", - operationId: API_OPERATIONS.listSevenDayCheckInClaims, - path: "/v1/admin/activity/seven-day-checkin/claims", - permission: "seven-day-checkin:view", - permissions: ["seven-day-checkin:view"] - }, - listSystemMenus: { - method: "GET", - operationId: API_OPERATIONS.listSystemMenus, - path: "/v1/system/menus", - permission: "menu:view", - permissions: ["menu:view"] - }, - listTaskDefinitions: { - method: "GET", - operationId: API_OPERATIONS.listTaskDefinitions, - path: "/v1/admin/activity/daily-tasks", - permission: "daily-task:view", - permissions: ["daily-task:view"] - }, - listUserLeaderboards: { - method: "GET", - operationId: API_OPERATIONS.listUserLeaderboards, - path: "/v1/admin/activity/user-leaderboards", - permission: "user-leaderboard:view", - permissions: ["user-leaderboard:view"] - }, - listUsers: { - method: "GET", - operationId: API_OPERATIONS.listUsers, - path: "/v1/users", - permission: "user:view", - permissions: ["user:view"] - }, - login: { - method: "POST", - operationId: API_OPERATIONS.login, - path: "/v1/auth/login" - }, - logout: { - method: "POST", - operationId: API_OPERATIONS.logout, - path: "/v1/auth/logout" - }, - lookupCoinAdjustmentTarget: { - method: "GET", - operationId: API_OPERATIONS.lookupCoinAdjustmentTarget, - path: "/v1/admin/operations/coin-adjustments/target", - permission: "coin-adjustment:create", - permissions: ["coin-adjustment:create"] - }, - me: { - method: "GET", - operationId: API_OPERATIONS.me, - path: "/v1/auth/me" - }, - navigationMenus: { - method: "GET", - operationId: API_OPERATIONS.navigationMenus, - path: "/v1/navigation/menus" - }, - refresh: { - method: "POST", - operationId: API_OPERATIONS.refresh, - path: "/v1/auth/refresh" - }, - replaceRegionBlocks: { - method: "PUT", - operationId: API_OPERATIONS.replaceRegionBlocks, - path: "/v1/admin/users/region-blocks", - permission: "region-block:update", - permissions: ["region-block:update"] - }, - replaceRegionCountries: { - method: "PUT", - operationId: API_OPERATIONS.replaceRegionCountries, - path: "/v1/admin/regions/{region_id}/countries", - permission: "region:update", - permissions: ["region:update"] - }, - replaceRoleDataScopes: { - method: "PUT", - operationId: API_OPERATIONS.replaceRoleDataScopes, - path: "/v1/roles/{id}/data-scopes", - permission: "role:data-scope", - permissions: ["role:data-scope"] - }, - replaceRolePermissions: { - method: "PUT", - operationId: API_OPERATIONS.replaceRolePermissions, - path: "/v1/roles/{id}/permissions", - permission: "role:permission", - permissions: ["role:permission","role:manage"] - }, - resetUserPassword: { - method: "POST", - operationId: API_OPERATIONS.resetUserPassword, - path: "/v1/users/{id}/reset-password", - permission: "user:reset-password", - permissions: ["user:reset-password"] - }, - search: { - method: "GET", - operationId: API_OPERATIONS.search, - path: "/v1/search" - }, - setAgencyJoinEnabled: { - method: "POST", - operationId: API_OPERATIONS.setAgencyJoinEnabled, - path: "/v1/admin/agencies/{agency_id}/join-enabled", - permission: "agency:status", - permissions: ["agency:status"] - }, - setBDLeaderStatus: { - method: "PATCH", - operationId: API_OPERATIONS.setBDLeaderStatus, - path: "/v1/admin/bd-leaders/{user_id}/status", - permission: "bd:update", - permissions: ["bd:update"] - }, - setBDStatus: { - method: "PATCH", - operationId: API_OPERATIONS.setBDStatus, - path: "/v1/admin/bds/{user_id}/status", - permission: "bd:update", - permissions: ["bd:update"] - }, - setCoinSellerStatus: { - method: "PATCH", - operationId: API_OPERATIONS.setCoinSellerStatus, - path: "/v1/admin/coin-sellers/{user_id}/status", - permission: "coin-seller:update", - permissions: ["coin-seller:update"] - }, - setGameStatus: { - method: "PATCH", - operationId: API_OPERATIONS.setGameStatus, - path: "/v1/admin/game/games/{game_id}/status", - permission: "game:status", - permissions: ["game:status"] - }, - setTaskDefinitionStatus: { - method: "POST", - operationId: API_OPERATIONS.setTaskDefinitionStatus, - path: "/v1/admin/activity/daily-tasks/{task_id}/status", - permission: "daily-task:status", - permissions: ["daily-task:status"] - }, - sortMenus: { - method: "PUT", - operationId: API_OPERATIONS.sortMenus, - path: "/v1/system/menus/sort", - permission: "menu:sort", - permissions: ["menu:sort"] - }, - syncPermissions: { - method: "POST", - operationId: API_OPERATIONS.syncPermissions, - path: "/v1/permissions/sync", - permission: "permission:sync", - permissions: ["permission:sync"] - }, - updateAchievementDefinition: { - method: "PUT", - operationId: API_OPERATIONS.updateAchievementDefinition, - path: "/v1/admin/activity/achievements/{achievement_id}", - permission: "achievement:update", - permissions: ["achievement:update"] - }, - updateAppVersion: { - method: "PUT", - operationId: API_OPERATIONS.updateAppVersion, - path: "/v1/admin/app-config/versions/{version_id}", - permission: "app-version:update", - permissions: ["app-version:update"] - }, - updateBanner: { - method: "PUT", - operationId: API_OPERATIONS.updateBanner, - path: "/v1/admin/app-config/banners/{banner_id}", - permission: "app-config:update", - permissions: ["app-config:update"] - }, - updateCatalog: { - method: "PATCH", - operationId: API_OPERATIONS.updateCatalog, - path: "/v1/admin/game/games/{game_id}", - permission: "game:update", - permissions: ["game:update"] - }, - updateCountry: { - method: "PATCH", - operationId: API_OPERATIONS.updateCountry, - path: "/v1/admin/countries/{country_id}", - permission: "country:update", - permissions: ["country:update"] - }, - updateFirstRechargeRewardConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateFirstRechargeRewardConfig, - path: "/v1/admin/activity/first-recharge-reward/config", - permission: "first-recharge-reward:update", - permissions: ["first-recharge-reward:update"] - }, - updateGift: { - method: "PUT", - operationId: API_OPERATIONS.updateGift, - path: "/v1/admin/gifts/{gift_id}", - permission: "gift:update", - permissions: ["gift:update"] - }, - updateGiftType: { - method: "PUT", - operationId: API_OPERATIONS.updateGiftType, - path: "/v1/admin/gift-types/{type_code}", - permission: "gift:update", - permissions: ["gift:update"] - }, - updateH5Links: { - method: "PUT", - operationId: API_OPERATIONS.updateH5Links, - path: "/v1/admin/app-config/h5-links", - permission: "app-config:update", - permissions: ["app-config:update"] - }, - updateMenu: { - method: "PATCH", - operationId: API_OPERATIONS.updateMenu, - path: "/v1/system/menus/{id}", - permission: "menu:update", - permissions: ["menu:update"] - }, - updateMenuVisible: { - method: "PATCH", - operationId: API_OPERATIONS.updateMenuVisible, - path: "/v1/system/menus/{id}/visible", - permission: "menu:visible", - permissions: ["menu:visible"] - }, - updatePermission: { - method: "PATCH", - operationId: API_OPERATIONS.updatePermission, - path: "/v1/permissions/{id}", - permission: "permission:update", - permissions: ["permission:update"] - }, - updatePlatform: { - method: "PATCH", - operationId: API_OPERATIONS.updatePlatform, - path: "/v1/admin/game/platforms/{platform_code}", - permission: "game:update", - permissions: ["game:update"] - }, - updateRechargeProduct: { - method: "PUT", - operationId: API_OPERATIONS.updateRechargeProduct, - path: "/v1/admin/payment/recharge-products/{product_id}", - permission: "payment-product:update", - permissions: ["payment-product:update"] - }, - updateRedPacketConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateRedPacketConfig, - path: "/v1/admin/activity/red-packets/config", - permission: "red-packet:update", - permissions: ["red-packet:update"] - }, - updateRegion: { - method: "PATCH", - operationId: API_OPERATIONS.updateRegion, - path: "/v1/admin/regions/{region_id}", - permission: "region:update", - permissions: ["region:update"] - }, - updateRegistrationRewardConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateRegistrationRewardConfig, - path: "/v1/admin/activity/registration-reward/config", - permission: "registration-reward:update", - permissions: ["registration-reward:update"] - }, - updateResource: { - method: "PUT", - operationId: API_OPERATIONS.updateResource, - path: "/v1/admin/resources/{resource_id}", - permission: "resource:update", - permissions: ["resource:update"] - }, - updateResourceGroup: { - method: "PUT", - operationId: API_OPERATIONS.updateResourceGroup, - path: "/v1/admin/resource-groups/{group_id}", - permission: "resource-group:update", - permissions: ["resource-group:update"] - }, - updateResourceGroupItems: { - method: "PUT", - operationId: API_OPERATIONS.updateResourceGroupItems, - path: "/v1/admin/resource-groups/{group_id}/items", - permission: "resource-group:update", - permissions: ["resource-group:update"] - }, - updateRole: { - method: "PATCH", - operationId: API_OPERATIONS.updateRole, - path: "/v1/roles/{id}", - permission: "role:update", - permissions: ["role:update","role:manage"] - }, - updateRoom: { - method: "PATCH", - operationId: API_OPERATIONS.updateRoom, - path: "/v1/admin/rooms/{room_id}", - permission: "room:update", - permissions: ["room:update"] - }, - updateRoomConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateRoomConfig, - path: "/v1/admin/rooms/config", - permission: "room-config:update", - permissions: ["room-config:update"] - }, - updateRoomTreasureConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateRoomTreasureConfig, - path: "/v1/admin/activity/room-treasure/config", - permission: "room-treasure:update", - permissions: ["room-treasure:update"] - }, - updateSevenDayCheckInConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateSevenDayCheckInConfig, - path: "/v1/admin/activity/seven-day-checkin/config", - permission: "seven-day-checkin:update", - permissions: ["seven-day-checkin:update"] - }, - updateTaskDefinition: { - method: "PUT", - operationId: API_OPERATIONS.updateTaskDefinition, - path: "/v1/admin/activity/daily-tasks/{task_id}", - permission: "daily-task:update", - permissions: ["daily-task:update"] - }, - updateTier: { - method: "PUT", - operationId: API_OPERATIONS.updateTier, - path: "/v1/admin/users/level-config/tiers/{tier_id}", - permission: "level-config:update", - permissions: ["level-config:update"] - }, - updateTrack: { - method: "PUT", - operationId: API_OPERATIONS.updateTrack, - path: "/v1/admin/users/level-config/tracks/{track}", - permission: "level-config:update", - permissions: ["level-config:update"] - }, - updateUser: { - method: "PATCH", - operationId: API_OPERATIONS.updateUser, - path: "/v1/users/{id}", - permission: "user:update", - permissions: ["user:update"] - }, - updateUserStatus: { - method: "PATCH", - operationId: API_OPERATIONS.updateUserStatus, - path: "/v1/users/{id}/status", - permission: "user:status", - permissions: ["user:status"] - }, - uploadFile: { - method: "POST", - operationId: API_OPERATIONS.uploadFile, - path: "/v1/admin/files/upload", - permission: "upload:create", - permissions: ["upload:create"] - }, - uploadImage: { - method: "POST", - operationId: API_OPERATIONS.uploadImage, - path: "/v1/admin/files/image/upload", - permission: "upload:create", - permissions: ["upload:create"] - }, - upsertLuckyGiftConfig: { - method: "PUT", - operationId: API_OPERATIONS.upsertLuckyGiftConfig, - path: "/v1/admin/activity/lucky-gifts/config", - permission: "lucky-gift:update", - permissions: ["lucky-gift:update"] - }, - upsertRule: { - method: "PUT", - operationId: API_OPERATIONS.upsertRule, - path: "/v1/admin/users/level-config/rules/{track}/{level}", - permission: "level-config:update", - permissions: ["level-config:update"] - } + appBanUser: { + method: "POST", + operationId: API_OPERATIONS.appBanUser, + path: "/v1/app/users/{id}/ban", + permission: "app-user:status", + permissions: ["app-user:status"], + }, + appGetUser: { + method: "GET", + operationId: API_OPERATIONS.appGetUser, + path: "/v1/app/users/{id}", + permission: "app-user:view", + permissions: ["app-user:view"], + }, + appListBannedUsers: { + method: "GET", + operationId: API_OPERATIONS.appListBannedUsers, + path: "/v1/app/users/bans", + permission: "app-user:view", + permissions: ["app-user:view"], + }, + appListLoginLogs: { + method: "GET", + operationId: API_OPERATIONS.appListLoginLogs, + path: "/v1/app/users/login-logs", + permission: "app-user:view", + permissions: ["app-user:view"], + }, + appListUserLoginLogs: { + method: "GET", + operationId: API_OPERATIONS.appListUserLoginLogs, + path: "/v1/app/users/{id}/login-logs", + permission: "app-user:view", + permissions: ["app-user:view"], + }, + appListUsers: { + method: "GET", + operationId: API_OPERATIONS.appListUsers, + path: "/v1/app/users", + permission: "app-user:view", + permissions: ["app-user:view"], + }, + appSetPassword: { + method: "POST", + operationId: API_OPERATIONS.appSetPassword, + path: "/v1/app/users/{id}/password", + permission: "app-user:password", + permissions: ["app-user:password"], + }, + appUnbanUser: { + method: "POST", + operationId: API_OPERATIONS.appUnbanUser, + path: "/v1/app/users/{id}/unban", + permission: "app-user:status", + permissions: ["app-user:status"], + }, + appUpdateUser: { + method: "PATCH", + operationId: API_OPERATIONS.appUpdateUser, + path: "/v1/app/users/{id}", + permission: "app-user:update", + permissions: ["app-user:update"], + }, + batchUpdateUserStatus: { + method: "POST", + operationId: API_OPERATIONS.batchUpdateUserStatus, + path: "/v1/users/batch/status", + permission: "user:status", + permissions: ["user:status"], + }, + cancelRoomPin: { + method: "DELETE", + operationId: API_OPERATIONS.cancelRoomPin, + path: "/v1/admin/rooms/pins/{pin_id}", + permission: "room-pin:cancel", + permissions: ["room-pin:cancel"], + }, + changePassword: { + method: "POST", + operationId: API_OPERATIONS.changePassword, + path: "/v1/auth/change-password", + }, + closeAgency: { + method: "POST", + operationId: API_OPERATIONS.closeAgency, + path: "/v1/admin/agencies/{agency_id}/close", + permission: "agency:status", + permissions: ["agency:status"], + }, + createAchievementDefinition: { + method: "POST", + operationId: API_OPERATIONS.createAchievementDefinition, + path: "/v1/admin/activity/achievements", + permission: "achievement:create", + permissions: ["achievement:create"], + }, + createAgency: { + method: "POST", + operationId: API_OPERATIONS.createAgency, + path: "/v1/admin/agencies", + permission: "agency:create", + permissions: ["agency:create"], + }, + createAppVersion: { + method: "POST", + operationId: API_OPERATIONS.createAppVersion, + path: "/v1/admin/app-config/versions", + permission: "app-version:create", + permissions: ["app-version:create"], + }, + createBanner: { + method: "POST", + operationId: API_OPERATIONS.createBanner, + path: "/v1/admin/app-config/banners", + permission: "app-config:update", + permissions: ["app-config:update"], + }, + createBD: { + method: "POST", + operationId: API_OPERATIONS.createBD, + path: "/v1/admin/bds", + permission: "bd:create", + permissions: ["bd:create"], + }, + createBDLeader: { + method: "POST", + operationId: API_OPERATIONS.createBDLeader, + path: "/v1/admin/bd-leaders", + permission: "bd:create", + permissions: ["bd:create"], + }, + createCatalog: { + method: "POST", + operationId: API_OPERATIONS.createCatalog, + path: "/v1/admin/game/games", + permission: "game:create", + permissions: ["game:create"], + }, + createCoinAdjustment: { + method: "POST", + operationId: API_OPERATIONS.createCoinAdjustment, + path: "/v1/admin/operations/coin-adjustments", + permission: "coin-adjustment:create", + permissions: ["coin-adjustment:create"], + }, + createCoinSeller: { + method: "POST", + operationId: API_OPERATIONS.createCoinSeller, + path: "/v1/admin/coin-sellers", + permission: "coin-seller:create", + permissions: ["coin-seller:create"], + }, + createCountry: { + method: "POST", + operationId: API_OPERATIONS.createCountry, + path: "/v1/admin/countries", + permission: "country:create", + permissions: ["country:create"], + }, + createEmojiPack: { + method: "POST", + operationId: API_OPERATIONS.createEmojiPack, + path: "/v1/admin/emoji-packs", + permission: "emoji-pack:create", + permissions: ["emoji-pack:create"], + }, + createExploreTab: { + method: "POST", + operationId: API_OPERATIONS.createExploreTab, + path: "/v1/admin/app-config/explore-tabs", + permission: "app-config:update", + permissions: ["app-config:update"], + }, + createGift: { + method: "POST", + operationId: API_OPERATIONS.createGift, + path: "/v1/admin/gifts", + permission: "gift:create", + permissions: ["gift:create"], + }, + createH5Link: { + method: "POST", + operationId: API_OPERATIONS.createH5Link, + path: "/v1/admin/app-config/h5-links", + permission: "app-config:update", + permissions: ["app-config:update"], + }, + createMenu: { + method: "POST", + operationId: API_OPERATIONS.createMenu, + path: "/v1/system/menus", + permission: "menu:create", + permissions: ["menu:create"], + }, + createPermission: { + method: "POST", + operationId: API_OPERATIONS.createPermission, + path: "/v1/permissions", + permission: "permission:create", + permissions: ["permission:create"], + }, + createPlatform: { + method: "POST", + operationId: API_OPERATIONS.createPlatform, + path: "/v1/admin/game/platforms", + permission: "game:update", + permissions: ["game:update"], + }, + createRechargeProduct: { + method: "POST", + operationId: API_OPERATIONS.createRechargeProduct, + path: "/v1/admin/payment/recharge-products", + permission: "payment-product:create", + permissions: ["payment-product:create"], + }, + createRegion: { + method: "POST", + operationId: API_OPERATIONS.createRegion, + path: "/v1/admin/regions", + permission: "region:create", + permissions: ["region:create"], + }, + createResource: { + method: "POST", + operationId: API_OPERATIONS.createResource, + path: "/v1/admin/resources", + permission: "resource:create", + permissions: ["resource:create"], + }, + createResourceGroup: { + method: "POST", + operationId: API_OPERATIONS.createResourceGroup, + path: "/v1/admin/resource-groups", + permission: "resource-group:create", + permissions: ["resource-group:create"], + }, + createRole: { + method: "POST", + operationId: API_OPERATIONS.createRole, + path: "/v1/roles", + permission: "role:create", + permissions: ["role:create", "role:manage"], + }, + createRoomPin: { + method: "POST", + operationId: API_OPERATIONS.createRoomPin, + path: "/v1/admin/rooms/pins", + permission: "room-pin:create", + permissions: ["room-pin:create"], + }, + createTaskDefinition: { + method: "POST", + operationId: API_OPERATIONS.createTaskDefinition, + path: "/v1/admin/activity/daily-tasks", + permission: "daily-task:create", + permissions: ["daily-task:create"], + }, + createTier: { + method: "POST", + operationId: API_OPERATIONS.createTier, + path: "/v1/admin/users/level-config/tiers", + permission: "level-config:update", + permissions: ["level-config:update"], + }, + createUser: { + method: "POST", + operationId: API_OPERATIONS.createUser, + path: "/v1/users", + permission: "user:create", + permissions: ["user:create"], + }, + creditCoinSellerStock: { + method: "POST", + operationId: API_OPERATIONS.creditCoinSellerStock, + path: "/v1/admin/coin-sellers/{user_id}/stock-credits", + permission: "coin-seller:stock-credit", + permissions: ["coin-seller:stock-credit"], + }, + dashboardOverview: { + method: "GET", + operationId: API_OPERATIONS.dashboardOverview, + path: "/v1/dashboard/overview", + permission: "overview:view", + permissions: ["overview:view"], + }, + deleteAppVersion: { + method: "DELETE", + operationId: API_OPERATIONS.deleteAppVersion, + path: "/v1/admin/app-config/versions/{version_id}", + permission: "app-version:delete", + permissions: ["app-version:delete"], + }, + deleteBanner: { + method: "DELETE", + operationId: API_OPERATIONS.deleteBanner, + path: "/v1/admin/app-config/banners/{banner_id}", + permission: "app-config:update", + permissions: ["app-config:update"], + }, + deleteBDLeader: { + method: "DELETE", + operationId: API_OPERATIONS.deleteBDLeader, + path: "/v1/admin/bd-leaders/{user_id}", + permission: "bd:update", + permissions: ["bd:update"], + }, + deleteCatalog: { + method: "DELETE", + operationId: API_OPERATIONS.deleteCatalog, + path: "/v1/admin/game/games/{game_id}", + permission: "game:delete", + permissions: ["game:delete"], + }, + deleteCountry: { + method: "DELETE", + operationId: API_OPERATIONS.deleteCountry, + path: "/v1/admin/countries/{country_id}", + permission: "country:status", + permissions: ["country:status"], + }, + deleteExploreTab: { + method: "DELETE", + operationId: API_OPERATIONS.deleteExploreTab, + path: "/v1/admin/app-config/explore-tabs/{tab_id}", + permission: "app-config:update", + permissions: ["app-config:update"], + }, + deleteH5Link: { + method: "DELETE", + operationId: API_OPERATIONS.deleteH5Link, + path: "/v1/admin/app-config/h5-links/{key}", + permission: "app-config:update", + permissions: ["app-config:update"], + }, + deleteMenu: { + method: "DELETE", + operationId: API_OPERATIONS.deleteMenu, + path: "/v1/system/menus/{id}", + permission: "menu:delete", + permissions: ["menu:delete"], + }, + deletePermission: { + method: "DELETE", + operationId: API_OPERATIONS.deletePermission, + path: "/v1/permissions/{id}", + permission: "permission:delete", + permissions: ["permission:delete"], + }, + deleteRechargeProduct: { + method: "DELETE", + operationId: API_OPERATIONS.deleteRechargeProduct, + path: "/v1/admin/payment/recharge-products/{product_id}", + permission: "payment-product:delete", + permissions: ["payment-product:delete"], + }, + deleteRole: { + method: "DELETE", + operationId: API_OPERATIONS.deleteRole, + path: "/v1/roles/{id}", + permission: "role:delete", + permissions: ["role:delete", "role:manage"], + }, + deleteRoom: { + method: "DELETE", + operationId: API_OPERATIONS.deleteRoom, + path: "/v1/admin/rooms/{room_id}", + permission: "room:delete", + permissions: ["room:delete"], + }, + disableCountry: { + method: "POST", + operationId: API_OPERATIONS.disableCountry, + path: "/v1/admin/countries/{country_id}/disable", + permission: "country:status", + permissions: ["country:status"], + }, + disableGift: { + method: "POST", + operationId: API_OPERATIONS.disableGift, + path: "/v1/admin/gifts/{gift_id}/disable", + permission: "gift:status", + permissions: ["gift:status"], + }, + disableRegion: { + method: "DELETE", + operationId: API_OPERATIONS.disableRegion, + path: "/v1/admin/regions/{region_id}", + permission: "region:status", + permissions: ["region:status"], + }, + disableResource: { + method: "POST", + operationId: API_OPERATIONS.disableResource, + path: "/v1/admin/resources/{resource_id}/disable", + permission: "resource:update", + permissions: ["resource:update"], + }, + disableResourceGroup: { + method: "POST", + operationId: API_OPERATIONS.disableResourceGroup, + path: "/v1/admin/resource-groups/{group_id}/disable", + permission: "resource-group:update", + permissions: ["resource-group:update"], + }, + enableCountry: { + method: "POST", + operationId: API_OPERATIONS.enableCountry, + path: "/v1/admin/countries/{country_id}/enable", + permission: "country:status", + permissions: ["country:status"], + }, + enableGift: { + method: "POST", + operationId: API_OPERATIONS.enableGift, + path: "/v1/admin/gifts/{gift_id}/enable", + permission: "gift:status", + permissions: ["gift:status"], + }, + enableRegion: { + method: "POST", + operationId: API_OPERATIONS.enableRegion, + path: "/v1/admin/regions/{region_id}/enable", + permission: "region:status", + permissions: ["region:status"], + }, + enableResource: { + method: "POST", + operationId: API_OPERATIONS.enableResource, + path: "/v1/admin/resources/{resource_id}/enable", + permission: "resource:update", + permissions: ["resource:update"], + }, + enableResourceGroup: { + method: "POST", + operationId: API_OPERATIONS.enableResourceGroup, + path: "/v1/admin/resource-groups/{group_id}/enable", + permission: "resource-group:update", + permissions: ["resource-group:update"], + }, + exportLoginLogs: { + method: "GET", + operationId: API_OPERATIONS.exportLoginLogs, + path: "/v1/logs/login/export", + permission: "log:export", + permissions: ["log:export"], + }, + exportOperationLogs: { + method: "GET", + operationId: API_OPERATIONS.exportOperationLogs, + path: "/v1/logs/operations/export", + permission: "log:export", + permissions: ["log:export"], + }, + exportUsers: { + method: "GET", + operationId: API_OPERATIONS.exportUsers, + path: "/v1/users/export", + permission: "user:export", + permissions: ["user:export"], + }, + getCountry: { + method: "GET", + operationId: API_OPERATIONS.getCountry, + path: "/v1/admin/countries/{country_id}", + permission: "country:view", + permissions: ["country:view"], + }, + getFirstRechargeRewardConfig: { + method: "GET", + operationId: API_OPERATIONS.getFirstRechargeRewardConfig, + path: "/v1/admin/activity/first-recharge-reward/config", + permission: "first-recharge-reward:view", + permissions: ["first-recharge-reward:view"], + }, + getLuckyGiftConfig: { + method: "GET", + operationId: API_OPERATIONS.getLuckyGiftConfig, + path: "/v1/admin/activity/lucky-gifts/config", + permission: "lucky-gift:view", + permissions: ["lucky-gift:view"], + }, + getLuckyGiftDrawSummary: { + method: "GET", + operationId: API_OPERATIONS.getLuckyGiftDrawSummary, + path: "/v1/admin/activity/lucky-gifts/draw-summary", + permission: "lucky-gift:view", + permissions: ["lucky-gift:view"], + }, + getRedPacket: { + method: "GET", + operationId: API_OPERATIONS.getRedPacket, + path: "/v1/admin/activity/red-packets/{packet_id}", + permission: "red-packet:view", + permissions: ["red-packet:view"], + }, + getRedPacketConfig: { + method: "GET", + operationId: API_OPERATIONS.getRedPacketConfig, + path: "/v1/admin/activity/red-packets/config", + permission: "red-packet:view", + permissions: ["red-packet:view"], + }, + getRegion: { + method: "GET", + operationId: API_OPERATIONS.getRegion, + path: "/v1/admin/regions/{region_id}", + permission: "region:view", + permissions: ["region:view"], + }, + getRegistrationRewardConfig: { + method: "GET", + operationId: API_OPERATIONS.getRegistrationRewardConfig, + path: "/v1/admin/activity/registration-reward/config", + permission: "registration-reward:view", + permissions: ["registration-reward:view"], + }, + getResource: { + method: "GET", + operationId: API_OPERATIONS.getResource, + path: "/v1/admin/resources/{resource_id}", + permission: "resource:view", + permissions: ["resource:view"], + }, + getResourceGroup: { + method: "GET", + operationId: API_OPERATIONS.getResourceGroup, + path: "/v1/admin/resource-groups/{group_id}", + permission: "resource-group:view", + permissions: ["resource-group:view"], + }, + getRoleDataScopes: { + method: "GET", + operationId: API_OPERATIONS.getRoleDataScopes, + path: "/v1/roles/{id}/data-scopes", + permission: "role:data-scope", + permissions: ["role:data-scope"], + }, + getRoomConfig: { + method: "GET", + operationId: API_OPERATIONS.getRoomConfig, + path: "/v1/admin/rooms/config", + permission: "room-config:view", + permissions: ["room-config:view"], + }, + getRoomTreasureConfig: { + method: "GET", + operationId: API_OPERATIONS.getRoomTreasureConfig, + path: "/v1/admin/activity/room-treasure/config", + permission: "room-treasure:view", + permissions: ["room-treasure:view"], + }, + getSevenDayCheckInConfig: { + method: "GET", + operationId: API_OPERATIONS.getSevenDayCheckInConfig, + path: "/v1/admin/activity/seven-day-checkin/config", + permission: "seven-day-checkin:view", + permissions: ["seven-day-checkin:view"], + }, + getUser: { + method: "GET", + operationId: API_OPERATIONS.getUser, + path: "/v1/users/{id}", + permission: "user:view", + permissions: ["user:view"], + }, + grantResource: { + method: "POST", + operationId: API_OPERATIONS.grantResource, + path: "/v1/admin/resource-grants/resource", + permission: "resource-grant:create", + permissions: ["resource-grant:create"], + }, + grantResourceGroup: { + method: "POST", + operationId: API_OPERATIONS.grantResourceGroup, + path: "/v1/admin/resource-grants/group", + permission: "resource-grant:create", + permissions: ["resource-grant:create"], + }, + listAchievementDefinitions: { + method: "GET", + operationId: API_OPERATIONS.listAchievementDefinitions, + path: "/v1/admin/activity/achievements", + permission: "achievement:view", + permissions: ["achievement:view"], + }, + listAgencies: { + method: "GET", + operationId: API_OPERATIONS.listAgencies, + path: "/v1/admin/agencies", + permission: "agency:view", + permissions: ["agency:view"], + }, + listApps: { + method: "GET", + operationId: API_OPERATIONS.listApps, + path: "/v1/admin/apps", + }, + listAppVersions: { + method: "GET", + operationId: API_OPERATIONS.listAppVersions, + path: "/v1/admin/app-config/versions", + permission: "app-version:view", + permissions: ["app-version:view"], + }, + listBanners: { + method: "GET", + operationId: API_OPERATIONS.listBanners, + path: "/v1/admin/app-config/banners", + permission: "app-config:view", + permissions: ["app-config:view"], + }, + listBDLeaders: { + method: "GET", + operationId: API_OPERATIONS.listBDLeaders, + path: "/v1/admin/bd-leaders", + permission: "bd:view", + permissions: ["bd:view"], + }, + listBDs: { + method: "GET", + operationId: API_OPERATIONS.listBDs, + path: "/v1/admin/bds", + permission: "bd:view", + permissions: ["bd:view"], + }, + listCatalog: { + method: "GET", + operationId: API_OPERATIONS.listCatalog, + path: "/v1/admin/game/games", + permission: "game:view", + permissions: ["game:view"], + }, + listCoinAdjustments: { + method: "GET", + operationId: API_OPERATIONS.listCoinAdjustments, + path: "/v1/admin/operations/coin-adjustments", + permission: "coin-adjustment:view", + permissions: ["coin-adjustment:view"], + }, + listCoinLedger: { + method: "GET", + operationId: API_OPERATIONS.listCoinLedger, + path: "/v1/admin/operations/coin-ledger", + permission: "coin-ledger:view", + permissions: ["coin-ledger:view"], + }, + listCoinSellers: { + method: "GET", + operationId: API_OPERATIONS.listCoinSellers, + path: "/v1/admin/coin-sellers", + permission: "coin-seller:view", + permissions: ["coin-seller:view"], + }, + listCountries: { + method: "GET", + operationId: API_OPERATIONS.listCountries, + path: "/v1/admin/countries", + permission: "country:view", + permissions: ["country:view"], + }, + listEmojiPackCategories: { + method: "GET", + operationId: API_OPERATIONS.listEmojiPackCategories, + path: "/v1/admin/emoji-packs/categories", + permission: "emoji-pack:view", + permissions: ["emoji-pack:view"], + }, + listEmojiPacks: { + method: "GET", + operationId: API_OPERATIONS.listEmojiPacks, + path: "/v1/admin/emoji-packs", + permission: "emoji-pack:view", + permissions: ["emoji-pack:view"], + }, + listExploreTabs: { + method: "GET", + operationId: API_OPERATIONS.listExploreTabs, + path: "/v1/admin/app-config/explore-tabs", + permission: "app-config:view", + permissions: ["app-config:view"], + }, + listFirstRechargeRewardClaims: { + method: "GET", + operationId: API_OPERATIONS.listFirstRechargeRewardClaims, + path: "/v1/admin/activity/first-recharge-reward/claims", + permission: "first-recharge-reward:view", + permissions: ["first-recharge-reward:view"], + }, + listGifts: { + method: "GET", + operationId: API_OPERATIONS.listGifts, + path: "/v1/admin/gifts", + permission: "gift:view", + permissions: ["gift:view"], + }, + listGiftTypes: { + method: "GET", + operationId: API_OPERATIONS.listGiftTypes, + path: "/v1/admin/gift-types", + permission: "gift:view", + permissions: ["gift:view"], + }, + listH5Links: { + method: "GET", + operationId: API_OPERATIONS.listH5Links, + path: "/v1/admin/app-config/h5-links", + permission: "app-config:view", + permissions: ["app-config:view"], + }, + listHosts: { + method: "GET", + operationId: API_OPERATIONS.listHosts, + path: "/v1/admin/hosts", + permission: "host:view", + permissions: ["host:view"], + }, + listLevelConfig: { + method: "GET", + operationId: API_OPERATIONS.listLevelConfig, + path: "/v1/admin/users/level-config", + permission: "level-config:view", + permissions: ["level-config:view"], + }, + listLoginLogs: { + method: "GET", + operationId: API_OPERATIONS.listLoginLogs, + path: "/v1/logs/login", + permission: "log:view", + permissions: ["log:view"], + }, + listLuckyGiftConfigs: { + method: "GET", + operationId: API_OPERATIONS.listLuckyGiftConfigs, + path: "/v1/admin/activity/lucky-gifts/configs", + permission: "lucky-gift:view", + permissions: ["lucky-gift:view"], + }, + listLuckyGiftDraws: { + method: "GET", + operationId: API_OPERATIONS.listLuckyGiftDraws, + path: "/v1/admin/activity/lucky-gifts/draws", + permission: "lucky-gift:view", + permissions: ["lucky-gift:view"], + }, + listOperationLogs: { + method: "GET", + operationId: API_OPERATIONS.listOperationLogs, + path: "/v1/logs/operations", + permission: "log:view", + permissions: ["log:view"], + }, + listPermissions: { + method: "GET", + operationId: API_OPERATIONS.listPermissions, + path: "/v1/permissions", + permission: "permission:view", + permissions: ["permission:view", "role:permission", "role:manage"], + }, + listPlatforms: { + method: "GET", + operationId: API_OPERATIONS.listPlatforms, + path: "/v1/admin/game/platforms", + permission: "game:view", + permissions: ["game:view"], + }, + listRechargeBills: { + method: "GET", + operationId: API_OPERATIONS.listRechargeBills, + path: "/v1/admin/payment/recharge-bills", + permission: "payment-bill:view", + permissions: ["payment-bill:view"], + }, + listRechargeProducts: { + method: "GET", + operationId: API_OPERATIONS.listRechargeProducts, + path: "/v1/admin/payment/recharge-products", + permission: "payment-product:view", + permissions: ["payment-product:view"], + }, + listRedPackets: { + method: "GET", + operationId: API_OPERATIONS.listRedPackets, + path: "/v1/admin/activity/red-packets", + permission: "red-packet:view", + permissions: ["red-packet:view"], + }, + listRegionBlocks: { + method: "GET", + operationId: API_OPERATIONS.listRegionBlocks, + path: "/v1/admin/users/region-blocks", + permission: "region-block:view", + permissions: ["region-block:view"], + }, + listRegions: { + method: "GET", + operationId: API_OPERATIONS.listRegions, + path: "/v1/admin/regions", + permission: "region:view", + permissions: ["region:view"], + }, + listRegistrationRewardClaims: { + method: "GET", + operationId: API_OPERATIONS.listRegistrationRewardClaims, + path: "/v1/admin/activity/registration-reward/claims", + permission: "registration-reward:view", + permissions: ["registration-reward:view"], + }, + listResourceGrants: { + method: "GET", + operationId: API_OPERATIONS.listResourceGrants, + path: "/v1/admin/resource-grants", + permission: "resource-grant:view", + permissions: ["resource-grant:view"], + }, + listResourceGroups: { + method: "GET", + operationId: API_OPERATIONS.listResourceGroups, + path: "/v1/admin/resource-groups", + permission: "resource-group:view", + permissions: ["resource-group:view"], + }, + listResources: { + method: "GET", + operationId: API_OPERATIONS.listResources, + path: "/v1/admin/resources", + permission: "resource:view", + permissions: ["resource:view"], + }, + listRoles: { + method: "GET", + operationId: API_OPERATIONS.listRoles, + path: "/v1/roles", + permission: "role:view", + permissions: ["role:view"], + }, + listRoomPins: { + method: "GET", + operationId: API_OPERATIONS.listRoomPins, + path: "/v1/admin/rooms/pins", + permission: "room-pin:view", + permissions: ["room-pin:view"], + }, + listRooms: { + method: "GET", + operationId: API_OPERATIONS.listRooms, + path: "/v1/admin/rooms", + permission: "room:view", + permissions: ["room:view"], + }, + listSevenDayCheckInClaims: { + method: "GET", + operationId: API_OPERATIONS.listSevenDayCheckInClaims, + path: "/v1/admin/activity/seven-day-checkin/claims", + permission: "seven-day-checkin:view", + permissions: ["seven-day-checkin:view"], + }, + listSystemMenus: { + method: "GET", + operationId: API_OPERATIONS.listSystemMenus, + path: "/v1/system/menus", + permission: "menu:view", + permissions: ["menu:view"], + }, + listTaskDefinitions: { + method: "GET", + operationId: API_OPERATIONS.listTaskDefinitions, + path: "/v1/admin/activity/daily-tasks", + permission: "daily-task:view", + permissions: ["daily-task:view"], + }, + listUserLeaderboards: { + method: "GET", + operationId: API_OPERATIONS.listUserLeaderboards, + path: "/v1/admin/activity/user-leaderboards", + permission: "user-leaderboard:view", + permissions: ["user-leaderboard:view"], + }, + listUsers: { + method: "GET", + operationId: API_OPERATIONS.listUsers, + path: "/v1/users", + permission: "user:view", + permissions: ["user:view"], + }, + login: { + method: "POST", + operationId: API_OPERATIONS.login, + path: "/v1/auth/login", + }, + logout: { + method: "POST", + operationId: API_OPERATIONS.logout, + path: "/v1/auth/logout", + }, + lookupCoinAdjustmentTarget: { + method: "GET", + operationId: API_OPERATIONS.lookupCoinAdjustmentTarget, + path: "/v1/admin/operations/coin-adjustments/target", + permission: "coin-adjustment:create", + permissions: ["coin-adjustment:create"], + }, + me: { + method: "GET", + operationId: API_OPERATIONS.me, + path: "/v1/auth/me", + }, + navigationMenus: { + method: "GET", + operationId: API_OPERATIONS.navigationMenus, + path: "/v1/navigation/menus", + }, + refresh: { + method: "POST", + operationId: API_OPERATIONS.refresh, + path: "/v1/auth/refresh", + }, + replaceRegionBlocks: { + method: "PUT", + operationId: API_OPERATIONS.replaceRegionBlocks, + path: "/v1/admin/users/region-blocks", + permission: "region-block:update", + permissions: ["region-block:update"], + }, + replaceRegionCountries: { + method: "PUT", + operationId: API_OPERATIONS.replaceRegionCountries, + path: "/v1/admin/regions/{region_id}/countries", + permission: "region:update", + permissions: ["region:update"], + }, + replaceRoleDataScopes: { + method: "PUT", + operationId: API_OPERATIONS.replaceRoleDataScopes, + path: "/v1/roles/{id}/data-scopes", + permission: "role:data-scope", + permissions: ["role:data-scope"], + }, + replaceRolePermissions: { + method: "PUT", + operationId: API_OPERATIONS.replaceRolePermissions, + path: "/v1/roles/{id}/permissions", + permission: "role:permission", + permissions: ["role:permission", "role:manage"], + }, + resetUserPassword: { + method: "POST", + operationId: API_OPERATIONS.resetUserPassword, + path: "/v1/users/{id}/reset-password", + permission: "user:reset-password", + permissions: ["user:reset-password"], + }, + search: { + method: "GET", + operationId: API_OPERATIONS.search, + path: "/v1/search", + }, + setAgencyJoinEnabled: { + method: "POST", + operationId: API_OPERATIONS.setAgencyJoinEnabled, + path: "/v1/admin/agencies/{agency_id}/join-enabled", + permission: "agency:status", + permissions: ["agency:status"], + }, + setBDLeaderStatus: { + method: "PATCH", + operationId: API_OPERATIONS.setBDLeaderStatus, + path: "/v1/admin/bd-leaders/{user_id}/status", + permission: "bd:update", + permissions: ["bd:update"], + }, + setBDStatus: { + method: "PATCH", + operationId: API_OPERATIONS.setBDStatus, + path: "/v1/admin/bds/{user_id}/status", + permission: "bd:update", + permissions: ["bd:update"], + }, + setCoinSellerStatus: { + method: "PATCH", + operationId: API_OPERATIONS.setCoinSellerStatus, + path: "/v1/admin/coin-sellers/{user_id}/status", + permission: "coin-seller:update", + permissions: ["coin-seller:update"], + }, + setGameStatus: { + method: "PATCH", + operationId: API_OPERATIONS.setGameStatus, + path: "/v1/admin/game/games/{game_id}/status", + permission: "game:status", + permissions: ["game:status"], + }, + setTaskDefinitionStatus: { + method: "POST", + operationId: API_OPERATIONS.setTaskDefinitionStatus, + path: "/v1/admin/activity/daily-tasks/{task_id}/status", + permission: "daily-task:status", + permissions: ["daily-task:status"], + }, + sortMenus: { + method: "PUT", + operationId: API_OPERATIONS.sortMenus, + path: "/v1/system/menus/sort", + permission: "menu:sort", + permissions: ["menu:sort"], + }, + syncPermissions: { + method: "POST", + operationId: API_OPERATIONS.syncPermissions, + path: "/v1/permissions/sync", + permission: "permission:sync", + permissions: ["permission:sync"], + }, + updateAchievementDefinition: { + method: "PUT", + operationId: API_OPERATIONS.updateAchievementDefinition, + path: "/v1/admin/activity/achievements/{achievement_id}", + permission: "achievement:update", + permissions: ["achievement:update"], + }, + updateAppVersion: { + method: "PUT", + operationId: API_OPERATIONS.updateAppVersion, + path: "/v1/admin/app-config/versions/{version_id}", + permission: "app-version:update", + permissions: ["app-version:update"], + }, + updateBanner: { + method: "PUT", + operationId: API_OPERATIONS.updateBanner, + path: "/v1/admin/app-config/banners/{banner_id}", + permission: "app-config:update", + permissions: ["app-config:update"], + }, + updateCatalog: { + method: "PATCH", + operationId: API_OPERATIONS.updateCatalog, + path: "/v1/admin/game/games/{game_id}", + permission: "game:update", + permissions: ["game:update"], + }, + updateCountry: { + method: "PATCH", + operationId: API_OPERATIONS.updateCountry, + path: "/v1/admin/countries/{country_id}", + permission: "country:update", + permissions: ["country:update"], + }, + updateExploreTab: { + method: "PUT", + operationId: API_OPERATIONS.updateExploreTab, + path: "/v1/admin/app-config/explore-tabs/{tab_id}", + permission: "app-config:update", + permissions: ["app-config:update"], + }, + updateFirstRechargeRewardConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateFirstRechargeRewardConfig, + path: "/v1/admin/activity/first-recharge-reward/config", + permission: "first-recharge-reward:update", + permissions: ["first-recharge-reward:update"], + }, + updateGift: { + method: "PUT", + operationId: API_OPERATIONS.updateGift, + path: "/v1/admin/gifts/{gift_id}", + permission: "gift:update", + permissions: ["gift:update"], + }, + updateGiftType: { + method: "PUT", + operationId: API_OPERATIONS.updateGiftType, + path: "/v1/admin/gift-types/{type_code}", + permission: "gift:update", + permissions: ["gift:update"], + }, + updateH5Link: { + method: "PUT", + operationId: API_OPERATIONS.updateH5Link, + path: "/v1/admin/app-config/h5-links/{key}", + permission: "app-config:update", + permissions: ["app-config:update"], + }, + updateH5Links: { + method: "PUT", + operationId: API_OPERATIONS.updateH5Links, + path: "/v1/admin/app-config/h5-links", + permission: "app-config:update", + permissions: ["app-config:update"], + }, + updateMenu: { + method: "PATCH", + operationId: API_OPERATIONS.updateMenu, + path: "/v1/system/menus/{id}", + permission: "menu:update", + permissions: ["menu:update"], + }, + updateMenuVisible: { + method: "PATCH", + operationId: API_OPERATIONS.updateMenuVisible, + path: "/v1/system/menus/{id}/visible", + permission: "menu:visible", + permissions: ["menu:visible"], + }, + updatePermission: { + method: "PATCH", + operationId: API_OPERATIONS.updatePermission, + path: "/v1/permissions/{id}", + permission: "permission:update", + permissions: ["permission:update"], + }, + updatePlatform: { + method: "PATCH", + operationId: API_OPERATIONS.updatePlatform, + path: "/v1/admin/game/platforms/{platform_code}", + permission: "game:update", + permissions: ["game:update"], + }, + updateRechargeProduct: { + method: "PUT", + operationId: API_OPERATIONS.updateRechargeProduct, + path: "/v1/admin/payment/recharge-products/{product_id}", + permission: "payment-product:update", + permissions: ["payment-product:update"], + }, + updateRedPacketConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateRedPacketConfig, + path: "/v1/admin/activity/red-packets/config", + permission: "red-packet:update", + permissions: ["red-packet:update"], + }, + updateRegion: { + method: "PATCH", + operationId: API_OPERATIONS.updateRegion, + path: "/v1/admin/regions/{region_id}", + permission: "region:update", + permissions: ["region:update"], + }, + updateRegistrationRewardConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateRegistrationRewardConfig, + path: "/v1/admin/activity/registration-reward/config", + permission: "registration-reward:update", + permissions: ["registration-reward:update"], + }, + updateResource: { + method: "PUT", + operationId: API_OPERATIONS.updateResource, + path: "/v1/admin/resources/{resource_id}", + permission: "resource:update", + permissions: ["resource:update"], + }, + updateResourceGroup: { + method: "PUT", + operationId: API_OPERATIONS.updateResourceGroup, + path: "/v1/admin/resource-groups/{group_id}", + permission: "resource-group:update", + permissions: ["resource-group:update"], + }, + updateResourceGroupItems: { + method: "PUT", + operationId: API_OPERATIONS.updateResourceGroupItems, + path: "/v1/admin/resource-groups/{group_id}/items", + permission: "resource-group:update", + permissions: ["resource-group:update"], + }, + updateRole: { + method: "PATCH", + operationId: API_OPERATIONS.updateRole, + path: "/v1/roles/{id}", + permission: "role:update", + permissions: ["role:update", "role:manage"], + }, + updateRoom: { + method: "PATCH", + operationId: API_OPERATIONS.updateRoom, + path: "/v1/admin/rooms/{room_id}", + permission: "room:update", + permissions: ["room:update"], + }, + updateRoomConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateRoomConfig, + path: "/v1/admin/rooms/config", + permission: "room-config:update", + permissions: ["room-config:update"], + }, + updateRoomTreasureConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateRoomTreasureConfig, + path: "/v1/admin/activity/room-treasure/config", + permission: "room-treasure:update", + permissions: ["room-treasure:update"], + }, + updateSevenDayCheckInConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateSevenDayCheckInConfig, + path: "/v1/admin/activity/seven-day-checkin/config", + permission: "seven-day-checkin:update", + permissions: ["seven-day-checkin:update"], + }, + updateTaskDefinition: { + method: "PUT", + operationId: API_OPERATIONS.updateTaskDefinition, + path: "/v1/admin/activity/daily-tasks/{task_id}", + permission: "daily-task:update", + permissions: ["daily-task:update"], + }, + updateTier: { + method: "PUT", + operationId: API_OPERATIONS.updateTier, + path: "/v1/admin/users/level-config/tiers/{tier_id}", + permission: "level-config:update", + permissions: ["level-config:update"], + }, + updateTrack: { + method: "PUT", + operationId: API_OPERATIONS.updateTrack, + path: "/v1/admin/users/level-config/tracks/{track}", + permission: "level-config:update", + permissions: ["level-config:update"], + }, + updateUser: { + method: "PATCH", + operationId: API_OPERATIONS.updateUser, + path: "/v1/users/{id}", + permission: "user:update", + permissions: ["user:update"], + }, + updateUserStatus: { + method: "PATCH", + operationId: API_OPERATIONS.updateUserStatus, + path: "/v1/users/{id}/status", + permission: "user:status", + permissions: ["user:status"], + }, + uploadFile: { + method: "POST", + operationId: API_OPERATIONS.uploadFile, + path: "/v1/admin/files/upload", + permission: "upload:create", + permissions: ["upload:create"], + }, + uploadImage: { + method: "POST", + operationId: API_OPERATIONS.uploadImage, + path: "/v1/admin/files/image/upload", + permission: "upload:create", + permissions: ["upload:create"], + }, + upsertLuckyGiftConfig: { + method: "PUT", + operationId: API_OPERATIONS.upsertLuckyGiftConfig, + path: "/v1/admin/activity/lucky-gifts/config", + permission: "lucky-gift:update", + permissions: ["lucky-gift:update"], + }, + upsertRule: { + method: "PUT", + operationId: API_OPERATIONS.upsertRule, + path: "/v1/admin/users/level-config/rules/{track}/{level}", + permission: "level-config:update", + permissions: ["level-config:update"], + }, }; export const API_OPERATION_IDS = Object.values(API_OPERATIONS); export const API_PERMISSION_CODES = Array.from( - new Set( - Object.values(API_ENDPOINTS) - .flatMap((endpoint) => endpoint.permissions || (endpoint.permission ? [endpoint.permission] : [])) - .filter((permission): permission is PermissionCode => Boolean(permission)) - ) + new Set( + Object.values(API_ENDPOINTS) + .flatMap((endpoint) => endpoint.permissions || (endpoint.permission ? [endpoint.permission] : [])) + .filter((permission): permission is PermissionCode => Boolean(permission)), + ), ); export type ApiPathParams = Record; export function apiEndpointPath(operationId: ApiOperationId, params: ApiPathParams = {}) { - let endpointPath = API_ENDPOINTS[operationId].path; + let endpointPath = API_ENDPOINTS[operationId].path; - for (const [key, value] of Object.entries(params)) { - endpointPath = endpointPath.replace(`{${key}}`, encodeURIComponent(String(value))); - } + for (const [key, value] of Object.entries(params)) { + endpointPath = endpointPath.replace(`{${key}}`, encodeURIComponent(String(value))); + } - return endpointPath; + return endpointPath; } diff --git a/src/shared/api/generated/schema.d.ts b/src/shared/api/generated/schema.d.ts index f445606..651204b 100644 --- a/src/shared/api/generated/schema.d.ts +++ b/src/shared/api/generated/schema.d.ts @@ -196,6 +196,22 @@ export interface paths { patch?: never; trace?: never; }; + "/admin/activity/lucky-gifts/draw-summary": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getLuckyGiftDrawSummary"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/admin/activity/first-recharge-reward/claims": { parameters: { query?: never; @@ -397,13 +413,61 @@ export interface paths { }; get: operations["listH5Links"]; put: operations["updateH5Links"]; - post?: never; + post: operations["createH5Link"]; delete?: never; options?: never; head?: never; patch?: never; trace?: never; }; + "/admin/app-config/h5-links/{key}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: operations["updateH5Link"]; + post?: never; + delete: operations["deleteH5Link"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/app-config/explore-tabs": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["listExploreTabs"]; + put?: never; + post: operations["createExploreTab"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/app-config/explore-tabs/{tab_id}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: operations["updateExploreTab"]; + post?: never; + delete: operations["deleteExploreTab"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/admin/app-config/versions": { parameters: { query?: never; @@ -2654,6 +2718,18 @@ export interface operations { 200: components["responses"]["EmptyResponse"]; }; }; + getLuckyGiftDrawSummary: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptyResponse"]; + }; + }; listFirstRechargeRewardClaims: { parameters: { query?: never; @@ -2921,6 +2997,98 @@ export interface operations { 200: components["responses"]["EmptyResponse"]; }; }; + createH5Link: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptyResponse"]; + }; + }; + updateH5Link: { + parameters: { + query?: never; + header?: never; + path: { + key: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptyResponse"]; + }; + }; + deleteH5Link: { + parameters: { + query?: never; + header?: never; + path: { + key: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptyResponse"]; + }; + }; + listExploreTabs: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptyResponse"]; + }; + }; + createExploreTab: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptyResponse"]; + }; + }; + updateExploreTab: { + parameters: { + query?: never; + header?: never; + path: { + tab_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptyResponse"]; + }; + }; + deleteExploreTab: { + parameters: { + query?: never; + header?: never; + path: { + tab_id: number; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["EmptyResponse"]; + }; + }; listAppVersions: { parameters: { query?: never; diff --git a/src/shared/api/types.ts b/src/shared/api/types.ts index 5d49bca..c2c90fa 100644 --- a/src/shared/api/types.ts +++ b/src/shared/api/types.ts @@ -618,13 +618,32 @@ export interface H5LinkConfigDto { export interface H5LinkConfigPayload { key: string; - url?: string; + label: string; + url: string; } export interface H5LinkConfigUpdatePayload { items: H5LinkConfigPayload[]; } +export interface ExploreTabDto { + appCode?: string; + createdAtMs?: number; + enabled: boolean; + h5Url: string; + id: number; + sortOrder?: number; + tab: string; + updatedAtMs?: number; +} + +export interface ExploreTabPayload { + enabled: boolean; + h5Url: string; + sortOrder?: number; + tab: string; +} + export interface AppBannerDto { appCode?: string; bannerType: "h5" | "app" | string; diff --git a/src/shared/ui/DataTable.jsx b/src/shared/ui/DataTable.jsx index cbe3f73..7b0676a 100644 --- a/src/shared/ui/DataTable.jsx +++ b/src/shared/ui/DataTable.jsx @@ -22,6 +22,7 @@ export function DataTable({ emptyLabel = "当前无数据", fixedEdges = true, getRowProps, + infiniteScroll, items, minWidth = "980px", onColumnWidthsChange, @@ -38,8 +39,11 @@ export function DataTable({ const [filterQuery, setFilterQuery] = useState(""); const [hasHorizontalOverflow, setHasHorizontalOverflow] = useState(false); const [resizeSession, setResizeSession] = useState(null); + const loadMoreRef = useRef(null); const scrollRef = useRef(null); const safeItems = Array.isArray(items) ? items : []; + const infiniteLoading = Boolean(infiniteScroll?.loading); + const infiniteHasMore = Boolean(infiniteScroll?.hasMore); const renderContext = useMemo(() => (context ? { ...context, timeZone } : { timeZone }), [context, timeZone]); const preparedColumns = useMemo( @@ -132,6 +136,28 @@ export function DataTable({ }; }, [onColumnWidthsChange, resizeSession]); + useEffect(() => { + const root = scrollRef.current; + const target = loadMoreRef.current; + if (!root || !target || !infiniteScroll?.onLoadMore || !infiniteHasMore || infiniteLoading) { + return undefined; + } + + const observer = new IntersectionObserver( + (entries) => { + if (entries.some((entry) => entry.isIntersecting)) { + infiniteScroll.onLoadMore(); + } + }, + { root, rootMargin: "0px 0px 96px", threshold: 0.01 } + ); + + observer.observe(target); + return () => { + observer.disconnect(); + }; + }, [infiniteHasMore, infiniteLoading, infiniteScroll, safeItems.length]); + const startResize = (event, column) => { if (!resizableColumns || column.resizable === false) { return; @@ -247,25 +273,48 @@ export function DataTable({ })} {safeItems.length ? ( - safeItems.map((item, index) => { - const rowProps = getRowProps ? getRowProps(item, index) : {}; - const { className: rowClassName = "", ...restRowProps } = rowProps; + <> + {safeItems.map((item, index) => { + const rowProps = getRowProps ? getRowProps(item, index) : {}; + const { className: rowClassName = "", ...restRowProps } = rowProps; - return ( -
- {preparedColumns.map((column) => ( -
- {column.render ? column.render(item, index, renderContext) : displayValue(item[column.key])} -
- ))} + return ( +
+ {preparedColumns.map((column) => ( +
+ {column.render ? column.render(item, index, renderContext) : displayValue(item[column.key])} +
+ ))} +
+ ); + })} + {infiniteScroll ? ( +
+
+ {infiniteLoading ? infiniteScroll.loadingLabel || "加载中..." : infiniteHasMore ? "" : infiniteScroll.doneLabel || ""} +
- ); - }) + ) : null} + + ) : infiniteLoading ? ( +
+
+ {infiniteScroll?.loadingLabel || "加载中..."} +
+
) : (
{emptyLabel}
)} + {safeItems.length === 0 && infiniteScroll && !infiniteLoading ? ( +
+ ) : null}
{pagination ? : null} diff --git a/src/shared/ui/PaginationBar.jsx b/src/shared/ui/PaginationBar.jsx index 095b352..3997c7c 100644 --- a/src/shared/ui/PaginationBar.jsx +++ b/src/shared/ui/PaginationBar.jsx @@ -12,46 +12,57 @@ export function PaginationBar({ page, pageSize, pageSizeOptions = [], - total + total, + totalPages }) { const hasKnownTotal = Number.isFinite(Number(total)); - const totalPages = hasKnownTotal ? Math.max(1, Math.ceil(total / pageSize)) : Math.max(1, page + (hasNextPage ? 1 : 0)); + const resolvedTotalPages = Number.isFinite(Number(totalPages)) + ? Math.max(1, Number(totalPages)) + : hasKnownTotal + ? Math.max(1, Math.ceil(total / pageSize)) + : Math.max(1, page + (hasNextPage ? 1 : 0)); const start = hasKnownTotal ? (total === 0 ? 0 : (page - 1) * pageSize + 1) : 0; const end = hasKnownTotal ? Math.min(total, page * pageSize) : Number(itemCount || 0); - const nextDisabled = hasKnownTotal ? page >= totalPages : !hasNextPage; + const nextDisabled = hasKnownTotal ? page >= resolvedTotalPages : !hasNextPage; + const showPageActions = typeof onPageChange === "function"; + const showPageSize = showPageActions && pageSizeOptions.length && onPageSizeChange; + const pageSummary = hasKnownTotal ? `共 ${resolvedTotalPages} 页 · 共 ${total} 条` : `已加载 ${Math.max(1, page)} 页 · ${end} 条`; return (
- {pageSizeOptions.length && onPageSizeChange ? ( - onPageSizeChange(Number(event.target.value))} - > - {pageSizeOptions.map((option) => ( - - {option} - - ))} - + {showPageSize ? ( + + 每页 + onPageSizeChange(Number(event.target.value))} + > + {pageSizeOptions.map((option) => ( + + {option} + + ))} + + ) : null} - - {hasKnownTotal ? `${start}-${end} / 共 ${total} 条` : `第 ${page} 页 · 本页 ${end} 条`} - -
-
- onPageChange(page - 1)}> - - - {page} / {totalPages} - onPageChange(page + 1)}> - - + {showPageActions && hasKnownTotal ? `${start}-${end} / ${total}` : pageSummary}
+ {showPageActions ? ( +
+ onPageChange(page - 1)}> + + + {page} / {resolvedTotalPages} + onPageChange(page + 1)}> + + +
+ ) : null}
); } diff --git a/src/shared/ui/ResourceGroupSelectDrawer.module.css b/src/shared/ui/ResourceGroupSelectDrawer.module.css index bcc84d2..9558b40 100644 --- a/src/shared/ui/ResourceGroupSelectDrawer.module.css +++ b/src/shared/ui/ResourceGroupSelectDrawer.module.css @@ -3,33 +3,38 @@ } .drawer.drawer { - width: min(760px, 100vw); + width: min(640px, 100vw); height: 100%; } .drawerBody { flex: 1; min-height: 0; + overflow: hidden; } .groupGrid { display: grid; min-height: 0; - grid-template-columns: repeat(auto-fill, minmax(176px, 1fr)); - gap: var(--space-3); + align-content: start; + align-items: start; + grid-auto-rows: min-content; + grid-template-columns: repeat(auto-fill, minmax(260px, 1fr)); + gap: var(--space-2); overflow-y: auto; padding-right: var(--space-1); } .groupCard { display: grid; + grid-template-columns: 40px minmax(0, 1fr); min-width: 0; - min-height: 136px; - align-content: start; - gap: var(--space-2); + min-height: 76px; + align-items: start; + gap: var(--space-1) var(--space-3); padding: var(--space-3); border: 1px solid var(--border); - border-radius: var(--radius-card); + border-radius: var(--radius-control); background: var(--bg-card); color: var(--text-primary); cursor: pointer; @@ -45,8 +50,8 @@ .groupCard:hover { border-color: var(--primary-border); background: var(--primary-surface); - box-shadow: var(--shadow-soft); - transform: translateY(-1px); + box-shadow: none; + transform: none; } .groupCard:focus-visible { @@ -62,18 +67,20 @@ } .emptyCard { - min-height: 104px; + min-height: 64px; + align-items: center; } .groupIcon { display: inline-flex; - width: 44px; - height: 44px; + grid-row: 1 / 4; + width: 40px; + height: 40px; align-items: center; justify-content: center; overflow: hidden; border: 1px solid var(--border); - border-radius: var(--radius-sm); + border-radius: var(--radius-control); background: var(--bg-card-strong); color: var(--text-secondary); } @@ -105,6 +112,7 @@ .groupItems { display: flex; + grid-column: 2; min-width: 0; flex-wrap: wrap; gap: var(--space-1); @@ -136,7 +144,7 @@ @media (max-width: 640px) { .groupGrid { - grid-template-columns: repeat(auto-fill, minmax(148px, 1fr)); + grid-template-columns: 1fr; } } diff --git a/src/styles/shared-ui.css b/src/styles/shared-ui.css index 4e41f03..f386c8f 100644 --- a/src/styles/shared-ui.css +++ b/src/styles/shared-ui.css @@ -994,27 +994,45 @@ display: flex; align-items: center; justify-content: space-between; - gap: var(--space-3); - margin-top: var(--space-3); + gap: var(--space-2); + min-height: 32px; + margin-top: var(--space-2); color: var(--text-tertiary); - font-size: var(--admin-font-size); + font-size: 12px; } .pagination-bar__meta { display: flex; min-width: 0; align-items: center; - gap: var(--space-3); + gap: var(--space-2); +} + +.pagination-bar__page-size-wrap { + display: inline-flex; + align-items: center; + gap: var(--space-1); } .pagination-bar__page-size { - width: 96px; + width: 72px; +} + +.pagination-bar__page-size .MuiInputBase-root { + height: 30px; + border-radius: var(--radius-control); + font-size: 12px; +} + +.pagination-bar__page-size .MuiSelect-select.MuiInputBase-input { + padding-top: 4px; + padding-bottom: 4px; } .pagination-bar__actions { display: flex; align-items: center; - gap: var(--space-2); + gap: var(--space-1); } .data-state { @@ -1125,7 +1143,7 @@ } .admin-table { - --admin-table-cell-x: var(--space-4); + --admin-table-cell-x: var(--space-3); display: flex; flex-direction: column; width: max(100%, var(--admin-table-min-width, 900px)); @@ -1160,10 +1178,30 @@ font-weight: 650; } +.admin-row--load-more { + min-height: 36px; + color: var(--text-tertiary); + font-size: 12px; +} + +.admin-row--load-more-done { + min-height: 1px; +} + +.admin-cell--load-more { + grid-column: 1 / -1; + text-align: center; +} + +.admin-row--load-more-sentinel { + min-height: 1px; +} + .admin-cell { box-sizing: border-box; min-width: 0; padding: 0 var(--admin-table-cell-x); + overflow: hidden; overflow-wrap: anywhere; } @@ -1180,11 +1218,11 @@ display: flex; min-height: var(--table-head-height); align-items: center; - padding-right: calc(var(--admin-table-cell-x) + 12px); + padding-right: calc(var(--admin-table-cell-x) + 10px); } .admin-cell--head:last-child { - padding-right: calc(var(--admin-table-cell-x) + 12px); + padding-right: calc(var(--admin-table-cell-x) + 10px); } .admin-cell__head-content { diff --git a/src/styles/tokens.css b/src/styles/tokens.css index 1a721c6..c7d5b29 100644 --- a/src/styles/tokens.css +++ b/src/styles/tokens.css @@ -9,8 +9,8 @@ --admin-tag-gap: var(--space-1); --admin-tag-font-size: var(--admin-font-size); --admin-tag-font-weight: 650; - --table-head-height: 44px; - --table-row-height: 58px; + --table-head-height: 38px; + --table-row-height: 48px; --switch-width: 46px; --switch-height: 26px; --switch-thumb-size: 20px;