diff --git a/contracts/admin-openapi.json b/contracts/admin-openapi.json index b55bfa4..097f534 100644 --- a/contracts/admin-openapi.json +++ b/contracts/admin-openapi.json @@ -732,6 +732,114 @@ "x-permissions": ["registration-reward:update"] } }, + "/admin/activity/vip-program": { + "get": { + "operationId": "getVipProgram", + "responses": { + "200": { + "$ref": "#/components/responses/VipProgramResponse" + } + }, + "x-permission": "vip-config:view", + "x-permissions": ["vip-config:view"] + }, + "put": { + "operationId": "updateVipProgram", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VipProgramUpdateInput" + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/VipProgramResponse" + } + }, + "x-permission": "vip-config:update", + "x-permissions": ["vip-config:update"] + } + }, + "/admin/activity/vip-levels": { + "get": { + "operationId": "getVipConfig", + "responses": { + "200": { + "$ref": "#/components/responses/VipConfigResponse" + } + }, + "x-permission": "vip-config:view", + "x-permissions": ["vip-config:view"] + }, + "put": { + "operationId": "updateVipConfig", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VipConfigInput" + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/VipConfigResponse" + } + }, + "x-permission": "vip-config:update", + "x-permissions": ["vip-config:update"] + } + }, + "/admin/activity/vip-grants": { + "post": { + "operationId": "grantVip", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VipGrantInput" + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "vip-config:grant", + "x-permissions": ["vip-config:grant"] + } + }, + "/admin/activity/vip-trial-card-grants": { + "post": { + "operationId": "grantVipTrialCard", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/VipTrialCardGrantInput" + } + } + } + }, + "responses": { + "200": { + "$ref": "#/components/responses/EmptyResponse" + } + }, + "x-permission": "vip-config:grant", + "x-permissions": ["vip-config:grant"] + } + }, "/admin/activity/room-rocket/config": { "get": { "operationId": "getRoomRocketConfig", @@ -5615,9 +5723,28 @@ "/app/users": { "get": { "operationId": "appListUsers", + "parameters": [ + { "$ref": "#/components/parameters/Page" }, + { "$ref": "#/components/parameters/PageSize" }, + { "$ref": "#/components/parameters/Keyword" }, + { "in": "query", "name": "user_id", "schema": { "type": "string" } }, + { "in": "query", "name": "display_user_id", "schema": { "type": "string" } }, + { "in": "query", "name": "username", "schema": { "type": "string" } }, + { "in": "query", "name": "country", "schema": { "type": "string" } }, + { "in": "query", "name": "region_id", "schema": { "type": "integer", "format": "int64" } }, + { "in": "query", "name": "status", "schema": { "type": "string" } }, + { "in": "query", "name": "start_ms", "schema": { "type": "integer", "format": "int64" } }, + { "in": "query", "name": "end_ms", "schema": { "type": "integer", "format": "int64" } }, + { + "in": "query", + "name": "sort_by", + "schema": { "type": "string", "enum": ["created_at", "coin"] } + }, + { "in": "query", "name": "sort_direction", "schema": { "type": "string", "enum": ["asc", "desc"] } } + ], "responses": { "200": { - "$ref": "#/components/responses/EmptyResponse" + "$ref": "#/components/responses/AppUserPageResponse" } }, "x-permission": "app-user:view", @@ -5629,7 +5756,7 @@ "operationId": "appGetUser", "responses": { "200": { - "$ref": "#/components/responses/EmptyResponse" + "$ref": "#/components/responses/AppUserResponse" } }, "parameters": [ @@ -5642,9 +5769,17 @@ }, "patch": { "operationId": "appUpdateUser", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/AppUserUpdateInput" } + } + } + }, "responses": { "200": { - "$ref": "#/components/responses/EmptyResponse" + "$ref": "#/components/responses/AppUserResponse" } }, "parameters": [ @@ -5659,9 +5794,17 @@ "/app/users/{id}/ban": { "post": { "operationId": "appBanUser", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/AppUserBanInput" } + } + } + }, "responses": { "200": { - "$ref": "#/components/responses/EmptyResponse" + "$ref": "#/components/responses/AppUserStatusMutationResponse" } }, "parameters": [ @@ -5673,12 +5816,31 @@ "x-permissions": ["app-user:status"] } }, + "/app/users/{id}/levels": { + "put": { + "operationId": "appAdjustUserLevels", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/AppUserLevelAdjustmentInput" } + } + } + }, + "responses": { + "200": { "$ref": "#/components/responses/AppUserResponse" } + }, + "parameters": [{ "$ref": "#/components/parameters/Id" }], + "x-permission": "app-user:level", + "x-permissions": ["app-user:level"] + } + }, "/app/users/{id}/login-logs": { "get": { "operationId": "appListUserLoginLogs", "responses": { "200": { - "$ref": "#/components/responses/EmptyResponse" + "$ref": "#/components/responses/AppUserLoginLogPageResponse" } }, "parameters": [ @@ -5693,6 +5855,14 @@ "/app/users/{id}/password": { "post": { "operationId": "appSetPassword", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/AppUserPasswordInput" } + } + } + }, "responses": { "200": { "$ref": "#/components/responses/EmptyResponse" @@ -5710,9 +5880,17 @@ "/app/users/{id}/unban": { "post": { "operationId": "appUnbanUser", + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/AppUserUnbanInput" } + } + } + }, "responses": { "200": { - "$ref": "#/components/responses/EmptyResponse" + "$ref": "#/components/responses/AppUserStatusMutationResponse" } }, "parameters": [ @@ -5729,7 +5907,7 @@ "operationId": "appListBannedUsers", "responses": { "200": { - "$ref": "#/components/responses/EmptyResponse" + "$ref": "#/components/responses/AppUserBanRecordPageResponse" } }, "x-permission": "app-user:view", @@ -5741,13 +5919,40 @@ "operationId": "appListLoginLogs", "responses": { "200": { - "$ref": "#/components/responses/EmptyResponse" + "$ref": "#/components/responses/AppUserLoginLogPageResponse" } }, "x-permission": "app-user:view", "x-permissions": ["app-user:view"] } }, + "/exports/app-users": { + "post": { + "operationId": "appExportUsers", + "parameters": [ + { "$ref": "#/components/parameters/Keyword" }, + { "in": "query", "name": "user_id", "schema": { "type": "string" } }, + { "in": "query", "name": "display_user_id", "schema": { "type": "string" } }, + { "in": "query", "name": "username", "schema": { "type": "string" } }, + { "in": "query", "name": "country", "schema": { "type": "string" } }, + { "in": "query", "name": "region_id", "schema": { "type": "integer", "format": "int64" } }, + { "in": "query", "name": "status", "schema": { "type": "string" } }, + { "in": "query", "name": "start_ms", "schema": { "type": "integer", "format": "int64" } }, + { "in": "query", "name": "end_ms", "schema": { "type": "integer", "format": "int64" } }, + { + "in": "query", + "name": "sort_by", + "schema": { "type": "string", "enum": ["created_at", "coin"] } + }, + { "in": "query", "name": "sort_direction", "schema": { "type": "string", "enum": ["asc", "desc"] } } + ], + "responses": { + "200": { "$ref": "#/components/responses/AppUserExportJobResponse" } + }, + "x-permission": "app-user:export", + "x-permissions": ["app-user:export"] + } + }, "/auth/change-password": { "post": { "operationId": "changePassword", @@ -6514,7 +6719,23 @@ } }, "x-permission": "job:view", - "x-permissions": ["job:view", "country:update"] + "x-permissions": ["job:view", "country:update", "app-user:export"] + } + }, + "/jobs/{id}/artifact": { + "get": { + "operationId": "downloadJobArtifact", + "parameters": [{ "$ref": "#/components/parameters/Id" }], + "responses": { + "200": { + "description": "Export artifact", + "content": { + "text/csv": { "schema": { "type": "string", "format": "binary" } } + } + } + }, + "x-permission": "job:view", + "x-permissions": ["job:view", "app-user:export"] } }, "/jobs/{id}/cancel": { @@ -7246,6 +7467,54 @@ } } }, + "AppUserPageResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ApiResponseAppUserPage" } + } + } + }, + "AppUserResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ApiResponseAppUser" } + } + } + }, + "AppUserStatusMutationResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ApiResponseAppUserStatusMutation" } + } + } + }, + "AppUserBanRecordPageResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ApiResponseAppUserBanRecordPage" } + } + } + }, + "AppUserLoginLogPageResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ApiResponseAppUserLoginLogPage" } + } + } + }, + "AppUserExportJobResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { "$ref": "#/components/schemas/ApiResponseAppUserExportJob" } + } + } + }, "AgencyPageResponse": { "description": "OK", "content": { @@ -7406,6 +7675,26 @@ } } }, + "VipProgramResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseVipProgram" + } + } + } + }, + "VipConfigResponse": { + "description": "OK", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ApiResponseVipConfig" + } + } + } + }, "EmptyResponse": { "description": "OK", "content": { @@ -7825,6 +8114,723 @@ } } }, + "ApiResponseAppUserPage": { + "allOf": [ + { "$ref": "#/components/schemas/Envelope" }, + { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/ApiPageAppUser" } } } + ] + }, + "ApiResponseAppUser": { + "allOf": [ + { "$ref": "#/components/schemas/Envelope" }, + { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/AppUser" } } } + ] + }, + "ApiResponseAppUserStatusMutation": { + "allOf": [ + { "$ref": "#/components/schemas/Envelope" }, + { + "type": "object", + "properties": { "data": { "$ref": "#/components/schemas/AppUserStatusMutationResult" } } + } + ] + }, + "ApiResponseAppUserBanRecordPage": { + "allOf": [ + { "$ref": "#/components/schemas/Envelope" }, + { + "type": "object", + "properties": { "data": { "$ref": "#/components/schemas/ApiPageAppUserBanRecord" } } + } + ] + }, + "ApiResponseAppUserLoginLogPage": { + "allOf": [ + { "$ref": "#/components/schemas/Envelope" }, + { + "type": "object", + "properties": { "data": { "$ref": "#/components/schemas/ApiPageAppUserLoginLog" } } + } + ] + }, + "ApiResponseAppUserExportJob": { + "allOf": [ + { "$ref": "#/components/schemas/Envelope" }, + { "type": "object", "properties": { "data": { "$ref": "#/components/schemas/AppUserExportJob" } } } + ] + }, + "ApiPageAppUser": { + "type": "object", + "required": ["items", "page", "pageSize", "total"], + "properties": { + "items": { "type": "array", "items": { "$ref": "#/components/schemas/AppUser" } }, + "page": { "type": "integer", "minimum": 1 }, + "pageSize": { "type": "integer", "minimum": 1 }, + "total": { "type": "integer", "format": "int64", "minimum": 0 } + } + }, + "AppUser": { + "type": "object", + "required": ["userId", "status", "levels", "roles", "ban"], + "properties": { + "userId": { "type": "string" }, + "defaultDisplayUserId": { "type": "string" }, + "displayUserId": { "type": "string" }, + "prettyDisplayUserId": { "type": "string" }, + "prettyId": { "type": "string" }, + "username": { "type": "string" }, + "avatar": { "type": "string" }, + "gender": { "type": "string" }, + "birth": { "type": "string" }, + "age": { "type": "integer", "nullable": true, "minimum": 0 }, + "country": { "type": "string" }, + "countryName": { "type": "string" }, + "countryDisplayName": { "type": "string" }, + "regionId": { "type": "integer", "format": "int64" }, + "regionName": { "type": "string" }, + "registerDevice": { "type": "string" }, + "roles": { "type": "array", "items": { "type": "string" } }, + "levels": { "$ref": "#/components/schemas/AppUserLevels" }, + "ban": { "$ref": "#/components/schemas/AppUserBan" }, + "lastOperator": { "$ref": "#/components/schemas/AppUserOperator" }, + "lastOperatedAtMs": { "type": "integer", "format": "int64" }, + "lastLoginAtMs": { "type": "integer", "format": "int64" }, + "lastActiveAtMs": { "type": "integer", "format": "int64" }, + "createdAtMs": { "type": "integer", "format": "int64" }, + "updatedAtMs": { "type": "integer", "format": "int64" }, + "coin": { "type": "integer", "format": "int64" }, + "diamond": { "type": "integer", "format": "int64" }, + "cumulativeRechargeUsdMinor": { "type": "integer", "format": "int64" }, + "vip": { "$ref": "#/components/schemas/AppUserVIP" }, + "balances": { "type": "array", "items": { "$ref": "#/components/schemas/AppUserAssetBalance" } }, + "equippedResources": { + "type": "array", + "items": { "$ref": "#/components/schemas/AppUserResource" } + }, + "resources": { "type": "array", "items": { "$ref": "#/components/schemas/AppUserResource" } } + } + }, + "AppUserLevels": { + "type": "object", + "required": ["wealth", "game", "charm"], + "properties": { + "wealth": { "$ref": "#/components/schemas/AppUserLevel" }, + "game": { "$ref": "#/components/schemas/AppUserLevel" }, + "charm": { "$ref": "#/components/schemas/AppUserLevel" } + } + }, + "AppUserLevel": { + "type": "object", + "required": ["track", "realLevel", "realTotalValue", "displayLevel", "displayValue"], + "properties": { + "track": { "type": "string", "enum": ["wealth", "game", "charm"] }, + "realLevel": { "type": "integer" }, + "realTotalValue": { "type": "integer", "format": "int64" }, + "displayLevel": { "type": "integer" }, + "displayValue": { "type": "integer", "format": "int64" }, + "temporaryLevelId": { "type": "string" }, + "temporaryTargetLevel": { "type": "integer" }, + "startedAtMs": { "type": "integer", "format": "int64" }, + "expiresAtMs": { "type": "integer", "format": "int64" } + } + }, + "AppUserBan": { + "type": "object", + "required": ["active", "permanent", "expiresAtMs"], + "properties": { + "id": { "type": "string" }, + "active": { "type": "boolean" }, + "permanent": { "type": "boolean" }, + "expiresAtMs": { "type": "integer", "format": "int64" }, + "source": { "type": "string", "enum": ["admin", "manager", "legacy", ""] }, + "reason": { "type": "string" } + } + }, + "AppUserOperator": { + "type": "object", + "properties": { + "adminId": { "type": "string" }, + "name": { "type": "string" }, + "action": { "type": "string" } + } + }, + "AppUserVIP": { + "type": "object", + "required": ["level", "active", "startedAtMs", "expiresAtMs", "updatedAtMs"], + "properties": { + "level": { "type": "integer" }, + "name": { "type": "string" }, + "active": { "type": "boolean" }, + "startedAtMs": { "type": "integer", "format": "int64" }, + "expiresAtMs": { "type": "integer", "format": "int64" }, + "updatedAtMs": { "type": "integer", "format": "int64" } + } + }, + "AppUserAssetBalance": { + "type": "object", + "required": ["assetType", "availableAmount", "frozenAmount", "totalAmount", "version", "updatedAtMs"], + "properties": { + "assetType": { "type": "string" }, + "availableAmount": { "type": "integer", "format": "int64" }, + "frozenAmount": { "type": "integer", "format": "int64" }, + "totalAmount": { "type": "integer", "format": "int64" }, + "version": { "type": "integer", "format": "int64" }, + "updatedAtMs": { "type": "integer", "format": "int64" } + } + }, + "AppUserResource": { + "type": "object", + "properties": { + "entitlementId": { "type": "string" }, + "resourceId": { "type": "integer", "format": "int64" }, + "resourceCode": { "type": "string" }, + "resourceType": { "type": "string" }, + "name": { "type": "string" }, + "status": { "type": "string" }, + "quantity": { "type": "integer", "format": "int64" }, + "remainingQuantity": { "type": "integer", "format": "int64" }, + "effectiveAtMs": { "type": "integer", "format": "int64" }, + "expiresAtMs": { "type": "integer", "format": "int64" }, + "sourceGrantId": { "type": "string" }, + "assetUrl": { "type": "string" }, + "previewUrl": { "type": "string" }, + "animationUrl": { "type": "string" }, + "equipped": { "type": "boolean" }, + "createdAtMs": { "type": "integer", "format": "int64" }, + "updatedAtMs": { "type": "integer", "format": "int64" } + } + }, + "AppUserUpdateInput": { + "type": "object", + "properties": { + "username": { "type": "string", "maxLength": 64 }, + "avatar": { "type": "string", "maxLength": 512 }, + "gender": { "type": "string" }, + "country": { "type": "string" } + } + }, + "AppUserBanInput": { + "type": "object", + "required": ["expires_at_ms"], + "properties": { + "expires_at_ms": { "type": "integer", "format": "int64", "minimum": 0 }, + "reason": { "type": "string", "maxLength": 255 } + } + }, + "AppUserUnbanInput": { + "type": "object", + "properties": { "reason": { "type": "string", "maxLength": 255 } } + }, + "AppUserLevelAdjustmentInput": { + "type": "object", + "required": ["adjustments"], + "properties": { + "adjustments": { + "type": "array", + "minItems": 1, + "maxItems": 2, + "items": { + "type": "object", + "required": ["track", "level", "duration_days"], + "properties": { + "track": { "type": "string", "enum": ["wealth", "charm"] }, + "level": { "type": "integer", "minimum": 1, "maximum": 50 }, + "duration_days": { "type": "integer", "minimum": 1 } + } + } + }, + "reason": { "type": "string", "maxLength": 255 } + } + }, + "AppUserPasswordInput": { + "type": "object", + "required": ["password"], + "properties": { "password": { "type": "string", "maxLength": 128 } } + }, + "AppUserStatusMutationResult": { + "type": "object", + "required": ["user"], + "properties": { + "user": { "$ref": "#/components/schemas/AppUser" }, + "revokedSessionCount": { "type": "integer", "format": "int64" }, + "accessTokenRevoked": { "type": "boolean" }, + "accessTokenRevokeError": { "type": "string" }, + "imKicked": { "type": "boolean" }, + "imKickError": { "type": "string" }, + "roomEvicted": { "type": "boolean" }, + "roomId": { "type": "string" }, + "rtcKicked": { "type": "boolean" }, + "rtcKickError": { "type": "string" }, + "roomEvictError": { "type": "string" } + } + }, + "AppUserExportJob": { + "type": "object", + "required": ["jobId", "status", "snapshotAtMs"], + "properties": { + "jobId": { "type": "integer" }, + "status": { "type": "string" }, + "snapshotAtMs": { "type": "integer", "format": "int64" } + } + }, + "AppUserBrief": { + "type": "object", + "required": ["userId"], + "properties": { + "userId": { "type": "string" }, + "defaultDisplayUserId": { "type": "string" }, + "displayUserId": { "type": "string" }, + "prettyDisplayUserId": { "type": "string" }, + "prettyId": { "type": "string" }, + "username": { "type": "string" }, + "avatar": { "type": "string" } + } + }, + "AppUserBanOperator": { + "allOf": [ + { "$ref": "#/components/schemas/AppUserBrief" }, + { + "type": "object", + "properties": { + "adminId": { "type": "string" }, + "account": { "type": "string" }, + "name": { "type": "string" }, + "type": { "type": "string" } + } + } + ] + }, + "AppUserBanRecord": { + "type": "object", + "required": ["id", "target"], + "properties": { + "id": { "type": "integer", "format": "int64" }, + "target": { "$ref": "#/components/schemas/AppUserBrief" }, + "operator": { "$ref": "#/components/schemas/AppUserBanOperator" }, + "oldStatus": { "type": "string" }, + "newStatus": { "type": "string" }, + "reason": { "type": "string" }, + "requestId": { "type": "string" }, + "createdAtMs": { "type": "integer", "format": "int64" } + } + }, + "ApiPageAppUserBanRecord": { + "type": "object", + "required": ["items", "page", "pageSize", "total"], + "properties": { + "items": { "type": "array", "items": { "$ref": "#/components/schemas/AppUserBanRecord" } }, + "page": { "type": "integer" }, + "pageSize": { "type": "integer" }, + "total": { "type": "integer", "format": "int64" } + } + }, + "AppUserLoginLog": { + "allOf": [ + { "$ref": "#/components/schemas/AppUserBrief" }, + { + "type": "object", + "properties": { + "id": { "type": "integer", "format": "int64" }, + "loginType": { "type": "string" }, + "provider": { "type": "string" }, + "channel": { "type": "string" }, + "platform": { "type": "string" }, + "result": { "type": "string" }, + "failureCode": { "type": "string" }, + "loginIp": { "type": "string" }, + "ipCountryCode": { "type": "string" }, + "country": { "type": "string" }, + "regionId": { "type": "integer", "format": "int64" }, + "regionName": { "type": "string" }, + "blocked": { "type": "boolean" }, + "blockReason": { "type": "string" }, + "riskHighlighted": { "type": "boolean" }, + "requestId": { "type": "string" }, + "createdAtMs": { "type": "integer", "format": "int64" } + } + } + ] + }, + "ApiPageAppUserLoginLog": { + "type": "object", + "required": ["items", "page", "pageSize", "total"], + "properties": { + "items": { "type": "array", "items": { "$ref": "#/components/schemas/AppUserLoginLog" } }, + "page": { "type": "integer" }, + "pageSize": { "type": "integer" }, + "total": { "type": "integer", "format": "int64" } + } + }, + "ApiResponseVipProgram": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/VipProgramData" + } + } + } + ] + }, + "ApiResponseVipConfig": { + "allOf": [ + { + "$ref": "#/components/schemas/Envelope" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/components/schemas/VipConfig" + } + } + } + ] + }, + "VipProgram": { + "type": "object", + "required": ["appCode", "programType", "levelCount", "status"], + "properties": { + "appCode": { + "type": "string" + }, + "programType": { + "type": "string", + "enum": ["legacy_timed", "tiered_privilege_v1"] + }, + "levelCount": { + "type": "integer", + "minimum": 1, + "maximum": 20 + }, + "status": { + "type": "string", + "enum": ["active", "disabled"] + }, + "configVersion": { + "type": "integer", + "minimum": 0 + }, + "sameLevelExpiryPolicy": { + "type": "string", + "enum": ["extend_remaining"] + }, + "upgradeExpiryPolicy": { + "type": "string", + "enum": ["extend_remaining", "replace_from_now"] + }, + "downgradePurchasePolicy": { + "type": "string", + "enum": ["reject"] + }, + "benefitInheritancePolicy": { + "type": "string", + "enum": ["target_only"] + }, + "grantMode": { + "type": "string", + "enum": ["direct_membership", "trial_card"] + }, + "trialCardEnabled": { + "type": "boolean" + }, + "createdAtMs": { + "type": "integer", + "format": "int64" + }, + "updatedAtMs": { + "type": "integer", + "format": "int64" + } + } + }, + "VipProgramData": { + "type": "object", + "required": ["config"], + "properties": { + "config": { + "$ref": "#/components/schemas/VipProgram" + }, + "benefits": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VipBenefit" + } + }, + "serverTimeMs": { + "type": "integer", + "format": "int64" + } + } + }, + "VipProgramInput": { + "type": "object", + "required": [ + "programType", + "levelCount", + "sameLevelExpiryPolicy", + "upgradeExpiryPolicy", + "downgradePurchasePolicy", + "benefitInheritancePolicy", + "grantMode", + "trialCardEnabled", + "status" + ], + "properties": { + "programType": { + "type": "string", + "enum": ["legacy_timed", "tiered_privilege_v1"] + }, + "levelCount": { + "type": "integer", + "minimum": 1, + "maximum": 20 + }, + "sameLevelExpiryPolicy": { + "type": "string", + "enum": ["extend_remaining"] + }, + "upgradeExpiryPolicy": { + "type": "string", + "enum": ["extend_remaining", "replace_from_now"] + }, + "downgradePurchasePolicy": { + "type": "string", + "enum": ["reject"] + }, + "benefitInheritancePolicy": { + "type": "string", + "enum": ["target_only"] + }, + "grantMode": { + "type": "string", + "enum": ["direct_membership", "trial_card"] + }, + "trialCardEnabled": { + "type": "boolean" + }, + "status": { + "type": "string", + "enum": ["active", "disabled"] + } + } + }, + "VipProgramUpdateInput": { + "type": "object", + "required": ["config"], + "properties": { + "config": { + "$ref": "#/components/schemas/VipProgramInput" + } + } + }, + "VipBenefit": { + "type": "object", + "required": [ + "benefitCode", + "name", + "benefitType", + "unlockLevel", + "status", + "trialEnabled", + "resourceId", + "resourceType", + "executionScope", + "autoEquip", + "sortOrder", + "metadataJson" + ], + "properties": { + "benefitCode": { + "type": "string", + "maxLength": 96 + }, + "name": { + "type": "string", + "maxLength": 128 + }, + "benefitType": { + "type": "string", + "enum": ["decoration", "function"] + }, + "unlockLevel": { + "type": "integer", + "minimum": 1 + }, + "status": { + "type": "string", + "enum": ["active", "disabled"] + }, + "trialEnabled": { + "type": "boolean" + }, + "resourceId": { + "type": "integer", + "format": "int64", + "minimum": 0 + }, + "resourceType": { + "type": "string" + }, + "executionScope": { + "type": "string", + "enum": ["wallet", "room", "user", "notice"] + }, + "autoEquip": { + "type": "boolean" + }, + "sortOrder": { + "type": "integer", + "minimum": 0 + }, + "metadataJson": { + "type": "string" + } + } + }, + "VipLevel": { + "type": "object", + "required": [ + "level", + "name", + "status", + "priceCoin", + "durationMs", + "rewardResourceGroupId", + "sortOrder", + "benefits" + ], + "properties": { + "level": { + "type": "integer", + "minimum": 1 + }, + "name": { + "type": "string" + }, + "status": { + "type": "string", + "enum": ["active", "disabled"] + }, + "priceCoin": { + "type": "integer", + "minimum": 0 + }, + "durationMs": { + "type": "integer", + "format": "int64", + "minimum": 1 + }, + "rewardResourceGroupId": { + "type": "integer", + "format": "int64", + "minimum": 0 + }, + "sortOrder": { + "type": "integer", + "minimum": 0 + }, + "benefits": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VipBenefit" + } + }, + "createdAtMs": { + "type": "integer", + "format": "int64" + }, + "updatedAtMs": { + "type": "integer", + "format": "int64" + } + } + }, + "VipConfig": { + "type": "object", + "required": ["levels"], + "properties": { + "levels": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VipLevel" + } + }, + "serverTimeMs": { + "type": "integer", + "format": "int64" + }, + "programConfig": { + "$ref": "#/components/schemas/VipProgram" + } + } + }, + "VipConfigInput": { + "type": "object", + "required": ["levels"], + "properties": { + "levels": { + "type": "array", + "items": { + "$ref": "#/components/schemas/VipLevel" + } + } + } + }, + "VipGrantInput": { + "type": "object", + "required": ["targetUserId", "level", "reason"], + "properties": { + "commandId": { + "type": "string" + }, + "targetUserId": { + "type": "string" + }, + "level": { + "type": "integer", + "minimum": 1 + }, + "reason": { + "type": "string", + "maxLength": 240 + } + } + }, + "VipTrialCardGrantInput": { + "type": "object", + "required": ["targetUserId", "level", "durationMs", "reason"], + "properties": { + "commandId": { + "type": "string" + }, + "targetUserId": { + "type": "string" + }, + "level": { + "type": "integer", + "minimum": 1 + }, + "resourceId": { + "type": "integer", + "format": "int64", + "minimum": 1 + }, + "durationMs": { + "type": "integer", + "format": "int64", + "minimum": 1 + }, + "reason": { + "type": "string", + "maxLength": 240 + } + } + }, "ApiPageAgency": { "type": "object", "required": ["items", "page", "pageSize", "total"], diff --git a/databi/src/DatabiApp.test.jsx b/databi/src/DatabiApp.test.jsx index ae3cd07..1b6557a 100644 --- a/databi/src/DatabiApp.test.jsx +++ b/databi/src/DatabiApp.test.jsx @@ -334,7 +334,7 @@ test("routes databi social page to Social BI and loads real overview rows", asyn expect(fetchSocialBiMaster).toHaveBeenCalledTimes(1); expect(fetchSocialBiOverview).toHaveBeenCalledWith(expect.objectContaining({ statTz: "Asia/Shanghai" })); - expect(fetchSocialBiFunnel).toHaveBeenCalledWith(expect.objectContaining({ statTz: "Asia/Shanghai" })); + expect(fetchSocialBiFunnel).not.toHaveBeenCalled(); expect(fetchSocialBiKpi).toHaveBeenCalledWith(expect.objectContaining({ statTz: "Asia/Shanghai" })); // 经营概览:App 名、Hero 汇总充值(12,300 + 5,000 USD 分 = $173)、 @@ -433,7 +433,7 @@ test("renders social BI data requirements table with section filters and CSV exp section: "new_users", userRole: "all" })); - expect(screen.getByRole("tab", { name: "P0新用户" })).toHaveAttribute("aria-selected", "true"); + expect(screen.getByRole("tab", { name: "新用户" })).toHaveAttribute("aria-selected", "true"); expect(screen.getByText("下载APP人数")).toBeTruthy(); expect(screen.getByText("注册成功率")).toBeTruthy(); expect(screen.getAllByText("12").length).toBeGreaterThan(0); @@ -442,7 +442,7 @@ test("renders social BI data requirements table with section filters and CSV exp expect(screen.queryByRole("radiogroup", { name: "付费身份" })).toBeNull(); await act(async () => { - screen.getByRole("tab", { name: "P1营收" }).click(); + screen.getByRole("tab", { name: "营收" }).click(); }); await flushEffects(); expect(screen.getByRole("radiogroup", { name: "用户身份" })).toBeTruthy(); diff --git a/databi/src/api.js b/databi/src/api.js index 7f0997c..37f7ebc 100644 --- a/databi/src/api.js +++ b/databi/src/api.js @@ -180,7 +180,7 @@ export async function fetchSocialBiOverview({ appCodes, endMs, regionId, startMs return fetchDatabiData(apiEndpointPath(API_OPERATIONS.getSocialBiOverview), { query }); } -export async function fetchSocialBiRequirements({ appCodes, endMs, payerType, regionId, regionIds, section, startMs, statTz, userRole }) { +export async function fetchSocialBiRequirements({ appCodes, endMs, newUserType, payerType, regionId, regionIds, section, startMs, statTz, userRole }) { const query = {}; if (statTz) { query.stat_tz = statTz; @@ -208,6 +208,9 @@ export async function fetchSocialBiRequirements({ appCodes, endMs, payerType, re if (payerType) { query.payer_type = payerType; } + if (newUserType) { + query.new_user_type = newUserType; + } return fetchDatabiData(apiEndpointPath(API_OPERATIONS.getSocialBiRequirements), { query }); } diff --git a/databi/src/social/SocialBiApp.jsx b/databi/src/social/SocialBiApp.jsx index 5845ef8..e08f91b 100644 --- a/databi/src/social/SocialBiApp.jsx +++ b/databi/src/social/SocialBiApp.jsx @@ -53,7 +53,7 @@ export function SocialBiApp() { const initial = useMemo(() => readStateFromURL(), []); const [filters, setFilters] = useState(initial.filters); const [viewKey, setViewKey] = useState(() => (VIEWS.some((view) => view.key === initial.view) ? initial.view : "overview")); - const data = useSocialBiData(filters); + const data = useSocialBiData(filters, { includeFunnel: viewKey === "funnel" }); useEffect(() => { writeStateToURL(filters, viewKey); diff --git a/databi/src/social/metrics.js b/databi/src/social/metrics.js index dc35ab4..3c02921 100644 --- a/databi/src/social/metrics.js +++ b/databi/src/social/metrics.js @@ -249,6 +249,24 @@ export function aggregateMetricMaps(rows, { acrossTime = false } = {}) { return out; } +// averageMetricMaps:跨天"平均值"行。可加字段取日均(总量/覆盖天数),余额快照保持末日快照, +// 比例/均值类分子分母同除天数后不变,直接沿用汇总行的派生值。 +export function averageMetricMaps(rows, dayCount) { + if (!rows.length || !dayCount || dayCount <= 0) { + return null; + } + const out = aggregateMetricMaps(rows, { acrossTime: true }); + ADDITIVE_METRIC_KEYS.forEach((key) => { + if (SNAPSHOT_METRIC_KEYS.has(key)) { + return; + } + if (out[key] !== null && out[key] !== undefined) { + out[key] = out[key] / dayCount; + } + }); + return out; +} + // App 品牌色:chips、图表系列、行标识统一取色,保证同一 App 全站同色。 // 已知 App 用固定映射(与筛选状态无关);未知 App 按 code 哈希取色,避免"选中子集后颜色漂移"。 const APP_COLOR_PALETTE = ["#2563eb", "#0e9488", "#d97706", "#7c3aed", "#db2777", "#059669", "#dc2626", "#4f46e5"]; diff --git a/databi/src/social/useSocialBiData.js b/databi/src/social/useSocialBiData.js index 6f245b9..a243853 100644 --- a/databi/src/social/useSocialBiData.js +++ b/databi/src/social/useSocialBiData.js @@ -9,7 +9,7 @@ import { ALL, appSelectionMatches, regionSelectionMatches, resolveDateRange } fr export const SOCIAL_BI_TZ = DEFAULT_TIME_ZONE; export const SOCIAL_BI_FUNNEL_APP_CODES = ["lalu", "huwaa", "fami"]; -export function useSocialBiData(filters) { +export function useSocialBiData(filters, { includeFunnel = false } = {}) { const [master, setMaster] = useState(null); // 数据请求等 master 结果落地后再发:否则会先用兜底 App 列表打一轮,master 到达后立刻重打一轮(整轮浪费)。 const [isMasterSettled, setIsMasterSettled] = useState(false); @@ -78,9 +78,13 @@ export function useSocialBiData(filters) { const startMs = rangeStartMs(range, SOCIAL_BI_TZ); const endMs = rangeEndMs(range, SOCIAL_BI_TZ); setIsLoading(true); + // 漏斗会执行 cohort 聚合,只在用户进入漏斗视图时请求;其他视图不能为不可见数据承担查询成本或错误提示。 + const funnelRequest = includeFunnel + ? fetchSocialBiFunnel({ appCodes: funnelAppCodes, endMs, startMs, statTz: SOCIAL_BI_TZ }) + : Promise.resolve(null); Promise.allSettled([ fetchSocialBiOverview({ appCodes, endMs, startMs, statTz: SOCIAL_BI_TZ }), - fetchSocialBiFunnel({ appCodes: funnelAppCodes, endMs, startMs, statTz: SOCIAL_BI_TZ }), + funnelRequest, fetchSocialBiKpi({ appCodes, endMs, startMs, statTz: SOCIAL_BI_TZ }) ]).then(([overviewResult, funnelResult, kpiResult]) => { if (sequence !== requestSeq.current) { @@ -98,7 +102,9 @@ export function useSocialBiData(filters) { setOverview(null); nextErrors.push(`统计数据加载失败: ${overviewResult.reason?.message || "未知错误"}`); } - if (funnelResult.status === "fulfilled") { + if (!includeFunnel) { + setFunnel(null); + } else if (funnelResult.status === "fulfilled") { setFunnel(funnelResult.value); (funnelResult.value?.apps || []).forEach((app) => { if (app.error) { @@ -121,10 +127,10 @@ export function useSocialBiData(filters) { setErrors(nextErrors); setIsLoading(false); }); - }, [appCodes, funnelAppCodes, isMasterSettled, range, refreshToken]); + }, [appCodes, funnelAppCodes, includeFunnel, isMasterSettled, range, refreshToken]); const loadRequirements = useCallback( - ({ payerType, section, userRole } = {}) => { + ({ newUserType, payerType, section, userRole } = {}) => { if (!isMasterSettled) { return Promise.resolve(null); } @@ -145,6 +151,7 @@ export function useSocialBiData(filters) { return Promise.all(requestScopes.map((scope) => fetchSocialBiRequirements({ ...scope, endMs, + newUserType, payerType, section, startMs, diff --git a/databi/src/social/views/DataTableView.jsx b/databi/src/social/views/DataTableView.jsx index 2dcc997..d146c64 100644 --- a/databi/src/social/views/DataTableView.jsx +++ b/databi/src/social/views/DataTableView.jsx @@ -8,6 +8,7 @@ import { useSocialBi } from "../SocialBiApp.jsx"; import { METRIC_GROUPS, aggregateMetricMaps, + averageMetricMaps, formatMetric, metricChartValue, metricLabel, @@ -54,7 +55,7 @@ const REQUIREMENT_SECTIONS = [ { key: "first_room_join_users", label: "首次进房", type: "count" } ], key: "new_users", - label: "P0新用户" + label: "新用户" }, { csvName: "p1-revenue", @@ -66,21 +67,23 @@ const REQUIREMENT_SECTIONS = [ { key: "arppu_usd_minor", label: "ARPPU", type: "money_minor" } ], key: "revenue", - label: "P1营收", + label: "营收", + newUserFilter: true, payerFilter: true, roleFilter: true }, { csvName: "p2-retention", fallbackColumns: [ - { key: "cohort_users", label: "留存基数", type: "count" }, - { key: "d1_retention_users", label: "次留用户", type: "count" }, - { key: "d1_retention_rate", label: "次留率", type: "ratio" }, - { key: "d7_retention_rate", label: "7日留存", type: "ratio" }, - { key: "d30_retention_rate", label: "30日留存", type: "ratio" } + { key: "active_d1_active_base_users", label: "活跃用户基数", type: "count" }, + { key: "active_d1_active_users", label: "次留人数", type: "count" }, + { key: "active_d1_active_rate", label: "用户次留", type: "ratio" }, + { key: "active_d7_active_rate", label: "用户7日留", type: "ratio" }, + { key: "active_d30_active_rate", label: "用户30日留", type: "ratio" } ], key: "retention", - label: "P2留存", + label: "留存", + newUserFilter: true, payerFilter: true, roleFilter: true }, @@ -94,7 +97,8 @@ const REQUIREMENT_SECTIONS = [ { key: "avg_session_ms", label: "人均在线", type: "duration_ms" } ], key: "active", - label: "P2活跃", + label: "活跃", + newUserFilter: true, payerFilter: true, roleFilter: true }, @@ -107,7 +111,8 @@ const REQUIREMENT_SECTIONS = [ { key: "gift_paid_users", label: "付费送礼用户", type: "count" } ], key: "gift", - label: "P4送礼", + label: "送礼", + newUserFilter: true, roleFilter: true }, { @@ -120,7 +125,8 @@ const REQUIREMENT_SECTIONS = [ { key: "game_profit_rate", label: "游戏利润率", type: "ratio" } ], key: "game", - label: "P5游戏", + label: "游戏", + newUserFilter: true, roleFilter: true } ]; @@ -137,6 +143,23 @@ const PAYER_TYPE_OPTIONS = [ { label: "未付费", value: "unpaid" } ]; +// 新用户 = 当天注册成功的用户;非新用户 = 当天未注册(历史注册)的用户。 +const NEW_USER_OPTIONS = [ + { label: "全部用户", value: "all" }, + { label: "新用户", value: "new" }, + { label: "非新用户", value: "old" } +]; + +// P5 按游戏明细的兜底列(正常由后端 game_columns 下发)。 +const FALLBACK_GAME_COLUMNS = [ + { key: "game_bet_users", label: "押注用户数", type: "count" }, + { key: "game_d1_retention_rate", label: "游戏次留", type: "ratio" }, + { key: "game_arppu_coin", label: "ARPPU(金币)", type: "coin" }, + { key: "game_bet_coin", label: "押注金币", type: "coin" } +]; + +const GAME_SOURCE_LABELS = { self: "自研", vendor: "厂商" }; + function readClosedGroups() { try { const raw = window.localStorage.getItem(GROUPS_STORAGE_KEY); @@ -236,6 +259,18 @@ function normalizedRequirementColumns(sectionItem, fallbackColumns) { return columns.length ? columns : fallbackColumns; } +// 日行统一按日期倒序展示(最新在最上),不依赖后端返回顺序;无日期的行(如"汇总"占位)保持原相对位置沉底。 +function sortRequirementDailyRows(rows) { + return [...rows].sort((a, b) => { + const left = String(a?.stat_day || ""); + const right = String(b?.stat_day || ""); + if (left === right) { + return 0; + } + return left < right ? 1 : -1; + }); +} + function normalizeRequirementPayload(payload, sectionKey) { const fallbackColumns = requirementSectionConfig(sectionKey).fallbackColumns; const appSections = asArray(payload?.apps).flatMap((app) => { @@ -251,21 +286,27 @@ function normalizeRequirementPayload(payload, sectionKey) { if (appSections.length === 1) { const { context, section } = appSections[0]; return { + average: flattenRequirementRow(section.average, context), columns, - rows: asArray(section.daily_rows || section.dailyRows || section.daily_series || section.rows || section.items) - .map((row) => flattenRequirementRow(row, context)) - .filter(Boolean), + rows: sortRequirementDailyRows( + asArray(section.daily_rows || section.dailyRows || section.daily_series || section.rows || section.items) + .map((row) => flattenRequirementRow(row, context)) + .filter(Boolean) + ), total: flattenRequirementRow(section.total || section.totals || section.summary, context) }; } const rows = appSections.flatMap(({ context, section }) => { const total = flattenRequirementRow(section.total || section.totals || section.summary, { ...context, stat_day: "汇总" }); - const dailyRows = asArray(section.daily_rows || section.dailyRows || section.daily_series || section.rows || section.items) - .map((row) => flattenRequirementRow(row, context)) - .filter(Boolean); - return total ? [total, ...dailyRows] : dailyRows; + const average = flattenRequirementRow(section.average, { ...context, stat_day: "平均值" }); + const dailyRows = sortRequirementDailyRows( + asArray(section.daily_rows || section.dailyRows || section.daily_series || section.rows || section.items) + .map((row) => flattenRequirementRow(row, context)) + .filter(Boolean) + ); + return [total, average, ...dailyRows].filter(Boolean); }); - return { columns, rows, total: null }; + return { average: null, columns, rows, total: null }; } const sectionItem = asArray(payload?.sections).find((item) => sectionMatches(item, sectionKey)) @@ -273,17 +314,64 @@ function normalizeRequirementPayload(payload, sectionKey) { || payload || {}; const columns = normalizedRequirementColumns(sectionItem, fallbackColumns); - const rows = asArray(sectionItem.daily_rows || sectionItem.dailyRows || sectionItem.daily_series || sectionItem.rows || sectionItem.items) - .map((row) => flattenRequirementRow(row)) - .filter(Boolean); + const rows = sortRequirementDailyRows( + asArray(sectionItem.daily_rows || sectionItem.dailyRows || sectionItem.daily_series || sectionItem.rows || sectionItem.items) + .map((row) => flattenRequirementRow(row)) + .filter(Boolean) + ); const total = flattenRequirementRow(sectionItem.total || sectionItem.totals || sectionItem.summary); return { + average: flattenRequirementRow(sectionItem.average), columns, rows, total }; } +// P5 按游戏明细:每个游戏输出 [汇总行 + 日行(倒序)],行带 app/game 上下文;列优先取后端 game_columns。 +// 该明细不受用户身份/付费身份/是否新用户筛选影响(后端口径限制)。 +function normalizeRequirementGamePayload(payload) { + const appSections = asArray(payload?.apps).flatMap((app) => { + const context = requirementAppContext(app); + return asArray(app?.sections) + .filter((section) => sectionMatches(section, "game")) + .map((section) => ({ context, section })); + }); + const sections = appSections.length + ? appSections + : asArray(payload?.sections) + .filter((section) => sectionMatches(section, "game")) + .map((section) => ({ context: {}, section })); + const columns = + sections + .map(({ section }) => asArray(section.game_columns).map(normalizeRequirementColumn).filter(Boolean)) + .find((cols) => cols.length) || FALLBACK_GAME_COLUMNS; + const rows = sections.flatMap(({ context, section }) => + asArray(section.games).flatMap((game) => { + const gameContext = { + ...context, + game_key: game.game_key || "", + game_name: game.game_name || game.game_key || "--", + game_source: game.game_source || "" + }; + const total = flattenRequirementRow(game.total, { ...gameContext, stat_day: "汇总" }); + const daily = sortRequirementDailyRows( + asArray(game.daily_series) + .map((row) => flattenRequirementRow(row, gameContext)) + .filter(Boolean) + ); + return total ? [total, ...daily] : daily; + }) + ); + return { columns, rows }; +} + +function requirementGameLabel(row) { + const source = GAME_SOURCE_LABELS[String(row?.game_source || "")] || ""; + const name = row?.game_name || row?.game_key || "--"; + return source ? `${source}·${name}` : name; +} + function inferRequirementType(column) { const type = String(column.type || "").toLowerCase(); const key = String(column.key || "").toLowerCase(); @@ -302,13 +390,17 @@ function inferRequirementType(column) { return type || "number"; } -function truncateTwoDecimals(value) { +// 文档展示规则:百分比固定保留 2 位小数(截断补零);整数展示整数;非整数展示 2 位小数(超出截断)。 +function truncateTwoDecimals(value, { pad = false } = {}) { const numeric = Number(value); if (!Number.isFinite(numeric)) { return "--"; } const truncated = Math.trunc(numeric * 100) / 100; - return truncated.toLocaleString("en-US", { maximumFractionDigits: 2 }); + return truncated.toLocaleString("en-US", { + maximumFractionDigits: 2, + minimumFractionDigits: pad ? 2 : 0 + }); } function formatRequirementRatio(value) { @@ -316,7 +408,7 @@ function formatRequirementRatio(value) { if (!Number.isFinite(numeric)) { return "--"; } - return `${truncateTwoDecimals(numeric * 100)}%`; + return `${truncateTwoDecimals(numeric * 100, { pad: true })}%`; } function formatRequirementValue(column, value) { @@ -325,7 +417,11 @@ function formatRequirementValue(column, value) { } const type = inferRequirementType(column); if (type === "money_minor") { - return formatMoneyMinor(value); + const dollars = Number(value) / 100; + if (!Number.isFinite(dollars)) { + return "--"; + } + return Number.isInteger(dollars) ? formatMoneyMinor(value) : `$${truncateTwoDecimals(dollars, { pad: true })}`; } if (type === "ratio") { return formatRequirementRatio(value); @@ -334,11 +430,16 @@ function formatRequirementValue(column, value) { return formatDurationMs(value); } if (type === "coin" || type === "count" || type === "integer") { + const numeric = Number(value); + // 平均值行的计数/金币可能出现小数,按"非整数展示2位小数(截断)"处理。 + if (Number.isFinite(numeric) && !Number.isInteger(numeric)) { + return truncateTwoDecimals(numeric, { pad: true }); + } return formatCount(value); } const numeric = Number(value); if (Number.isFinite(numeric)) { - return Number.isInteger(numeric) ? formatCount(numeric) : truncateTwoDecimals(numeric); + return Number.isInteger(numeric) ? formatCount(numeric) : truncateTwoDecimals(numeric, { pad: true }); } return String(value); } @@ -384,6 +485,7 @@ export function DataTableView() { const [requirementSection, setRequirementSection] = useState(REQUIREMENT_SECTIONS[0].key); const [requirementRole, setRequirementRole] = useState("all"); const [requirementPayer, setRequirementPayer] = useState("all"); + const [requirementNewUser, setRequirementNewUser] = useState("all"); const dim = DIMENSIONS.find((item) => item.key === dimKey) || DIMENSIONS[0]; const dimColumns = dim.dims.map((name) => DIM_COLUMNS[name]); @@ -392,10 +494,16 @@ export function DataTableView() { const activeRequirementSection = requirementSectionConfig(requirementSection); const effectiveRequirementRole = activeRequirementSection.roleFilter ? requirementRole : "all"; const effectiveRequirementPayer = activeRequirementSection.payerFilter ? requirementPayer : "all"; + const effectiveRequirementNewUser = activeRequirementSection.newUserFilter ? requirementNewUser : "all"; const requirementData = useMemo(() => normalizeRequirementPayload(requirements, requirementSection), [requirements, requirementSection]); const requirementColumns = requirementData.columns; const requirementRows = requirementData.rows; const requirementTotal = requirementData.total; + const requirementAverage = requirementData.average; + const requirementGameData = useMemo( + () => (requirementSection === "game" ? normalizeRequirementGamePayload(requirements) : { columns: [], rows: [] }), + [requirements, requirementSection] + ); const visibleGroups = useMemo(() => METRIC_GROUPS.filter((group) => !closedGroups.includes(group.key)), [closedGroups]); const visibleMetrics = useMemo(() => visibleGroups.flatMap((group) => group.metrics), [visibleGroups]); @@ -421,6 +529,9 @@ export function DataTableView() { // 日维度的汇总跨天:余额快照类指标(金币数量/存量工资)只取最后一天,避免按天数放大。 const totalRow = sortedRows.length ? aggregateMetricMaps(sortedRows, { acrossTime: hasDay }) : null; + // 平均值行只在带日期的维度有意义:可加指标按覆盖天数取日均。 + const wideDayCount = hasDay ? new Set(sortedRows.map((row) => String(row.stat_day || "")).filter(Boolean)).size : 0; + const averageRow = totalRow && hasDay && wideDayCount > 0 ? averageMetricMaps(sortedRows, wideDayCount) : null; const renderRows = sortedRows.slice(0, MAX_RENDER_ROWS); const isTruncated = sortedRows.length > MAX_RENDER_ROWS; const hasRestricted = baseRows.some((row) => row.restricted); @@ -431,11 +542,12 @@ export function DataTableView() { return; } loadRequirements({ + newUserType: effectiveRequirementNewUser, payerType: effectiveRequirementPayer, section: requirementSection, userRole: effectiveRequirementRole }); - }, [effectiveRequirementPayer, effectiveRequirementRole, loadRequirements, mode, refreshToken, requirementSection]); + }, [effectiveRequirementNewUser, effectiveRequirementPayer, effectiveRequirementRole, loadRequirements, mode, refreshToken, requirementSection]); const handleDimChange = (key) => { setDimKey(key); @@ -451,6 +563,9 @@ export function DataTableView() { if (!nextSection.payerFilter) { setRequirementPayer("all"); } + if (!nextSection.newUserFilter) { + setRequirementNewUser("all"); + } }; const toggleGroup = (key) => { @@ -480,6 +595,7 @@ export function DataTableView() { const header = ["日期", "App", ...requirementColumns.map((column) => column.label)]; const rows = [ ...(requirementTotal ? [{ ...requirementTotal, app_name: "全部", stat_day: "汇总" }] : []), + ...(requirementAverage ? [{ ...requirementAverage, app_name: "全部", stat_day: "平均值" }] : []), ...requirementRows ].map((row) => [ row.stat_day || "--", @@ -489,6 +605,17 @@ export function DataTableView() { downloadCsv(`social-bi-requirements-${activeRequirementSection.csvName}-${rangeLabel(range).replace(/\s+/g, "")}.csv`, header, rows); }; + const handleGameBreakdownExport = () => { + const header = ["游戏", "日期", "App", ...requirementGameData.columns.map((column) => column.label)]; + const rows = requirementGameData.rows.map((row) => [ + requirementGameLabel(row), + row.stat_day || "--", + requirementAppName(row), + ...requirementGameData.columns.map((column) => csvRequirementValue(column, row[column.key])) + ]); + downloadCsv(`social-bi-game-breakdown-${rangeLabel(range).replace(/\s+/g, "")}.csv`, header, rows); + }; + let wideContent; if (isLoading && !baseRows.length) { wideContent = ( @@ -559,6 +686,18 @@ export function DataTableView() { ))} ) : null} + {averageRow ? ( + + {dimColumns.map((column, index) => ( + + {index === 0 ? "平均值" : column.totalText} + + ))} + {visibleMetrics.map((key) => ( + {formatMetric(key, averageRow[key])} + ))} + + ) : null} {renderRows.map((row, rowIndex) => ( {dimColumns.map((column, index) => ( @@ -607,6 +746,7 @@ export function DataTableView() { ); } else { requirementsContent = ( + <>
@@ -632,6 +772,15 @@ export function DataTableView() { ))} ) : null} + {requirementAverage ? ( + + + + {requirementColumns.map((column) => ( + + ))} + + ) : null} {requirementRows.map((row, rowIndex) => ( @@ -644,6 +793,48 @@ export function DataTableView() {
平均值全部{formatRequirementValue(column, requirementAverage[column.key])}
{row.stat_day || "--"}
+ {requirementGameData.rows.length ? ( + <> +
+ 各游戏明细 + 押注用户/同游戏次留/ARPPU · 不受身份与新用户筛选影响 +
+
+ + + + + + + {requirementGameData.columns.map((column) => ( + + ))} + + + + {requirementGameData.rows.map((row, rowIndex) => ( + + + + + {requirementGameData.columns.map((column) => ( + + ))} + + ))} + +
游戏日期App + + {column.label} + +
{requirementGameLabel(row)}{row.stat_day || "--"}{requirementAppName(row)}{formatRequirementValue(column, row[column.key])}
+
+ + ) : null} + ); } @@ -746,9 +937,28 @@ export function DataTableView() { onChange={setRequirementPayer} /> ) : null} + {activeRequirementSection.newUserFilter ? ( + + ) : null} )}
+ {mode === "requirements" && requirementGameData.rows.length ? ( + + ) : null}
+ +
+

