@host = http://localhost:8080 @tenantCode = 2s # NOTE: # - tenant module requires JWT auth + tenant membership. # - Get a token via `tests/super.http` (`/super/v1/auth/token`) then paste it below. @token = eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoyLCJpc3MiOiJ2MiIsImV4cCI6MTc2NjYzMzAyMSwibmJmIjoxNzY2MDI4MjExfQ.RjLVil6EnbPi4LMPyVBzR2vFaeXelypk5fKInsAzqc8 ### Tenant - Me (resolved tenant/user/tenant_user) GET {{ host }}/t/{{ tenantCode }}/v1/me Content-Type: application/json Authorization: Bearer {{ token }} ### Tenant - My balance GET {{ host }}/t/{{ tenantCode }}/v1/me/balance Content-Type: application/json Authorization: Bearer {{ token }} ### Tenant - My ledgers (paged) GET {{ host }}/t/{{ tenantCode }}/v1/me/ledgers?page=1&limit=20 Content-Type: application/json Authorization: Bearer {{ token }} ### Tenant - Contents list (published) GET {{ host }}/t/{{ tenantCode }}/v1/contents?page=1&limit=10 Content-Type: application/json Authorization: Bearer {{ token }} ### Tenant - Content detail (visibility + access check) @contentID = 1 GET {{ host }}/t/{{ tenantCode }}/v1/contents/{{ contentID }} Content-Type: application/json Authorization: Bearer {{ token }} ### Tenant - Preview assets (role=preview) GET {{ host }}/t/{{ tenantCode }}/v1/contents/{{ contentID }}/preview Content-Type: application/json Authorization: Bearer {{ token }} ### Tenant - Main assets (role=main, requires access unless free/owner) GET {{ host }}/t/{{ tenantCode }}/v1/contents/{{ contentID }}/assets Content-Type: application/json Authorization: Bearer {{ token }} ### Tenant - Purchase content (tenant balance) POST {{ host }}/t/{{ tenantCode }}/v1/contents/{{ contentID }}/purchase Content-Type: application/json Authorization: Bearer {{ token }} { "idempotency_key": "purchase-{{ contentID }}-001" } ### Tenant - My orders list GET {{ host }}/t/{{ tenantCode }}/v1/orders?page=1&limit=10 Content-Type: application/json Authorization: Bearer {{ token }} ### Tenant - My orders list (filter by status/content_id/paid_at window) GET {{ host }}/t/{{ tenantCode }}/v1/orders?page=1&limit=10&status=paid&content_id={{ contentID }} Content-Type: application/json Authorization: Bearer {{ token }} ### Tenant - My order detail GET {{ host }}/t/{{ tenantCode }}/v1/orders/{{ orderID }} Content-Type: application/json Authorization: Bearer {{ token }} ### Tenant Admin - Create content draft POST {{ host }}/t/{{ tenantCode }}/v1/admin/contents Content-Type: application/json Authorization: Bearer {{ token }} { "title": "示例内容", "description": "这是一个内容草稿,用于联调", "visibility": "tenant_only", "preview_seconds": 60 } ### Tenant Admin - Update content (publish/unpublish/title/description/preview_seconds) PATCH {{ host }}/t/{{ tenantCode }}/v1/admin/contents/{{ contentID }} Content-Type: application/json Authorization: Bearer {{ token }} { "title": "示例内容(已更新)", "status": "published" } ### Tenant Admin - Upsert content price/discount PUT {{ host }}/t/{{ tenantCode }}/v1/admin/contents/{{ contentID }}/price Content-Type: application/json Authorization: Bearer {{ token }} { "currency": "CNY", "price_amount": 990, "discount_type": "none", "discount_value": 0 } ### Tenant Admin - Attach asset to content (main/cover/preview) @assetID = 1 POST {{ host }}/t/{{ tenantCode }}/v1/admin/contents/{{ contentID }}/assets Content-Type: application/json Authorization: Bearer {{ token }} { "asset_id": {{ assetID }}, "role": "main", "sort": 0 } ### Tenant Admin - Orders list GET {{ host }}/t/{{ tenantCode }}/v1/admin/orders?page=1&limit=10 Content-Type: application/json Authorization: Bearer {{ token }} ### Tenant Admin - Orders list (filter by user_id/content_id/paid_at range/amount_paid range) GET {{ host }}/t/{{ tenantCode }}/v1/admin/orders?page=1&limit=10&user_id=2&content_id={{ contentID }}&paid_at_from=2025-01-01T00:00:00Z&paid_at_to=2026-01-01T00:00:00Z&amount_paid_min=1&amount_paid_max=99999999 Content-Type: application/json Authorization: Bearer {{ token }} ### Tenant Admin - Order detail @orderID = 1 GET {{ host }}/t/{{ tenantCode }}/v1/admin/orders/{{ orderID }} Content-Type: application/json Authorization: Bearer {{ token }} ### Tenant Admin - Refund order (default window paid_at + 24h) POST {{ host }}/t/{{ tenantCode }}/v1/admin/orders/{{ orderID }}/refund Content-Type: application/json Authorization: Bearer {{ token }} { "force": false, "reason": "联调退款", "idempotency_key": "refund-{{ orderID }}-001" } ### Tenant Admin - Topup a tenant member @topupUserID = 2 POST {{ host }}/t/{{ tenantCode }}/v1/admin/users/{{ topupUserID }}/topup Content-Type: application/json Authorization: Bearer {{ token }} { "amount": 1000, "reason": "联调充值", "idempotency_key": "topup-{{ topupUserID }}-001" }