07409eb602
Closes HIF-4 Stage 2 交付:人工奖领奖工单完整闭环。crypto / physical / manual_other 三类奖品从抽中到 mark-paid 的全流程可用。 - 迁移 02159_lottery_claim:UNIQUE(draw_id) + 3 支持索引,状态机 pending_claim→reviewing→paying→paid,rejected 可复活,超时 expired - 3 个 PrizeHandler:Dispatch→ErrDispatchNotSupported 兜底、ClaimSchema 各自形态、ValidateClaim 表驱动 - BuildCryptoClaimSchema:抽中时按奖品 config.networks 注入 enum,前端下拉直接可用 - Draw service dispatchOrEnqueueClaim:人工奖同 tx 插 pending_claim(回滚双清),nonce 重放回读 ExpiresAt + ClaimFormSchema - POST /claim 实装:ownership 校验 → prize 类型校验 → handler.ValidateClaim → crypto network 白名单二次校验 → tx CAS status IN (pending_claim, rejected) AND expires_at > now - Admin CRUD 5 接口:list(IN 批拉 snap + user,无 N+1)、summary(GROUP BY 一次拿计数 + overdue 单查)、approve/reject/mark-paid 全走 CAS + audit - Scheduler @every 1h 扫过期,级联 lottery_draw.dispatch_state → expired - 新增错误码 100005-100011(already_submitted / invalid_claim_data / draw_not_found / not_your_draw / claim_expired / claim_state_invalid) - Rebase 后 Stage 2 测试主动 reuse PR E 的 unmetReasonsNotEmpty + evaluatedAtNotZero matcher,人工奖分支若绕过守卫会立即挂 - Stage 1 全部 4 处 guardrail 后端 rebase 时自检过:UnmetReasons、EvaluatedAt、GrantLedger.Payload、AdminMetaMiddleware 全保留 CI 全绿;28 files, +2442/-126;覆盖率 handler 78.9% / model.lottery 74.3% / draw 68.7% / queue/lottery 76.9%
87 lines
2.7 KiB
Plaintext
87 lines
2.7 KiB
Plaintext
syntax = "v1"
|
|
|
|
info (
|
|
title: "Lottery Admin API"
|
|
desc: "Admin-facing lottery endpoints for HIF-3 Stage 1"
|
|
author: "hifast"
|
|
version: "0.1.0"
|
|
)
|
|
|
|
import "../types.api"
|
|
|
|
@server (
|
|
prefix: v1/admin/lottery
|
|
group: admin/lottery
|
|
middleware: AuthMiddleware
|
|
)
|
|
service ppanel {
|
|
@doc "Create a new activity (status=draft)"
|
|
@handler CreateLotteryActivity
|
|
post /activities (CreateAdminLotteryActivityRequest) returns (AdminLotteryActivity)
|
|
|
|
@doc "Update mutable activity fields"
|
|
@handler UpdateLotteryActivity
|
|
put /activities (UpdateAdminLotteryActivityRequest) returns (AdminLotteryActivity)
|
|
|
|
@doc "List activities (paginated)"
|
|
@handler ListLotteryActivities
|
|
get /activities (ListAdminLotteryActivitiesRequest) returns (ListAdminLotteryActivitiesResponse)
|
|
|
|
@doc "Get one activity"
|
|
@handler GetLotteryActivity
|
|
get /activities/detail (AdminActivityIdRequest) returns (AdminLotteryActivity)
|
|
|
|
@doc "Publish (draft/paused → running)"
|
|
@handler PublishLotteryActivity
|
|
post /activities/publish (AdminActivityIdRequest)
|
|
|
|
@doc "Pause (running → paused)"
|
|
@handler PauseLotteryActivity
|
|
post /activities/pause (AdminActivityIdRequest)
|
|
|
|
@doc "Update eligibility/chance_sources (rule-caps enforced)"
|
|
@handler UpdateLotteryRules
|
|
put /activities/rules (UpdateAdminLotteryRulesRequest)
|
|
|
|
@doc "Create prize"
|
|
@handler CreateLotteryPrize
|
|
post /prizes (CreateAdminLotteryPrizeRequest) returns (AdminLotteryPrize)
|
|
|
|
@doc "Update prize"
|
|
@handler UpdateLotteryPrize
|
|
put /prizes (UpdateAdminLotteryPrizeRequest) returns (AdminLotteryPrize)
|
|
|
|
@doc "Delete prize"
|
|
@handler DeleteLotteryPrize
|
|
delete /prizes (AdminPrizeIdRequest)
|
|
|
|
@doc "List prizes on an activity"
|
|
@handler ListLotteryPrizes
|
|
get /prizes (ListAdminLotteryPrizesRequest) returns (ListAdminLotteryPrizesResponse)
|
|
|
|
@doc "Manually grant N chances to a user (idempotent by source_ref)"
|
|
@handler GrantLotteryChance
|
|
post /chances/grant (GrantAdminLotteryChanceRequest)
|
|
|
|
// Stage 2 (HIF-4): 人工奖工单接口
|
|
@doc "List manual-claim work orders (filter by type/status/activity/user/time)"
|
|
@handler ListLotteryClaims
|
|
get /claims (ListAdminLotteryClaimsRequest) returns (ListAdminLotteryClaimsResponse)
|
|
|
|
@doc "Summary counts for claims workbench"
|
|
@handler LotteryClaimsSummary
|
|
get /claims/summary returns (AdminLotteryClaimsSummary)
|
|
|
|
@doc "Approve a claim (reviewing -> paying)"
|
|
@handler ApproveLotteryClaim
|
|
post /claims/approve (AdminApproveClaimRequest)
|
|
|
|
@doc "Reject a claim (reviewing/paying -> rejected; user may resubmit)"
|
|
@handler RejectLotteryClaim
|
|
post /claims/reject (AdminRejectClaimRequest)
|
|
|
|
@doc "Mark as paid (paying -> paid, records tx_hash/delivery_ref)"
|
|
@handler MarkPaidLotteryClaim
|
|
post /claims/mark-paid (AdminMarkPaidClaimRequest)
|
|
}
|