等级信息

+
+ } /> + } /> + } /> + } /> +

账号状态

- } /> + } /> + + + + } + />
@@ -248,25 +277,26 @@ function formatCountry(user) { return user.countryDisplayName || user.countryName || user.country || "-"; } -function formatGender(gender) { - const value = String(gender || "").toLowerCase(); - if (value === "male" || value === "m" || value === "男") { - return "男"; - } - if (value === "female" || value === "f" || value === "女") { - return "女"; - } - if (value === "non_binary") { - return "非二元"; - } - return gender || "-"; -} - function formatNumber(value) { const number = Number(value || 0); return Number.isFinite(number) ? number.toLocaleString() : "-"; } +function formatAge(value) { + if (value === undefined || value === null || value === "") { + return "-"; + } + const age = Number(value); + return Number.isFinite(age) && age >= 0 ? `${Math.trunc(age)} 岁` : "-"; +} + +function formatVipExpire(vip) { + if (Number(vip?.level || 0) <= 0) { + return "-"; + } + return formatExpireTime(vip?.expiresAtMs); +} + function formatAssetType(value) { const normalized = String(value || "").toUpperCase(); const labels = { diff --git a/src/features/app-users/components/AppUserDetailProvider.test.jsx b/src/features/app-users/components/AppUserDetailProvider.test.jsx new file mode 100644 index 0000000..b31dd98 --- /dev/null +++ b/src/features/app-users/components/AppUserDetailProvider.test.jsx @@ -0,0 +1,75 @@ +import { fireEvent, render, screen } from "@testing-library/react"; +import { beforeEach, expect, test, vi } from "vitest"; +import { ToastProvider } from "@/shared/ui/ToastProvider.jsx"; +import { getAppUser } from "@/features/app-users/api"; +import { useAppUserDetail } from "@/features/app-users/components/AppUserDetailContext.jsx"; +import { AppUserDetailProvider } from "@/features/app-users/components/AppUserDetailProvider.jsx"; + +vi.mock("@/features/app-users/api", () => ({ getAppUser: vi.fn() })); + +beforeEach(() => { + vi.clearAllMocks(); +}); + +test("detail drawer keeps the identity hero and shows the expanded admin projection", async () => { + vi.mocked(getAppUser).mockResolvedValue({ + age: 26, + avatar: "", + ban: { active: true, permanent: true, reason: "risk" }, + birth: "2000-02-29", + coin: 1200, + countryDisplayName: "阿联酋", + createdAtMs: 1780000000000, + cumulativeRechargeUsdMinor: 12345, + defaultDisplayUserId: "163337", + diamond: 88, + displayUserId: "163337", + gender: "female", + lastLoginAtMs: 1781000000000, + lastOperatedAtMs: 1782000000000, + lastOperator: { action: "ban", adminId: "7", name: "运营" }, + levels: { + charm: { displayLevel: 18, realLevel: 7, temporaryTargetLevel: 18, expiresAtMs: 1790000000000 }, + game: { displayLevel: 9, realLevel: 9 }, + wealth: { displayLevel: 20, realLevel: 8, temporaryTargetLevel: 20, expiresAtMs: 1790000000000 }, + }, + prettyDisplayUserId: "VIP888", + prettyId: "pretty-888", + regionName: "中东区", + registerDevice: "iPhone17,2", + roles: ["主播", "BD"], + status: "banned", + updatedAtMs: 1782000000000, + userId: "10001", + username: "tester", + vip: { active: true, expiresAtMs: 1795000000000, level: 3, name: "黄金会员" }, + }); + + render( + + + + + , + ); + fireEvent.click(screen.getByRole("button", { name: "打开详情" })); + + expect((await screen.findAllByText("VIP888")).length).toBeGreaterThan(0); + expect(screen.getByText("注册设备")).toBeInTheDocument(); + expect(screen.getByText("iPhone17,2")).toBeInTheDocument(); + expect(screen.getByText("主播、BD")).toBeInTheDocument(); + expect(screen.getByText("累计充值")).toBeInTheDocument(); + expect(screen.getByText(/123\.45/)).toBeInTheDocument(); + expect(screen.getByText("永久")).toBeInTheDocument(); + expect(screen.getAllByText(/真实 Lv8/).length).toBeGreaterThan(0); + expect(screen.getByText("VIP 3 · 黄金会员")).toBeInTheDocument(); +}); + +function DetailTrigger() { + const { openAppUserDetail } = useAppUserDetail(); + return ( + + ); +} diff --git a/src/features/app-users/components/AppUserValues.jsx b/src/features/app-users/components/AppUserValues.jsx new file mode 100644 index 0000000..d18c4cb --- /dev/null +++ b/src/features/app-users/components/AppUserValues.jsx @@ -0,0 +1,152 @@ +import { useEffect, useMemo, useState } from "react"; +import { formatMillis } from "@/shared/utils/time.js"; +import styles from "@/features/app-users/app-users.module.css"; + +const roleLabels = { + admin: "管理员", + bd: "BD", + bd_leader: "BD Leader", + bdleader: "BD Leader", + coin_seller: "币商", + guild_leader: "公会长", + host: "主播", + manager: "经理", + normal: "普通用户", + ordinary: "普通用户", +}; + +export function GenderValue({ gender }) { + return formatGender(gender); +} + +export function LevelValue({ level, showReal = false }) { + if (!level) { + return "-"; + } + const displayLevel = numericLevel(level.displayLevel ?? level.realLevel); + const realLevel = numericLevel(level.realLevel); + const temporary = Number(level.expiresAtMs || 0) > 0 && Number(level.temporaryTargetLevel || 0) > 0; + return ( +
+ Lv{displayLevel} + {showReal || temporary ? ( + + {showReal ? `真实 Lv${realLevel}` : ""} + {showReal && temporary ? " · " : ""} + {temporary ? `临时至 ${formatMillis(level.expiresAtMs)}` : ""} + + ) : null} +
+ ); +} + +export function RolesValue({ roles }) { + const labels = normalizeRoles(roles); + return {labels.join("、")}; +} + +export function OperatorValue({ operatedAtMs, operator }) { + if (!operator?.name && !operator?.adminId && !operatedAtMs) { + return "-"; + } + const name = operator?.name || (operator?.adminId ? `管理员 ${operator.adminId}` : "-"); + return ( +
+ {name} + + {[operator?.action, formatMillis(operatedAtMs)].filter((value) => value && value !== "-").join(" · ") || "-"} + +
+ ); +} + +export function BanCountdown({ ban, status }) { + const [now, setNow] = useState(0); + const banned = status === "banned" || status === "disabled" || Boolean(ban?.active); + const expiresAtMs = Number(ban?.expiresAtMs || 0); + + useEffect(() => { + if (!banned || ban?.permanent || expiresAtMs <= 0) { + return undefined; + } + const startupTimer = window.setTimeout(() => setNow(Date.now()), 0); + const timer = window.setInterval(() => setNow(Date.now()), 1000); + return () => { + window.clearTimeout(startupTimer); + window.clearInterval(timer); + }; + }, [ban?.permanent, banned, expiresAtMs]); + + const label = useMemo(() => { + if (!banned) { + return "-"; + } + // 兼容迁移前只有 banned/disabled 状态、没有事实记录的用户:按永久展示,绝不因缺失到期时间误判为可自动解封。 + if (ban?.permanent || expiresAtMs <= 0) { + return "永久"; + } + if (now <= 0) { + return `至 ${formatMillis(expiresAtMs)}`; + } + const remainingMs = expiresAtMs - now; + if (remainingMs <= 0) { + return "等待自动解封"; + } + return formatDuration(remainingMs); + }, [ban?.permanent, banned, expiresAtMs, now]); + + return {label}; +} + +export function formatGender(gender) { + const value = String(gender || "").toLowerCase(); + if (value === "male" || value === "m" || value === "男") { + return "男"; + } + if (value === "female" || value === "f" || value === "女") { + return "女"; + } + if (value === "non_binary") { + return "非二元"; + } + return gender || "-"; +} + +export function formatUsdMinor(value) { + const amount = Number(value); + if (!Number.isFinite(amount)) { + return "-"; + } + return new Intl.NumberFormat("zh-CN", { currency: "USD", style: "currency" }).format(amount / 100); +} + +export function normalizeRoles(roles) { + const values = Array.isArray(roles) ? roles.filter(Boolean) : []; + if (!values.length) { + return ["普通用户"]; + } + return Array.from(new Set(values.map((role) => roleLabels[String(role).toLowerCase()] || String(role)))); +} + +function numericLevel(value) { + const level = Number(value || 0); + return Number.isFinite(level) ? Math.max(0, Math.trunc(level)) : 0; +} + +function formatDuration(milliseconds) { + const totalSeconds = Math.max(0, Math.ceil(milliseconds / 1000)); + const days = Math.floor(totalSeconds / 86400); + const hours = Math.floor((totalSeconds % 86400) / 3600); + const minutes = Math.floor((totalSeconds % 3600) / 60); + const seconds = totalSeconds % 60; + if (days > 0) { + return `${days}天 ${hours}小时`; + } + if (hours > 0) { + return `${hours}小时 ${minutes}分`; + } + if (minutes > 0) { + return `${minutes}分 ${seconds}秒`; + } + return `${seconds}秒`; +} diff --git a/src/features/app-users/hooks/useAppUsersPage.js b/src/features/app-users/hooks/useAppUsersPage.js index 9cbc8df..62c07f4 100644 --- a/src/features/app-users/hooks/useAppUsersPage.js +++ b/src/features/app-users/hooks/useAppUsersPage.js @@ -1,4 +1,5 @@ import { useEffect, useMemo, useState } from "react"; +import { downloadResponse } from "@/shared/api/download"; import { parseForm } from "@/shared/forms/validation"; import { usePaginatedQuery } from "@/shared/hooks/usePaginatedQuery.js"; import { useRegionOptions } from "@/shared/hooks/useRegionOptions.js"; @@ -6,14 +7,24 @@ import { useConfirm } from "@/shared/ui/ConfirmProvider.jsx"; import { useToast } from "@/shared/ui/ToastProvider.jsx"; import { emptyUserIdentityFilter, userIdentityFilterParams } from "@/shared/ui/userIdentityFilter.js"; import { + adjustAppUserLevels, banAppUser, + createAppUserExport, + downloadAppUserExport, + getAppUserExportJob, listAppUsers, setAppUserPassword, unbanAppUser, updateAppUser, } from "@/features/app-users/api"; import { useAppUserAbilities } from "@/features/app-users/permissions.js"; -import { appUserCountrySchema, appUserPasswordSchema, appUserUpdateSchema } from "@/features/app-users/schema"; +import { + appUserBanSchema, + appUserCountrySchema, + appUserLevelAdjustmentSchema, + appUserPasswordSchema, + appUserUpdateSchema, +} from "@/features/app-users/schema"; import { useCountryOptions } from "@/features/host-org/hooks/useCountryOptions.js"; const pageSize = 50; @@ -21,6 +32,7 @@ const emptyData = { items: [], page: 1, pageSize, total: 0 }; const emptyEditForm = () => ({ avatar: "", gender: "", username: "" }); const emptyCountryForm = () => ({ country: "" }); const emptyPasswordForm = () => ({ password: "" }); +const emptyBanForm = () => ({ expiresAtLocal: futureDateTimeLocal(7), mode: "permanent", reason: "" }); export function useAppUsersPage() { const abilities = useAppUserAbilities(); @@ -41,6 +53,8 @@ export function useAppUsersPage() { const [editForm, setEditForm] = useState(emptyEditForm); const [countryForm, setCountryForm] = useState(emptyCountryForm); const [passwordForm, setPasswordForm] = useState(emptyPasswordForm); + const [levelForm, setLevelForm] = useState(() => levelFormFromUser(null)); + const [banForm, setBanForm] = useState(emptyBanForm); const [loadingAction, setLoadingAction] = useState(""); const [selectedUserIds, setSelectedUserIds] = useState([]); const [patchedUsers, setPatchedUsers] = useState({}); @@ -141,6 +155,8 @@ export function useAppUsersPage() { setRegionId(""); setStatus(""); setTimeRange({ endMs: "", startMs: "" }); + setSortBy("created_at"); + setSortDirection("desc"); setPage(1); }; @@ -151,6 +167,7 @@ export function useAppUsersPage() { gender: user.gender || "", username: user.username || "", }); + setLevelForm(levelFormFromUser(user)); setActiveAction("edit"); }; @@ -183,9 +200,30 @@ export function useAppUsersPage() { } await runAction("edit", "用户已更新", async () => { const payload = parseForm(appUserUpdateSchema, editForm); - await updateAppUser(activeUser.userId, payload); - closeAction(); - await reload(); + const result = await updateAppUser(activeUser.userId, payload); + patchUsers([result]); + setActiveUser((current) => (current ? { ...current, ...result } : result)); + }); + }; + + const submitLevels = async () => { + if (!activeUser) { + return; + } + await runAction("levels", "等级调整已提交", async () => { + const form = parseForm(appUserLevelAdjustmentSchema, levelForm); + // 两条轨道只发一个 adjustments 数组,保证跨轨道由 activity-service 同事务提交或整体失败。 + const adjustments = ["wealth", "charm"] + .filter((track) => form[track].enabled) + .map((track) => ({ + duration_days: Number(form[track].durationDays), + level: Number(form[track].level), + track, + })); + const result = await adjustAppUserLevels(activeUser.userId, { adjustments, reason: form.reason }); + patchUsers([result]); + setActiveUser((current) => (current ? { ...current, ...result } : result)); + setLevelForm(levelFormFromUser(result)); }); }; @@ -216,13 +254,45 @@ export function useAppUsersPage() { const toggleBan = async (user) => { const banned = isBanned(user); - await runAction(`status-${user.userId}`, banned ? "用户已解封" : "用户已封禁", async () => { - const result = banned ? await unbanAppUser(user.userId) : await banAppUser(user.userId); - patchUsers([mergeUserStatus(user, result, banned ? "active" : "banned")]); + if (!banned) { + setActiveUser(user); + setBanForm(emptyBanForm()); + setActiveAction("ban"); + return; + } + const ok = await confirm({ + confirmText: "解封", + message: "仅当该用户不存在其他有效管理员或经理封禁时,账号状态才会恢复。", + title: "解封用户", + }); + if (!ok) { + return; + } + await runAction(`status-${user.userId}`, "用户已解封", async () => { + const result = await unbanAppUser(user.userId, { reason: "admin_manual_unban" }); + patchUsers([mergeUserStatus(user, result, "active")]); setSelectedUserIds((current) => current.filter((userId) => userId !== user.userId)); }); }; + const submitBan = async (event) => { + event.preventDefault(); + if (!activeUser) { + return; + } + await runAction(`status-${activeUser.userId}`, "用户已封禁", async () => { + const form = parseForm(appUserBanSchema, banForm); + const expiresAtMs = form.mode === "permanent" ? 0 : new Date(form.expiresAtLocal).getTime(); + const result = await banAppUser(activeUser.userId, { + expires_at_ms: expiresAtMs, + reason: form.reason, + }); + patchUsers([mergeUserStatus(activeUser, result, "banned")]); + setSelectedUserIds((current) => current.filter((userId) => userId !== activeUser.userId)); + closeAction(); + }); + }; + const batchBan = async () => { const users = (data.items || []).filter((user) => selectedUserIds.includes(user.userId) && !isBanned(user)); if (!users.length) { @@ -231,7 +301,7 @@ export function useAppUsersPage() { } const ok = await confirm({ confirmText: "封禁", - message: `将封禁 ${users.length} 个用户。`, + message: `将永久封禁 ${users.length} 个用户。`, title: "批量封禁用户", tone: "danger", }); @@ -241,7 +311,11 @@ export function useAppUsersPage() { setLoadingAction("batch-ban"); try { - const results = await Promise.allSettled(users.map((user) => banAppUser(user.userId))); + const results = await Promise.allSettled( + users.map((user) => + banAppUser(user.userId, { expires_at_ms: 0, reason: "admin_batch_permanent_ban" }), + ), + ); const updatedUsers = results .map((result, index) => result.status === "fulfilled" ? mergeUserStatus(users[index], result.value, "banned") : null, @@ -270,6 +344,23 @@ export function useAppUsersPage() { } }; + const exportUsers = async () => { + setLoadingAction("export"); + try { + // 创建任务时仅传当前筛选快照;页码由后端固定为首批并逐页导出,避免只导出当前可见页。 + const created = await createAppUserExport(filters); + showToast(`导出任务 #${created.jobId} 已创建`, "success"); + const job = await waitAppUserExportJob(created.jobId); + const response = await downloadAppUserExport(created.jobId); + await downloadResponse(response, appUserExportFilename(created.snapshotAtMs || job.createdAtMs)); + showToast("用户 CSV 已生成", "success"); + } catch (err) { + showToast(err.message || "导出用户失败", "error"); + } finally { + setLoadingAction(""); + } + }; + const runAction = async (action, successMessage, submitter) => { setLoadingAction(action); try { @@ -299,6 +390,7 @@ export function useAppUsersPage() { abilities, activeAction, activeUser, + banForm, batchBan, changeUserFilter, changeStatus, @@ -313,6 +405,7 @@ export function useAppUsersPage() { loadingAction, loadingCountries, loadingRegions, + levelForm, locationFilterOptions, locationFilterValue, openCountry, @@ -327,7 +420,9 @@ export function useAppUsersPage() { resetFilters, selectedUserIds, setCountryForm, + setBanForm, setEditForm, + setLevelForm, setPage, setPasswordForm, setSelectedUserIds, @@ -339,9 +434,12 @@ export function useAppUsersPage() { changeSort, changeTimeRange, submitCountry, + submitBan, submitEdit, + submitLevels, submitPassword, toggleBan, + exportUsers, }; } @@ -356,3 +454,56 @@ function mergeUserStatus(currentUser, result, fallbackStatus) { status: result?.status || fallbackStatus, }; } + +function levelFormFromUser(user) { + return { + charm: levelTrackForm(user?.levels?.charm), + reason: "", + wealth: levelTrackForm(user?.levels?.wealth), + }; +} + +function levelTrackForm(level) { + const realLevel = Number(level?.realLevel || 0); + const currentTarget = Number(level?.temporaryTargetLevel || level?.displayLevel || realLevel + 1); + const expiresAtMs = Number(level?.expiresAtMs || 0); + const remainingDays = expiresAtMs > Date.now() ? Math.max(1, Math.ceil((expiresAtMs - Date.now()) / 86400000)) : 7; + return { + durationDays: String(remainingDays), + enabled: false, + level: String(Math.min(50, Math.max(1, currentTarget))), + }; +} + +async function waitAppUserExportJob(jobId) { + const deadline = Date.now() + 120000; + while (Date.now() < deadline) { + const job = await getAppUserExportJob(jobId); + if (job.status === "succeeded") { + return job; + } + if (["failed", "canceled", "cancelled"].includes(job.status)) { + throw new Error(job.error || "用户导出任务失败"); + } + await delay(1500); + } + throw new Error("用户导出任务仍在处理中,请稍后重试"); +} + +function delay(ms) { + return new Promise((resolve) => { + window.setTimeout(resolve, ms); + }); +} + +function futureDateTimeLocal(days) { + const date = new Date(Date.now() + days * 86400000); + const offsetMs = date.getTimezoneOffset() * 60000; + return new Date(date.getTime() - offsetMs).toISOString().slice(0, 16); +} + +function appUserExportFilename(snapshotAtMs) { + const date = new Date(Number(snapshotAtMs || Date.now())); + const stamp = Number.isFinite(date.getTime()) ? date.toISOString().slice(0, 10) : "snapshot"; + return `app-users-${stamp}.csv`; +} diff --git a/src/features/app-users/pages/AppUserListPage.jsx b/src/features/app-users/pages/AppUserListPage.jsx index 429d218..04d2793 100644 --- a/src/features/app-users/pages/AppUserListPage.jsx +++ b/src/features/app-users/pages/AppUserListPage.jsx @@ -1,12 +1,15 @@ import BlockOutlined from "@mui/icons-material/BlockOutlined"; import EditOutlined from "@mui/icons-material/EditOutlined"; +import FileDownloadOutlined from "@mui/icons-material/FileDownloadOutlined"; import KeyboardArrowDownOutlined from "@mui/icons-material/KeyboardArrowDownOutlined"; import KeyboardArrowUpOutlined from "@mui/icons-material/KeyboardArrowUpOutlined"; import LockOpenOutlined from "@mui/icons-material/LockOpenOutlined"; import PasswordOutlined from "@mui/icons-material/PasswordOutlined"; +import RestartAltOutlined from "@mui/icons-material/RestartAltOutlined"; import UnfoldMoreOutlined from "@mui/icons-material/UnfoldMoreOutlined"; import Autocomplete from "@mui/material/Autocomplete"; import Checkbox from "@mui/material/Checkbox"; +import FormControlLabel from "@mui/material/FormControlLabel"; import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import Tooltip from "@mui/material/Tooltip"; @@ -22,6 +25,13 @@ import { TimeRangeFilter } from "@/shared/ui/TimeRangeFilter.jsx"; import { UploadField } from "@/shared/ui/UploadField.jsx"; import { formatMillis } from "@/shared/utils/time.js"; import { appUserStatusFilters, appUserStatusLabels, genderOptions } from "@/features/app-users/constants.js"; +import { + BanCountdown, + GenderValue, + LevelValue, + OperatorValue, + RolesValue, +} from "@/features/app-users/components/AppUserValues.jsx"; import { useAppUsersPage } from "@/features/app-users/hooks/useAppUsersPage.js"; import { CoinLedgerTable } from "@/features/operations/components/CoinLedgerTable.jsx"; import styles from "@/features/app-users/app-users.module.css"; @@ -89,6 +99,42 @@ export function AppUserListPage() { }), render: (user) => , }, + { + key: "gender", + label: "性别", + width: "minmax(72px, 0.4fr)", + render: (user) => , + }, + { + key: "age", + label: "年龄", + width: "minmax(72px, 0.4fr)", + render: (user) => (user.age === undefined || user.age === null ? "-" : `${user.age} 岁`), + }, + { + key: "wealthLevel", + label: "富豪等级", + width: "minmax(118px, 0.7fr)", + render: (user) => , + }, + { + key: "charmLevel", + label: "魅力等级", + width: "minmax(118px, 0.7fr)", + render: (user) => , + }, + { + key: "gameLevel", + label: "游戏等级", + width: "minmax(96px, 0.55fr)", + render: (user) => , + }, + { + key: "roles", + label: "身份", + width: "minmax(150px, 0.9fr)", + render: (user) => , + }, { key: "vip", label: "VIP", @@ -134,7 +180,30 @@ export function AppUserListPage() { value: page.status, onChange: page.changeStatus, }), - render: (user) => , + render: (user) => ( +
+ + +
+ ), + }, + { + key: "lastLoginAtMs", + label: "最新成功登录", + width: "minmax(160px, 0.9fr)", + render: (user) => formatMillis(user.lastLoginAtMs), + }, + { + key: "lastOperator", + label: "最新操作人", + width: "minmax(142px, 0.8fr)", + render: (user) => , + }, + { + key: "lastOperatedAtMs", + label: "最新操作时间", + width: "minmax(160px, 0.9fr)", + render: (user) => formatMillis(user.lastOperatedAtMs), }, { key: "time", @@ -181,21 +250,35 @@ export function AppUserListPage() { onChange={page.changeTimeRange} /> - {page.abilities.canStatus ? ( - - ) : null} + {page.abilities.canExport ? ( + + ) : null} + {page.abilities.canStatus ? ( + + ) : null} + 0 ? { @@ -212,40 +295,96 @@ export function AppUserListPage() { - event.preventDefault()} + > + + page.setEditForm({ ...page.editForm, username: event.target.value })} + /> + page.setEditForm({ ...page.editForm, avatar })} + /> + page.setEditForm({ ...page.editForm, gender: event.target.value })} + > + {genderOptions.map(([value, label]) => ( + + {label} + + ))} + + + + {page.loadingAction === "levels" ? "保存中" : "保存等级"} + + } + title="等级调整" + > + + + + + page.setEditForm({ ...page.editForm, username: event.target.value })} - /> - page.setEditForm({ ...page.editForm, avatar })} - /> - page.setEditForm({ ...page.editForm, gender: event.target.value })} + value={page.banForm.mode} + onChange={(event) => page.setBanForm({ ...page.banForm, mode: event.target.value })} > - {genderOptions.map(([value, label]) => ( - - {label} - - ))} + 永久 + 指定截止时间 + {page.banForm.mode === "timed" ? ( + page.setBanForm({ ...page.banForm, expiresAtLocal: event.target.value })} + /> + ) : null} + page.setBanForm({ ...page.banForm, reason: event.target.value })} + /> { + page.setLevelForm((current) => ({ + ...current, + [track]: { ...current[track], ...patch }, + })); + }; + return ( +
+ {tracks.map(([track, label]) => { + const field = page.levelForm[track]; + const current = page.activeUser?.levels?.[track]; + return ( +
+ updateTrack(track, { enabled: event.target.checked })} + /> + } + label={`${label}(真实 Lv${Number(current?.realLevel || 0)},展示 Lv${Number(current?.displayLevel || 0)})`} + /> +
+ updateTrack(track, { level: event.target.value })} + /> + updateTrack(track, { durationDays: event.target.value })} + /> +
+
+ ); + })} + + page.setLevelForm((current) => ({ ...current, reason: event.target.value }))} + /> +
+ ); +} + function VipValue({ vip }) { const level = Number(vip?.level || 0); if (level <= 0 || !vip?.active) { @@ -350,10 +553,13 @@ function UserActions({ page, user }) { const banned = user.status === "banned" || user.status === "disabled"; return (
- {page.abilities.canUpdate ? ( - + {page.abilities.canUpdate || page.abilities.canLevel ? ( + - page.openEdit(user)}> + page.openEdit(user)} + > diff --git a/src/features/app-users/pages/AppUserListPage.test.jsx b/src/features/app-users/pages/AppUserListPage.test.jsx index acddfef..237b153 100644 --- a/src/features/app-users/pages/AppUserListPage.test.jsx +++ b/src/features/app-users/pages/AppUserListPage.test.jsx @@ -1,6 +1,7 @@ import { fireEvent, render, screen } from "@testing-library/react"; import { afterEach, expect, test, vi } from "vitest"; import { AppUserListPage } from "./AppUserListPage.jsx"; +import { ToastProvider } from "@/shared/ui/ToastProvider.jsx"; import { useAppUsersPage } from "@/features/app-users/hooks/useAppUsersPage.js"; const mocks = vi.hoisted(() => ({ @@ -26,9 +27,17 @@ afterEach(() => { test("clicking an app user's coin opens the coin ledger drawer", () => { vi.mocked(useAppUsersPage).mockReturnValue(pageFixture()); - render(); + render( + + + , + ); expect(screen.getByText("VIP 2")).toBeInTheDocument(); + expect(screen.getByText("VIP888")).toBeInTheDocument(); + expect(screen.getByText("公会长、BD")).toBeInTheDocument(); + expect(screen.getByRole("button", { name: "调整富豪等级列宽" })).toBeInTheDocument(); + expect(screen.getByRole("button", { name: "调整最新成功登录列宽" })).toBeInTheDocument(); fireEvent.click(screen.getByRole("button", { name: "查看 d 的金币流水" })); expect(mocks.openCoinLedger).toHaveBeenCalledWith(expect.objectContaining({ userId: "10001" })); @@ -43,7 +52,11 @@ test("coin ledger drawer passes the active app user to the shared ledger table", }), ); - render(); + render( + + + , + ); expect(screen.getByTestId("coin-ledger-table")).toHaveTextContent("10001"); expect(mocks.ledgerTable).toHaveBeenCalledWith( @@ -51,10 +64,49 @@ test("coin ledger drawer passes the active app user to the shared ledger table", ); }); +test("edit dialog saves profile and temporary levels independently", () => { + const page = pageFixture({ activeAction: "edit", activeUser: userFixture() }); + vi.mocked(useAppUsersPage).mockReturnValue(page); + + render( + + + , + ); + + expect(screen.getByText("用户资料")).toBeInTheDocument(); + expect(screen.getByText("等级调整")).toBeInTheDocument(); + expect(screen.getByLabelText("游戏等级(只读)")).toBeDisabled(); + fireEvent.click(screen.getByRole("button", { name: "保存等级" })); + expect(page.submitLevels).toHaveBeenCalledTimes(1); + + fireEvent.submit(screen.getByRole("button", { name: "保存资料" }).closest("form")); + expect(page.submitEdit).toHaveBeenCalledTimes(1); +}); + +test("level-only permission can open level adjustment without exposing country edit", () => { + const page = pageFixture({ + abilities: { ...pageFixture().abilities, canLevel: true, canUpdate: false }, + }); + vi.mocked(useAppUsersPage).mockReturnValue(page); + + render( + + + , + ); + + fireEvent.click(screen.getByRole("button", { name: "等级调整" })); + expect(page.openEdit).toHaveBeenCalledWith(expect.objectContaining({ userId: "10001" })); + expect(screen.queryByRole("button", { name: "阿拉伯联合酋长国" })).not.toBeInTheDocument(); +}); + function pageFixture(patch = {}) { return { abilities: { canCoinLedger: true, + canExport: true, + canLevel: true, canPassword: true, canStatus: true, canUpdate: true, @@ -63,6 +115,7 @@ function pageFixture(patch = {}) { }, activeAction: "", activeUser: null, + banForm: { expiresAtLocal: "", mode: "permanent", reason: "" }, batchBan: vi.fn(), changeLocationFilter: vi.fn(), changeQuery: vi.fn(), @@ -74,11 +127,17 @@ function pageFixture(patch = {}) { countryOptions: [], data: { items: [userFixture()], page: 1, pageSize: 50, total: 1 }, editForm: { avatar: "", gender: "", username: "" }, + exportUsers: vi.fn(), error: null, loading: false, loadingAction: "", loadingCountries: false, loadingRegions: false, + levelForm: { + charm: { durationDays: "7", enabled: false, level: "4" }, + reason: "", + wealth: { durationDays: "7", enabled: false, level: "5" }, + }, locationFilterOptions: [], locationFilterValue: "", openCoinLedger: mocks.openCoinLedger, @@ -90,17 +149,22 @@ function pageFixture(patch = {}) { query: "", regionOptions: [], reload: vi.fn(), + resetFilters: vi.fn(), selectedUserIds: [], + setBanForm: vi.fn(), setCountryForm: vi.fn(), setEditForm: vi.fn(), + setLevelForm: vi.fn(), setPage: vi.fn(), setPasswordForm: vi.fn(), setSelectedUserIds: vi.fn(), sortBy: "created_at", sortDirection: "desc", status: "", + submitBan: vi.fn(), submitCountry: vi.fn(), submitEdit: vi.fn(), + submitLevels: vi.fn(), submitPassword: vi.fn(), timeRange: { endMs: "", startMs: "" }, toggleBan: vi.fn(), @@ -110,15 +174,30 @@ function pageFixture(patch = {}) { function userFixture() { return { + age: 24, avatar: "", + ban: { active: false, expiresAtMs: 0, permanent: false }, coin: 223437, country: "AE", countryDisplayName: "阿拉伯联合酋长国", createdAtMs: 1779322523000, + defaultDisplayUserId: "163337", displayUserId: "163337", + gender: "female", lastActiveAtMs: 1781325798000, + lastLoginAtMs: 1781325700000, + lastOperatedAtMs: 1781325750000, + lastOperator: { action: "update", adminId: "7", name: "雷乐" }, + levels: { + charm: { displayLevel: 3, realLevel: 3, track: "charm" }, + game: { displayLevel: 6, realLevel: 6, track: "game" }, + wealth: { displayLevel: 4, realLevel: 4, track: "wealth" }, + }, + prettyDisplayUserId: "VIP888", + prettyId: "pretty-888", regionId: 2, regionName: "中东区", + roles: ["公会长", "BD"], status: "active", userId: "10001", username: "d", diff --git a/src/features/app-users/permissions.js b/src/features/app-users/permissions.js index ce7f0c7..9b3ec71 100644 --- a/src/features/app-users/permissions.js +++ b/src/features/app-users/permissions.js @@ -15,5 +15,7 @@ export function useAppUserAbilities() { canUpdate: can(PERMISSIONS.appUserUpdate), canUpload: can(PERMISSIONS.uploadCreate), canView: can(PERMISSIONS.appUserView), + canLevel: can(PERMISSIONS.appUserLevel), + canExport: can(PERMISSIONS.appUserExport), }; } diff --git a/src/features/app-users/schema.test.ts b/src/features/app-users/schema.test.ts new file mode 100644 index 0000000..3b561a6 --- /dev/null +++ b/src/features/app-users/schema.test.ts @@ -0,0 +1,28 @@ +import { describe, expect, test } from "vitest"; +import { parseForm } from "@/shared/forms/validation"; +import { prettyDisplayIDGrantSchema } from "./schema"; + +describe("pretty display ID grant schema", () => { + test("accepts arbitrary Unicode display content", () => { + // 管理端只保留展示文本的非空和长度约束,避免 Unicode 字体、符号和 emoji 被客户端正则错误拦截。 + const payload = parseForm(prettyDisplayIDGrantSchema, { + displayUserId: " 𝕸⃝é中⚡️™ ", + durationDays: "1", + reason: "Unicode 靓号", + targetUserId: "163001", + }); + + expect(payload.displayUserId).toBe("𝕸⃝é中⚡️™"); + }); + + test("counts supplementary Unicode characters as one character", () => { + const payload = parseForm(prettyDisplayIDGrantSchema, { + displayUserId: "😀".repeat(64), + durationDays: "", + reason: "", + targetUserId: "163001", + }); + + expect(Array.from(payload.displayUserId)).toHaveLength(64); + }); +}); diff --git a/src/features/app-users/schema.ts b/src/features/app-users/schema.ts index 61b2ee2..bf2013d 100644 --- a/src/features/app-users/schema.ts +++ b/src/features/app-users/schema.ts @@ -14,8 +14,64 @@ export const appUserPasswordSchema = z.object({ password: z.string().trim().min(6, "密码至少 6 位").max(128, "密码不能超过 128 个字符"), }); -// 与服务端后台发放规则保持一致:只允许 Unicode 字母、数字和组合标记,空格、标点、emoji 都在前端先拦截。 -const prettyContentPattern = /^[\p{L}\p{N}\p{M}]+$/u; +const temporaryLevelTrackSchema = z.object({ + durationDays: z.string().trim().optional().default("7"), + enabled: z.boolean().optional().default(false), + level: z.string().trim().optional().default(""), +}); + +// 财富和魅力必须作为一次命令提交;表单在送出前校验双轨边界,后端继续负责真实等级、规则启用状态和事务原子性。 +export const appUserLevelAdjustmentSchema = z + .object({ + charm: temporaryLevelTrackSchema, + reason: z.string().trim().max(128, "调整原因不能超过 128 个字符").optional().default(""), + wealth: temporaryLevelTrackSchema, + }) + .superRefine((value, context) => { + const enabledTracks = [ + ["wealth", value.wealth], + ["charm", value.charm], + ] as const; + if (!enabledTracks.some(([, track]) => track.enabled)) { + context.addIssue({ code: "custom", message: "至少选择一个等级轨道", path: ["wealth", "enabled"] }); + return; + } + enabledTracks.forEach(([name, track]) => { + if (!track.enabled) { + return; + } + const level = Number(track.level); + if (!Number.isInteger(level) || level < 1 || level > 50) { + context.addIssue({ code: "custom", message: "目标等级必须是 1 到 50 的整数", path: [name, "level"] }); + } + const durationDays = Number(track.durationDays); + if (!Number.isInteger(durationDays) || durationDays < 1 || durationDays > 36500) { + context.addIssue({ + code: "custom", + message: "有效天数必须是 1 到 36500 的整数", + path: [name, "durationDays"], + }); + } + }); + }); + +// expires_at_ms=0 仅由“永久”模式产生;指定截止时间必须在浏览器当前时刻之后,服务端仍以 UTC 再次校验。 +export const appUserBanSchema = z + .object({ + expiresAtLocal: z.string().trim().optional().default(""), + mode: z.enum(["permanent", "timed"], "请选择封禁期限"), + reason: z.string().trim().max(512, "封禁原因不能超过 512 个字符").optional().default(""), + }) + .superRefine((value, context) => { + if (value.mode !== "timed") { + return; + } + const expiresAtMs = new Date(value.expiresAtLocal).getTime(); + if (!value.expiresAtLocal || !Number.isFinite(expiresAtMs) || expiresAtMs <= Date.now()) { + context.addIssue({ code: "custom", message: "截止时间必须晚于当前时间", path: ["expiresAtLocal"] }); + } + }); + const prettyRuleValues = [ "aa", "aaa", @@ -77,14 +133,16 @@ export const prettyDisplayIDGenerateSchema = z.object({ ruleType: z.enum(prettyRuleValues, "请选择生成规则"), }); -// 后台发放允许管理员输入非数字靓号;durationDays 为空或 0 都会转成 duration_ms=0,表示长期持有。 +// 靓号展示内容必须原样支持任意 Unicode 字符,不能以字母数字正则过滤字体字形、表情或符号;仅去除首尾空白、限制长度并拦截控制字符,服务端继续负责唯一性和持久化安全校验。 export const prettyDisplayIDGrantSchema = z.object({ displayUserId: z .string() .trim() .min(1, "请输入靓号内容") - .max(64, "靓号不能超过 64 个字符") - .regex(prettyContentPattern, "靓号只支持字母、数字和组合标记"), + // String.length 会把补充平面 Unicode 字符计为两个 UTF-16 单元,必须按 code point 计数,才能和服务端的 rune 上限一致。 + .refine((value) => Array.from(value).length <= 64, "靓号不能超过 64 个字符") + // 控制字符不是展示字形,保留会破坏列表、日志和协议载荷;符号、emoji 和格式化字形仍可通过。 + .refine((value) => !/\p{Cc}/u.test(value), "靓号不能包含控制字符"), durationDays: z .string() .trim() @@ -111,6 +169,8 @@ export const prettyDisplayIDStatusSchema = z.object({ export type AppUserUpdateForm = z.infer; export type AppUserCountryForm = z.infer; export type AppUserPasswordForm = z.infer; +export type AppUserLevelAdjustmentForm = z.infer; +export type AppUserBanForm = z.infer; export type PrettyDisplayIDPoolForm = z.infer; export type PrettyDisplayIDGenerateForm = z.infer; export type PrettyDisplayIDGrantForm = z.infer; diff --git a/src/features/dashboard/components/DashboardFrequentMenus.jsx b/src/features/dashboard/components/DashboardFrequentMenus.jsx deleted file mode 100644 index 4e88b23..0000000 --- a/src/features/dashboard/components/DashboardFrequentMenus.jsx +++ /dev/null @@ -1,46 +0,0 @@ -import { useMemo } from "react"; -import { useNavigate } from "react-router-dom"; -import { useAuth } from "@/app/auth/AuthProvider.jsx"; -import { getFrequentSecondLevelMenus } from "@/app/navigation/menuUsage.js"; -import { TimeText } from "@/shared/ui/TimeText.jsx"; - -export function DashboardFrequentMenus({ menus = [] }) { - const { user } = useAuth(); - const navigate = useNavigate(); - const frequentMenus = useMemo(() => getFrequentSecondLevelMenus({ menus, user }), [menus, user]); - - return ( -
-
-
-

常用页面

-

本地缓存的二级菜单访问次数

-
-
- {frequentMenus.length ? ( -
- {frequentMenus.map((item) => { - const Icon = item.icon; - return ( - - ); - })} -
- ) : ( -
暂无本地访问记录
- )} -
- ); -} diff --git a/src/features/dashboard/components/DashboardToolbar.jsx b/src/features/dashboard/components/DashboardToolbar.jsx index 8ee887c..c018110 100644 --- a/src/features/dashboard/components/DashboardToolbar.jsx +++ b/src/features/dashboard/components/DashboardToolbar.jsx @@ -8,7 +8,7 @@ export function DashboardToolbar({ onRefresh, onRangeChange, overview, range }) const { formatMillis } = useTimeZone(); return ( - + - {page.abilities.canUpdate ? ( - - ) : null} -
+
+
+
+
+

VIP配置

+ + {page.appCode || "-"} · {vipProgramLabels[page.program.programType] || "VIP"} + +
+
+ + {page.abilities.canUpdate ? ( + + ) : null} + {page.abilities.canUpdate ? ( + + ) : null} +
+
+ +
+ + {page.program.status === "disabled" ? "停用" : "启用"} + + {levels.length || page.program.levelCount} + {page.activeCount} + + {vipUpgradePolicyLabels[ + page.program.upgradeExpiryPolicy || programDefaults.upgradeExpiryPolicy + ] || "-"} + + + {vipGrantModeLabels[page.program.grantMode || programDefaults.grantMode] || "-"} + +
+ + + item.level} + /> + +
- - - item.level} /> - - - + {page.editorMode === "program" ? : null} + {page.editorMode === "levels" ? : null} ); } -function VipConfigDrawer({ page }) { +function VipProgramDialog({ page }) { const disabled = !page.abilities.canUpdate || page.saving || page.loading; + const defaults = vipProgramDefaults[page.programForm.programType]; return ( - -
-

VIP配置

-
-
等级配置
-
- {(page.form.levels || []).map((level) => ( -
-
- VIP{level.level} - - page.updateLevel(level.level, { - status: event.target.checked ? "active" : "disabled", - }) - } - /> -
-
- - page.updateLevel(level.level, { name: event.target.value }) - } - /> - - page.updateLevel(level.level, { priceCoin: event.target.value }) - } - /> - - page.updateLevel(level.level, { durationDays: event.target.value }) - } - /> - - page.updateLevel(level.level, { rewardResourceGroupId: value }) - } - /> - - page.updateLevel(level.level, { sortOrder: event.target.value }) - } - /> -
-
- ))} + + + +
+

VIP体系设置

+ 体系决定等级数量、升级计时和后台发放方式
-
-
- -
+
-
+ ); } -function vipColumns(resourceLabels) { +function VipLevelsDialog({ page }) { + const levels = page.form.levels || []; + // 等级、筛选与当前权益只属于弹窗浏览状态;完整草稿仍由 Hook 持有,切换等级不会截断整包提交。 + const [selectedLevelNumber, setSelectedLevelNumber] = useState(levels[0]?.level || 1); + const activeLevel = levels.find((level) => level.level === selectedLevelNumber) || levels[0]; + const [benefitQuery, setBenefitQuery] = useState(""); + const [benefitFilter, setBenefitFilter] = useState("all"); + const [selectedBenefitCode, setSelectedBenefitCode] = useState(activeLevel?.benefits?.[0]?.benefitCode || ""); + const [showRules, setShowRules] = useState(false); + const disabled = !page.abilities.canUpdate || page.saving || page.loading; + const isP1 = page.program.programType === "tiered_privilege_v1"; + const benefits = activeLevel?.benefits || emptyBenefitList; + const activeBenefitCount = benefits.filter((benefit) => benefit.status === "active").length; + const selectedBenefit = benefits.find((benefit) => benefit.benefitCode === selectedBenefitCode) || benefits[0]; + const filteredGroups = useMemo( + () => groupVisibleBenefits(benefits, benefitQuery, benefitFilter), + [benefitFilter, benefitQuery, benefits], + ); + + function selectLevel(level) { + setSelectedLevelNumber(level.level); + setSelectedBenefitCode(level.benefits?.[0]?.benefitCode || ""); + setBenefitQuery(""); + setBenefitFilter("all"); + setShowRules(false); + } + + function selectBenefit(benefitCode) { + setSelectedBenefitCode(benefitCode); + setShowRules(false); + } + + if (!activeLevel) return null; + + return ( + +
+ +
+

VIP等级配置

+ + {page.appCode || "当前 App"} · {vipProgramLabels[page.program.programType] || "VIP"} + +
+
+ {levels.length} 个等级 + + {levels.filter((level) => level.status === "active").length} 个启用 + + + + + +
+
+ + + + +
+
+
+
+ 当前等级 +

+ VIP{activeLevel.level} · {activeLevel.name || `VIP${activeLevel.level}`} +

+
+ + page.updateLevel(activeLevel.level, { + status: event.target.checked ? "active" : "disabled", + }) + } + /> +
+
+ + page.updateLevel(activeLevel.level, { name: event.target.value }) + } + /> + + page.updateLevel(activeLevel.level, { priceCoin: event.target.value }) + } + /> + + page.updateLevel(activeLevel.level, { durationDays: event.target.value }) + } + /> + + page.updateLevel(activeLevel.level, { rewardResourceGroupId: value }) + } + /> + + page.updateLevel(activeLevel.level, { sortOrder: event.target.value }) + } + /> +
+
+ + {isP1 ? ( +
+
+
+

权益配置

+ + 已启用 {activeBenefitCount}/{benefits.length} + +
+
+ setBenefitQuery(event.target.value)} + /> + 0 && activeBenefitCount === benefits.length + } + disabled={disabled || !benefits.length} + indeterminate={ + activeBenefitCount > 0 && activeBenefitCount < benefits.length + } + size="small" + slotProps={{ + input: { "aria-label": `VIP${activeLevel.level}权益全选` }, + }} + onChange={(event) => + page.updateAllBenefits( + activeLevel.level, + event.target.checked ? "active" : "disabled", + ) + } + /> + } + label="全选" + /> +
+
+
+ {benefitFilterOptions.map(([value, label]) => ( + + ))} +
+
+ {filteredGroups.length ? ( + filteredGroups.map((group) => ( +
+
+ {group.label} + + {group.items.filter((item) => item.status === "active").length}/ + {group.items.length} + +
+
+ {group.items.map((benefit) => ( + + page.updateBenefit( + activeLevel.level, + benefit.benefitCode, + patch, + ) + } + onSelect={() => selectBenefit(benefit.benefitCode)} + /> + ))} +
+
+ )) + ) : ( +
没有符合当前筛选条件的权益。
+ )} +
+
+ ) : ( +
+ Lalu 经典 VIP 只维护等级、价格、有效期和等级资源组,不使用 P1 权益矩阵。 +
+ )} +
+ + +
+ + +
+ 整包保存 + 切换等级不会丢失草稿,提交时一次保存全部 {levels.length} 个等级 +
+
+ + +
+
+
+
+ ); +} + +function BenefitCard({ benefit, disabled, onChange, onSelect, selected }) { + return ( +
+ onChange({ status: event.target.checked ? "active" : "disabled" })} + /> + + + {benefit.status === "active" ? "已启用" : "未启用"} + +
+ ); +} + +function BenefitInspector({ benefit, disabled, level, page }) { + const rebateBenefit = benefit.benefitCode === "daily_coin_rebate"; + const onlineNoticeBenefit = benefit.benefitCode === "online_global_notice"; + const decorationBenefit = benefit.benefitType === "decoration"; + const metadataValid = Boolean(readVipBenefitMetadata(benefit.metadataJson)); + const onChange = (patch) => page.updateBenefit(level, benefit.benefitCode, patch); + + return ( +
+
+
+ 当前权益 +

{benefit.name}

+ {benefit.benefitCode} +
+ onChange({ status: event.target.checked ? "active" : "disabled" })} + /> +
+ +
+

业务参数

+ {rebateBenefit ? ( + + onChange({ + metadataJson: updateVipBenefitMetadataField( + benefit.metadataJson, + "coin_amount", + event.target.value === "" ? "" : Number(event.target.value), + ), + }) + } + /> + ) : null} + {onlineNoticeBenefit ? ( + + onChange({ + metadataJson: updateVipBenefitMetadataField( + benefit.metadataJson, + "message", + event.target.value, + ), + }) + } + /> + ) : null} + {decorationBenefit ? ( + + onChange({ resourceId, resourceType: resource?.resourceType || "" }) + } + /> + ) : null} + {!rebateBenefit && !onlineNoticeBenefit && !decorationBenefit ? ( +

该功能无额外业务参数,启用后按对应服务规则生效。

+ ) : null} +
+ +
+

应用规则

+ onChange({ trialEnabled: event.target.checked })} + /> + {decorationBenefit ? ( + onChange({ autoEquip: event.target.checked })} + /> + ) : null} +
+ +
+ 高级设置 +
+ + onChange({ + autoEquip: event.target.value === "decoration" ? benefit.autoEquip : false, + benefitType: event.target.value, + }) + } + > + 装扮 + 功能 + + onChange({ executionScope: event.target.value })} + > + 钱包 + 房间 + 用户 + 通知 + + {!decorationBenefit ? ( + + onChange({ resourceId, resourceType: resource?.resourceType || "" }) + } + /> + ) : null} + onChange({ metadataJson: event.target.value })} + /> + onChange({ sortOrder: event.target.value })} + /> +
+
+
+ ); +} + +function VipRulesPanel({ onBack, page }) { + const notes = vipRuleNotes(page); + return ( +
+
+
+ 产品边界 +

规则说明

+
+ {onBack ? ( + + ) : null} +
+
    + {notes.map((note) => ( +
  1. {note}
  2. + ))} +
+
+ ); +} + +function SwitchField({ ariaLabel, checked, disabled, label, onChange }) { + return ( +
+ {label} + +
+ ); +} + +function groupVisibleBenefits(benefits, query, filter) { + // 目录分组只控制可见密度,不写回业务字段;权益类型和执行服务仍以服务端契约为准。 + const keyword = query.trim().toLocaleLowerCase(); + const visible = benefits.filter((benefit) => { + const queryMatches = + !keyword || + benefit.name.toLocaleLowerCase().includes(keyword) || + benefit.benefitCode.toLocaleLowerCase().includes(keyword); + const filterMatches = + filter === "all" || + (filter === "active" && benefit.status === "active") || + (filter === "disabled" && benefit.status === "disabled") || + benefit.benefitType === filter; + return queryMatches && filterMatches; + }); + return benefitGroupDefinitions + .map(([key, label]) => ({ + items: visible.filter((benefit) => benefitGroupKey(benefit) === key), + key, + label, + })) + .filter((group) => group.items.length); +} + +function benefitGroupKey(benefit) { + if (benefit.benefitType === "decoration") return "decoration"; + if (["wallet", "notice", "room", "user"].includes(benefit.executionScope)) return benefit.executionScope; + return "user"; +} + +function benefitSummary(benefit) { + if (benefit.benefitCode === "daily_coin_rebate") { + const amount = vipBenefitMetadataField(benefit.metadataJson, "coin_amount"); + return amount ? `每日 ${formatNumber(amount)} 金币` : "未配置返现金额"; + } + if (benefit.benefitCode === "online_global_notice") { + const message = String(vipBenefitMetadataField(benefit.metadataJson, "message") || ""); + return message ? truncateText(message, 18) : "未配置通知文案"; + } + if (benefit.resourceId) return `已绑定资源 · ${benefit.resourceId}`; + if (benefit.benefitType === "decoration") return "未绑定资源"; + return benefit.trialEnabled ? "体验卡可用" : "会员权益"; +} + +function vipRuleNotes(page) { + const p1 = page.program.programType === "tiered_privilege_v1"; + return [ + `当前配置只作用于 ${page.appCode || "当前 App"},等级、价格和权益不会跨 App 共用。`, + p1 + ? "Fami 购买高等级后立即替换低等级,并从购买时重新计时;原低等级剩余时间丢弃。" + : "Lalu 沿用经典 VIP:同级和高等级购买保留剩余时间并续期。", + "低等级购买不覆盖当前高等级;同等级购买按体系规则续期。", + "VIP 体验卡走背包佩戴,可自由切换;未佩戴体验卡的剩余时间正常保留,金币返现不随体验卡生效。", + "进房通知只在当前房间展示;上线全服通知由客户端按本次进程记录当日展示状态。", + "金币返现按项目统一的 UTC 自然日结算;跨服务时间使用 Unix 毫秒。", + "防踢、防禁言只拦截普通房主或管理员操作,不绕过平台风控、平台封禁和超级管理员。", + ]; +} + +function truncateText(value, maxLength) { + return value.length > maxLength ? `${value.slice(0, maxLength)}…` : value; +} + +function vipColumns() { return [ { key: "level", label: "等级", - render: (item) => , - width: "minmax(120px, 0.5fr)", + render: (item) => VIP{item.level}, + width: "minmax(110px, 0.7fr)", }, { key: "status", @@ -177,38 +904,25 @@ function vipColumns(resourceLabels) { {item.status === "active" ? "启用" : "停用"} ), - width: "minmax(100px, 0.45fr)", + width: "minmax(110px, 0.7fr)", }, { key: "price", label: "购买金币", render: (item) => formatNumber(item.priceCoin), - width: "minmax(140px, 0.6fr)", - }, - { - key: "gate", - label: "购买门槛", - render: () => "直接购买", - width: "minmax(180px, 0.8fr)", - }, - { - key: "reward", - label: "奖励资源组", - render: (item) => - resourceLabels[String(item.rewardResourceGroupId)] || `资源组 #${item.rewardResourceGroupId || "-"}`, - width: "minmax(220px, 1fr)", + width: "minmax(140px, 1fr)", }, { key: "duration", label: "有效期", render: (item) => `${Math.round(Number(item.durationMs || 0) / 86400000)} 天`, - width: "minmax(110px, 0.45fr)", + width: "minmax(120px, 0.8fr)", }, { key: "updatedAtMs", label: "更新时间", render: (item) => formatMillis(item.updatedAtMs), - width: "minmax(170px, 0.75fr)", + width: "minmax(180px, 1.2fr)", }, ]; } @@ -222,22 +936,6 @@ function SummaryItem({ children, label }) { ); } -function Stack({ primary, secondary }) { - return ( -
- {primary || "-"} - {secondary || "-"} -
- ); -} - -function groupLabelMap(groups) { - return (groups || []).reduce((labels, group) => { - labels[String(group.groupId)] = group.name || group.groupCode || `资源组 #${group.groupId}`; - return labels; - }, {}); -} - function formatNumber(value) { const number = Number(value || 0); return Number.isFinite(number) ? number.toLocaleString("zh-CN") : "-"; diff --git a/src/features/vip-config/pages/VipConfigPage.test.jsx b/src/features/vip-config/pages/VipConfigPage.test.jsx new file mode 100644 index 0000000..8cb5564 --- /dev/null +++ b/src/features/vip-config/pages/VipConfigPage.test.jsx @@ -0,0 +1,241 @@ +import { fireEvent, render, screen, within } from "@testing-library/react"; +import { afterEach, expect, test, vi } from "vitest"; +import { VipConfigPage } from "./VipConfigPage.jsx"; +import { useVipConfigPage } from "@/features/vip-config/hooks/useVipConfigPage.js"; + +vi.mock("@/features/vip-config/hooks/useVipConfigPage.js", () => ({ + useVipConfigPage: vi.fn(), +})); + +afterEach(() => { + vi.clearAllMocks(); +}); + +test("vip config overview follows the compact five-column design and opens level editing", () => { + const page = pageFixture(); + vi.mocked(useVipConfigPage).mockReturnValue(page); + + render(); + + expect(screen.getByRole("heading", { name: "VIP配置" })).toBeInTheDocument(); + expect(screen.getByText("fami · Fami P1 VIP")).toBeInTheDocument(); + expect(screen.getByText("高等级从购买时重新计时")).toBeInTheDocument(); + expect(Array.from(document.querySelectorAll("[data-table-header-cell]")).map((cell) => cell.textContent)).toEqual([ + "等级", + "状态", + "购买金币", + "有效期", + "更新时间", + ]); + expect(screen.queryByText("操作", { selector: "[data-table-header-cell] *" })).not.toBeInTheDocument(); + + fireEvent.click(screen.getByRole("button", { name: "编辑配置" })); + expect(page.openLevelsEditor).toHaveBeenCalledTimes(1); +}); + +test("P1 level editing uses a real dialog and only renders the selected level editor", () => { + const page = pageFixture({ editorMode: "levels" }); + vi.mocked(useVipConfigPage).mockReturnValue(page); + + render(); + + const dialog = screen.getByRole("dialog", { name: /^VIP等级配置/ }); + const levelNavigation = within(dialog).getByRole("navigation", { name: "VIP等级" }); + + expect(screen.getByTestId("vip-level-1")).toBeInTheDocument(); + expect(screen.queryByTestId("vip-level-2")).not.toBeInTheDocument(); + expect(within(screen.getByTestId("vip-level-1")).getByLabelText("奖励资源组(可选)")).toBeInTheDocument(); + + fireEvent.click(within(levelNavigation).getByRole("button", { name: /VIP2/ })); + + expect(screen.getByTestId("vip-level-2")).toBeInTheDocument(); + expect(screen.queryByTestId("vip-level-1")).not.toBeInTheDocument(); + fireEvent.change(within(screen.getByTestId("vip-level-2")).getByLabelText("购买金币"), { + target: { value: "260" }, + }); + expect(page.updateLevel).toHaveBeenCalledWith(2, { priceCoin: "260" }); +}); + +test("benefit search and status filters only change the visible matrix", () => { + const page = pageFixture({ editorMode: "levels" }); + vi.mocked(useVipConfigPage).mockReturnValue(page); + + render(); + + const benefitPanel = screen.getByRole("region", { name: "VIP1权益配置" }); + fireEvent.change(within(benefitPanel).getByLabelText("搜索权益"), { target: { value: "返现" } }); + + expect(within(benefitPanel).getByRole("button", { name: /金币返现/ })).toBeInTheDocument(); + expect(within(benefitPanel).queryByRole("button", { name: /VIP标识/ })).not.toBeInTheDocument(); + + fireEvent.change(within(benefitPanel).getByLabelText("搜索权益"), { target: { value: "" } }); + fireEvent.click(within(benefitPanel).getByRole("button", { name: "未启用" })); + + expect(within(benefitPanel).getByRole("button", { name: /金币返现/ })).toBeInTheDocument(); + expect(within(benefitPanel).getByRole("button", { name: /上线全服通知/ })).toBeInTheDocument(); + expect(within(benefitPanel).queryByRole("button", { name: /VIP标识/ })).not.toBeInTheDocument(); + expect(page.updateBenefit).not.toHaveBeenCalled(); + expect(page.updateAllBenefits).not.toHaveBeenCalled(); +}); + +test("benefit inspector writes typed rebate and online notice parameters", () => { + const page = pageFixture({ editorMode: "levels" }); + vi.mocked(useVipConfigPage).mockReturnValue(page); + + render(); + + const benefitPanel = screen.getByRole("region", { name: "VIP1权益配置" }); + const inspector = screen.getByRole("complementary", { name: "权益详细设置" }); + + fireEvent.click(within(benefitPanel).getByRole("button", { name: /金币返现/ })); + expect(within(inspector).getByLabelText("每日返现金币")).toHaveValue(88); + fireEvent.change(within(inspector).getByLabelText("每日返现金币"), { target: { value: "99" } }); + + fireEvent.click(within(benefitPanel).getByRole("button", { name: /上线全服通知/ })); + expect(within(inspector).getByLabelText("上线飘屏文案")).toHaveValue("欢迎上线"); + fireEvent.change(within(inspector).getByLabelText("上线飘屏文案"), { + target: { value: "新的上线文案" }, + }); + + const rebatePatch = page.updateBenefit.mock.calls.find((call) => call[1] === "daily_coin_rebate")?.[2]; + const noticePatch = page.updateBenefit.mock.calls.find((call) => call[1] === "online_global_notice")?.[2]; + expect(page.updateBenefit.mock.calls.find((call) => call[1] === "daily_coin_rebate")?.[0]).toBe(1); + expect(page.updateBenefit.mock.calls.find((call) => call[1] === "online_global_notice")?.[0]).toBe(1); + expect(JSON.parse(rebatePatch.metadataJson)).toEqual({ channel: "vip", coin_amount: 99 }); + expect(JSON.parse(noticePatch.metadataJson)).toEqual({ message: "新的上线文案", theme: "gold" }); +}); + +test("benefit select-all targets only the current level", () => { + const page = pageFixture({ editorMode: "levels" }); + vi.mocked(useVipConfigPage).mockReturnValue(page); + + render(); + + const selectAll = screen.getByRole("checkbox", { name: "VIP1权益全选" }); + expect(selectAll).toHaveAttribute("data-indeterminate", "true"); + expect(screen.getByRole("checkbox", { name: "VIP标识权益" })).toBeChecked(); + + fireEvent.click(selectAll); + + expect(page.updateAllBenefits).toHaveBeenCalledTimes(1); + expect(page.updateAllBenefits).toHaveBeenCalledWith(1, "active"); +}); + +test("level dialog exposes one footer cancel and one whole-package save action", () => { + const page = pageFixture({ editorMode: "levels" }); + vi.mocked(useVipConfigPage).mockReturnValue(page); + + render(); + + const dialog = screen.getByRole("dialog", { name: /^VIP等级配置/ }); + const cancelButtons = within(dialog).getAllByRole("button", { name: "取消" }); + const saveButtons = within(dialog).getAllByRole("button", { name: "保存全部配置" }); + expect(cancelButtons).toHaveLength(1); + expect(saveButtons).toHaveLength(1); + + fireEvent.click(cancelButtons[0]); + fireEvent.click(saveButtons[0]); + + expect(page.closeEditor).toHaveBeenCalledTimes(1); + expect(page.submitLevels).toHaveBeenCalledTimes(1); +}); + +function pageFixture(patch = {}) { + const benefits = [ + benefitFixture({ benefitCode: "vip_badge_identity", name: "VIP标识", status: "active" }), + benefitFixture({ + benefitCode: "daily_coin_rebate", + metadataJson: '{"channel":"vip","coin_amount":88}', + name: "金币返现", + trialEnabled: false, + unlockLevel: 6, + }), + benefitFixture({ + benefitCode: "online_global_notice", + executionScope: "notice", + metadataJson: '{"message":"欢迎上线","theme":"gold"}', + name: "上线全服通知", + unlockLevel: 9, + }), + ]; + const firstLevel = levelFixture({ benefits, level: 1, name: "VIP1", status: "active" }); + const secondLevel = levelFixture({ + benefits: benefits.map((benefit) => ({ ...benefit })), + level: 2, + name: "VIP2", + priceCoin: "200", + sortOrder: "20", + }); + return { + abilities: { canUpdate: true, canView: true }, + activeCount: 1, + appCode: "fami", + closeEditor: vi.fn(), + config: { + levels: [ + { ...firstLevel, durationMs: 30 * 24 * 60 * 60 * 1000, priceCoin: 100 }, + { ...secondLevel, durationMs: 30 * 24 * 60 * 60 * 1000, priceCoin: 200 }, + ], + }, + editorMode: "", + error: null, + form: { levels: [firstLevel, secondLevel] }, + loading: false, + openLevelsEditor: vi.fn(), + openProgramEditor: vi.fn(), + program: { + grantMode: "trial_card", + levelCount: 2, + programType: "tiered_privilege_v1", + status: "active", + trialCardEnabled: true, + upgradeExpiryPolicy: "replace_from_now", + }, + programForm: { enabled: true, levelCount: "2", programType: "tiered_privilege_v1" }, + reload: vi.fn(), + resourceGroups: [{ groupId: 11, name: "VIP1资源组" }], + resources: [], + resourcesLoading: false, + saving: false, + submitLevels: vi.fn((event) => event.preventDefault()), + submitProgram: vi.fn((event) => event.preventDefault()), + updateAllBenefits: vi.fn(), + updateBenefit: vi.fn(), + updateLevel: vi.fn(), + updateProgramField: vi.fn(), + ...patch, + }; +} + +function levelFixture(patch = {}) { + return { + benefits: [], + durationDays: "30", + level: 1, + name: "VIP1", + priceCoin: "100", + rewardResourceGroupId: "11", + sortOrder: "10", + status: "disabled", + updatedAtMs: 1780000000000, + ...patch, + }; +} + +function benefitFixture(patch = {}) { + return { + autoEquip: false, + benefitCode: "room_entry_notice", + benefitType: "function", + executionScope: "room", + metadataJson: "{}", + name: "VIP进房通知", + resourceId: "", + resourceType: "", + sortOrder: "10", + status: "disabled", + trialEnabled: true, + unlockLevel: 2, + ...patch, + }; +} diff --git a/src/features/vip-config/schema.js b/src/features/vip-config/schema.js new file mode 100644 index 0000000..df98819 --- /dev/null +++ b/src/features/vip-config/schema.js @@ -0,0 +1,36 @@ +import { z } from "zod"; + +const benefitSchema = z.object({ + catalogPlaceholder: z.boolean().optional(), + benefitCode: z.string().trim().min(1, "权益编码不能为空").max(96, "权益编码不能超过 96 个字符"), + benefitType: z.enum(["decoration", "function"]), + autoEquip: z.boolean(), + executionScope: z.enum(["wallet", "room", "user", "notice"]), + metadataJson: z.string().trim().max(4096, "权益元数据不能超过 4096 个字符"), + name: z.string().trim().min(1, "权益名称不能为空").max(128, "权益名称不能超过 128 个字符"), + resourceId: z.union([z.string(), z.number()]).optional(), + resourceType: z.string().optional(), + sortOrder: z.union([z.string(), z.number()]), + status: z.enum(["active", "disabled"]), + trialEnabled: z.boolean(), + unlockLevel: z.number().int().positive(), +}); + +const levelSchema = z.object({ + benefits: z.array(benefitSchema), + durationDays: z.union([z.string(), z.number()]), + level: z.number().int().positive(), + name: z.string().trim().min(1, "VIP名称不能为空").max(128, "VIP名称不能超过 128 个字符"), + priceCoin: z.union([z.string(), z.number()]), + rewardResourceGroupId: z.union([z.string(), z.number()]).optional(), + sortOrder: z.union([z.string(), z.number()]), + status: z.enum(["active", "disabled"]), +}); + +export const vipProgramFormSchema = z.object({ + enabled: z.boolean(), + levelCount: z.union([z.string(), z.number()]), + programType: z.enum(["legacy_timed", "tiered_privilege_v1"]), +}); + +export const vipConfigFormSchema = z.object({ levels: z.array(levelSchema).min(1, "请至少配置一个VIP等级") }); diff --git a/src/features/vip-config/vip-config.module.css b/src/features/vip-config/vip-config.module.css index b46220c..2537178 100644 --- a/src/features/vip-config/vip-config.module.css +++ b/src/features/vip-config/vip-config.module.css @@ -1,98 +1,996 @@ -.summaryPanel { +.pageScroll { display: flex; + flex: 1; + min-width: 0; + min-height: 0; + flex-direction: column; + overflow-x: hidden; + overflow-y: auto; + overscroll-behavior: contain; + background: var(--bg-subtle); + scrollbar-gutter: stable; +} + +.overviewSection { + min-width: 0; + border-bottom: 1px solid var(--border); + background: var(--bg-card); +} + +.sectionHeader { + display: flex; + min-width: 0; align-items: center; justify-content: space-between; gap: 16px; - padding: 16px 18px; - border-bottom: 1px solid var(--color-border-subtle); - background: var(--color-surface); + padding: 16px 22px 12px; +} + +.sectionTitleGroup, +.dialogHeading { + display: flex; + min-width: 0; + flex-direction: column; + gap: 3px; +} + +.pageTitle { + margin: 0; + color: var(--text-primary); + font-size: 16px; + font-weight: 780; + line-height: 1.35; +} + +.pageSubtitle, +.summaryLabel { + color: var(--text-tertiary); + font-size: 12px; + line-height: 1.4; +} + +.headerActions { + display: flex; + flex: 0 0 auto; + align-items: center; + gap: 8px; } .summaryItems { - display: flex; - flex-wrap: wrap; - gap: 14px; + display: grid; + grid-template-columns: repeat(5, minmax(130px, 1fr)); + gap: 10px; + padding: 0 22px 14px; } .summaryItem { - min-width: 140px; -} - -.summaryLabel, -.meta { - display: block; - color: var(--color-text-muted); - font-size: 12px; + display: flex; + min-width: 0; + flex-direction: column; + gap: 3px; + padding: 9px 11px; + border: 1px solid var(--border); + border-radius: 8px; + background: var(--bg-card-strong); } .summaryValue { - display: block; - margin-top: 4px; - color: var(--color-text); - font-size: 18px; - font-weight: 700; + min-width: 0; + overflow: hidden; + color: var(--text-primary); + font-size: 13px; + font-weight: 720; + text-overflow: ellipsis; + white-space: nowrap; } -.summaryActions { - display: flex; - gap: 10px; +.overviewTable { + flex: none !important; + min-height: auto !important; + border: 0 !important; + border-top: 1px solid var(--border) !important; + border-radius: 0 !important; +} + +.overviewTable :global(.table-scroll) { + flex: none; + min-height: auto; + overflow-x: auto; + overflow-y: visible; +} + +.overviewTable :global(.admin-table) { + min-height: 0; +} + +.overviewTable :global(.admin-row) { + min-height: 42px; +} + +.overviewTable :global(.admin-row--head) { + position: static; + min-height: 38px; +} + +.levelTableName { + color: var(--text-primary); + font-weight: 760; } .statusBadge { display: inline-flex; + width: fit-content; + min-height: 23px; align-items: center; - height: 24px; - padding: 0 10px; - border-radius: 999px; + padding: 0 9px; + border-radius: var(--radius-pill); font-size: 12px; - font-weight: 700; + font-weight: 720; } .statusActive { - color: #12603a; - background: #dcfce7; + border: 1px solid var(--success-border); + background: var(--success-surface); + color: var(--success); } .statusDisabled { - color: #475569; - background: #e2e8f0; + border: 1px solid var(--border); + background: var(--bg-card-strong); + color: var(--text-tertiary); } -.stack { - display: flex; - flex-direction: column; - gap: 3px; - min-width: 0; +.programDialogPaper { + border-radius: var(--radius-card) !important; + background: var(--bg-card) !important; + box-shadow: var(--shadow-dialog) !important; } -.levelEditorList { +.programDialogForm { display: grid; - gap: 12px; + max-height: calc(100vh - 48px); + grid-template-rows: auto minmax(0, 1fr) auto; + overflow: hidden; } -.levelEditor { - border: 1px solid var(--color-border-subtle); - border-radius: 8px; - padding: 14px; - background: var(--color-surface-subtle); -} - -.levelEditorHeader { +.dialogTitle, +.levelsDialogTitle { display: flex; align-items: center; justify-content: space-between; + gap: 16px; + border-bottom: 1px solid var(--border); +} + +.dialogTitle { + padding: 18px 20px 14px !important; +} + +.dialogTitle > div:first-child { + display: grid; + gap: 3px; +} + +.dialogTitle h2, +.levelsDialogTitle h2 { + margin: 0; + color: var(--text-primary); + font-size: 19px; + font-weight: 800; + line-height: 1.35; +} + +.dialogTitle span, +.levelsDialogTitle .dialogHeading > span { + color: var(--text-tertiary); + font-size: 12px; + font-weight: 650; +} + +.programDialogContent { + display: grid; + gap: 14px; + min-height: 0; + overflow: auto; + padding: 20px !important; +} + +.programGrid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; - margin-bottom: 12px; +} + +.inlineNotice { + padding: 10px 12px; + border: 1px solid var(--warning-border); + border-radius: 8px; + background: var(--warning-surface); + color: var(--text-secondary); + font-size: 12px; + line-height: 1.6; +} + +.dialogActions, +.levelsDialogActions { + border-top: 1px solid var(--border); + background: var(--bg-card); +} + +.dialogActions { + gap: 8px; + padding: 12px 20px 16px !important; +} + +.levelsDialogPaper { + width: min(1420px, calc(100vw - 32px)) !important; + max-width: min(1420px, calc(100vw - 32px)) !important; + height: min(900px, calc(100vh - 32px)); + max-height: calc(100vh - 32px) !important; + overflow: hidden; + border-radius: 12px !important; + background: var(--bg-card) !important; + box-shadow: var(--shadow-dialog) !important; +} + +.levelsDialogForm { + display: grid; + width: 100%; + height: 100%; + min-height: 0; + grid-template-rows: auto minmax(0, 1fr) auto; + overflow: hidden; +} + +.levelsDialogTitle { + min-height: 68px; + padding: 13px 18px 12px 20px !important; +} + +.dialogHeaderActions { + display: flex; + flex: 0 0 auto; + align-items: center; + gap: 8px; +} + +.dialogStat { + display: inline-flex; + min-height: 26px; + align-items: center; + padding: 0 9px; + border: 1px solid var(--admin-tag-border); + border-radius: var(--radius-pill); + background: var(--admin-tag-bg); + color: var(--admin-tag-color); + font-size: 11px; + font-weight: 720; + white-space: nowrap; +} + +.rulesButton { + min-height: 30px !important; +} + +.levelsDialogContent { + display: grid !important; + min-width: 0; + min-height: 0; + grid-template-columns: 184px minmax(560px, 1fr) 340px; + overflow: hidden !important; + padding: 0 !important; +} + +.levelRail { + min-width: 0; + min-height: 0; + overflow-y: auto; + border-right: 1px solid var(--border); + background: color-mix(in srgb, var(--bg-card-strong) 65%, var(--bg-card)); + scrollbar-width: thin; +} + +.levelRailHeading { + position: sticky; + top: 0; + z-index: 1; + display: grid; + gap: 2px; + padding: 14px 12px 10px; + border-bottom: 1px solid var(--border-soft); + background: color-mix(in srgb, var(--bg-card-strong) 92%, var(--bg-card)); +} + +.levelRailHeading strong { + color: var(--text-primary); + font-size: 12px; + font-weight: 800; +} + +.levelRailHeading span { + color: var(--text-tertiary); + font-size: 10px; +} + +.levelRailList { + display: grid; + gap: 5px; + padding: 8px; +} + +.levelRailItem { + display: grid; + width: 100%; + min-height: 58px; + gap: 5px; + padding: 9px 10px; + border: 1px solid transparent; + border-radius: 8px; + background: transparent; + color: var(--text-secondary); + font: inherit; + text-align: left; + cursor: pointer; + transition: + border-color 120ms ease, + background 120ms ease, + box-shadow 120ms ease; +} + +.levelRailItem:hover { + background: var(--bg-hover); +} + +.levelRailItem:focus-visible { + outline: 2px solid var(--primary-border-strong); + outline-offset: 1px; +} + +.levelRailItemActive { + border-color: var(--primary-border); + background: var(--primary-surface); + box-shadow: inset 3px 0 0 var(--primary); +} + +.levelRailItemTop, +.levelRailItemMeta { + display: flex; + min-width: 0; + align-items: center; + justify-content: space-between; + gap: 8px; +} + +.levelRailItemTop strong { + color: var(--text-primary); + font-size: 13px; + font-weight: 800; +} + +.levelRailItemMeta { + color: var(--text-tertiary); + font-size: 10px; +} + +.levelStatusDot { + width: 7px; + height: 7px; + flex: 0 0 auto; + border-radius: 50%; + background: var(--text-tertiary); +} + +.levelStatusDotActive { + background: var(--success); + box-shadow: 0 0 0 3px var(--success-surface); +} + +.levelMain { + display: flex; + min-width: 0; + min-height: 0; + flex-direction: column; + gap: 14px; + overflow-y: auto; + padding: 16px; + background: var(--bg-page); + scrollbar-gutter: stable; +} + +.levelBaseSection, +.benefitsPanel { + flex: 0 0 auto; + min-width: 0; + border: 1px solid var(--border); + border-radius: 10px; + background: var(--bg-card); + box-shadow: 0 1px 2px rgb(15 23 42 / 0.035); +} + +.levelBaseSection { + display: grid; + gap: 13px; + padding: 14px; +} + +.panelHeading { + display: flex; + min-width: 0; + align-items: center; + justify-content: space-between; + gap: 12px; +} + +.panelHeading > div:first-child { + display: grid; + min-width: 0; + gap: 2px; +} + +.panelEyebrow { + color: var(--text-tertiary); + font-size: 10px; + font-weight: 760; + letter-spacing: 0.04em; + text-transform: uppercase; +} + +.panelHeading h3, +.benefitsTitleBlock h3, +.inspectorHeading h3 { + margin: 0; + color: var(--text-primary); + font-size: 14px; + font-weight: 800; + line-height: 1.4; +} + +.levelFields { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 10px; +} + +.levelFields > :nth-child(4) { + grid-column: span 2; +} + +.levelsDialog :global(.MuiTextField-root), +.levelsDialog :global(.MuiFormControl-root), +.programDialogForm :global(.MuiTextField-root), +.programDialogForm :global(.MuiFormControl-root) { + --admin-control-height: 34px; + --admin-control-font-size: 12px; +} + +.benefitsPanel { + display: grid; + overflow: visible; +} + +.benefitsToolbar { + display: flex; + min-width: 0; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 12px 14px 9px; +} + +.benefitsTitleBlock { + display: flex; + min-width: 0; + align-items: baseline; + gap: 8px; +} + +.benefitsTitleBlock span { + color: var(--text-tertiary); + font-size: 11px; + font-weight: 650; +} + +.benefitsToolbarActions { + display: flex; + min-width: 0; + align-items: center; + gap: 8px; +} + +.benefitSearch { + width: min(210px, 30vw); +} + +.selectAllControl { + margin: 0 !important; +} + +.selectAllControl :global(.MuiFormControlLabel-label) { + color: var(--text-secondary); + font-size: 11px; font-weight: 700; } -@media (max-width: 760px) { - .summaryPanel { +.filterBar { + display: flex; + min-width: 0; + align-items: center; + gap: 6px; + overflow-x: auto; + padding: 0 14px 10px; + border-bottom: 1px solid var(--border-soft); +} + +.filterChip { + min-height: 25px; + padding: 0 9px; + border: 1px solid var(--border); + border-radius: var(--radius-pill); + background: var(--bg-card); + color: var(--text-secondary); + font: inherit; + font-size: 11px; + font-weight: 680; + white-space: nowrap; + cursor: pointer; +} + +.filterChip:hover { + border-color: var(--primary-border); + color: var(--primary); +} + +.filterChip:focus-visible { + outline: 2px solid var(--primary-border-strong); + outline-offset: 1px; +} + +.filterChipActive { + border-color: var(--primary-border); + background: var(--primary-surface); + color: var(--primary); +} + +.benefitGroups { + display: grid; + min-width: 0; + gap: 12px; + padding: 12px 14px 14px; +} + +.benefitGroup { + display: grid; + min-width: 0; + gap: 7px; +} + +.benefitGroupHeading { + display: flex; + min-width: 0; + align-items: center; + justify-content: space-between; + gap: 10px; + color: var(--text-secondary); + font-size: 11px; + font-weight: 800; +} + +.benefitGroupHeading span:last-child { + color: var(--text-tertiary); + font-size: 10px; + font-weight: 680; +} + +.benefitMatrix { + display: grid; + min-width: 0; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 6px; +} + +.benefitCard { + display: grid; + min-width: 0; + min-height: 52px; + grid-template-columns: auto minmax(0, 1fr) auto; + align-items: center; + gap: 2px; + padding: 3px 7px 3px 3px; + overflow: hidden; + border: 1px solid var(--border-soft); + border-radius: 7px; + background: var(--bg-card-strong); + transition: + border-color 120ms ease, + background 120ms ease, + box-shadow 120ms ease; +} + +.benefitCard:hover { + border-color: var(--primary-border); +} + +.benefitCardSelected { + border-color: var(--primary-border-strong); + background: var(--primary-surface); + box-shadow: 0 0 0 1px var(--primary-surface-strong); +} + +.benefitCard > button { + display: grid; + min-width: 0; + gap: 2px; + padding: 6px 4px; + border: 0; + outline: 0; + background: transparent; + color: inherit; + font: inherit; + text-align: left; + cursor: pointer; +} + +.benefitCard > button:focus-visible { + border-radius: 4px; + outline: 2px solid var(--primary-border-strong); + outline-offset: 1px; +} + +.benefitCardName, +.benefitCardSummary { + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.benefitCardName { + color: var(--text-primary); + font-size: 12px; + font-weight: 730; +} + +.benefitCardSummary { + color: var(--text-tertiary); + font-size: 10px; +} + +.benefitEnabledLabel, +.benefitDisabledLabel { + display: inline-flex; + min-height: 20px; + align-items: center; + padding: 0 6px; + border-radius: var(--radius-pill); + font-size: 9px; + font-weight: 760; + white-space: nowrap; +} + +.benefitEnabledLabel { + background: var(--success-surface); + color: var(--success); +} + +.benefitDisabledLabel { + background: color-mix(in srgb, var(--text-tertiary) 10%, transparent); + color: var(--text-tertiary); +} + +.emptyBenefits, +.inspectorEmpty, +.classicNotice { + padding: 24px 16px; + border: 1px dashed var(--border); + border-radius: 8px; + color: var(--text-tertiary); + font-size: 12px; + line-height: 1.6; + text-align: center; +} + +.classicNotice { + background: var(--bg-card); +} + +.inspector { + min-width: 0; + min-height: 0; + overflow-y: auto; + border-left: 1px solid var(--border); + background: var(--bg-card); + scrollbar-gutter: stable; +} + +.inspectorBody, +.rulesPanel { + display: grid; + min-width: 0; + align-content: start; + gap: 14px; + padding: 16px; +} + +.inspectorHeading { + display: flex; + min-width: 0; + align-items: flex-start; + justify-content: space-between; + gap: 10px; + padding-bottom: 12px; + border-bottom: 1px solid var(--border-soft); +} + +.inspectorHeading > div:first-child { + display: grid; + min-width: 0; + gap: 3px; +} + +.inspectorHeading code { + max-width: 220px; + overflow: hidden; + color: var(--text-tertiary); + font-size: 10px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.inspectorSection { + display: grid; + min-width: 0; + gap: 10px; +} + +.inspectorSection h4 { + margin: 0; + color: var(--text-secondary); + font-size: 11px; + font-weight: 800; +} + +.switchField { + display: flex; + min-height: 34px; + min-width: 0; + align-items: center; + justify-content: space-between; + gap: 10px; + padding: 0 9px; + border: 1px solid var(--border); + border-radius: var(--radius-control); + background: var(--bg-card); + color: var(--text-secondary); + font-size: 11px; + font-weight: 650; +} + +.noExtraFields { + margin: 0; + padding: 10px 11px; + border-radius: 7px; + background: var(--bg-card-strong); + color: var(--text-tertiary); + font-size: 11px; + line-height: 1.55; +} + +.advancedSettings { + min-width: 0; + overflow: hidden; + border: 1px solid var(--border); + border-radius: 8px; + background: var(--bg-card-strong); +} + +.advancedSettings > summary { + padding: 10px 12px; + color: var(--text-secondary); + font-size: 11px; + font-weight: 760; + cursor: pointer; + user-select: none; +} + +.advancedSettings[open] > summary { + border-bottom: 1px solid var(--border); +} + +.advancedFields { + display: grid; + min-width: 0; + gap: 10px; + padding: 12px; +} + +.rulesPanel ol { + display: grid; + gap: 9px; + margin: 0; + padding-left: 20px; + color: var(--text-secondary); + font-size: 11px; + line-height: 1.62; +} + +.levelsDialogActions { + display: flex; + min-height: 64px; + align-items: center; + justify-content: space-between !important; + gap: 16px; + padding: 10px 18px !important; +} + +.saveHint { + display: grid; + min-width: 0; + gap: 1px; +} + +.saveHint strong { + color: var(--text-primary); + font-size: 11px; + font-weight: 800; +} + +.saveHint span { + min-width: 0; + overflow: hidden; + color: var(--text-tertiary); + font-size: 10px; + text-overflow: ellipsis; + white-space: nowrap; +} + +.footerActions { + display: flex; + flex: 0 0 auto; + align-items: center; + gap: 8px; +} + +@media (max-width: 1240px) { + .levelsDialogContent { + grid-template-columns: 164px minmax(500px, 1fr) 300px; + } + + .levelFields { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .levelFields > :nth-child(4) { + grid-column: auto; + } +} + +@media (max-width: 1020px) { + .levelsDialogPaper { + width: calc(100vw - 20px) !important; + max-width: calc(100vw - 20px) !important; + height: calc(100vh - 20px); + max-height: calc(100vh - 20px) !important; + } + + .levelsDialogContent { + grid-template-columns: 148px minmax(430px, 1fr) 280px; + } + + .benefitMatrix { + grid-template-columns: 1fr; + } + + .dialogStat { + display: none; + } +} + +@media (max-width: 820px) { + .summaryItems { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .levelsDialogTitle { + align-items: flex-start; + } + + .dialogHeaderActions { + gap: 4px; + } + + .levelsDialogContent { + grid-template-columns: 1fr; + grid-template-rows: auto minmax(0, 1fr); + overflow-y: auto !important; + } + + .levelRail { + overflow-x: auto; + overflow-y: hidden; + border-right: 0; + border-bottom: 1px solid var(--border); + } + + .levelRailHeading { + display: none; + } + + .levelRailList { + display: flex; + width: max-content; + padding: 7px 10px; + } + + .levelRailItem { + width: 126px; + min-height: 50px; + } + + .levelMain { + overflow: visible; + } + + .inspector { + grid-column: 1; + overflow: visible; + border-top: 1px solid var(--border); + border-left: 0; + } + + .levelsDialogActions { + min-height: auto; + } + + .saveHint { + display: none; + } +} + +@media (max-width: 620px) { + .sectionHeader { align-items: stretch; flex-direction: column; } - .summaryActions { + .headerActions { + flex-wrap: wrap; justify-content: flex-end; } + + .summaryItems, + .programGrid, + .levelFields, + .benefitMatrix { + grid-template-columns: 1fr; + } + + .summaryItems { + padding-right: 12px; + padding-left: 12px; + } + + .levelsDialogTitle { + padding-left: 14px !important; + } + + .levelsDialogTitle .rulesButton, + .levelsDialogTitle .dialogHeading > span { + display: none; + } + + .levelMain, + .inspectorBody, + .rulesPanel { + padding: 12px; + } + + .benefitsToolbar { + align-items: stretch; + flex-direction: column; + } + + .benefitsToolbarActions, + .benefitSearch { + width: 100%; + } } diff --git a/src/shared/api/generated/endpoints.ts b/src/shared/api/generated/endpoints.ts index 9c1279a..1920490 100644 --- a/src/shared/api/generated/endpoints.ts +++ b/src/shared/api/generated/endpoints.ts @@ -5,2807 +5,2879 @@ 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 = { - adjustDicePool: "adjustDicePool", - adminAddAgencyHost: "adminAddAgencyHost", - appBanUser: "appBanUser", - appGetUser: "appGetUser", - appListBannedUsers: "appListBannedUsers", - appListLoginLogs: "appListLoginLogs", - appListUserLoginLogs: "appListUserLoginLogs", - appListUsers: "appListUsers", - approveCoinSellerSubApplication: "approveCoinSellerSubApplication", - approveFinanceApplication: "approveFinanceApplication", - approveFinanceWithdrawalApplication: "approveFinanceWithdrawalApplication", - appSetPassword: "appSetPassword", - appUnbanUser: "appUnbanUser", - appUpdateUser: "appUpdateUser", - batchCreateGifts: "batchCreateGifts", - batchDeleteResources: "batchDeleteResources", - batchUpdateUserStatus: "batchUpdateUserStatus", - cancelJob: "cancelJob", - 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", - createFinanceApplication: "createFinanceApplication", - createFinanceCoinSellerRechargeOrder: "createFinanceCoinSellerRechargeOrder", - createFullServerNoticeFanout: "createFullServerNoticeFanout", - createGift: "createGift", - createH5Link: "createH5Link", - createHostAgencyPolicy: "createHostAgencyPolicy", - createManager: "createManager", - createMenu: "createMenu", - createPermission: "createPermission", - createPlatform: "createPlatform", - createPolicyInstance: "createPolicyInstance", - createPopup: "createPopup", - createPrettyIdPool: "createPrettyIdPool", - createRechargeProduct: "createRechargeProduct", - createRegion: "createRegion", - createResource: "createResource", - createResourceGroup: "createResourceGroup", - createRobotRoom: "createRobotRoom", - createRole: "createRole", - createRoomPin: "createRoomPin", - createSplashScreen: "createSplashScreen", - createTaskDefinition: "createTaskDefinition", - createTeam: "createTeam", - createTeamSalaryPolicy: "createTeamSalaryPolicy", - createTemporaryPaymentLink: "createTemporaryPaymentLink", - createTier: "createTier", - createUser: "createUser", - createWeeklyStarCycle: "createWeeklyStarCycle", - creditCoinSellerStock: "creditCoinSellerStock", - dashboardOverview: "dashboardOverview", - debitCoinSellerStock: "debitCoinSellerStock", - deleteAchievementDefinition: "deleteAchievementDefinition", - deleteAgency: "deleteAgency", - deleteAppVersion: "deleteAppVersion", - deleteBanner: "deleteBanner", - deleteBDLeader: "deleteBDLeader", - deleteCatalog: "deleteCatalog", - deleteCountry: "deleteCountry", - deleteDiceRobot: "deleteDiceRobot", - deleteExploreTab: "deleteExploreTab", - deleteGift: "deleteGift", - deleteH5Link: "deleteH5Link", - deleteHostAgencyPolicy: "deleteHostAgencyPolicy", - deleteMenu: "deleteMenu", - deletePermission: "deletePermission", - deletePopup: "deletePopup", - deleteRechargeProduct: "deleteRechargeProduct", - deleteResource: "deleteResource", - deleteRole: "deleteRole", - deleteRoom: "deleteRoom", - deleteSplashScreen: "deleteSplashScreen", - deleteTeamSalaryPolicy: "deleteTeamSalaryPolicy", - disableCountry: "disableCountry", - disableGift: "disableGift", - disableRegion: "disableRegion", - disableResource: "disableResource", - disableResourceGroup: "disableResourceGroup", - disableResourceShopItem: "disableResourceShopItem", - enableCountry: "enableCountry", - enableGift: "enableGift", - enableRegion: "enableRegion", - enableResource: "enableResource", - enableResourceGroup: "enableResourceGroup", - enableResourceShopItem: "enableResourceShopItem", - expireRoomRpsChallenge: "expireRoomRpsChallenge", - exportCoinSellerLedger: "exportCoinSellerLedger", - exportLoginLogs: "exportLoginLogs", - exportOperationLogs: "exportOperationLogs", - exportRechargeBills: "exportRechargeBills", - exportUsers: "exportUsers", - generateDiceRobots: "generateDiceRobots", - generatePrettyIds: "generatePrettyIds", - getCoinSellerSalaryRates: "getCoinSellerSalaryRates", - getCountry: "getCountry", - getCPConfig: "getCPConfig", - getCPWeeklyRankConfig: "getCPWeeklyRankConfig", - getCumulativeRechargeRewardConfig: "getCumulativeRechargeRewardConfig", - getFinanceScope: "getFinanceScope", - getFirstRechargeRewardConfig: "getFirstRechargeRewardConfig", - getHumanRoomRobotConfig: "getHumanRoomRobotConfig", - getInviteActivityRewardConfig: "getInviteActivityRewardConfig", - getJob: "getJob", - getLuckyGiftConfig: "getLuckyGiftConfig", - getLuckyGiftDrawSummary: "getLuckyGiftDrawSummary", - getRechargeBillOverview: "getRechargeBillOverview", - getRechargeBillSummary: "getRechargeBillSummary", - getRedPacket: "getRedPacket", - getRedPacketConfig: "getRedPacketConfig", - getRegion: "getRegion", - getRegistrationRewardConfig: "getRegistrationRewardConfig", - getResource: "getResource", - getResourceGroup: "getResourceGroup", - getResourceIdentityAutoGrantConfig: "getResourceIdentityAutoGrantConfig", - getRiskConfig: "getRiskConfig", - getRoleDataScopes: "getRoleDataScopes", - getRoomConfig: "getRoomConfig", - getRoomRocketConfig: "getRoomRocketConfig", - getRoomRpsChallenge: "getRoomRpsChallenge", - getRoomRpsConfig: "getRoomRpsConfig", - getRoomTurnoverRewardConfig: "getRoomTurnoverRewardConfig", - getRoomWhitelistConfig: "getRoomWhitelistConfig", - getSevenDayCheckInConfig: "getSevenDayCheckInConfig", - getSocialBiFunnel: "getSocialBiFunnel", - getSocialBiKpi: "getSocialBiKpi", - getSocialBiMaster: "getSocialBiMaster", - getSocialBiOverview: "getSocialBiOverview", - getSocialBiRequirements: "getSocialBiRequirements", - getTemporaryPaymentLink: "getTemporaryPaymentLink", - getUser: "getUser", - getWeeklyStarCycle: "getWeeklyStarCycle", - getWheelConfig: "getWheelConfig", - getWheelDrawSummary: "getWheelDrawSummary", - grantFinanceCoinSellerRechargeOrder: "grantFinanceCoinSellerRechargeOrder", - grantPrettyId: "grantPrettyId", - grantResource: "grantResource", - grantResourceGroup: "grantResourceGroup", - listAchievementDefinitions: "listAchievementDefinitions", - listAgencies: "listAgencies", - listApps: "listApps", - listAppVersions: "listAppVersions", - listAvailableRoomRobots: "listAvailableRoomRobots", - listBanners: "listBanners", - listBDLeaders: "listBDLeaders", - listBDs: "listBDs", - listCatalog: "listCatalog", - listCoinAdjustments: "listCoinAdjustments", - listCoinLedger: "listCoinLedger", - listCoinSellerLedger: "listCoinSellerLedger", - listCoinSellers: "listCoinSellers", - listCoinSellerSubApplications: "listCoinSellerSubApplications", - listCoinSellerSubSellers: "listCoinSellerSubSellers", - listCountries: "listCountries", - listCPApplications: "listCPApplications", - listCPRelationships: "listCPRelationships", - listCPWeeklyRankSettlements: "listCPWeeklyRankSettlements", - listCumulativeRechargeRewardGrants: "listCumulativeRechargeRewardGrants", - listDiceRobots: "listDiceRobots", - listEmojiPackCategories: "listEmojiPackCategories", - listEmojiPacks: "listEmojiPacks", - listExploreTabs: "listExploreTabs", - listFinanceApplications: "listFinanceApplications", - listFinanceCoinSellerRechargeOrders: "listFinanceCoinSellerRechargeOrders", - listFinanceWithdrawalApplications: "listFinanceWithdrawalApplications", - listFirstRechargeRewardClaims: "listFirstRechargeRewardClaims", - listGifts: "listGifts", - listGiftTypes: "listGiftTypes", - listH5Links: "listH5Links", - listHostAgencyPolicies: "listHostAgencyPolicies", - listHosts: "listHosts", - listHostSalarySettlements: "listHostSalarySettlements", - listHostWithdrawals: "listHostWithdrawals", - listInviteActivityRewardClaims: "listInviteActivityRewardClaims", - listJobs: "listJobs", - listLevelConfig: "listLevelConfig", - listLoginLogs: "listLoginLogs", - listLuckyGiftConfigs: "listLuckyGiftConfigs", - listLuckyGiftDraws: "listLuckyGiftDraws", - listManagers: "listManagers", - listMyFinanceApplications: "listMyFinanceApplications", - listOperationLogs: "listOperationLogs", - listPermissions: "listPermissions", - listPlatformGrantRecords: "listPlatformGrantRecords", - listPlatformGrantUsers: "listPlatformGrantUsers", - listPlatforms: "listPlatforms", - listPolicyInstances: "listPolicyInstances", - listPolicyTemplates: "listPolicyTemplates", - listPopups: "listPopups", - listPrettyIdPools: "listPrettyIdPools", - listPrettyIds: "listPrettyIds", - listRechargeApps: "listRechargeApps", - listRechargeBills: "listRechargeBills", - listRechargeProducts: "listRechargeProducts", - listRechargeRegions: "listRechargeRegions", - listRedPackets: "listRedPackets", - listRegionBlocks: "listRegionBlocks", - listRegions: "listRegions", - listRegistrationRewardClaims: "listRegistrationRewardClaims", - listReports: "listReports", - listResourceGrants: "listResourceGrants", - listResourceGroups: "listResourceGroups", - listResources: "listResources", - listResourceShopItems: "listResourceShopItems", - listResourceShopPurchaseOrders: "listResourceShopPurchaseOrders", - listRobotRooms: "listRobotRooms", - listRoles: "listRoles", - listRoomPins: "listRoomPins", - listRoomRpsChallenges: "listRoomRpsChallenges", - listRooms: "listRooms", - listRoomTurnoverRewardSettlements: "listRoomTurnoverRewardSettlements", - listSelfGames: "listSelfGames", - listSevenDayCheckInClaims: "listSevenDayCheckInClaims", - listSplashScreens: "listSplashScreens", - listSystemMenus: "listSystemMenus", - listTaskDefinitions: "listTaskDefinitions", - listTeams: "listTeams", - listTeamSalaryPolicies: "listTeamSalaryPolicies", - listTeamUsers: "listTeamUsers", - listTemporaryPaymentLinks: "listTemporaryPaymentLinks", - listThirdPartyPaymentChannels: "listThirdPartyPaymentChannels", - listUserFinanceScopes: "listUserFinanceScopes", - listUserLeaderboards: "listUserLeaderboards", - listUsers: "listUsers", - listWeeklyStarCycles: "listWeeklyStarCycles", - listWeeklyStarLeaderboard: "listWeeklyStarLeaderboard", - listWeeklyStarSettlements: "listWeeklyStarSettlements", - listWheelDraws: "listWheelDraws", - login: "login", - logout: "logout", - lookupCoinAdjustmentTarget: "lookupCoinAdjustmentTarget", - lookupResourceGrantTarget: "lookupResourceGrantTarget", - me: "me", - navigationMenus: "navigationMenus", - publishHostAgencyPolicy: "publishHostAgencyPolicy", - publishPolicyInstance: "publishPolicyInstance", - recyclePrettyId: "recyclePrettyId", - refresh: "refresh", - refreshGoogleRechargePaid: "refreshGoogleRechargePaid", - rejectCoinSellerSubApplication: "rejectCoinSellerSubApplication", - rejectFinanceApplication: "rejectFinanceApplication", - rejectFinanceWithdrawalApplication: "rejectFinanceWithdrawalApplication", - renameCountryCode: "renameCountryCode", - replaceCoinSellerSalaryRates: "replaceCoinSellerSalaryRates", - replaceRegionBlocks: "replaceRegionBlocks", - replaceRegionCountries: "replaceRegionCountries", - replaceRoleDataScopes: "replaceRoleDataScopes", - replaceRolePermissions: "replaceRolePermissions", - replaceUserFinanceScopes: "replaceUserFinanceScopes", - resetUserPassword: "resetUserPassword", - retryRedPacketRefund: "retryRedPacketRefund", - retryRoomRpsSettlement: "retryRoomRpsSettlement", - retryRoomTurnoverRewardSettlement: "retryRoomTurnoverRewardSettlement", - revokeResourceGrant: "revokeResourceGrant", - savePolicyTemplate: "savePolicyTemplate", - search: "search", - selfGameStatisticsOverview: "selfGameStatisticsOverview", - setAgencyJoinEnabled: "setAgencyJoinEnabled", - setAgencyStatus: "setAgencyStatus", - setBDLeaderStatus: "setBDLeaderStatus", - setBDStatus: "setBDStatus", - setCoinSellerStatus: "setCoinSellerStatus", - setDiceRobotStatus: "setDiceRobotStatus", - setGameStatus: "setGameStatus", - setPrettyIdStatus: "setPrettyIdStatus", - setTaskDefinitionStatus: "setTaskDefinitionStatus", - setThirdPartyPaymentMethodStatus: "setThirdPartyPaymentMethodStatus", - setWeeklyStarCycleStatus: "setWeeklyStarCycleStatus", - sortMenus: "sortMenus", - startRobotRoom: "startRobotRoom", - statisticsOverview: "statisticsOverview", - stopRobotRoom: "stopRobotRoom", - syncPermissions: "syncPermissions", - syncThirdPartyPaymentMethods: "syncThirdPartyPaymentMethods", - syncThirdPartyPaymentRates: "syncThirdPartyPaymentRates", - updateAchievementDefinition: "updateAchievementDefinition", - updateAppVersion: "updateAppVersion", - updateBanner: "updateBanner", - updateCatalog: "updateCatalog", - updateCountry: "updateCountry", - updateCPConfig: "updateCPConfig", - updateCPWeeklyRankConfig: "updateCPWeeklyRankConfig", - updateCumulativeRechargeRewardConfig: "updateCumulativeRechargeRewardConfig", - updateDiceConfig: "updateDiceConfig", - updateExploreTab: "updateExploreTab", - updateFirstRechargeRewardConfig: "updateFirstRechargeRewardConfig", - updateGift: "updateGift", - updateGiftType: "updateGiftType", - updateGiftTypes: "updateGiftTypes", - updateH5Link: "updateH5Link", - updateH5Links: "updateH5Links", - updateHostAgencyPolicy: "updateHostAgencyPolicy", - updateHumanRoomRobotConfig: "updateHumanRoomRobotConfig", - updateInviteActivityRewardConfig: "updateInviteActivityRewardConfig", - updateManager: "updateManager", - updateMenu: "updateMenu", - updateMenuVisible: "updateMenuVisible", - updatePermission: "updatePermission", - updatePlatform: "updatePlatform", - updatePolicyInstanceStatus: "updatePolicyInstanceStatus", - updatePopup: "updatePopup", - updatePrettyIdPool: "updatePrettyIdPool", - updateRechargeProduct: "updateRechargeProduct", - updateRedPacketConfig: "updateRedPacketConfig", - updateRegion: "updateRegion", - updateRegistrationRewardConfig: "updateRegistrationRewardConfig", - updateResource: "updateResource", - updateResourceGroup: "updateResourceGroup", - updateResourceGroupItems: "updateResourceGroupItems", - updateResourceIdentityAutoGrantConfig: "updateResourceIdentityAutoGrantConfig", - updateRiskConfig: "updateRiskConfig", - updateRole: "updateRole", - updateRoom: "updateRoom", - updateRoomConfig: "updateRoomConfig", - updateRoomRocketConfig: "updateRoomRocketConfig", - updateRoomRpsConfig: "updateRoomRpsConfig", - updateRoomTurnoverRewardConfig: "updateRoomTurnoverRewardConfig", - updateRoomWhitelistConfig: "updateRoomWhitelistConfig", - updateSevenDayCheckInConfig: "updateSevenDayCheckInConfig", - updateSplashScreen: "updateSplashScreen", - updateTaskDefinition: "updateTaskDefinition", - updateTeam: "updateTeam", - updateTeamSalaryPolicy: "updateTeamSalaryPolicy", - updateThirdPartyPaymentRate: "updateThirdPartyPaymentRate", - updateTier: "updateTier", - updateTrack: "updateTrack", - updateUser: "updateUser", - updateUserStatus: "updateUserStatus", - updateWeeklyStarCycle: "updateWeeklyStarCycle", - uploadFile: "uploadFile", - uploadImage: "uploadImage", - upsertLuckyGiftConfig: "upsertLuckyGiftConfig", - upsertResourceShopItems: "upsertResourceShopItems", - upsertRule: "upsertRule", - upsertWheelConfig: "upsertWheelConfig", - verifyFinanceCoinSellerRechargeOrder: "verifyFinanceCoinSellerRechargeOrder", - verifyFinanceCoinSellerRechargeReceipt: "verifyFinanceCoinSellerRechargeReceipt", + adjustDicePool: "adjustDicePool", + adminAddAgencyHost: "adminAddAgencyHost", + appAdjustUserLevels: "appAdjustUserLevels", + appBanUser: "appBanUser", + appExportUsers: "appExportUsers", + appGetUser: "appGetUser", + appListBannedUsers: "appListBannedUsers", + appListLoginLogs: "appListLoginLogs", + appListUserLoginLogs: "appListUserLoginLogs", + appListUsers: "appListUsers", + approveCoinSellerSubApplication: "approveCoinSellerSubApplication", + approveFinanceApplication: "approveFinanceApplication", + approveFinanceWithdrawalApplication: "approveFinanceWithdrawalApplication", + appSetPassword: "appSetPassword", + appUnbanUser: "appUnbanUser", + appUpdateUser: "appUpdateUser", + batchCreateGifts: "batchCreateGifts", + batchDeleteResources: "batchDeleteResources", + batchUpdateUserStatus: "batchUpdateUserStatus", + cancelJob: "cancelJob", + 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", + createFinanceApplication: "createFinanceApplication", + createFinanceCoinSellerRechargeOrder: "createFinanceCoinSellerRechargeOrder", + createFullServerNoticeFanout: "createFullServerNoticeFanout", + createGift: "createGift", + createH5Link: "createH5Link", + createHostAgencyPolicy: "createHostAgencyPolicy", + createManager: "createManager", + createMenu: "createMenu", + createPermission: "createPermission", + createPlatform: "createPlatform", + createPolicyInstance: "createPolicyInstance", + createPopup: "createPopup", + createPrettyIdPool: "createPrettyIdPool", + createRechargeProduct: "createRechargeProduct", + createRegion: "createRegion", + createResource: "createResource", + createResourceGroup: "createResourceGroup", + createRobotRoom: "createRobotRoom", + createRole: "createRole", + createRoomPin: "createRoomPin", + createSplashScreen: "createSplashScreen", + createTaskDefinition: "createTaskDefinition", + createTeam: "createTeam", + createTeamSalaryPolicy: "createTeamSalaryPolicy", + createTemporaryPaymentLink: "createTemporaryPaymentLink", + createTier: "createTier", + createUser: "createUser", + createWeeklyStarCycle: "createWeeklyStarCycle", + creditCoinSellerStock: "creditCoinSellerStock", + dashboardOverview: "dashboardOverview", + debitCoinSellerStock: "debitCoinSellerStock", + deleteAchievementDefinition: "deleteAchievementDefinition", + deleteAgency: "deleteAgency", + deleteAppVersion: "deleteAppVersion", + deleteBanner: "deleteBanner", + deleteBDLeader: "deleteBDLeader", + deleteCatalog: "deleteCatalog", + deleteCountry: "deleteCountry", + deleteDiceRobot: "deleteDiceRobot", + deleteExploreTab: "deleteExploreTab", + deleteGift: "deleteGift", + deleteH5Link: "deleteH5Link", + deleteHostAgencyPolicy: "deleteHostAgencyPolicy", + deleteMenu: "deleteMenu", + deletePermission: "deletePermission", + deletePopup: "deletePopup", + deleteRechargeProduct: "deleteRechargeProduct", + deleteResource: "deleteResource", + deleteRole: "deleteRole", + deleteRoom: "deleteRoom", + deleteSplashScreen: "deleteSplashScreen", + deleteTeamSalaryPolicy: "deleteTeamSalaryPolicy", + disableCountry: "disableCountry", + disableGift: "disableGift", + disableRegion: "disableRegion", + disableResource: "disableResource", + disableResourceGroup: "disableResourceGroup", + disableResourceShopItem: "disableResourceShopItem", + downloadJobArtifact: "downloadJobArtifact", + enableCountry: "enableCountry", + enableGift: "enableGift", + enableRegion: "enableRegion", + enableResource: "enableResource", + enableResourceGroup: "enableResourceGroup", + enableResourceShopItem: "enableResourceShopItem", + expireRoomRpsChallenge: "expireRoomRpsChallenge", + exportCoinSellerLedger: "exportCoinSellerLedger", + exportLoginLogs: "exportLoginLogs", + exportOperationLogs: "exportOperationLogs", + exportRechargeBills: "exportRechargeBills", + exportUsers: "exportUsers", + generateDiceRobots: "generateDiceRobots", + generatePrettyIds: "generatePrettyIds", + getCoinSellerSalaryRates: "getCoinSellerSalaryRates", + getCountry: "getCountry", + getCPConfig: "getCPConfig", + getCPWeeklyRankConfig: "getCPWeeklyRankConfig", + getCumulativeRechargeRewardConfig: "getCumulativeRechargeRewardConfig", + getFinanceScope: "getFinanceScope", + getFirstRechargeRewardConfig: "getFirstRechargeRewardConfig", + getHumanRoomRobotConfig: "getHumanRoomRobotConfig", + getInviteActivityRewardConfig: "getInviteActivityRewardConfig", + getJob: "getJob", + getLuckyGiftConfig: "getLuckyGiftConfig", + getLuckyGiftDrawSummary: "getLuckyGiftDrawSummary", + getRechargeBillOverview: "getRechargeBillOverview", + getRechargeBillSummary: "getRechargeBillSummary", + getRedPacket: "getRedPacket", + getRedPacketConfig: "getRedPacketConfig", + getRegion: "getRegion", + getRegistrationRewardConfig: "getRegistrationRewardConfig", + getResource: "getResource", + getResourceGroup: "getResourceGroup", + getResourceIdentityAutoGrantConfig: "getResourceIdentityAutoGrantConfig", + getRiskConfig: "getRiskConfig", + getRoleDataScopes: "getRoleDataScopes", + getRoomConfig: "getRoomConfig", + getRoomRocketConfig: "getRoomRocketConfig", + getRoomRpsChallenge: "getRoomRpsChallenge", + getRoomRpsConfig: "getRoomRpsConfig", + getRoomTurnoverRewardConfig: "getRoomTurnoverRewardConfig", + getRoomWhitelistConfig: "getRoomWhitelistConfig", + getSevenDayCheckInConfig: "getSevenDayCheckInConfig", + getSocialBiFunnel: "getSocialBiFunnel", + getSocialBiKpi: "getSocialBiKpi", + getSocialBiMaster: "getSocialBiMaster", + getSocialBiOverview: "getSocialBiOverview", + getSocialBiRequirements: "getSocialBiRequirements", + getTemporaryPaymentLink: "getTemporaryPaymentLink", + getUser: "getUser", + getVipConfig: "getVipConfig", + getVipProgram: "getVipProgram", + getWeeklyStarCycle: "getWeeklyStarCycle", + getWheelConfig: "getWheelConfig", + getWheelDrawSummary: "getWheelDrawSummary", + grantFinanceCoinSellerRechargeOrder: "grantFinanceCoinSellerRechargeOrder", + grantPrettyId: "grantPrettyId", + grantResource: "grantResource", + grantResourceGroup: "grantResourceGroup", + grantVip: "grantVip", + grantVipTrialCard: "grantVipTrialCard", + listAchievementDefinitions: "listAchievementDefinitions", + listAgencies: "listAgencies", + listApps: "listApps", + listAppVersions: "listAppVersions", + listAvailableRoomRobots: "listAvailableRoomRobots", + listBanners: "listBanners", + listBDLeaders: "listBDLeaders", + listBDs: "listBDs", + listCatalog: "listCatalog", + listCoinAdjustments: "listCoinAdjustments", + listCoinLedger: "listCoinLedger", + listCoinSellerLedger: "listCoinSellerLedger", + listCoinSellers: "listCoinSellers", + listCoinSellerSubApplications: "listCoinSellerSubApplications", + listCoinSellerSubSellers: "listCoinSellerSubSellers", + listCountries: "listCountries", + listCPApplications: "listCPApplications", + listCPRelationships: "listCPRelationships", + listCPWeeklyRankSettlements: "listCPWeeklyRankSettlements", + listCumulativeRechargeRewardGrants: "listCumulativeRechargeRewardGrants", + listDiceRobots: "listDiceRobots", + listEmojiPackCategories: "listEmojiPackCategories", + listEmojiPacks: "listEmojiPacks", + listExploreTabs: "listExploreTabs", + listFinanceApplications: "listFinanceApplications", + listFinanceCoinSellerRechargeOrders: "listFinanceCoinSellerRechargeOrders", + listFinanceWithdrawalApplications: "listFinanceWithdrawalApplications", + listFirstRechargeRewardClaims: "listFirstRechargeRewardClaims", + listGifts: "listGifts", + listGiftTypes: "listGiftTypes", + listH5Links: "listH5Links", + listHostAgencyPolicies: "listHostAgencyPolicies", + listHosts: "listHosts", + listHostSalarySettlements: "listHostSalarySettlements", + listHostWithdrawals: "listHostWithdrawals", + listInviteActivityRewardClaims: "listInviteActivityRewardClaims", + listJobs: "listJobs", + listLevelConfig: "listLevelConfig", + listLoginLogs: "listLoginLogs", + listLuckyGiftConfigs: "listLuckyGiftConfigs", + listLuckyGiftDraws: "listLuckyGiftDraws", + listManagers: "listManagers", + listMyFinanceApplications: "listMyFinanceApplications", + listOperationLogs: "listOperationLogs", + listPermissions: "listPermissions", + listPlatformGrantRecords: "listPlatformGrantRecords", + listPlatformGrantUsers: "listPlatformGrantUsers", + listPlatforms: "listPlatforms", + listPolicyInstances: "listPolicyInstances", + listPolicyTemplates: "listPolicyTemplates", + listPopups: "listPopups", + listPrettyIdPools: "listPrettyIdPools", + listPrettyIds: "listPrettyIds", + listRechargeApps: "listRechargeApps", + listRechargeBills: "listRechargeBills", + listRechargeProducts: "listRechargeProducts", + listRechargeRegions: "listRechargeRegions", + listRedPackets: "listRedPackets", + listRegionBlocks: "listRegionBlocks", + listRegions: "listRegions", + listRegistrationRewardClaims: "listRegistrationRewardClaims", + listReports: "listReports", + listResourceGrants: "listResourceGrants", + listResourceGroups: "listResourceGroups", + listResources: "listResources", + listResourceShopItems: "listResourceShopItems", + listResourceShopPurchaseOrders: "listResourceShopPurchaseOrders", + listRobotRooms: "listRobotRooms", + listRoles: "listRoles", + listRoomPins: "listRoomPins", + listRoomRpsChallenges: "listRoomRpsChallenges", + listRooms: "listRooms", + listRoomTurnoverRewardSettlements: "listRoomTurnoverRewardSettlements", + listSelfGames: "listSelfGames", + listSevenDayCheckInClaims: "listSevenDayCheckInClaims", + listSplashScreens: "listSplashScreens", + listSystemMenus: "listSystemMenus", + listTaskDefinitions: "listTaskDefinitions", + listTeams: "listTeams", + listTeamSalaryPolicies: "listTeamSalaryPolicies", + listTeamUsers: "listTeamUsers", + listTemporaryPaymentLinks: "listTemporaryPaymentLinks", + listThirdPartyPaymentChannels: "listThirdPartyPaymentChannels", + listUserFinanceScopes: "listUserFinanceScopes", + listUserLeaderboards: "listUserLeaderboards", + listUsers: "listUsers", + listWeeklyStarCycles: "listWeeklyStarCycles", + listWeeklyStarLeaderboard: "listWeeklyStarLeaderboard", + listWeeklyStarSettlements: "listWeeklyStarSettlements", + listWheelDraws: "listWheelDraws", + login: "login", + logout: "logout", + lookupCoinAdjustmentTarget: "lookupCoinAdjustmentTarget", + lookupResourceGrantTarget: "lookupResourceGrantTarget", + me: "me", + navigationMenus: "navigationMenus", + publishHostAgencyPolicy: "publishHostAgencyPolicy", + publishPolicyInstance: "publishPolicyInstance", + recyclePrettyId: "recyclePrettyId", + refresh: "refresh", + refreshGoogleRechargePaid: "refreshGoogleRechargePaid", + rejectCoinSellerSubApplication: "rejectCoinSellerSubApplication", + rejectFinanceApplication: "rejectFinanceApplication", + rejectFinanceWithdrawalApplication: "rejectFinanceWithdrawalApplication", + renameCountryCode: "renameCountryCode", + replaceCoinSellerSalaryRates: "replaceCoinSellerSalaryRates", + replaceRegionBlocks: "replaceRegionBlocks", + replaceRegionCountries: "replaceRegionCountries", + replaceRoleDataScopes: "replaceRoleDataScopes", + replaceRolePermissions: "replaceRolePermissions", + replaceUserFinanceScopes: "replaceUserFinanceScopes", + resetUserPassword: "resetUserPassword", + retryRedPacketRefund: "retryRedPacketRefund", + retryRoomRpsSettlement: "retryRoomRpsSettlement", + retryRoomTurnoverRewardSettlement: "retryRoomTurnoverRewardSettlement", + revokeResourceGrant: "revokeResourceGrant", + savePolicyTemplate: "savePolicyTemplate", + search: "search", + selfGameStatisticsOverview: "selfGameStatisticsOverview", + setAgencyJoinEnabled: "setAgencyJoinEnabled", + setAgencyStatus: "setAgencyStatus", + setBDLeaderStatus: "setBDLeaderStatus", + setBDStatus: "setBDStatus", + setCoinSellerStatus: "setCoinSellerStatus", + setDiceRobotStatus: "setDiceRobotStatus", + setGameStatus: "setGameStatus", + setPrettyIdStatus: "setPrettyIdStatus", + setTaskDefinitionStatus: "setTaskDefinitionStatus", + setThirdPartyPaymentMethodStatus: "setThirdPartyPaymentMethodStatus", + setWeeklyStarCycleStatus: "setWeeklyStarCycleStatus", + sortMenus: "sortMenus", + startRobotRoom: "startRobotRoom", + statisticsOverview: "statisticsOverview", + stopRobotRoom: "stopRobotRoom", + syncPermissions: "syncPermissions", + syncThirdPartyPaymentMethods: "syncThirdPartyPaymentMethods", + syncThirdPartyPaymentRates: "syncThirdPartyPaymentRates", + updateAchievementDefinition: "updateAchievementDefinition", + updateAppVersion: "updateAppVersion", + updateBanner: "updateBanner", + updateCatalog: "updateCatalog", + updateCountry: "updateCountry", + updateCPConfig: "updateCPConfig", + updateCPWeeklyRankConfig: "updateCPWeeklyRankConfig", + updateCumulativeRechargeRewardConfig: "updateCumulativeRechargeRewardConfig", + updateDiceConfig: "updateDiceConfig", + updateExploreTab: "updateExploreTab", + updateFirstRechargeRewardConfig: "updateFirstRechargeRewardConfig", + updateGift: "updateGift", + updateGiftType: "updateGiftType", + updateGiftTypes: "updateGiftTypes", + updateH5Link: "updateH5Link", + updateH5Links: "updateH5Links", + updateHostAgencyPolicy: "updateHostAgencyPolicy", + updateHumanRoomRobotConfig: "updateHumanRoomRobotConfig", + updateInviteActivityRewardConfig: "updateInviteActivityRewardConfig", + updateManager: "updateManager", + updateMenu: "updateMenu", + updateMenuVisible: "updateMenuVisible", + updatePermission: "updatePermission", + updatePlatform: "updatePlatform", + updatePolicyInstanceStatus: "updatePolicyInstanceStatus", + updatePopup: "updatePopup", + updatePrettyIdPool: "updatePrettyIdPool", + updateRechargeProduct: "updateRechargeProduct", + updateRedPacketConfig: "updateRedPacketConfig", + updateRegion: "updateRegion", + updateRegistrationRewardConfig: "updateRegistrationRewardConfig", + updateResource: "updateResource", + updateResourceGroup: "updateResourceGroup", + updateResourceGroupItems: "updateResourceGroupItems", + updateResourceIdentityAutoGrantConfig: "updateResourceIdentityAutoGrantConfig", + updateRiskConfig: "updateRiskConfig", + updateRole: "updateRole", + updateRoom: "updateRoom", + updateRoomConfig: "updateRoomConfig", + updateRoomRocketConfig: "updateRoomRocketConfig", + updateRoomRpsConfig: "updateRoomRpsConfig", + updateRoomTurnoverRewardConfig: "updateRoomTurnoverRewardConfig", + updateRoomWhitelistConfig: "updateRoomWhitelistConfig", + updateSevenDayCheckInConfig: "updateSevenDayCheckInConfig", + updateSplashScreen: "updateSplashScreen", + updateTaskDefinition: "updateTaskDefinition", + updateTeam: "updateTeam", + updateTeamSalaryPolicy: "updateTeamSalaryPolicy", + updateThirdPartyPaymentRate: "updateThirdPartyPaymentRate", + updateTier: "updateTier", + updateTrack: "updateTrack", + updateUser: "updateUser", + updateUserStatus: "updateUserStatus", + updateVipConfig: "updateVipConfig", + updateVipProgram: "updateVipProgram", + updateWeeklyStarCycle: "updateWeeklyStarCycle", + uploadFile: "uploadFile", + uploadImage: "uploadImage", + upsertLuckyGiftConfig: "upsertLuckyGiftConfig", + upsertResourceShopItems: "upsertResourceShopItems", + upsertRule: "upsertRule", + upsertWheelConfig: "upsertWheelConfig", + verifyFinanceCoinSellerRechargeOrder: "verifyFinanceCoinSellerRechargeOrder", + verifyFinanceCoinSellerRechargeReceipt: "verifyFinanceCoinSellerRechargeReceipt" } as const; export type ApiOperationId = (typeof API_OPERATIONS)[keyof typeof API_OPERATIONS]; export const API_ENDPOINTS: Record = { - adjustDicePool: { - method: "POST", - operationId: API_OPERATIONS.adjustDicePool, - path: "/v1/admin/game/self-games/{game_id}/pool/adjust", - permission: "game:update", - permissions: ["game:update"], - }, - adminAddAgencyHost: { - method: "POST", - operationId: API_OPERATIONS.adminAddAgencyHost, - path: "/v1/admin/agencies/{agency_id}/hosts", - permission: "agency:create", - permissions: ["agency:create"], - }, - 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"], - }, - approveCoinSellerSubApplication: { - method: "POST", - operationId: API_OPERATIONS.approveCoinSellerSubApplication, - path: "/v1/admin/coin-seller-sub-applications/{application_id}/approve", - permission: "coin-seller-sub-application:audit", - permissions: ["coin-seller-sub-application:audit"], - }, - approveFinanceApplication: { - method: "POST", - operationId: API_OPERATIONS.approveFinanceApplication, - path: "/v1/admin/finance/applications/{application_id}/approve", - permission: "finance-application:audit", - permissions: ["finance-application:audit"], - }, - approveFinanceWithdrawalApplication: { - method: "POST", - operationId: API_OPERATIONS.approveFinanceWithdrawalApplication, - path: "/v1/admin/finance/withdrawal-applications/{application_id}/approve", - permission: "finance-withdrawal:audit", - permissions: ["finance-withdrawal:audit", "finance-application:audit"], - }, - 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"], - }, - batchCreateGifts: { - method: "POST", - operationId: API_OPERATIONS.batchCreateGifts, - path: "/v1/admin/gifts/batch", - permission: "gift:create", - permissions: ["gift:create"], - }, - batchDeleteResources: { - method: "POST", - operationId: API_OPERATIONS.batchDeleteResources, - path: "/v1/admin/resources/batch-delete", - permission: "resource:delete", - permissions: ["resource:delete"], - }, - batchUpdateUserStatus: { - method: "POST", - operationId: API_OPERATIONS.batchUpdateUserStatus, - path: "/v1/users/batch/status", - permission: "user:status", - permissions: ["user:status"], - }, - cancelJob: { - method: "POST", - operationId: API_OPERATIONS.cancelJob, - path: "/v1/jobs/{id}/cancel", - permission: "job:cancel", - permissions: ["job:cancel"], - }, - 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"], - }, - createFinanceApplication: { - method: "POST", - operationId: API_OPERATIONS.createFinanceApplication, - path: "/v1/admin/finance/applications", - permission: "finance-application:create", - permissions: ["finance-application:create"], - }, - createFinanceCoinSellerRechargeOrder: { - method: "POST", - operationId: API_OPERATIONS.createFinanceCoinSellerRechargeOrder, - path: "/v1/admin/finance/orders/coin-seller-recharges", - permission: "finance-order:coin-seller-recharge:create", - permissions: ["finance-order:coin-seller-recharge:create"], - }, - createFullServerNoticeFanout: { - method: "POST", - operationId: API_OPERATIONS.createFullServerNoticeFanout, - path: "/v1/admin/operations/full-server-notices/fanout", - permission: "full-server-notice:send", - permissions: ["full-server-notice:send"], - }, - 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"], - }, - createHostAgencyPolicy: { - method: "POST", - operationId: API_OPERATIONS.createHostAgencyPolicy, - path: "/v1/admin/host-agency-policies", - permission: "host-agency-policy:create", - permissions: ["host-agency-policy:create"], - }, - createManager: { - method: "POST", - operationId: API_OPERATIONS.createManager, - path: "/v1/admin/managers", - permission: "bd:create", - permissions: ["bd: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"], - }, - createPolicyInstance: { - method: "POST", - operationId: API_OPERATIONS.createPolicyInstance, - path: "/v1/admin/policy-instances", - permission: "policy-instance:create", - permissions: ["policy-instance:create"], - }, - createPopup: { - method: "POST", - operationId: API_OPERATIONS.createPopup, - path: "/v1/admin/app-config/popups", - permission: "app-config:update", - permissions: ["app-config:update"], - }, - createPrettyIdPool: { - method: "POST", - operationId: API_OPERATIONS.createPrettyIdPool, - path: "/v1/admin/users/pretty-id-pools", - permission: "pretty-id:update", - permissions: ["pretty-id: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"], - }, - createRobotRoom: { - method: "POST", - operationId: API_OPERATIONS.createRobotRoom, - path: "/v1/admin/rooms/robot-rooms", - permission: "room-robot:create", - permissions: ["room-robot: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"], - }, - createSplashScreen: { - method: "POST", - operationId: API_OPERATIONS.createSplashScreen, - path: "/v1/admin/app-config/splash-screens", - permission: "app-config:update", - permissions: ["app-config:update"], - }, - createTaskDefinition: { - method: "POST", - operationId: API_OPERATIONS.createTaskDefinition, - path: "/v1/admin/activity/daily-tasks", - permission: "daily-task:create", - permissions: ["daily-task:create"], - }, - createTeam: { - method: "POST", - operationId: API_OPERATIONS.createTeam, - path: "/v1/teams", - permission: "team:create", - permissions: ["team:create"], - }, - createTeamSalaryPolicy: { - method: "POST", - operationId: API_OPERATIONS.createTeamSalaryPolicy, - path: "/v1/admin/team-salary-policies", - permission: "team-salary-policy:create", - permissions: ["team-salary-policy:create"], - }, - createTemporaryPaymentLink: { - method: "POST", - operationId: API_OPERATIONS.createTemporaryPaymentLink, - path: "/v1/admin/payment/temporary-links", - permission: "payment-temporary-link:create", - permissions: ["payment-temporary-link: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"], - }, - createWeeklyStarCycle: { - method: "POST", - operationId: API_OPERATIONS.createWeeklyStarCycle, - path: "/v1/admin/activity/weekly-star/cycles", - permission: "weekly-star:create", - permissions: ["weekly-star: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"], - }, - debitCoinSellerStock: { - method: "POST", - operationId: API_OPERATIONS.debitCoinSellerStock, - path: "/v1/admin/coin-sellers/{user_id}/stock-debits", - permission: "coin-seller:stock-credit", - permissions: ["coin-seller:stock-credit"], - }, - deleteAchievementDefinition: { - method: "DELETE", - operationId: API_OPERATIONS.deleteAchievementDefinition, - path: "/v1/admin/activity/achievements/{achievement_id}", - permission: "achievement:update", - permissions: ["achievement:update"], - }, - deleteAgency: { - method: "POST", - operationId: API_OPERATIONS.deleteAgency, - path: "/v1/admin/agencies/{agency_id}/delete", - permission: "agency:delete", - permissions: ["agency:delete"], - }, - 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"], - }, - deleteDiceRobot: { - method: "DELETE", - operationId: API_OPERATIONS.deleteDiceRobot, - path: "/v1/admin/game/robots/{user_id}", - permission: "game:delete", - permissions: ["game:delete"], - }, - deleteExploreTab: { - method: "DELETE", - operationId: API_OPERATIONS.deleteExploreTab, - path: "/v1/admin/app-config/explore-tabs/{tab_id}", - permission: "app-config:update", - permissions: ["app-config:update"], - }, - deleteGift: { - method: "DELETE", - operationId: API_OPERATIONS.deleteGift, - path: "/v1/admin/gifts/{gift_id}", - permission: "gift:delete", - permissions: ["gift:delete"], - }, - deleteH5Link: { - method: "DELETE", - operationId: API_OPERATIONS.deleteH5Link, - path: "/v1/admin/app-config/h5-links/{key}", - permission: "app-config:update", - permissions: ["app-config:update"], - }, - deleteHostAgencyPolicy: { - method: "DELETE", - operationId: API_OPERATIONS.deleteHostAgencyPolicy, - path: "/v1/admin/host-agency-policies/{policy_id}", - permission: "host-agency-policy:delete", - permissions: ["host-agency-policy:delete"], - }, - 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"], - }, - deletePopup: { - method: "DELETE", - operationId: API_OPERATIONS.deletePopup, - path: "/v1/admin/app-config/popups/{popup_id}", - permission: "app-config:update", - permissions: ["app-config:update"], - }, - deleteRechargeProduct: { - method: "DELETE", - operationId: API_OPERATIONS.deleteRechargeProduct, - path: "/v1/admin/payment/recharge-products/{product_id}", - permission: "payment-product:delete", - permissions: ["payment-product:delete"], - }, - deleteResource: { - method: "DELETE", - operationId: API_OPERATIONS.deleteResource, - path: "/v1/admin/resources/{resource_id}", - permission: "resource:delete", - permissions: ["resource: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"], - }, - deleteSplashScreen: { - method: "DELETE", - operationId: API_OPERATIONS.deleteSplashScreen, - path: "/v1/admin/app-config/splash-screens/{splash_id}", - permission: "app-config:update", - permissions: ["app-config:update"], - }, - deleteTeamSalaryPolicy: { - method: "DELETE", - operationId: API_OPERATIONS.deleteTeamSalaryPolicy, - path: "/v1/admin/team-salary-policies/{policy_id}", - permission: "team-salary-policy:delete", - permissions: ["team-salary-policy: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"], - }, - disableResourceShopItem: { - method: "POST", - operationId: API_OPERATIONS.disableResourceShopItem, - path: "/v1/admin/resource-shop/items/{shop_item_id}/disable", - permission: "resource-shop:update", - permissions: ["resource-shop: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"], - }, - enableResourceShopItem: { - method: "POST", - operationId: API_OPERATIONS.enableResourceShopItem, - path: "/v1/admin/resource-shop/items/{shop_item_id}/enable", - permission: "resource-shop:update", - permissions: ["resource-shop:update"], - }, - expireRoomRpsChallenge: { - method: "POST", - operationId: API_OPERATIONS.expireRoomRpsChallenge, - path: "/v1/admin/game/room-rps/challenges/{challenge_id}/expire", - permission: "game:update", - permissions: ["game:update"], - }, - exportCoinSellerLedger: { - method: "GET", - operationId: API_OPERATIONS.exportCoinSellerLedger, - path: "/v1/admin/operations/coin-seller-ledger/export", - permission: "coin-seller-ledger:view", - permissions: ["coin-seller-ledger:view"], - }, - 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"], - }, - exportRechargeBills: { - method: "GET", - operationId: API_OPERATIONS.exportRechargeBills, - path: "/v1/admin/payment/recharge-bills/export", - permission: "payment-bill:view", - permissions: ["payment-bill:view"], - }, - exportUsers: { - method: "GET", - operationId: API_OPERATIONS.exportUsers, - path: "/v1/users/export", - permission: "user:export", - permissions: ["user:export"], - }, - generateDiceRobots: { - method: "POST", - operationId: API_OPERATIONS.generateDiceRobots, - path: "/v1/admin/game/robots/generate", - permission: "game:create", - permissions: ["game:create"], - }, - generatePrettyIds: { - method: "POST", - operationId: API_OPERATIONS.generatePrettyIds, - path: "/v1/admin/users/pretty-id-pools/{pool_id}/generate", - permission: "pretty-id:generate", - permissions: ["pretty-id:generate"], - }, - getCoinSellerSalaryRates: { - method: "GET", - operationId: API_OPERATIONS.getCoinSellerSalaryRates, - path: "/v1/admin/coin-seller-salary-rates/{region_id}", - permission: "coin-seller:exchange-rate", - permissions: ["coin-seller:exchange-rate"], - }, - getCountry: { - method: "GET", - operationId: API_OPERATIONS.getCountry, - path: "/v1/admin/countries/{country_id}", - permission: "country:view", - permissions: ["country:view"], - }, - getCPConfig: { - method: "GET", - operationId: API_OPERATIONS.getCPConfig, - path: "/v1/admin/activity/cp/config", - permission: "cp-config:view", - permissions: ["cp-config:view"], - }, - getCPWeeklyRankConfig: { - method: "GET", - operationId: API_OPERATIONS.getCPWeeklyRankConfig, - path: "/v1/admin/activity/cp-weekly-rank/config", - permission: "cp-weekly-rank:view", - permissions: ["cp-weekly-rank:view"], - }, - getCumulativeRechargeRewardConfig: { - method: "GET", - operationId: API_OPERATIONS.getCumulativeRechargeRewardConfig, - path: "/v1/admin/activity/cumulative-recharge-reward/config", - permission: "cumulative-recharge-reward:view", - permissions: ["cumulative-recharge-reward:view"], - }, - getFinanceScope: { - method: "GET", - operationId: API_OPERATIONS.getFinanceScope, - path: "/v1/admin/finance/scope", - permission: "finance:view", - permissions: ["finance: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"], - }, - getHumanRoomRobotConfig: { - method: "GET", - operationId: API_OPERATIONS.getHumanRoomRobotConfig, - path: "/v1/admin/rooms/robot-rooms/human-config", - permission: "room-robot:view", - permissions: ["room-robot:view"], - }, - getInviteActivityRewardConfig: { - method: "GET", - operationId: API_OPERATIONS.getInviteActivityRewardConfig, - path: "/v1/admin/activity/invite-reward/config", - permission: "invite-activity-reward:view", - permissions: ["invite-activity-reward:view"], - }, - getJob: { - method: "GET", - operationId: API_OPERATIONS.getJob, - path: "/v1/jobs/{id}", - permission: "job:view", - permissions: ["job:view", "country:update"], - }, - getLuckyGiftConfig: { - method: "GET", - operationId: API_OPERATIONS.getLuckyGiftConfig, - path: "/v1/admin/activity/lucky-gifts/v2/config", - permission: "lucky-gift:view", - permissions: ["lucky-gift:view"], - }, - getLuckyGiftDrawSummary: { - method: "GET", - operationId: API_OPERATIONS.getLuckyGiftDrawSummary, - path: "/v1/admin/activity/lucky-gifts/v2/draw-summary", - permission: "lucky-gift:view", - permissions: ["lucky-gift:view"], - }, - getRechargeBillOverview: { - method: "GET", - operationId: API_OPERATIONS.getRechargeBillOverview, - path: "/v1/admin/payment/recharge-bills/overview", - permission: "payment-bill:view", - permissions: ["payment-bill:view"], - }, - getRechargeBillSummary: { - method: "GET", - operationId: API_OPERATIONS.getRechargeBillSummary, - path: "/v1/admin/payment/recharge-bills/summary", - permission: "payment-bill:view", - permissions: ["payment-bill: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"], - }, - getResourceIdentityAutoGrantConfig: { - method: "GET", - operationId: API_OPERATIONS.getResourceIdentityAutoGrantConfig, - path: "/v1/admin/resource-groups/identity-auto-grant-config", - permission: "resource-group:view", - permissions: ["resource-group:view"], - }, - getRiskConfig: { - method: "GET", - operationId: API_OPERATIONS.getRiskConfig, - path: "/v1/admin/users/risk-config", - permission: "risk-config:view", - permissions: ["risk-config: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"], - }, - getRoomRocketConfig: { - method: "GET", - operationId: API_OPERATIONS.getRoomRocketConfig, - path: "/v1/admin/activity/room-rocket/config", - permission: "room-rocket:view", - permissions: ["room-rocket:view"], - }, - getRoomRpsChallenge: { - method: "GET", - operationId: API_OPERATIONS.getRoomRpsChallenge, - path: "/v1/admin/game/room-rps/challenges/{challenge_id}", - permission: "game:view", - permissions: ["game:view"], - }, - getRoomRpsConfig: { - method: "GET", - operationId: API_OPERATIONS.getRoomRpsConfig, - path: "/v1/admin/game/room-rps/config", - permission: "game:view", - permissions: ["game:view"], - }, - getRoomTurnoverRewardConfig: { - method: "GET", - operationId: API_OPERATIONS.getRoomTurnoverRewardConfig, - path: "/v1/admin/activity/room-turnover-reward/config", - permission: "room-turnover-reward:view", - permissions: ["room-turnover-reward:view"], - }, - getRoomWhitelistConfig: { - method: "GET", - operationId: API_OPERATIONS.getRoomWhitelistConfig, - path: "/v1/admin/rooms/whitelist", - permission: "room-whitelist:view", - permissions: ["room-whitelist: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"], - }, - getSocialBiFunnel: { - method: "GET", - operationId: API_OPERATIONS.getSocialBiFunnel, - path: "/v1/admin/databi/social/funnel", - permission: "overview:view", - permissions: ["overview:view"], - }, - getSocialBiKpi: { - method: "GET", - operationId: API_OPERATIONS.getSocialBiKpi, - path: "/v1/admin/databi/social/kpi", - permission: "overview:view", - permissions: ["overview:view"], - }, - getSocialBiMaster: { - method: "GET", - operationId: API_OPERATIONS.getSocialBiMaster, - path: "/v1/admin/databi/social/master", - permission: "overview:view", - permissions: ["overview:view"], - }, - getSocialBiOverview: { - method: "GET", - operationId: API_OPERATIONS.getSocialBiOverview, - path: "/v1/admin/databi/social/overview", - permission: "overview:view", - permissions: ["overview:view"], - }, - getSocialBiRequirements: { - method: "GET", - operationId: API_OPERATIONS.getSocialBiRequirements, - path: "/v1/admin/databi/social/requirements", - permission: "overview:view", - permissions: ["overview:view"], - }, - getTemporaryPaymentLink: { - method: "GET", - operationId: API_OPERATIONS.getTemporaryPaymentLink, - path: "/v1/admin/payment/temporary-links/{order_id}", - permission: "payment-temporary-link:view", - permissions: ["payment-temporary-link:view"], - }, - getUser: { - method: "GET", - operationId: API_OPERATIONS.getUser, - path: "/v1/users/{id}", - permission: "user:view", - permissions: ["user:view"], - }, - getWeeklyStarCycle: { - method: "GET", - operationId: API_OPERATIONS.getWeeklyStarCycle, - path: "/v1/admin/activity/weekly-star/cycles/{cycle_id}", - permission: "weekly-star:view", - permissions: ["weekly-star:view"], - }, - getWheelConfig: { - method: "GET", - operationId: API_OPERATIONS.getWheelConfig, - path: "/v1/admin/activity/wheel/config", - permission: "wheel:view", - permissions: ["wheel:view"], - }, - getWheelDrawSummary: { - method: "GET", - operationId: API_OPERATIONS.getWheelDrawSummary, - path: "/v1/admin/activity/wheel/draw-summary", - permission: "wheel:view", - permissions: ["wheel:view"], - }, - grantFinanceCoinSellerRechargeOrder: { - method: "POST", - operationId: API_OPERATIONS.grantFinanceCoinSellerRechargeOrder, - path: "/v1/admin/finance/orders/coin-seller-recharges/{order_id}/grant", - permission: "finance-order:coin-seller-recharge:grant", - permissions: ["finance-order:coin-seller-recharge:grant"], - }, - grantPrettyId: { - method: "POST", - operationId: API_OPERATIONS.grantPrettyId, - path: "/v1/admin/users/pretty-ids/grant", - permission: "pretty-id:grant", - permissions: ["pretty-id:grant"], - }, - 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"], - }, - listAvailableRoomRobots: { - method: "GET", - operationId: API_OPERATIONS.listAvailableRoomRobots, - path: "/v1/admin/rooms/robot-rooms/available-robots", - permission: "room-robot:view", - permissions: ["room-robot: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"], - }, - listCoinSellerLedger: { - method: "GET", - operationId: API_OPERATIONS.listCoinSellerLedger, - path: "/v1/admin/operations/coin-seller-ledger", - permission: "coin-seller-ledger:view", - permissions: ["coin-seller-ledger:view"], - }, - listCoinSellers: { - method: "GET", - operationId: API_OPERATIONS.listCoinSellers, - path: "/v1/admin/coin-sellers", - permission: "coin-seller:view", - permissions: ["coin-seller:view"], - }, - listCoinSellerSubApplications: { - method: "GET", - operationId: API_OPERATIONS.listCoinSellerSubApplications, - path: "/v1/admin/coin-seller-sub-applications", - permission: "coin-seller-sub-application:view", - permissions: ["coin-seller-sub-application:view"], - }, - listCoinSellerSubSellers: { - method: "GET", - operationId: API_OPERATIONS.listCoinSellerSubSellers, - path: "/v1/admin/coin-sellers/{user_id}/sub-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"], - }, - listCPApplications: { - method: "GET", - operationId: API_OPERATIONS.listCPApplications, - path: "/v1/admin/activity/cp/applications", - permission: "cp-config:view", - permissions: ["cp-config:view"], - }, - listCPRelationships: { - method: "GET", - operationId: API_OPERATIONS.listCPRelationships, - path: "/v1/admin/activity/cp/relationships", - permission: "cp-config:view", - permissions: ["cp-config:view"], - }, - listCPWeeklyRankSettlements: { - method: "GET", - operationId: API_OPERATIONS.listCPWeeklyRankSettlements, - path: "/v1/admin/activity/cp-weekly-rank/settlements", - permission: "cp-weekly-rank:view", - permissions: ["cp-weekly-rank:view"], - }, - listCumulativeRechargeRewardGrants: { - method: "GET", - operationId: API_OPERATIONS.listCumulativeRechargeRewardGrants, - path: "/v1/admin/activity/cumulative-recharge-reward/grants", - permission: "cumulative-recharge-reward:view", - permissions: ["cumulative-recharge-reward:view"], - }, - listDiceRobots: { - method: "GET", - operationId: API_OPERATIONS.listDiceRobots, - path: "/v1/admin/game/robots", - permission: "game:view", - permissions: ["game: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"], - }, - listFinanceApplications: { - method: "GET", - operationId: API_OPERATIONS.listFinanceApplications, - path: "/v1/admin/finance/applications", - permission: "finance-application:audit", - permissions: ["finance-application:audit"], - }, - listFinanceCoinSellerRechargeOrders: { - method: "GET", - operationId: API_OPERATIONS.listFinanceCoinSellerRechargeOrders, - path: "/v1/admin/finance/orders/coin-seller-recharges", - permission: "finance-order:coin-seller-recharge:view", - permissions: ["finance-order:coin-seller-recharge:view"], - }, - listFinanceWithdrawalApplications: { - method: "GET", - operationId: API_OPERATIONS.listFinanceWithdrawalApplications, - path: "/v1/admin/finance/withdrawal-applications", - permission: "finance-withdrawal:view", - permissions: ["finance-withdrawal:view", "finance-withdrawal:audit", "finance-application:audit"], - }, - 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"], - }, - listHostAgencyPolicies: { - method: "GET", - operationId: API_OPERATIONS.listHostAgencyPolicies, - path: "/v1/admin/host-agency-policies", - permission: "host-agency-policy:view", - permissions: ["host-agency-policy:view"], - }, - listHosts: { - method: "GET", - operationId: API_OPERATIONS.listHosts, - path: "/v1/admin/hosts", - permission: "host:view", - permissions: ["host:view"], - }, - listHostSalarySettlements: { - method: "GET", - operationId: API_OPERATIONS.listHostSalarySettlements, - path: "/v1/admin/host-salary-settlements", - permission: "host-salary-settlement:view", - permissions: ["host-salary-settlement:view"], - }, - listHostWithdrawals: { - method: "GET", - operationId: API_OPERATIONS.listHostWithdrawals, - path: "/v1/admin/host-withdrawals", - permission: "host-withdrawal:view", - permissions: ["host-withdrawal:view"], - }, - listInviteActivityRewardClaims: { - method: "GET", - operationId: API_OPERATIONS.listInviteActivityRewardClaims, - path: "/v1/admin/activity/invite-reward/claims", - permission: "invite-activity-reward:view", - permissions: ["invite-activity-reward:view"], - }, - listJobs: { - method: "GET", - operationId: API_OPERATIONS.listJobs, - path: "/v1/jobs", - permission: "job:view", - permissions: ["job: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/v2/configs", - permission: "lucky-gift:view", - permissions: ["lucky-gift:view"], - }, - listLuckyGiftDraws: { - method: "GET", - operationId: API_OPERATIONS.listLuckyGiftDraws, - path: "/v1/admin/activity/lucky-gifts/v2/draws", - permission: "lucky-gift:view", - permissions: ["lucky-gift:view"], - }, - listManagers: { - method: "GET", - operationId: API_OPERATIONS.listManagers, - path: "/v1/admin/managers", - permission: "bd:view", - permissions: ["bd:view"], - }, - listMyFinanceApplications: { - method: "GET", - operationId: API_OPERATIONS.listMyFinanceApplications, - path: "/v1/admin/finance/applications/mine", - permission: "finance-application:create", - permissions: ["finance-application:create"], - }, - 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"], - }, - listPlatformGrantRecords: { - method: "GET", - operationId: API_OPERATIONS.listPlatformGrantRecords, - path: "/v1/statistics/platform-grants/records", - permission: "overview:view", - permissions: ["overview:view"], - }, - listPlatformGrantUsers: { - method: "GET", - operationId: API_OPERATIONS.listPlatformGrantUsers, - path: "/v1/statistics/platform-grants/users", - permission: "overview:view", - permissions: ["overview:view"], - }, - listPlatforms: { - method: "GET", - operationId: API_OPERATIONS.listPlatforms, - path: "/v1/admin/game/platforms", - permission: "game:view", - permissions: ["game:view"], - }, - listPolicyInstances: { - method: "GET", - operationId: API_OPERATIONS.listPolicyInstances, - path: "/v1/admin/policy-instances", - permission: "policy-template:view", - permissions: ["policy-template:view"], - }, - listPolicyTemplates: { - method: "GET", - operationId: API_OPERATIONS.listPolicyTemplates, - path: "/v1/admin/policy-templates", - permission: "policy-template:view", - permissions: ["policy-template:view"], - }, - listPopups: { - method: "GET", - operationId: API_OPERATIONS.listPopups, - path: "/v1/admin/app-config/popups", - permission: "app-config:view", - permissions: ["app-config:view"], - }, - listPrettyIdPools: { - method: "GET", - operationId: API_OPERATIONS.listPrettyIdPools, - path: "/v1/admin/users/pretty-id-pools", - permission: "pretty-id:view", - permissions: ["pretty-id:view"], - }, - listPrettyIds: { - method: "GET", - operationId: API_OPERATIONS.listPrettyIds, - path: "/v1/admin/users/pretty-ids", - permission: "pretty-id:view", - permissions: ["pretty-id:view"], - }, - listRechargeApps: { - method: "GET", - operationId: API_OPERATIONS.listRechargeApps, - path: "/v1/admin/payment/recharge-apps", - permission: "payment-bill:view", - permissions: ["payment-bill: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"], - }, - listRechargeRegions: { - method: "GET", - operationId: API_OPERATIONS.listRechargeRegions, - path: "/v1/admin/payment/recharge-regions", - permission: "payment-bill:view", - permissions: ["payment-bill: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"], - }, - listReports: { - method: "GET", - operationId: API_OPERATIONS.listReports, - path: "/v1/admin/operations/reports", - permission: "report:view", - permissions: ["report: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"], - }, - listResourceShopItems: { - method: "GET", - operationId: API_OPERATIONS.listResourceShopItems, - path: "/v1/admin/resource-shop/items", - permission: "resource-shop:view", - permissions: ["resource-shop:view"], - }, - listResourceShopPurchaseOrders: { - method: "GET", - operationId: API_OPERATIONS.listResourceShopPurchaseOrders, - path: "/v1/admin/resource-shop/purchase-orders", - permission: "resource-shop:view", - permissions: ["resource-shop:view"], - }, - listRobotRooms: { - method: "GET", - operationId: API_OPERATIONS.listRobotRooms, - path: "/v1/admin/rooms/robot-rooms", - permission: "room-robot:view", - permissions: ["room-robot: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"], - }, - listRoomRpsChallenges: { - method: "GET", - operationId: API_OPERATIONS.listRoomRpsChallenges, - path: "/v1/admin/game/room-rps/challenges", - permission: "game:view", - permissions: ["game:view"], - }, - listRooms: { - method: "GET", - operationId: API_OPERATIONS.listRooms, - path: "/v1/admin/rooms", - permission: "room:view", - permissions: ["room:view"], - }, - listRoomTurnoverRewardSettlements: { - method: "GET", - operationId: API_OPERATIONS.listRoomTurnoverRewardSettlements, - path: "/v1/admin/activity/room-turnover-reward/settlements", - permission: "room-turnover-reward:view", - permissions: ["room-turnover-reward:view"], - }, - listSelfGames: { - method: "GET", - operationId: API_OPERATIONS.listSelfGames, - path: "/v1/admin/game/self-games", - permission: "game:view", - permissions: ["game: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"], - }, - listSplashScreens: { - method: "GET", - operationId: API_OPERATIONS.listSplashScreens, - path: "/v1/admin/app-config/splash-screens", - permission: "app-config:view", - permissions: ["app-config: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"], - }, - listTeams: { - method: "GET", - operationId: API_OPERATIONS.listTeams, - path: "/v1/teams", - permission: "team:view", - permissions: ["team:view"], - }, - listTeamSalaryPolicies: { - method: "GET", - operationId: API_OPERATIONS.listTeamSalaryPolicies, - path: "/v1/admin/team-salary-policies", - permission: "team-salary-policy:view", - permissions: ["team-salary-policy:view"], - }, - listTeamUsers: { - method: "GET", - operationId: API_OPERATIONS.listTeamUsers, - path: "/v1/teams/{team_id}/users", - permission: "user:view", - permissions: ["user:view"], - }, - listTemporaryPaymentLinks: { - method: "GET", - operationId: API_OPERATIONS.listTemporaryPaymentLinks, - path: "/v1/admin/payment/temporary-links", - permission: "payment-temporary-link:view", - permissions: ["payment-temporary-link:view"], - }, - listThirdPartyPaymentChannels: { - method: "GET", - operationId: API_OPERATIONS.listThirdPartyPaymentChannels, - path: "/v1/admin/payment/third-party-channels", - permission: "payment-third-party:view", - permissions: ["payment-third-party:view"], - }, - listUserFinanceScopes: { - method: "GET", - operationId: API_OPERATIONS.listUserFinanceScopes, - path: "/v1/users/{id}/finance-scopes", - permission: "user:view", - permissions: ["user: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"], - }, - listWeeklyStarCycles: { - method: "GET", - operationId: API_OPERATIONS.listWeeklyStarCycles, - path: "/v1/admin/activity/weekly-star/cycles", - permission: "weekly-star:view", - permissions: ["weekly-star:view"], - }, - listWeeklyStarLeaderboard: { - method: "GET", - operationId: API_OPERATIONS.listWeeklyStarLeaderboard, - path: "/v1/admin/activity/weekly-star/cycles/{cycle_id}/leaderboard", - permission: "weekly-star:view", - permissions: ["weekly-star:view"], - }, - listWeeklyStarSettlements: { - method: "GET", - operationId: API_OPERATIONS.listWeeklyStarSettlements, - path: "/v1/admin/activity/weekly-star/cycles/{cycle_id}/settlements", - permission: "weekly-star:settle", - permissions: ["weekly-star:settle"], - }, - listWheelDraws: { - method: "GET", - operationId: API_OPERATIONS.listWheelDraws, - path: "/v1/admin/activity/wheel/draws", - permission: "wheel:view", - permissions: ["wheel: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"], - }, - lookupResourceGrantTarget: { - method: "GET", - operationId: API_OPERATIONS.lookupResourceGrantTarget, - path: "/v1/admin/resource-grants/target", - permission: "resource-grant:create", - permissions: ["resource-grant:create"], - }, - me: { - method: "GET", - operationId: API_OPERATIONS.me, - path: "/v1/auth/me", - }, - navigationMenus: { - method: "GET", - operationId: API_OPERATIONS.navigationMenus, - path: "/v1/navigation/menus", - }, - publishHostAgencyPolicy: { - method: "POST", - operationId: API_OPERATIONS.publishHostAgencyPolicy, - path: "/v1/admin/host-agency-policies/{policy_id}/publish", - permission: "host-agency-policy:publish", - permissions: ["host-agency-policy:publish"], - }, - publishPolicyInstance: { - method: "POST", - operationId: API_OPERATIONS.publishPolicyInstance, - path: "/v1/admin/policy-instances/{instance_id}/publish", - permission: "policy-instance:publish", - permissions: ["policy-instance:publish"], - }, - recyclePrettyId: { - method: "POST", - operationId: API_OPERATIONS.recyclePrettyId, - path: "/v1/admin/users/pretty-ids/{pretty_id}/recycle", - permission: "pretty-id:update", - permissions: ["pretty-id:update"], - }, - refresh: { - method: "POST", - operationId: API_OPERATIONS.refresh, - path: "/v1/auth/refresh", - }, - refreshGoogleRechargePaid: { - method: "POST", - operationId: API_OPERATIONS.refreshGoogleRechargePaid, - path: "/v1/admin/payment/recharge-bills/google-paid/refresh", - permission: "payment-bill:view", - permissions: ["payment-bill:view"], - }, - rejectCoinSellerSubApplication: { - method: "POST", - operationId: API_OPERATIONS.rejectCoinSellerSubApplication, - path: "/v1/admin/coin-seller-sub-applications/{application_id}/reject", - permission: "coin-seller-sub-application:audit", - permissions: ["coin-seller-sub-application:audit"], - }, - rejectFinanceApplication: { - method: "POST", - operationId: API_OPERATIONS.rejectFinanceApplication, - path: "/v1/admin/finance/applications/{application_id}/reject", - permission: "finance-application:audit", - permissions: ["finance-application:audit"], - }, - rejectFinanceWithdrawalApplication: { - method: "POST", - operationId: API_OPERATIONS.rejectFinanceWithdrawalApplication, - path: "/v1/admin/finance/withdrawal-applications/{application_id}/reject", - permission: "finance-withdrawal:audit", - permissions: ["finance-withdrawal:audit", "finance-application:audit"], - }, - renameCountryCode: { - method: "POST", - operationId: API_OPERATIONS.renameCountryCode, - path: "/v1/admin/countries/{country_id}/rename-code", - permission: "country:update", - permissions: ["country:update"], - }, - replaceCoinSellerSalaryRates: { - method: "PUT", - operationId: API_OPERATIONS.replaceCoinSellerSalaryRates, - path: "/v1/admin/coin-seller-salary-rates/{region_id}", - permission: "coin-seller:exchange-rate", - permissions: ["coin-seller:exchange-rate"], - }, - 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"], - }, - replaceUserFinanceScopes: { - method: "PUT", - operationId: API_OPERATIONS.replaceUserFinanceScopes, - path: "/v1/users/{id}/finance-scopes", - permission: "user:update", - permissions: ["user:update"], - }, - resetUserPassword: { - method: "POST", - operationId: API_OPERATIONS.resetUserPassword, - path: "/v1/users/{id}/reset-password", - permission: "user:reset-password", - permissions: ["user:reset-password"], - }, - retryRedPacketRefund: { - method: "POST", - operationId: API_OPERATIONS.retryRedPacketRefund, - path: "/v1/admin/activity/red-packets/refund/retry", - permission: "red-packet:update", - permissions: ["red-packet:update"], - }, - retryRoomRpsSettlement: { - method: "POST", - operationId: API_OPERATIONS.retryRoomRpsSettlement, - path: "/v1/admin/game/room-rps/challenges/{challenge_id}/retry-settlement", - permission: "game:update", - permissions: ["game:update"], - }, - retryRoomTurnoverRewardSettlement: { - method: "POST", - operationId: API_OPERATIONS.retryRoomTurnoverRewardSettlement, - path: "/v1/admin/activity/room-turnover-reward/settlements/{settlement_id}/retry", - permission: "room-turnover-reward:retry", - permissions: ["room-turnover-reward:retry"], - }, - revokeResourceGrant: { - method: "POST", - operationId: API_OPERATIONS.revokeResourceGrant, - path: "/v1/admin/resource-grants/{grant_id}/revoke", - permission: "resource-grant:revoke", - permissions: ["resource-grant:revoke"], - }, - savePolicyTemplate: { - method: "POST", - operationId: API_OPERATIONS.savePolicyTemplate, - path: "/v1/admin/policy-templates", - permission: "policy-template:create", - permissions: ["policy-template:create"], - }, - search: { - method: "GET", - operationId: API_OPERATIONS.search, - path: "/v1/search", - }, - selfGameStatisticsOverview: { - method: "GET", - operationId: API_OPERATIONS.selfGameStatisticsOverview, - path: "/v1/statistics/self-games/overview", - permission: "overview:view", - permissions: ["overview:view"], - }, - setAgencyJoinEnabled: { - method: "POST", - operationId: API_OPERATIONS.setAgencyJoinEnabled, - path: "/v1/admin/agencies/{agency_id}/join-enabled", - permission: "agency:status", - permissions: ["agency:status"], - }, - setAgencyStatus: { - method: "PATCH", - operationId: API_OPERATIONS.setAgencyStatus, - path: "/v1/admin/agencies/{agency_id}/status", - 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"], - }, - setDiceRobotStatus: { - method: "PATCH", - operationId: API_OPERATIONS.setDiceRobotStatus, - path: "/v1/admin/game/robots/{user_id}/status", - permission: "game:update", - permissions: ["game:update"], - }, - setGameStatus: { - method: "PATCH", - operationId: API_OPERATIONS.setGameStatus, - path: "/v1/admin/game/games/{game_id}/status", - permission: "game:status", - permissions: ["game:status"], - }, - setPrettyIdStatus: { - method: "POST", - operationId: API_OPERATIONS.setPrettyIdStatus, - path: "/v1/admin/users/pretty-ids/{pretty_id}/status", - permission: "pretty-id:update", - permissions: ["pretty-id:update"], - }, - setTaskDefinitionStatus: { - method: "POST", - operationId: API_OPERATIONS.setTaskDefinitionStatus, - path: "/v1/admin/activity/daily-tasks/{task_id}/status", - permission: "daily-task:status", - permissions: ["daily-task:status"], - }, - setThirdPartyPaymentMethodStatus: { - method: "PATCH", - operationId: API_OPERATIONS.setThirdPartyPaymentMethodStatus, - path: "/v1/admin/payment/third-party-methods/{method_id}/status", - permission: "payment-third-party:update", - permissions: ["payment-third-party:update"], - }, - setWeeklyStarCycleStatus: { - method: "PATCH", - operationId: API_OPERATIONS.setWeeklyStarCycleStatus, - path: "/v1/admin/activity/weekly-star/cycles/{cycle_id}/status", - permission: "weekly-star:update", - permissions: ["weekly-star:update"], - }, - sortMenus: { - method: "PUT", - operationId: API_OPERATIONS.sortMenus, - path: "/v1/system/menus/sort", - permission: "menu:sort", - permissions: ["menu:sort"], - }, - startRobotRoom: { - method: "POST", - operationId: API_OPERATIONS.startRobotRoom, - path: "/v1/admin/rooms/robot-rooms/{room_id}/start", - permission: "room-robot:update", - permissions: ["room-robot:update"], - }, - statisticsOverview: { - method: "GET", - operationId: API_OPERATIONS.statisticsOverview, - path: "/v1/statistics/overview", - permission: "overview:view", - permissions: ["overview:view"], - }, - stopRobotRoom: { - method: "POST", - operationId: API_OPERATIONS.stopRobotRoom, - path: "/v1/admin/rooms/robot-rooms/{room_id}/stop", - permission: "room-robot:update", - permissions: ["room-robot:update"], - }, - syncPermissions: { - method: "POST", - operationId: API_OPERATIONS.syncPermissions, - path: "/v1/permissions/sync", - permission: "permission:sync", - permissions: ["permission:sync"], - }, - syncThirdPartyPaymentMethods: { - method: "POST", - operationId: API_OPERATIONS.syncThirdPartyPaymentMethods, - path: "/v1/admin/payment/third-party-methods/sync", - permission: "payment-third-party:update", - permissions: ["payment-third-party:update"], - }, - syncThirdPartyPaymentRates: { - method: "POST", - operationId: API_OPERATIONS.syncThirdPartyPaymentRates, - path: "/v1/admin/payment/third-party-rates/sync", - permission: "payment-third-party:update", - permissions: ["payment-third-party:update"], - }, - 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"], - }, - updateCPConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateCPConfig, - path: "/v1/admin/activity/cp/config", - permission: "cp-config:update", - permissions: ["cp-config:update"], - }, - updateCPWeeklyRankConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateCPWeeklyRankConfig, - path: "/v1/admin/activity/cp-weekly-rank/config", - permission: "cp-weekly-rank:update", - permissions: ["cp-weekly-rank:update"], - }, - updateCumulativeRechargeRewardConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateCumulativeRechargeRewardConfig, - path: "/v1/admin/activity/cumulative-recharge-reward/config", - permission: "cumulative-recharge-reward:update", - permissions: ["cumulative-recharge-reward:update"], - }, - updateDiceConfig: { - method: "PATCH", - operationId: API_OPERATIONS.updateDiceConfig, - path: "/v1/admin/game/self-games/{game_id}/config", - permission: "game:update", - permissions: ["game: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"], - }, - updateGiftTypes: { - method: "PUT", - operationId: API_OPERATIONS.updateGiftTypes, - path: "/v1/admin/gift-types", - 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"], - }, - updateHostAgencyPolicy: { - method: "PUT", - operationId: API_OPERATIONS.updateHostAgencyPolicy, - path: "/v1/admin/host-agency-policies/{policy_id}", - permission: "host-agency-policy:update", - permissions: ["host-agency-policy:update"], - }, - updateHumanRoomRobotConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateHumanRoomRobotConfig, - path: "/v1/admin/rooms/robot-rooms/human-config", - permission: "room-robot:update", - permissions: ["room-robot:update"], - }, - updateInviteActivityRewardConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateInviteActivityRewardConfig, - path: "/v1/admin/activity/invite-reward/config", - permission: "invite-activity-reward:update", - permissions: ["invite-activity-reward:update"], - }, - updateManager: { - method: "PUT", - operationId: API_OPERATIONS.updateManager, - path: "/v1/admin/managers/{user_id}", - permission: "bd:update", - permissions: ["bd: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"], - }, - updatePolicyInstanceStatus: { - method: "PUT", - operationId: API_OPERATIONS.updatePolicyInstanceStatus, - path: "/v1/admin/policy-instances/{instance_id}/status", - permission: "policy-instance:update", - permissions: ["policy-instance:update"], - }, - updatePopup: { - method: "PUT", - operationId: API_OPERATIONS.updatePopup, - path: "/v1/admin/app-config/popups/{popup_id}", - permission: "app-config:update", - permissions: ["app-config:update"], - }, - updatePrettyIdPool: { - method: "PUT", - operationId: API_OPERATIONS.updatePrettyIdPool, - path: "/v1/admin/users/pretty-id-pools/{pool_id}", - permission: "pretty-id:update", - permissions: ["pretty-id: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"], - }, - updateResourceIdentityAutoGrantConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateResourceIdentityAutoGrantConfig, - path: "/v1/admin/resource-groups/identity-auto-grant-config", - permission: "resource-group:update", - permissions: ["resource-group:update"], - }, - updateRiskConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateRiskConfig, - path: "/v1/admin/users/risk-config", - permission: "risk-config:update", - permissions: ["risk-config: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"], - }, - updateRoomRocketConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateRoomRocketConfig, - path: "/v1/admin/activity/room-rocket/config", - permission: "room-rocket:update", - permissions: ["room-rocket:update"], - }, - updateRoomRpsConfig: { - method: "PATCH", - operationId: API_OPERATIONS.updateRoomRpsConfig, - path: "/v1/admin/game/room-rps/config", - permission: "game:update", - permissions: ["game:update"], - }, - updateRoomTurnoverRewardConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateRoomTurnoverRewardConfig, - path: "/v1/admin/activity/room-turnover-reward/config", - permission: "room-turnover-reward:update", - permissions: ["room-turnover-reward:update"], - }, - updateRoomWhitelistConfig: { - method: "PUT", - operationId: API_OPERATIONS.updateRoomWhitelistConfig, - path: "/v1/admin/rooms/whitelist", - permission: "room-whitelist:update", - permissions: ["room-whitelist: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"], - }, - updateSplashScreen: { - method: "PUT", - operationId: API_OPERATIONS.updateSplashScreen, - path: "/v1/admin/app-config/splash-screens/{splash_id}", - permission: "app-config:update", - permissions: ["app-config:update"], - }, - updateTaskDefinition: { - method: "PUT", - operationId: API_OPERATIONS.updateTaskDefinition, - path: "/v1/admin/activity/daily-tasks/{task_id}", - permission: "daily-task:update", - permissions: ["daily-task:update"], - }, - updateTeam: { - method: "PATCH", - operationId: API_OPERATIONS.updateTeam, - path: "/v1/teams/{team_id}", - permission: "team:update", - permissions: ["team:update"], - }, - updateTeamSalaryPolicy: { - method: "PUT", - operationId: API_OPERATIONS.updateTeamSalaryPolicy, - path: "/v1/admin/team-salary-policies/{policy_id}", - permission: "team-salary-policy:update", - permissions: ["team-salary-policy:update"], - }, - updateThirdPartyPaymentRate: { - method: "PATCH", - operationId: API_OPERATIONS.updateThirdPartyPaymentRate, - path: "/v1/admin/payment/third-party-rates/{method_id}", - permission: "payment-third-party:update", - permissions: ["payment-third-party: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"], - }, - updateWeeklyStarCycle: { - method: "PUT", - operationId: API_OPERATIONS.updateWeeklyStarCycle, - path: "/v1/admin/activity/weekly-star/cycles/{cycle_id}", - permission: "weekly-star:update", - permissions: ["weekly-star:update"], - }, - 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/v2/config", - permission: "lucky-gift:update", - permissions: ["lucky-gift:update"], - }, - upsertResourceShopItems: { - method: "POST", - operationId: API_OPERATIONS.upsertResourceShopItems, - path: "/v1/admin/resource-shop/items", - permission: "resource-shop:update", - permissions: ["resource-shop: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"], - }, - upsertWheelConfig: { - method: "PUT", - operationId: API_OPERATIONS.upsertWheelConfig, - path: "/v1/admin/activity/wheel/config", - permission: "wheel:update", - permissions: ["wheel:update"], - }, - verifyFinanceCoinSellerRechargeOrder: { - method: "POST", - operationId: API_OPERATIONS.verifyFinanceCoinSellerRechargeOrder, - path: "/v1/admin/finance/orders/coin-seller-recharges/{order_id}/verify", - permission: "finance-order:coin-seller-recharge:verify", - permissions: ["finance-order:coin-seller-recharge:verify"], - }, - verifyFinanceCoinSellerRechargeReceipt: { - method: "POST", - operationId: API_OPERATIONS.verifyFinanceCoinSellerRechargeReceipt, - path: "/v1/admin/finance/orders/coin-seller-recharges/receipt-verifications", - permission: "finance-order:coin-seller-recharge:verify", - permissions: ["finance-order:coin-seller-recharge:verify"], - }, + adjustDicePool: { + method: "POST", + operationId: API_OPERATIONS.adjustDicePool, + path: "/v1/admin/game/self-games/{game_id}/pool/adjust", + permission: "game:update", + permissions: ["game:update"] + }, + adminAddAgencyHost: { + method: "POST", + operationId: API_OPERATIONS.adminAddAgencyHost, + path: "/v1/admin/agencies/{agency_id}/hosts", + permission: "agency:create", + permissions: ["agency:create"] + }, + appAdjustUserLevels: { + method: "PUT", + operationId: API_OPERATIONS.appAdjustUserLevels, + path: "/v1/app/users/{id}/levels", + permission: "app-user:level", + permissions: ["app-user:level"] + }, + appBanUser: { + method: "POST", + operationId: API_OPERATIONS.appBanUser, + path: "/v1/app/users/{id}/ban", + permission: "app-user:status", + permissions: ["app-user:status"] + }, + appExportUsers: { + method: "POST", + operationId: API_OPERATIONS.appExportUsers, + path: "/v1/exports/app-users", + permission: "app-user:export", + permissions: ["app-user:export"] + }, + 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"] + }, + approveCoinSellerSubApplication: { + method: "POST", + operationId: API_OPERATIONS.approveCoinSellerSubApplication, + path: "/v1/admin/coin-seller-sub-applications/{application_id}/approve", + permission: "coin-seller-sub-application:audit", + permissions: ["coin-seller-sub-application:audit"] + }, + approveFinanceApplication: { + method: "POST", + operationId: API_OPERATIONS.approveFinanceApplication, + path: "/v1/admin/finance/applications/{application_id}/approve", + permission: "finance-application:audit", + permissions: ["finance-application:audit"] + }, + approveFinanceWithdrawalApplication: { + method: "POST", + operationId: API_OPERATIONS.approveFinanceWithdrawalApplication, + path: "/v1/admin/finance/withdrawal-applications/{application_id}/approve", + permission: "finance-withdrawal:audit", + permissions: ["finance-withdrawal:audit","finance-application:audit"] + }, + 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"] + }, + batchCreateGifts: { + method: "POST", + operationId: API_OPERATIONS.batchCreateGifts, + path: "/v1/admin/gifts/batch", + permission: "gift:create", + permissions: ["gift:create"] + }, + batchDeleteResources: { + method: "POST", + operationId: API_OPERATIONS.batchDeleteResources, + path: "/v1/admin/resources/batch-delete", + permission: "resource:delete", + permissions: ["resource:delete"] + }, + batchUpdateUserStatus: { + method: "POST", + operationId: API_OPERATIONS.batchUpdateUserStatus, + path: "/v1/users/batch/status", + permission: "user:status", + permissions: ["user:status"] + }, + cancelJob: { + method: "POST", + operationId: API_OPERATIONS.cancelJob, + path: "/v1/jobs/{id}/cancel", + permission: "job:cancel", + permissions: ["job:cancel"] + }, + 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"] + }, + createFinanceApplication: { + method: "POST", + operationId: API_OPERATIONS.createFinanceApplication, + path: "/v1/admin/finance/applications", + permission: "finance-application:create", + permissions: ["finance-application:create"] + }, + createFinanceCoinSellerRechargeOrder: { + method: "POST", + operationId: API_OPERATIONS.createFinanceCoinSellerRechargeOrder, + path: "/v1/admin/finance/orders/coin-seller-recharges", + permission: "finance-order:coin-seller-recharge:create", + permissions: ["finance-order:coin-seller-recharge:create"] + }, + createFullServerNoticeFanout: { + method: "POST", + operationId: API_OPERATIONS.createFullServerNoticeFanout, + path: "/v1/admin/operations/full-server-notices/fanout", + permission: "full-server-notice:send", + permissions: ["full-server-notice:send"] + }, + 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"] + }, + createHostAgencyPolicy: { + method: "POST", + operationId: API_OPERATIONS.createHostAgencyPolicy, + path: "/v1/admin/host-agency-policies", + permission: "host-agency-policy:create", + permissions: ["host-agency-policy:create"] + }, + createManager: { + method: "POST", + operationId: API_OPERATIONS.createManager, + path: "/v1/admin/managers", + permission: "bd:create", + permissions: ["bd: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"] + }, + createPolicyInstance: { + method: "POST", + operationId: API_OPERATIONS.createPolicyInstance, + path: "/v1/admin/policy-instances", + permission: "policy-instance:create", + permissions: ["policy-instance:create"] + }, + createPopup: { + method: "POST", + operationId: API_OPERATIONS.createPopup, + path: "/v1/admin/app-config/popups", + permission: "app-config:update", + permissions: ["app-config:update"] + }, + createPrettyIdPool: { + method: "POST", + operationId: API_OPERATIONS.createPrettyIdPool, + path: "/v1/admin/users/pretty-id-pools", + permission: "pretty-id:update", + permissions: ["pretty-id: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"] + }, + createRobotRoom: { + method: "POST", + operationId: API_OPERATIONS.createRobotRoom, + path: "/v1/admin/rooms/robot-rooms", + permission: "room-robot:create", + permissions: ["room-robot: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"] + }, + createSplashScreen: { + method: "POST", + operationId: API_OPERATIONS.createSplashScreen, + path: "/v1/admin/app-config/splash-screens", + permission: "app-config:update", + permissions: ["app-config:update"] + }, + createTaskDefinition: { + method: "POST", + operationId: API_OPERATIONS.createTaskDefinition, + path: "/v1/admin/activity/daily-tasks", + permission: "daily-task:create", + permissions: ["daily-task:create"] + }, + createTeam: { + method: "POST", + operationId: API_OPERATIONS.createTeam, + path: "/v1/teams", + permission: "team:create", + permissions: ["team:create"] + }, + createTeamSalaryPolicy: { + method: "POST", + operationId: API_OPERATIONS.createTeamSalaryPolicy, + path: "/v1/admin/team-salary-policies", + permission: "team-salary-policy:create", + permissions: ["team-salary-policy:create"] + }, + createTemporaryPaymentLink: { + method: "POST", + operationId: API_OPERATIONS.createTemporaryPaymentLink, + path: "/v1/admin/payment/temporary-links", + permission: "payment-temporary-link:create", + permissions: ["payment-temporary-link: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"] + }, + createWeeklyStarCycle: { + method: "POST", + operationId: API_OPERATIONS.createWeeklyStarCycle, + path: "/v1/admin/activity/weekly-star/cycles", + permission: "weekly-star:create", + permissions: ["weekly-star: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"] + }, + debitCoinSellerStock: { + method: "POST", + operationId: API_OPERATIONS.debitCoinSellerStock, + path: "/v1/admin/coin-sellers/{user_id}/stock-debits", + permission: "coin-seller:stock-credit", + permissions: ["coin-seller:stock-credit"] + }, + deleteAchievementDefinition: { + method: "DELETE", + operationId: API_OPERATIONS.deleteAchievementDefinition, + path: "/v1/admin/activity/achievements/{achievement_id}", + permission: "achievement:update", + permissions: ["achievement:update"] + }, + deleteAgency: { + method: "POST", + operationId: API_OPERATIONS.deleteAgency, + path: "/v1/admin/agencies/{agency_id}/delete", + permission: "agency:delete", + permissions: ["agency:delete"] + }, + 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"] + }, + deleteDiceRobot: { + method: "DELETE", + operationId: API_OPERATIONS.deleteDiceRobot, + path: "/v1/admin/game/robots/{user_id}", + permission: "game:delete", + permissions: ["game:delete"] + }, + deleteExploreTab: { + method: "DELETE", + operationId: API_OPERATIONS.deleteExploreTab, + path: "/v1/admin/app-config/explore-tabs/{tab_id}", + permission: "app-config:update", + permissions: ["app-config:update"] + }, + deleteGift: { + method: "DELETE", + operationId: API_OPERATIONS.deleteGift, + path: "/v1/admin/gifts/{gift_id}", + permission: "gift:delete", + permissions: ["gift:delete"] + }, + deleteH5Link: { + method: "DELETE", + operationId: API_OPERATIONS.deleteH5Link, + path: "/v1/admin/app-config/h5-links/{key}", + permission: "app-config:update", + permissions: ["app-config:update"] + }, + deleteHostAgencyPolicy: { + method: "DELETE", + operationId: API_OPERATIONS.deleteHostAgencyPolicy, + path: "/v1/admin/host-agency-policies/{policy_id}", + permission: "host-agency-policy:delete", + permissions: ["host-agency-policy:delete"] + }, + 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"] + }, + deletePopup: { + method: "DELETE", + operationId: API_OPERATIONS.deletePopup, + path: "/v1/admin/app-config/popups/{popup_id}", + permission: "app-config:update", + permissions: ["app-config:update"] + }, + deleteRechargeProduct: { + method: "DELETE", + operationId: API_OPERATIONS.deleteRechargeProduct, + path: "/v1/admin/payment/recharge-products/{product_id}", + permission: "payment-product:delete", + permissions: ["payment-product:delete"] + }, + deleteResource: { + method: "DELETE", + operationId: API_OPERATIONS.deleteResource, + path: "/v1/admin/resources/{resource_id}", + permission: "resource:delete", + permissions: ["resource: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"] + }, + deleteSplashScreen: { + method: "DELETE", + operationId: API_OPERATIONS.deleteSplashScreen, + path: "/v1/admin/app-config/splash-screens/{splash_id}", + permission: "app-config:update", + permissions: ["app-config:update"] + }, + deleteTeamSalaryPolicy: { + method: "DELETE", + operationId: API_OPERATIONS.deleteTeamSalaryPolicy, + path: "/v1/admin/team-salary-policies/{policy_id}", + permission: "team-salary-policy:delete", + permissions: ["team-salary-policy: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"] + }, + disableResourceShopItem: { + method: "POST", + operationId: API_OPERATIONS.disableResourceShopItem, + path: "/v1/admin/resource-shop/items/{shop_item_id}/disable", + permission: "resource-shop:update", + permissions: ["resource-shop:update"] + }, + downloadJobArtifact: { + method: "GET", + operationId: API_OPERATIONS.downloadJobArtifact, + path: "/v1/jobs/{id}/artifact", + permission: "job:view", + permissions: ["job:view","app-user:export"] + }, + 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"] + }, + enableResourceShopItem: { + method: "POST", + operationId: API_OPERATIONS.enableResourceShopItem, + path: "/v1/admin/resource-shop/items/{shop_item_id}/enable", + permission: "resource-shop:update", + permissions: ["resource-shop:update"] + }, + expireRoomRpsChallenge: { + method: "POST", + operationId: API_OPERATIONS.expireRoomRpsChallenge, + path: "/v1/admin/game/room-rps/challenges/{challenge_id}/expire", + permission: "game:update", + permissions: ["game:update"] + }, + exportCoinSellerLedger: { + method: "GET", + operationId: API_OPERATIONS.exportCoinSellerLedger, + path: "/v1/admin/operations/coin-seller-ledger/export", + permission: "coin-seller-ledger:view", + permissions: ["coin-seller-ledger:view"] + }, + 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"] + }, + exportRechargeBills: { + method: "GET", + operationId: API_OPERATIONS.exportRechargeBills, + path: "/v1/admin/payment/recharge-bills/export", + permission: "payment-bill:view", + permissions: ["payment-bill:view"] + }, + exportUsers: { + method: "GET", + operationId: API_OPERATIONS.exportUsers, + path: "/v1/users/export", + permission: "user:export", + permissions: ["user:export"] + }, + generateDiceRobots: { + method: "POST", + operationId: API_OPERATIONS.generateDiceRobots, + path: "/v1/admin/game/robots/generate", + permission: "game:create", + permissions: ["game:create"] + }, + generatePrettyIds: { + method: "POST", + operationId: API_OPERATIONS.generatePrettyIds, + path: "/v1/admin/users/pretty-id-pools/{pool_id}/generate", + permission: "pretty-id:generate", + permissions: ["pretty-id:generate"] + }, + getCoinSellerSalaryRates: { + method: "GET", + operationId: API_OPERATIONS.getCoinSellerSalaryRates, + path: "/v1/admin/coin-seller-salary-rates/{region_id}", + permission: "coin-seller:exchange-rate", + permissions: ["coin-seller:exchange-rate"] + }, + getCountry: { + method: "GET", + operationId: API_OPERATIONS.getCountry, + path: "/v1/admin/countries/{country_id}", + permission: "country:view", + permissions: ["country:view"] + }, + getCPConfig: { + method: "GET", + operationId: API_OPERATIONS.getCPConfig, + path: "/v1/admin/activity/cp/config", + permission: "cp-config:view", + permissions: ["cp-config:view"] + }, + getCPWeeklyRankConfig: { + method: "GET", + operationId: API_OPERATIONS.getCPWeeklyRankConfig, + path: "/v1/admin/activity/cp-weekly-rank/config", + permission: "cp-weekly-rank:view", + permissions: ["cp-weekly-rank:view"] + }, + getCumulativeRechargeRewardConfig: { + method: "GET", + operationId: API_OPERATIONS.getCumulativeRechargeRewardConfig, + path: "/v1/admin/activity/cumulative-recharge-reward/config", + permission: "cumulative-recharge-reward:view", + permissions: ["cumulative-recharge-reward:view"] + }, + getFinanceScope: { + method: "GET", + operationId: API_OPERATIONS.getFinanceScope, + path: "/v1/admin/finance/scope", + permission: "finance:view", + permissions: ["finance: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"] + }, + getHumanRoomRobotConfig: { + method: "GET", + operationId: API_OPERATIONS.getHumanRoomRobotConfig, + path: "/v1/admin/rooms/robot-rooms/human-config", + permission: "room-robot:view", + permissions: ["room-robot:view"] + }, + getInviteActivityRewardConfig: { + method: "GET", + operationId: API_OPERATIONS.getInviteActivityRewardConfig, + path: "/v1/admin/activity/invite-reward/config", + permission: "invite-activity-reward:view", + permissions: ["invite-activity-reward:view"] + }, + getJob: { + method: "GET", + operationId: API_OPERATIONS.getJob, + path: "/v1/jobs/{id}", + permission: "job:view", + permissions: ["job:view","country:update","app-user:export"] + }, + getLuckyGiftConfig: { + method: "GET", + operationId: API_OPERATIONS.getLuckyGiftConfig, + path: "/v1/admin/activity/lucky-gifts/v2/config", + permission: "lucky-gift:view", + permissions: ["lucky-gift:view"] + }, + getLuckyGiftDrawSummary: { + method: "GET", + operationId: API_OPERATIONS.getLuckyGiftDrawSummary, + path: "/v1/admin/activity/lucky-gifts/v2/draw-summary", + permission: "lucky-gift:view", + permissions: ["lucky-gift:view"] + }, + getRechargeBillOverview: { + method: "GET", + operationId: API_OPERATIONS.getRechargeBillOverview, + path: "/v1/admin/payment/recharge-bills/overview", + permission: "payment-bill:view", + permissions: ["payment-bill:view"] + }, + getRechargeBillSummary: { + method: "GET", + operationId: API_OPERATIONS.getRechargeBillSummary, + path: "/v1/admin/payment/recharge-bills/summary", + permission: "payment-bill:view", + permissions: ["payment-bill: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"] + }, + getResourceIdentityAutoGrantConfig: { + method: "GET", + operationId: API_OPERATIONS.getResourceIdentityAutoGrantConfig, + path: "/v1/admin/resource-groups/identity-auto-grant-config", + permission: "resource-group:view", + permissions: ["resource-group:view"] + }, + getRiskConfig: { + method: "GET", + operationId: API_OPERATIONS.getRiskConfig, + path: "/v1/admin/users/risk-config", + permission: "risk-config:view", + permissions: ["risk-config: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"] + }, + getRoomRocketConfig: { + method: "GET", + operationId: API_OPERATIONS.getRoomRocketConfig, + path: "/v1/admin/activity/room-rocket/config", + permission: "room-rocket:view", + permissions: ["room-rocket:view"] + }, + getRoomRpsChallenge: { + method: "GET", + operationId: API_OPERATIONS.getRoomRpsChallenge, + path: "/v1/admin/game/room-rps/challenges/{challenge_id}", + permission: "game:view", + permissions: ["game:view"] + }, + getRoomRpsConfig: { + method: "GET", + operationId: API_OPERATIONS.getRoomRpsConfig, + path: "/v1/admin/game/room-rps/config", + permission: "game:view", + permissions: ["game:view"] + }, + getRoomTurnoverRewardConfig: { + method: "GET", + operationId: API_OPERATIONS.getRoomTurnoverRewardConfig, + path: "/v1/admin/activity/room-turnover-reward/config", + permission: "room-turnover-reward:view", + permissions: ["room-turnover-reward:view"] + }, + getRoomWhitelistConfig: { + method: "GET", + operationId: API_OPERATIONS.getRoomWhitelistConfig, + path: "/v1/admin/rooms/whitelist", + permission: "room-whitelist:view", + permissions: ["room-whitelist: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"] + }, + getSocialBiFunnel: { + method: "GET", + operationId: API_OPERATIONS.getSocialBiFunnel, + path: "/v1/admin/databi/social/funnel", + permission: "overview:view", + permissions: ["overview:view"] + }, + getSocialBiKpi: { + method: "GET", + operationId: API_OPERATIONS.getSocialBiKpi, + path: "/v1/admin/databi/social/kpi", + permission: "overview:view", + permissions: ["overview:view"] + }, + getSocialBiMaster: { + method: "GET", + operationId: API_OPERATIONS.getSocialBiMaster, + path: "/v1/admin/databi/social/master", + permission: "overview:view", + permissions: ["overview:view"] + }, + getSocialBiOverview: { + method: "GET", + operationId: API_OPERATIONS.getSocialBiOverview, + path: "/v1/admin/databi/social/overview", + permission: "overview:view", + permissions: ["overview:view"] + }, + getSocialBiRequirements: { + method: "GET", + operationId: API_OPERATIONS.getSocialBiRequirements, + path: "/v1/admin/databi/social/requirements", + permission: "overview:view", + permissions: ["overview:view"] + }, + getTemporaryPaymentLink: { + method: "GET", + operationId: API_OPERATIONS.getTemporaryPaymentLink, + path: "/v1/admin/payment/temporary-links/{order_id}", + permission: "payment-temporary-link:view", + permissions: ["payment-temporary-link:view"] + }, + getUser: { + method: "GET", + operationId: API_OPERATIONS.getUser, + path: "/v1/users/{id}", + permission: "user:view", + permissions: ["user:view"] + }, + getVipConfig: { + method: "GET", + operationId: API_OPERATIONS.getVipConfig, + path: "/v1/admin/activity/vip-levels", + permission: "vip-config:view", + permissions: ["vip-config:view"] + }, + getVipProgram: { + method: "GET", + operationId: API_OPERATIONS.getVipProgram, + path: "/v1/admin/activity/vip-program", + permission: "vip-config:view", + permissions: ["vip-config:view"] + }, + getWeeklyStarCycle: { + method: "GET", + operationId: API_OPERATIONS.getWeeklyStarCycle, + path: "/v1/admin/activity/weekly-star/cycles/{cycle_id}", + permission: "weekly-star:view", + permissions: ["weekly-star:view"] + }, + getWheelConfig: { + method: "GET", + operationId: API_OPERATIONS.getWheelConfig, + path: "/v1/admin/activity/wheel/config", + permission: "wheel:view", + permissions: ["wheel:view"] + }, + getWheelDrawSummary: { + method: "GET", + operationId: API_OPERATIONS.getWheelDrawSummary, + path: "/v1/admin/activity/wheel/draw-summary", + permission: "wheel:view", + permissions: ["wheel:view"] + }, + grantFinanceCoinSellerRechargeOrder: { + method: "POST", + operationId: API_OPERATIONS.grantFinanceCoinSellerRechargeOrder, + path: "/v1/admin/finance/orders/coin-seller-recharges/{order_id}/grant", + permission: "finance-order:coin-seller-recharge:grant", + permissions: ["finance-order:coin-seller-recharge:grant"] + }, + grantPrettyId: { + method: "POST", + operationId: API_OPERATIONS.grantPrettyId, + path: "/v1/admin/users/pretty-ids/grant", + permission: "pretty-id:grant", + permissions: ["pretty-id:grant"] + }, + 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"] + }, + grantVip: { + method: "POST", + operationId: API_OPERATIONS.grantVip, + path: "/v1/admin/activity/vip-grants", + permission: "vip-config:grant", + permissions: ["vip-config:grant"] + }, + grantVipTrialCard: { + method: "POST", + operationId: API_OPERATIONS.grantVipTrialCard, + path: "/v1/admin/activity/vip-trial-card-grants", + permission: "vip-config:grant", + permissions: ["vip-config:grant"] + }, + 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"] + }, + listAvailableRoomRobots: { + method: "GET", + operationId: API_OPERATIONS.listAvailableRoomRobots, + path: "/v1/admin/rooms/robot-rooms/available-robots", + permission: "room-robot:view", + permissions: ["room-robot: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"] + }, + listCoinSellerLedger: { + method: "GET", + operationId: API_OPERATIONS.listCoinSellerLedger, + path: "/v1/admin/operations/coin-seller-ledger", + permission: "coin-seller-ledger:view", + permissions: ["coin-seller-ledger:view"] + }, + listCoinSellers: { + method: "GET", + operationId: API_OPERATIONS.listCoinSellers, + path: "/v1/admin/coin-sellers", + permission: "coin-seller:view", + permissions: ["coin-seller:view"] + }, + listCoinSellerSubApplications: { + method: "GET", + operationId: API_OPERATIONS.listCoinSellerSubApplications, + path: "/v1/admin/coin-seller-sub-applications", + permission: "coin-seller-sub-application:view", + permissions: ["coin-seller-sub-application:view"] + }, + listCoinSellerSubSellers: { + method: "GET", + operationId: API_OPERATIONS.listCoinSellerSubSellers, + path: "/v1/admin/coin-sellers/{user_id}/sub-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"] + }, + listCPApplications: { + method: "GET", + operationId: API_OPERATIONS.listCPApplications, + path: "/v1/admin/activity/cp/applications", + permission: "cp-config:view", + permissions: ["cp-config:view"] + }, + listCPRelationships: { + method: "GET", + operationId: API_OPERATIONS.listCPRelationships, + path: "/v1/admin/activity/cp/relationships", + permission: "cp-config:view", + permissions: ["cp-config:view"] + }, + listCPWeeklyRankSettlements: { + method: "GET", + operationId: API_OPERATIONS.listCPWeeklyRankSettlements, + path: "/v1/admin/activity/cp-weekly-rank/settlements", + permission: "cp-weekly-rank:view", + permissions: ["cp-weekly-rank:view"] + }, + listCumulativeRechargeRewardGrants: { + method: "GET", + operationId: API_OPERATIONS.listCumulativeRechargeRewardGrants, + path: "/v1/admin/activity/cumulative-recharge-reward/grants", + permission: "cumulative-recharge-reward:view", + permissions: ["cumulative-recharge-reward:view"] + }, + listDiceRobots: { + method: "GET", + operationId: API_OPERATIONS.listDiceRobots, + path: "/v1/admin/game/robots", + permission: "game:view", + permissions: ["game: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"] + }, + listFinanceApplications: { + method: "GET", + operationId: API_OPERATIONS.listFinanceApplications, + path: "/v1/admin/finance/applications", + permission: "finance-application:audit", + permissions: ["finance-application:audit"] + }, + listFinanceCoinSellerRechargeOrders: { + method: "GET", + operationId: API_OPERATIONS.listFinanceCoinSellerRechargeOrders, + path: "/v1/admin/finance/orders/coin-seller-recharges", + permission: "finance-order:coin-seller-recharge:view", + permissions: ["finance-order:coin-seller-recharge:view"] + }, + listFinanceWithdrawalApplications: { + method: "GET", + operationId: API_OPERATIONS.listFinanceWithdrawalApplications, + path: "/v1/admin/finance/withdrawal-applications", + permission: "finance-withdrawal:view", + permissions: ["finance-withdrawal:view","finance-withdrawal:audit","finance-application:audit"] + }, + 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"] + }, + listHostAgencyPolicies: { + method: "GET", + operationId: API_OPERATIONS.listHostAgencyPolicies, + path: "/v1/admin/host-agency-policies", + permission: "host-agency-policy:view", + permissions: ["host-agency-policy:view"] + }, + listHosts: { + method: "GET", + operationId: API_OPERATIONS.listHosts, + path: "/v1/admin/hosts", + permission: "host:view", + permissions: ["host:view"] + }, + listHostSalarySettlements: { + method: "GET", + operationId: API_OPERATIONS.listHostSalarySettlements, + path: "/v1/admin/host-salary-settlements", + permission: "host-salary-settlement:view", + permissions: ["host-salary-settlement:view"] + }, + listHostWithdrawals: { + method: "GET", + operationId: API_OPERATIONS.listHostWithdrawals, + path: "/v1/admin/host-withdrawals", + permission: "host-withdrawal:view", + permissions: ["host-withdrawal:view"] + }, + listInviteActivityRewardClaims: { + method: "GET", + operationId: API_OPERATIONS.listInviteActivityRewardClaims, + path: "/v1/admin/activity/invite-reward/claims", + permission: "invite-activity-reward:view", + permissions: ["invite-activity-reward:view"] + }, + listJobs: { + method: "GET", + operationId: API_OPERATIONS.listJobs, + path: "/v1/jobs", + permission: "job:view", + permissions: ["job: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/v2/configs", + permission: "lucky-gift:view", + permissions: ["lucky-gift:view"] + }, + listLuckyGiftDraws: { + method: "GET", + operationId: API_OPERATIONS.listLuckyGiftDraws, + path: "/v1/admin/activity/lucky-gifts/v2/draws", + permission: "lucky-gift:view", + permissions: ["lucky-gift:view"] + }, + listManagers: { + method: "GET", + operationId: API_OPERATIONS.listManagers, + path: "/v1/admin/managers", + permission: "bd:view", + permissions: ["bd:view"] + }, + listMyFinanceApplications: { + method: "GET", + operationId: API_OPERATIONS.listMyFinanceApplications, + path: "/v1/admin/finance/applications/mine", + permission: "finance-application:create", + permissions: ["finance-application:create"] + }, + 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"] + }, + listPlatformGrantRecords: { + method: "GET", + operationId: API_OPERATIONS.listPlatformGrantRecords, + path: "/v1/statistics/platform-grants/records", + permission: "overview:view", + permissions: ["overview:view"] + }, + listPlatformGrantUsers: { + method: "GET", + operationId: API_OPERATIONS.listPlatformGrantUsers, + path: "/v1/statistics/platform-grants/users", + permission: "overview:view", + permissions: ["overview:view"] + }, + listPlatforms: { + method: "GET", + operationId: API_OPERATIONS.listPlatforms, + path: "/v1/admin/game/platforms", + permission: "game:view", + permissions: ["game:view"] + }, + listPolicyInstances: { + method: "GET", + operationId: API_OPERATIONS.listPolicyInstances, + path: "/v1/admin/policy-instances", + permission: "policy-template:view", + permissions: ["policy-template:view"] + }, + listPolicyTemplates: { + method: "GET", + operationId: API_OPERATIONS.listPolicyTemplates, + path: "/v1/admin/policy-templates", + permission: "policy-template:view", + permissions: ["policy-template:view"] + }, + listPopups: { + method: "GET", + operationId: API_OPERATIONS.listPopups, + path: "/v1/admin/app-config/popups", + permission: "app-config:view", + permissions: ["app-config:view"] + }, + listPrettyIdPools: { + method: "GET", + operationId: API_OPERATIONS.listPrettyIdPools, + path: "/v1/admin/users/pretty-id-pools", + permission: "pretty-id:view", + permissions: ["pretty-id:view"] + }, + listPrettyIds: { + method: "GET", + operationId: API_OPERATIONS.listPrettyIds, + path: "/v1/admin/users/pretty-ids", + permission: "pretty-id:view", + permissions: ["pretty-id:view"] + }, + listRechargeApps: { + method: "GET", + operationId: API_OPERATIONS.listRechargeApps, + path: "/v1/admin/payment/recharge-apps", + permission: "payment-bill:view", + permissions: ["payment-bill: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"] + }, + listRechargeRegions: { + method: "GET", + operationId: API_OPERATIONS.listRechargeRegions, + path: "/v1/admin/payment/recharge-regions", + permission: "payment-bill:view", + permissions: ["payment-bill: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"] + }, + listReports: { + method: "GET", + operationId: API_OPERATIONS.listReports, + path: "/v1/admin/operations/reports", + permission: "report:view", + permissions: ["report: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"] + }, + listResourceShopItems: { + method: "GET", + operationId: API_OPERATIONS.listResourceShopItems, + path: "/v1/admin/resource-shop/items", + permission: "resource-shop:view", + permissions: ["resource-shop:view"] + }, + listResourceShopPurchaseOrders: { + method: "GET", + operationId: API_OPERATIONS.listResourceShopPurchaseOrders, + path: "/v1/admin/resource-shop/purchase-orders", + permission: "resource-shop:view", + permissions: ["resource-shop:view"] + }, + listRobotRooms: { + method: "GET", + operationId: API_OPERATIONS.listRobotRooms, + path: "/v1/admin/rooms/robot-rooms", + permission: "room-robot:view", + permissions: ["room-robot: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"] + }, + listRoomRpsChallenges: { + method: "GET", + operationId: API_OPERATIONS.listRoomRpsChallenges, + path: "/v1/admin/game/room-rps/challenges", + permission: "game:view", + permissions: ["game:view"] + }, + listRooms: { + method: "GET", + operationId: API_OPERATIONS.listRooms, + path: "/v1/admin/rooms", + permission: "room:view", + permissions: ["room:view"] + }, + listRoomTurnoverRewardSettlements: { + method: "GET", + operationId: API_OPERATIONS.listRoomTurnoverRewardSettlements, + path: "/v1/admin/activity/room-turnover-reward/settlements", + permission: "room-turnover-reward:view", + permissions: ["room-turnover-reward:view"] + }, + listSelfGames: { + method: "GET", + operationId: API_OPERATIONS.listSelfGames, + path: "/v1/admin/game/self-games", + permission: "game:view", + permissions: ["game: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"] + }, + listSplashScreens: { + method: "GET", + operationId: API_OPERATIONS.listSplashScreens, + path: "/v1/admin/app-config/splash-screens", + permission: "app-config:view", + permissions: ["app-config: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"] + }, + listTeams: { + method: "GET", + operationId: API_OPERATIONS.listTeams, + path: "/v1/teams", + permission: "team:view", + permissions: ["team:view"] + }, + listTeamSalaryPolicies: { + method: "GET", + operationId: API_OPERATIONS.listTeamSalaryPolicies, + path: "/v1/admin/team-salary-policies", + permission: "team-salary-policy:view", + permissions: ["team-salary-policy:view"] + }, + listTeamUsers: { + method: "GET", + operationId: API_OPERATIONS.listTeamUsers, + path: "/v1/teams/{team_id}/users", + permission: "user:view", + permissions: ["user:view"] + }, + listTemporaryPaymentLinks: { + method: "GET", + operationId: API_OPERATIONS.listTemporaryPaymentLinks, + path: "/v1/admin/payment/temporary-links", + permission: "payment-temporary-link:view", + permissions: ["payment-temporary-link:view"] + }, + listThirdPartyPaymentChannels: { + method: "GET", + operationId: API_OPERATIONS.listThirdPartyPaymentChannels, + path: "/v1/admin/payment/third-party-channels", + permission: "payment-third-party:view", + permissions: ["payment-third-party:view"] + }, + listUserFinanceScopes: { + method: "GET", + operationId: API_OPERATIONS.listUserFinanceScopes, + path: "/v1/users/{id}/finance-scopes", + permission: "user:view", + permissions: ["user: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"] + }, + listWeeklyStarCycles: { + method: "GET", + operationId: API_OPERATIONS.listWeeklyStarCycles, + path: "/v1/admin/activity/weekly-star/cycles", + permission: "weekly-star:view", + permissions: ["weekly-star:view"] + }, + listWeeklyStarLeaderboard: { + method: "GET", + operationId: API_OPERATIONS.listWeeklyStarLeaderboard, + path: "/v1/admin/activity/weekly-star/cycles/{cycle_id}/leaderboard", + permission: "weekly-star:view", + permissions: ["weekly-star:view"] + }, + listWeeklyStarSettlements: { + method: "GET", + operationId: API_OPERATIONS.listWeeklyStarSettlements, + path: "/v1/admin/activity/weekly-star/cycles/{cycle_id}/settlements", + permission: "weekly-star:settle", + permissions: ["weekly-star:settle"] + }, + listWheelDraws: { + method: "GET", + operationId: API_OPERATIONS.listWheelDraws, + path: "/v1/admin/activity/wheel/draws", + permission: "wheel:view", + permissions: ["wheel: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"] + }, + lookupResourceGrantTarget: { + method: "GET", + operationId: API_OPERATIONS.lookupResourceGrantTarget, + path: "/v1/admin/resource-grants/target", + permission: "resource-grant:create", + permissions: ["resource-grant:create"] + }, + me: { + method: "GET", + operationId: API_OPERATIONS.me, + path: "/v1/auth/me" + }, + navigationMenus: { + method: "GET", + operationId: API_OPERATIONS.navigationMenus, + path: "/v1/navigation/menus" + }, + publishHostAgencyPolicy: { + method: "POST", + operationId: API_OPERATIONS.publishHostAgencyPolicy, + path: "/v1/admin/host-agency-policies/{policy_id}/publish", + permission: "host-agency-policy:publish", + permissions: ["host-agency-policy:publish"] + }, + publishPolicyInstance: { + method: "POST", + operationId: API_OPERATIONS.publishPolicyInstance, + path: "/v1/admin/policy-instances/{instance_id}/publish", + permission: "policy-instance:publish", + permissions: ["policy-instance:publish"] + }, + recyclePrettyId: { + method: "POST", + operationId: API_OPERATIONS.recyclePrettyId, + path: "/v1/admin/users/pretty-ids/{pretty_id}/recycle", + permission: "pretty-id:update", + permissions: ["pretty-id:update"] + }, + refresh: { + method: "POST", + operationId: API_OPERATIONS.refresh, + path: "/v1/auth/refresh" + }, + refreshGoogleRechargePaid: { + method: "POST", + operationId: API_OPERATIONS.refreshGoogleRechargePaid, + path: "/v1/admin/payment/recharge-bills/google-paid/refresh", + permission: "payment-bill:view", + permissions: ["payment-bill:view"] + }, + rejectCoinSellerSubApplication: { + method: "POST", + operationId: API_OPERATIONS.rejectCoinSellerSubApplication, + path: "/v1/admin/coin-seller-sub-applications/{application_id}/reject", + permission: "coin-seller-sub-application:audit", + permissions: ["coin-seller-sub-application:audit"] + }, + rejectFinanceApplication: { + method: "POST", + operationId: API_OPERATIONS.rejectFinanceApplication, + path: "/v1/admin/finance/applications/{application_id}/reject", + permission: "finance-application:audit", + permissions: ["finance-application:audit"] + }, + rejectFinanceWithdrawalApplication: { + method: "POST", + operationId: API_OPERATIONS.rejectFinanceWithdrawalApplication, + path: "/v1/admin/finance/withdrawal-applications/{application_id}/reject", + permission: "finance-withdrawal:audit", + permissions: ["finance-withdrawal:audit","finance-application:audit"] + }, + renameCountryCode: { + method: "POST", + operationId: API_OPERATIONS.renameCountryCode, + path: "/v1/admin/countries/{country_id}/rename-code", + permission: "country:update", + permissions: ["country:update"] + }, + replaceCoinSellerSalaryRates: { + method: "PUT", + operationId: API_OPERATIONS.replaceCoinSellerSalaryRates, + path: "/v1/admin/coin-seller-salary-rates/{region_id}", + permission: "coin-seller:exchange-rate", + permissions: ["coin-seller:exchange-rate"] + }, + 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"] + }, + replaceUserFinanceScopes: { + method: "PUT", + operationId: API_OPERATIONS.replaceUserFinanceScopes, + path: "/v1/users/{id}/finance-scopes", + permission: "user:update", + permissions: ["user:update"] + }, + resetUserPassword: { + method: "POST", + operationId: API_OPERATIONS.resetUserPassword, + path: "/v1/users/{id}/reset-password", + permission: "user:reset-password", + permissions: ["user:reset-password"] + }, + retryRedPacketRefund: { + method: "POST", + operationId: API_OPERATIONS.retryRedPacketRefund, + path: "/v1/admin/activity/red-packets/refund/retry", + permission: "red-packet:update", + permissions: ["red-packet:update"] + }, + retryRoomRpsSettlement: { + method: "POST", + operationId: API_OPERATIONS.retryRoomRpsSettlement, + path: "/v1/admin/game/room-rps/challenges/{challenge_id}/retry-settlement", + permission: "game:update", + permissions: ["game:update"] + }, + retryRoomTurnoverRewardSettlement: { + method: "POST", + operationId: API_OPERATIONS.retryRoomTurnoverRewardSettlement, + path: "/v1/admin/activity/room-turnover-reward/settlements/{settlement_id}/retry", + permission: "room-turnover-reward:retry", + permissions: ["room-turnover-reward:retry"] + }, + revokeResourceGrant: { + method: "POST", + operationId: API_OPERATIONS.revokeResourceGrant, + path: "/v1/admin/resource-grants/{grant_id}/revoke", + permission: "resource-grant:revoke", + permissions: ["resource-grant:revoke"] + }, + savePolicyTemplate: { + method: "POST", + operationId: API_OPERATIONS.savePolicyTemplate, + path: "/v1/admin/policy-templates", + permission: "policy-template:create", + permissions: ["policy-template:create"] + }, + search: { + method: "GET", + operationId: API_OPERATIONS.search, + path: "/v1/search" + }, + selfGameStatisticsOverview: { + method: "GET", + operationId: API_OPERATIONS.selfGameStatisticsOverview, + path: "/v1/statistics/self-games/overview", + permission: "overview:view", + permissions: ["overview:view"] + }, + setAgencyJoinEnabled: { + method: "POST", + operationId: API_OPERATIONS.setAgencyJoinEnabled, + path: "/v1/admin/agencies/{agency_id}/join-enabled", + permission: "agency:status", + permissions: ["agency:status"] + }, + setAgencyStatus: { + method: "PATCH", + operationId: API_OPERATIONS.setAgencyStatus, + path: "/v1/admin/agencies/{agency_id}/status", + 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"] + }, + setDiceRobotStatus: { + method: "PATCH", + operationId: API_OPERATIONS.setDiceRobotStatus, + path: "/v1/admin/game/robots/{user_id}/status", + permission: "game:update", + permissions: ["game:update"] + }, + setGameStatus: { + method: "PATCH", + operationId: API_OPERATIONS.setGameStatus, + path: "/v1/admin/game/games/{game_id}/status", + permission: "game:status", + permissions: ["game:status"] + }, + setPrettyIdStatus: { + method: "POST", + operationId: API_OPERATIONS.setPrettyIdStatus, + path: "/v1/admin/users/pretty-ids/{pretty_id}/status", + permission: "pretty-id:update", + permissions: ["pretty-id:update"] + }, + setTaskDefinitionStatus: { + method: "POST", + operationId: API_OPERATIONS.setTaskDefinitionStatus, + path: "/v1/admin/activity/daily-tasks/{task_id}/status", + permission: "daily-task:status", + permissions: ["daily-task:status"] + }, + setThirdPartyPaymentMethodStatus: { + method: "PATCH", + operationId: API_OPERATIONS.setThirdPartyPaymentMethodStatus, + path: "/v1/admin/payment/third-party-methods/{method_id}/status", + permission: "payment-third-party:update", + permissions: ["payment-third-party:update"] + }, + setWeeklyStarCycleStatus: { + method: "PATCH", + operationId: API_OPERATIONS.setWeeklyStarCycleStatus, + path: "/v1/admin/activity/weekly-star/cycles/{cycle_id}/status", + permission: "weekly-star:update", + permissions: ["weekly-star:update"] + }, + sortMenus: { + method: "PUT", + operationId: API_OPERATIONS.sortMenus, + path: "/v1/system/menus/sort", + permission: "menu:sort", + permissions: ["menu:sort"] + }, + startRobotRoom: { + method: "POST", + operationId: API_OPERATIONS.startRobotRoom, + path: "/v1/admin/rooms/robot-rooms/{room_id}/start", + permission: "room-robot:update", + permissions: ["room-robot:update"] + }, + statisticsOverview: { + method: "GET", + operationId: API_OPERATIONS.statisticsOverview, + path: "/v1/statistics/overview", + permission: "overview:view", + permissions: ["overview:view"] + }, + stopRobotRoom: { + method: "POST", + operationId: API_OPERATIONS.stopRobotRoom, + path: "/v1/admin/rooms/robot-rooms/{room_id}/stop", + permission: "room-robot:update", + permissions: ["room-robot:update"] + }, + syncPermissions: { + method: "POST", + operationId: API_OPERATIONS.syncPermissions, + path: "/v1/permissions/sync", + permission: "permission:sync", + permissions: ["permission:sync"] + }, + syncThirdPartyPaymentMethods: { + method: "POST", + operationId: API_OPERATIONS.syncThirdPartyPaymentMethods, + path: "/v1/admin/payment/third-party-methods/sync", + permission: "payment-third-party:update", + permissions: ["payment-third-party:update"] + }, + syncThirdPartyPaymentRates: { + method: "POST", + operationId: API_OPERATIONS.syncThirdPartyPaymentRates, + path: "/v1/admin/payment/third-party-rates/sync", + permission: "payment-third-party:update", + permissions: ["payment-third-party:update"] + }, + 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"] + }, + updateCPConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateCPConfig, + path: "/v1/admin/activity/cp/config", + permission: "cp-config:update", + permissions: ["cp-config:update"] + }, + updateCPWeeklyRankConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateCPWeeklyRankConfig, + path: "/v1/admin/activity/cp-weekly-rank/config", + permission: "cp-weekly-rank:update", + permissions: ["cp-weekly-rank:update"] + }, + updateCumulativeRechargeRewardConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateCumulativeRechargeRewardConfig, + path: "/v1/admin/activity/cumulative-recharge-reward/config", + permission: "cumulative-recharge-reward:update", + permissions: ["cumulative-recharge-reward:update"] + }, + updateDiceConfig: { + method: "PATCH", + operationId: API_OPERATIONS.updateDiceConfig, + path: "/v1/admin/game/self-games/{game_id}/config", + permission: "game:update", + permissions: ["game: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"] + }, + updateGiftTypes: { + method: "PUT", + operationId: API_OPERATIONS.updateGiftTypes, + path: "/v1/admin/gift-types", + 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"] + }, + updateHostAgencyPolicy: { + method: "PUT", + operationId: API_OPERATIONS.updateHostAgencyPolicy, + path: "/v1/admin/host-agency-policies/{policy_id}", + permission: "host-agency-policy:update", + permissions: ["host-agency-policy:update"] + }, + updateHumanRoomRobotConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateHumanRoomRobotConfig, + path: "/v1/admin/rooms/robot-rooms/human-config", + permission: "room-robot:update", + permissions: ["room-robot:update"] + }, + updateInviteActivityRewardConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateInviteActivityRewardConfig, + path: "/v1/admin/activity/invite-reward/config", + permission: "invite-activity-reward:update", + permissions: ["invite-activity-reward:update"] + }, + updateManager: { + method: "PUT", + operationId: API_OPERATIONS.updateManager, + path: "/v1/admin/managers/{user_id}", + permission: "bd:update", + permissions: ["bd: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"] + }, + updatePolicyInstanceStatus: { + method: "PUT", + operationId: API_OPERATIONS.updatePolicyInstanceStatus, + path: "/v1/admin/policy-instances/{instance_id}/status", + permission: "policy-instance:update", + permissions: ["policy-instance:update"] + }, + updatePopup: { + method: "PUT", + operationId: API_OPERATIONS.updatePopup, + path: "/v1/admin/app-config/popups/{popup_id}", + permission: "app-config:update", + permissions: ["app-config:update"] + }, + updatePrettyIdPool: { + method: "PUT", + operationId: API_OPERATIONS.updatePrettyIdPool, + path: "/v1/admin/users/pretty-id-pools/{pool_id}", + permission: "pretty-id:update", + permissions: ["pretty-id: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"] + }, + updateResourceIdentityAutoGrantConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateResourceIdentityAutoGrantConfig, + path: "/v1/admin/resource-groups/identity-auto-grant-config", + permission: "resource-group:update", + permissions: ["resource-group:update"] + }, + updateRiskConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateRiskConfig, + path: "/v1/admin/users/risk-config", + permission: "risk-config:update", + permissions: ["risk-config: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"] + }, + updateRoomRocketConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateRoomRocketConfig, + path: "/v1/admin/activity/room-rocket/config", + permission: "room-rocket:update", + permissions: ["room-rocket:update"] + }, + updateRoomRpsConfig: { + method: "PATCH", + operationId: API_OPERATIONS.updateRoomRpsConfig, + path: "/v1/admin/game/room-rps/config", + permission: "game:update", + permissions: ["game:update"] + }, + updateRoomTurnoverRewardConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateRoomTurnoverRewardConfig, + path: "/v1/admin/activity/room-turnover-reward/config", + permission: "room-turnover-reward:update", + permissions: ["room-turnover-reward:update"] + }, + updateRoomWhitelistConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateRoomWhitelistConfig, + path: "/v1/admin/rooms/whitelist", + permission: "room-whitelist:update", + permissions: ["room-whitelist: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"] + }, + updateSplashScreen: { + method: "PUT", + operationId: API_OPERATIONS.updateSplashScreen, + path: "/v1/admin/app-config/splash-screens/{splash_id}", + permission: "app-config:update", + permissions: ["app-config:update"] + }, + updateTaskDefinition: { + method: "PUT", + operationId: API_OPERATIONS.updateTaskDefinition, + path: "/v1/admin/activity/daily-tasks/{task_id}", + permission: "daily-task:update", + permissions: ["daily-task:update"] + }, + updateTeam: { + method: "PATCH", + operationId: API_OPERATIONS.updateTeam, + path: "/v1/teams/{team_id}", + permission: "team:update", + permissions: ["team:update"] + }, + updateTeamSalaryPolicy: { + method: "PUT", + operationId: API_OPERATIONS.updateTeamSalaryPolicy, + path: "/v1/admin/team-salary-policies/{policy_id}", + permission: "team-salary-policy:update", + permissions: ["team-salary-policy:update"] + }, + updateThirdPartyPaymentRate: { + method: "PATCH", + operationId: API_OPERATIONS.updateThirdPartyPaymentRate, + path: "/v1/admin/payment/third-party-rates/{method_id}", + permission: "payment-third-party:update", + permissions: ["payment-third-party: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"] + }, + updateVipConfig: { + method: "PUT", + operationId: API_OPERATIONS.updateVipConfig, + path: "/v1/admin/activity/vip-levels", + permission: "vip-config:update", + permissions: ["vip-config:update"] + }, + updateVipProgram: { + method: "PUT", + operationId: API_OPERATIONS.updateVipProgram, + path: "/v1/admin/activity/vip-program", + permission: "vip-config:update", + permissions: ["vip-config:update"] + }, + updateWeeklyStarCycle: { + method: "PUT", + operationId: API_OPERATIONS.updateWeeklyStarCycle, + path: "/v1/admin/activity/weekly-star/cycles/{cycle_id}", + permission: "weekly-star:update", + permissions: ["weekly-star:update"] + }, + 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/v2/config", + permission: "lucky-gift:update", + permissions: ["lucky-gift:update"] + }, + upsertResourceShopItems: { + method: "POST", + operationId: API_OPERATIONS.upsertResourceShopItems, + path: "/v1/admin/resource-shop/items", + permission: "resource-shop:update", + permissions: ["resource-shop: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"] + }, + upsertWheelConfig: { + method: "PUT", + operationId: API_OPERATIONS.upsertWheelConfig, + path: "/v1/admin/activity/wheel/config", + permission: "wheel:update", + permissions: ["wheel:update"] + }, + verifyFinanceCoinSellerRechargeOrder: { + method: "POST", + operationId: API_OPERATIONS.verifyFinanceCoinSellerRechargeOrder, + path: "/v1/admin/finance/orders/coin-seller-recharges/{order_id}/verify", + permission: "finance-order:coin-seller-recharge:verify", + permissions: ["finance-order:coin-seller-recharge:verify"] + }, + verifyFinanceCoinSellerRechargeReceipt: { + method: "POST", + operationId: API_OPERATIONS.verifyFinanceCoinSellerRechargeReceipt, + path: "/v1/admin/finance/orders/coin-seller-recharges/receipt-verifications", + permission: "finance-order:coin-seller-recharge:verify", + permissions: ["finance-order:coin-seller-recharge:verify"] + } }; 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 c716d05..544ac60 100644 --- a/src/shared/api/generated/schema.d.ts +++ b/src/shared/api/generated/schema.d.ts @@ -612,6 +612,70 @@ export interface paths { patch?: never; trace?: never; }; + "/admin/activity/vip-program": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getVipProgram"]; + put: operations["updateVipProgram"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/activity/vip-levels": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["getVipConfig"]; + put: operations["updateVipConfig"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/activity/vip-grants": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["grantVip"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/admin/activity/vip-trial-card-grants": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["grantVipTrialCard"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/admin/activity/room-rocket/config": { parameters: { query?: never; @@ -3304,6 +3368,22 @@ export interface paths { patch?: never; trace?: never; }; + "/app/users/{id}/levels": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put: operations["appAdjustUserLevels"]; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/app/users/{id}/login-logs": { parameters: { query?: never; @@ -3384,6 +3464,22 @@ export interface paths { patch?: never; trace?: never; }; + "/exports/app-users": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post: operations["appExportUsers"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/auth/change-password": { parameters: { query?: never; @@ -3960,6 +4056,22 @@ export interface paths { patch?: never; trace?: never; }; + "/jobs/{id}/artifact": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get: operations["downloadJobArtifact"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/jobs/{id}/cancel": { parameters: { query?: never; @@ -4172,6 +4284,386 @@ export interface components { H5LinkDeleteResult: { deleted: boolean; }; + ApiResponseAppUserPage: components["schemas"]["Envelope"] & { + data?: components["schemas"]["ApiPageAppUser"]; + }; + ApiResponseAppUser: components["schemas"]["Envelope"] & { + data?: components["schemas"]["AppUser"]; + }; + ApiResponseAppUserStatusMutation: components["schemas"]["Envelope"] & { + data?: components["schemas"]["AppUserStatusMutationResult"]; + }; + ApiResponseAppUserBanRecordPage: components["schemas"]["Envelope"] & { + data?: components["schemas"]["ApiPageAppUserBanRecord"]; + }; + ApiResponseAppUserLoginLogPage: components["schemas"]["Envelope"] & { + data?: components["schemas"]["ApiPageAppUserLoginLog"]; + }; + ApiResponseAppUserExportJob: components["schemas"]["Envelope"] & { + data?: components["schemas"]["AppUserExportJob"]; + }; + ApiPageAppUser: { + items: components["schemas"]["AppUser"][]; + page: number; + pageSize: number; + /** Format: int64 */ + total: number; + }; + AppUser: { + userId: string; + defaultDisplayUserId?: string; + displayUserId?: string; + prettyDisplayUserId?: string; + prettyId?: string; + username?: string; + avatar?: string; + gender?: string; + birth?: string; + age?: number | null; + country?: string; + countryName?: string; + countryDisplayName?: string; + /** Format: int64 */ + regionId?: number; + regionName?: string; + registerDevice?: string; + roles: string[]; + levels: components["schemas"]["AppUserLevels"]; + ban: components["schemas"]["AppUserBan"]; + lastOperator?: components["schemas"]["AppUserOperator"]; + /** Format: int64 */ + lastOperatedAtMs?: number; + /** Format: int64 */ + lastLoginAtMs?: number; + /** Format: int64 */ + lastActiveAtMs?: number; + /** Format: int64 */ + createdAtMs?: number; + /** Format: int64 */ + updatedAtMs?: number; + /** Format: int64 */ + coin?: number; + /** Format: int64 */ + diamond?: number; + /** Format: int64 */ + cumulativeRechargeUsdMinor?: number; + vip?: components["schemas"]["AppUserVIP"]; + balances?: components["schemas"]["AppUserAssetBalance"][]; + equippedResources?: components["schemas"]["AppUserResource"][]; + resources?: components["schemas"]["AppUserResource"][]; + }; + AppUserLevels: { + wealth: components["schemas"]["AppUserLevel"]; + game: components["schemas"]["AppUserLevel"]; + charm: components["schemas"]["AppUserLevel"]; + }; + AppUserLevel: { + /** @enum {string} */ + track: "wealth" | "game" | "charm"; + realLevel: number; + /** Format: int64 */ + realTotalValue: number; + displayLevel: number; + /** Format: int64 */ + displayValue: number; + temporaryLevelId?: string; + temporaryTargetLevel?: number; + /** Format: int64 */ + startedAtMs?: number; + /** Format: int64 */ + expiresAtMs?: number; + }; + AppUserBan: { + id?: string; + active: boolean; + permanent: boolean; + /** Format: int64 */ + expiresAtMs: number; + /** @enum {string} */ + source?: "admin" | "manager" | "legacy" | ""; + reason?: string; + }; + AppUserOperator: { + adminId?: string; + name?: string; + action?: string; + }; + AppUserVIP: { + level: number; + name?: string; + active: boolean; + /** Format: int64 */ + startedAtMs: number; + /** Format: int64 */ + expiresAtMs: number; + /** Format: int64 */ + updatedAtMs: number; + }; + AppUserAssetBalance: { + assetType: string; + /** Format: int64 */ + availableAmount: number; + /** Format: int64 */ + frozenAmount: number; + /** Format: int64 */ + totalAmount: number; + /** Format: int64 */ + version: number; + /** Format: int64 */ + updatedAtMs: number; + }; + AppUserResource: { + entitlementId?: string; + /** Format: int64 */ + resourceId?: number; + resourceCode?: string; + resourceType?: string; + name?: string; + status?: string; + /** Format: int64 */ + quantity?: number; + /** Format: int64 */ + remainingQuantity?: number; + /** Format: int64 */ + effectiveAtMs?: number; + /** Format: int64 */ + expiresAtMs?: number; + sourceGrantId?: string; + assetUrl?: string; + previewUrl?: string; + animationUrl?: string; + equipped?: boolean; + /** Format: int64 */ + createdAtMs?: number; + /** Format: int64 */ + updatedAtMs?: number; + }; + AppUserUpdateInput: { + username?: string; + avatar?: string; + gender?: string; + country?: string; + }; + AppUserBanInput: { + /** Format: int64 */ + expires_at_ms: number; + reason?: string; + }; + AppUserUnbanInput: { + reason?: string; + }; + AppUserLevelAdjustmentInput: { + adjustments: { + /** @enum {string} */ + track: "wealth" | "charm"; + level: number; + duration_days: number; + }[]; + reason?: string; + }; + AppUserPasswordInput: { + password: string; + }; + AppUserStatusMutationResult: { + user: components["schemas"]["AppUser"]; + /** Format: int64 */ + revokedSessionCount?: number; + accessTokenRevoked?: boolean; + accessTokenRevokeError?: string; + imKicked?: boolean; + imKickError?: string; + roomEvicted?: boolean; + roomId?: string; + rtcKicked?: boolean; + rtcKickError?: string; + roomEvictError?: string; + }; + AppUserExportJob: { + jobId: number; + status: string; + /** Format: int64 */ + snapshotAtMs: number; + }; + AppUserBrief: { + userId: string; + defaultDisplayUserId?: string; + displayUserId?: string; + prettyDisplayUserId?: string; + prettyId?: string; + username?: string; + avatar?: string; + }; + AppUserBanOperator: components["schemas"]["AppUserBrief"] & { + adminId?: string; + account?: string; + name?: string; + type?: string; + }; + AppUserBanRecord: { + /** Format: int64 */ + id: number; + target: components["schemas"]["AppUserBrief"]; + operator?: components["schemas"]["AppUserBanOperator"]; + oldStatus?: string; + newStatus?: string; + reason?: string; + requestId?: string; + /** Format: int64 */ + createdAtMs?: number; + }; + ApiPageAppUserBanRecord: { + items: components["schemas"]["AppUserBanRecord"][]; + page: number; + pageSize: number; + /** Format: int64 */ + total: number; + }; + AppUserLoginLog: components["schemas"]["AppUserBrief"] & { + /** Format: int64 */ + id?: number; + loginType?: string; + provider?: string; + channel?: string; + platform?: string; + result?: string; + failureCode?: string; + loginIp?: string; + ipCountryCode?: string; + country?: string; + /** Format: int64 */ + regionId?: number; + regionName?: string; + blocked?: boolean; + blockReason?: string; + riskHighlighted?: boolean; + requestId?: string; + /** Format: int64 */ + createdAtMs?: number; + }; + ApiPageAppUserLoginLog: { + items: components["schemas"]["AppUserLoginLog"][]; + page: number; + pageSize: number; + /** Format: int64 */ + total: number; + }; + ApiResponseVipProgram: components["schemas"]["Envelope"] & { + data?: components["schemas"]["VipProgramData"]; + }; + ApiResponseVipConfig: components["schemas"]["Envelope"] & { + data?: components["schemas"]["VipConfig"]; + }; + VipProgram: { + appCode: string; + /** @enum {string} */ + programType: "legacy_timed" | "tiered_privilege_v1"; + levelCount: number; + /** @enum {string} */ + status: "active" | "disabled"; + configVersion?: number; + /** @enum {string} */ + sameLevelExpiryPolicy?: "extend_remaining"; + /** @enum {string} */ + upgradeExpiryPolicy?: "extend_remaining" | "replace_from_now"; + /** @enum {string} */ + downgradePurchasePolicy?: "reject"; + /** @enum {string} */ + benefitInheritancePolicy?: "target_only"; + /** @enum {string} */ + grantMode?: "direct_membership" | "trial_card"; + trialCardEnabled?: boolean; + /** Format: int64 */ + createdAtMs?: number; + /** Format: int64 */ + updatedAtMs?: number; + }; + VipProgramData: { + config: components["schemas"]["VipProgram"]; + benefits?: components["schemas"]["VipBenefit"][]; + /** Format: int64 */ + serverTimeMs?: number; + }; + VipProgramInput: { + /** @enum {string} */ + programType: "legacy_timed" | "tiered_privilege_v1"; + levelCount: number; + /** @enum {string} */ + sameLevelExpiryPolicy: "extend_remaining"; + /** @enum {string} */ + upgradeExpiryPolicy: "extend_remaining" | "replace_from_now"; + /** @enum {string} */ + downgradePurchasePolicy: "reject"; + /** @enum {string} */ + benefitInheritancePolicy: "target_only"; + /** @enum {string} */ + grantMode: "direct_membership" | "trial_card"; + trialCardEnabled: boolean; + /** @enum {string} */ + status: "active" | "disabled"; + }; + VipProgramUpdateInput: { + config: components["schemas"]["VipProgramInput"]; + }; + VipBenefit: { + benefitCode: string; + name: string; + /** @enum {string} */ + benefitType: "decoration" | "function"; + unlockLevel: number; + /** @enum {string} */ + status: "active" | "disabled"; + trialEnabled: boolean; + /** Format: int64 */ + resourceId: number; + resourceType: string; + /** @enum {string} */ + executionScope: "wallet" | "room" | "user" | "notice"; + autoEquip: boolean; + sortOrder: number; + metadataJson: string; + }; + VipLevel: { + level: number; + name: string; + /** @enum {string} */ + status: "active" | "disabled"; + priceCoin: number; + /** Format: int64 */ + durationMs: number; + /** Format: int64 */ + rewardResourceGroupId: number; + sortOrder: number; + benefits: components["schemas"]["VipBenefit"][]; + /** Format: int64 */ + createdAtMs?: number; + /** Format: int64 */ + updatedAtMs?: number; + }; + VipConfig: { + levels: components["schemas"]["VipLevel"][]; + /** Format: int64 */ + serverTimeMs?: number; + programConfig?: components["schemas"]["VipProgram"]; + }; + VipConfigInput: { + levels: components["schemas"]["VipLevel"][]; + }; + VipGrantInput: { + commandId?: string; + targetUserId: string; + level: number; + reason: string; + }; + VipTrialCardGrantInput: { + commandId?: string; + targetUserId: string; + level: number; + /** Format: int64 */ + resourceId?: number; + /** Format: int64 */ + durationMs: number; + reason: string; + }; ApiPageAgency: { items: components["schemas"]["Agency"][]; page: number; @@ -4689,15 +5181,7 @@ export interface components { /** Format: int64 */ availableDelta: number; /** @enum {string} */ - bizType: - | "coin_seller_stock_purchase" - | "coin_seller_stock_deduction" - | "coin_seller_recharge" - | "coin_seller_coin_compensation" - | "coin_seller_transfer" - | "coin_seller_sub_transfer" - | "salary_transfer_to_coin_seller" - | "manual_credit"; + bizType: "coin_seller_stock_purchase" | "coin_seller_stock_deduction" | "coin_seller_recharge" | "coin_seller_coin_compensation" | "coin_seller_transfer" | "coin_seller_sub_transfer" | "salary_transfer_to_coin_seller" | "manual_credit"; commandId?: string; counterpartyUserId?: string; /** Format: int64 */ @@ -5029,13 +5513,7 @@ export interface components { appCode: string; appName?: string; /** @enum {string} */ - operation: - | "user_coin_credit" - | "user_coin_debit" - | "user_wallet_debit" - | "user_wallet_credit" - | "coin_seller_coin_credit" - | "coin_seller_coin_debit"; + operation: "user_coin_credit" | "user_coin_debit" | "user_wallet_debit" | "user_wallet_credit" | "coin_seller_coin_credit" | "coin_seller_coin_debit"; walletIdentity?: string; targetUserId: string; coinAmount: number; @@ -5117,13 +5595,7 @@ export interface components { FinanceApplicationInput: { appCode: string; /** @enum {string} */ - operation: - | "user_coin_credit" - | "user_coin_debit" - | "user_wallet_debit" - | "user_wallet_credit" - | "coin_seller_coin_credit" - | "coin_seller_coin_debit"; + operation: "user_coin_credit" | "user_coin_debit" | "user_wallet_debit" | "user_wallet_credit" | "coin_seller_coin_credit" | "coin_seller_coin_debit"; /** @enum {string} */ walletIdentity?: "host" | "agency" | "bd"; targetUserId: string; @@ -5207,6 +5679,60 @@ export interface components { }; }; /** @description OK */ + AppUserPageResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiResponseAppUserPage"]; + }; + }; + /** @description OK */ + AppUserResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiResponseAppUser"]; + }; + }; + /** @description OK */ + AppUserStatusMutationResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiResponseAppUserStatusMutation"]; + }; + }; + /** @description OK */ + AppUserBanRecordPageResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiResponseAppUserBanRecordPage"]; + }; + }; + /** @description OK */ + AppUserLoginLogPageResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiResponseAppUserLoginLogPage"]; + }; + }; + /** @description OK */ + AppUserExportJobResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiResponseAppUserExportJob"]; + }; + }; + /** @description OK */ AgencyPageResponse: { headers: { [name: string]: unknown; @@ -5351,6 +5877,24 @@ export interface components { }; }; /** @description OK */ + VipProgramResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiResponseVipProgram"]; + }; + }; + /** @description OK */ + VipConfigResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ApiResponseVipConfig"]; + }; + }; + /** @description OK */ EmptyResponse: { headers: { [name: string]: unknown; @@ -6458,6 +7002,94 @@ export interface operations { 200: components["responses"]["EmptyResponse"]; }; }; + getVipProgram: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["VipProgramResponse"]; + }; + }; + updateVipProgram: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["VipProgramUpdateInput"]; + }; + }; + responses: { + 200: components["responses"]["VipProgramResponse"]; + }; + }; + getVipConfig: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["VipConfigResponse"]; + }; + }; + updateVipConfig: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["VipConfigInput"]; + }; + }; + responses: { + 200: components["responses"]["VipConfigResponse"]; + }; + }; + grantVip: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["VipGrantInput"]; + }; + }; + responses: { + 200: components["responses"]["EmptyResponse"]; + }; + }; + grantVipTrialCard: { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["VipTrialCardGrantInput"]; + }; + }; + responses: { + 200: components["responses"]["EmptyResponse"]; + }; + }; getRoomRocketConfig: { parameters: { query?: never; @@ -8111,11 +8743,7 @@ export interface operations { seller_filter_user_id?: string; seller_display_user_id?: string; seller_username?: string; - ledger_type?: - | "admin_stock_credit" - | "seller_transfer" - | "sub_seller_transfer" - | "salary_transfer_received"; + ledger_type?: "admin_stock_credit" | "seller_transfer" | "sub_seller_transfer" | "salary_transfer_received"; start_at_ms?: number; end_at_ms?: number; }; @@ -8138,11 +8766,7 @@ export interface operations { seller_filter_user_id?: string; seller_display_user_id?: string; seller_username?: string; - ledger_type?: - | "admin_stock_credit" - | "seller_transfer" - | "sub_seller_transfer" - | "salary_transfer_received"; + ledger_type?: "admin_stock_credit" | "seller_transfer" | "sub_seller_transfer" | "salary_transfer_received"; start_at_ms?: number; end_at_ms?: number; }; @@ -8196,13 +8820,7 @@ export interface operations { sent_at_ms?: number; summary: string; /** @enum {string} */ - target_scope: - | "all_registered_users" - | "all_active_users" - | "single_user" - | "user_ids" - | "region" - | "country"; + target_scope: "all_registered_users" | "all_active_users" | "single_user" | "user_ids" | "region" | "country"; /** Format: int64 */ target_user_id?: number; title: string; @@ -9787,14 +10405,28 @@ export interface operations { }; appListUsers: { parameters: { - query?: never; + query?: { + page?: components["parameters"]["Page"]; + page_size?: components["parameters"]["PageSize"]; + keyword?: components["parameters"]["Keyword"]; + user_id?: string; + display_user_id?: string; + username?: string; + country?: string; + region_id?: number; + status?: string; + start_ms?: number; + end_ms?: number; + sort_by?: "created_at" | "coin"; + sort_direction?: "asc" | "desc"; + }; header?: never; path?: never; cookie?: never; }; requestBody?: never; responses: { - 200: components["responses"]["EmptyResponse"]; + 200: components["responses"]["AppUserPageResponse"]; }; }; appGetUser: { @@ -9808,7 +10440,7 @@ export interface operations { }; requestBody?: never; responses: { - 200: components["responses"]["EmptyResponse"]; + 200: components["responses"]["AppUserResponse"]; }; }; appUpdateUser: { @@ -9820,9 +10452,13 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["AppUserUpdateInput"]; + }; + }; responses: { - 200: components["responses"]["EmptyResponse"]; + 200: components["responses"]["AppUserResponse"]; }; }; appBanUser: { @@ -9834,9 +10470,31 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["AppUserBanInput"]; + }; + }; responses: { - 200: components["responses"]["EmptyResponse"]; + 200: components["responses"]["AppUserStatusMutationResponse"]; + }; + }; + appAdjustUserLevels: { + parameters: { + query?: never; + header?: never; + path: { + id: components["parameters"]["Id"]; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["AppUserLevelAdjustmentInput"]; + }; + }; + responses: { + 200: components["responses"]["AppUserResponse"]; }; }; appListUserLoginLogs: { @@ -9850,7 +10508,7 @@ export interface operations { }; requestBody?: never; responses: { - 200: components["responses"]["EmptyResponse"]; + 200: components["responses"]["AppUserLoginLogPageResponse"]; }; }; appSetPassword: { @@ -9862,7 +10520,11 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["AppUserPasswordInput"]; + }; + }; responses: { 200: components["responses"]["EmptyResponse"]; }; @@ -9876,9 +10538,13 @@ export interface operations { }; cookie?: never; }; - requestBody?: never; + requestBody: { + content: { + "application/json": components["schemas"]["AppUserUnbanInput"]; + }; + }; responses: { - 200: components["responses"]["EmptyResponse"]; + 200: components["responses"]["AppUserStatusMutationResponse"]; }; }; appListBannedUsers: { @@ -9890,7 +10556,7 @@ export interface operations { }; requestBody?: never; responses: { - 200: components["responses"]["EmptyResponse"]; + 200: components["responses"]["AppUserBanRecordPageResponse"]; }; }; appListLoginLogs: { @@ -9902,7 +10568,31 @@ export interface operations { }; requestBody?: never; responses: { - 200: components["responses"]["EmptyResponse"]; + 200: components["responses"]["AppUserLoginLogPageResponse"]; + }; + }; + appExportUsers: { + parameters: { + query?: { + keyword?: components["parameters"]["Keyword"]; + user_id?: string; + display_user_id?: string; + username?: string; + country?: string; + region_id?: number; + status?: string; + start_ms?: number; + end_ms?: number; + sort_by?: "created_at" | "coin"; + sort_direction?: "asc" | "desc"; + }; + header?: never; + path?: never; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["AppUserExportJobResponse"]; }; }; changePassword: { @@ -10572,6 +11262,28 @@ export interface operations { 200: components["responses"]["AdminJobResponse"]; }; }; + downloadJobArtifact: { + parameters: { + query?: never; + header?: never; + path: { + id: components["parameters"]["Id"]; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Export artifact */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "text/csv": string; + }; + }; + }; + }; cancelJob: { parameters: { query?: never; diff --git a/src/shared/api/types.ts b/src/shared/api/types.ts index 5f291e0..c858f8a 100644 --- a/src/shared/api/types.ts +++ b/src/shared/api/types.ts @@ -1000,8 +1000,11 @@ export interface CoinSellerSalaryRatesPayload { } export interface AppUserDto { + age?: number; avatar?: string; balances?: AppUserAssetBalanceDto[]; + ban?: AppUserBanDto; + birth?: string; coin?: number; country?: string; countryDisplayName?: string; @@ -1013,16 +1016,56 @@ export interface AppUserDto { equippedResources?: AppUserResourceDto[]; gender?: string; lastActiveAtMs?: number; + lastLoginAtMs?: number; + lastOperatedAtMs?: number; + lastOperator?: AppUserOperatorDto; + levels?: AppUserLevelsDto; prettyDisplayUserId?: string; prettyId?: string; regionId?: number; regionName?: string; + registerDevice?: string; resources?: AppUserResourceDto[]; + roles?: string[]; status?: string; updatedAtMs?: number; userId: string; username?: string; vip?: AppUserVIPDto; + cumulativeRechargeUsdMinor?: number; +} + +export interface AppUserLevelDto { + displayLevel: number; + displayValue: number; + expiresAtMs: number; + realLevel: number; + realTotalValue: number; + startedAtMs: number; + temporaryLevelId?: string; + temporaryTargetLevel: number; + track: "wealth" | "game" | "charm" | string; +} + +export interface AppUserLevelsDto { + charm: AppUserLevelDto; + game: AppUserLevelDto; + wealth: AppUserLevelDto; +} + +export interface AppUserBanDto { + active: boolean; + expiresAtMs: number; + id?: string; + permanent: boolean; + reason?: string; + source?: "admin" | "manager" | "legacy" | string; +} + +export interface AppUserOperatorDto { + action?: string; + adminId?: string; + name?: string; } export interface AppUserAssetBalanceDto { @@ -1131,6 +1174,30 @@ export interface AppUserUpdatePayload { username?: string; } +export interface AppUserBanPayload { + expires_at_ms: number; + reason?: string; +} + +export interface AppUserUnbanPayload { + reason?: string; +} + +export interface AppUserLevelAdjustmentPayload { + adjustments: Array<{ + duration_days: number; + level: number; + track: "wealth" | "charm"; + }>; + reason?: string; +} + +export interface AppUserExportJobDto { + jobId: number; + snapshotAtMs: number; + status: string; +} + export interface AppUserPasswordPayload { password: string; } @@ -1509,8 +1576,8 @@ export interface H5LinkConfigDto { appCode: string; key: string; label: string; - updatedAtMs?: number; - url?: string; + updatedAtMs: number; + url: string; } export interface H5LinkConfigPayload { diff --git a/src/styles/responsive.css b/src/styles/responsive.css index 1337214..1e3a547 100644 --- a/src/styles/responsive.css +++ b/src/styles/responsive.css @@ -23,7 +23,7 @@ .kpi-grid, .panel-grid, .overview-charts, - .frequent-menu-grid, + .workspace-entry-grid, .user-kpi-row, .page-skeleton__kpis, .page-skeleton__charts { @@ -102,7 +102,7 @@ .kpi-grid, .panel-grid, .overview-charts, - .frequent-menu-grid, + .workspace-entry-grid, .user-kpi-row, .alert-strip, .page-skeleton__kpis,