Files
MAcode/tcs-iptv/internal/model/rights.go
T
selfrelease 2cd5fbec6d 四期(大小屏融合)后端可代码部分:跨域解析网关/扫码验真/跨屏权益通兑
- model/rights.go: ScreenType/ParsedMA/ResolveResult/ScanVerifyResult/UserRights/PurchaseRecord/CrossScreenRightsResult
- service/phase4.go: ParseMACode + Resolve(C.1/C.2) + ScanVerify(B.2) + RecordPurchase/VerifyCrossScreenRights(D.1)
- api/handlers.go: GET /content/resolve, POST /content/scan-verify, /rights/purchase, /rights/verify
- service/phase4_test.go: 18 单测全绿
- 同一MA码跨iptv/ott/app统一解析; 任一屏购买全屏通看不重复扣费
- OTT/移动端SDK/C2PA凭证标注需外部环境
- 更新 5-task-IPTV-四期.md 进度
2026-06-14 19:01:26 +08:00

95 lines
3.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package model
import "time"
// 四期(大小屏融合):跨域解析、扫码验真、跨屏权益相关模型。
// ScreenType 屏幕/终端类型(大小屏融合)。
type ScreenType string
const (
ScreenIPTV ScreenType = "iptv" // 大屏:IPTV 机顶盒
ScreenOTT ScreenType = "ott" // 大屏:OTT 盒子 / 智能电视
ScreenApp ScreenType = "app" // 小屏:手机 APP / 小程序
)
// AllScreens 大小屏融合覆盖的全部屏类型(同一 MA 码跨屏可用)。
func AllScreens() []ScreenType {
return []ScreenType{ScreenIPTV, ScreenOTT, ScreenApp}
}
// ValidScreen 校验屏类型合法性。
func ValidScreen(s ScreenType) bool {
switch s {
case ScreenIPTV, ScreenOTT, ScreenApp:
return true
default:
return false
}
}
// ParsedMA 六段式 MA 码解析结果(含可选集级子标识)。
type ParsedMA struct {
Raw string `json:"raw"` // 原始 MA 码(含集级子标识)
Prefix string `json:"prefix"` // MA
CountryCode string `json:"country_code"` // 156
IndustryNode string `json:"industry_node"` // 行业节点
OrgNode string `json:"org_node"` // 机构节点
Category string `json:"category"` // 内容类目 WD/WJ/DY/DH
Year string `json:"year"` // 年份
Sequence string `json:"sequence"` // 号段内序列
Episode int `json:"episode"` // 集级子标识 #Exx;0 表示整剧
Valid bool `json:"valid"` // 结构是否合法
}
// ResolveResult 跨域解析网关返回(四期 C.1/C.2,大小屏统一解析)。
type ResolveResult struct {
MACode string `json:"ma_code"`
Parsed ParsedMA `json:"parsed"`
Title string `json:"title"`
Status string `json:"status"` // 流通状态(published/revoked/...
InCirculation bool `json:"in_circulation"` // 是否流通中
Screens []ScreenType `json:"screens"` // 跨屏可用屏类型
Issuer string `json:"issuer"`
IssueDate string `json:"issue_date"`
Resolved bool `json:"resolved"`
Message string `json:"message"`
}
// ScanVerifyResult 用户扫码验真返回(四期 B.2)。
type ScanVerifyResult struct {
MACode string `json:"ma_code"`
Authentic bool `json:"authentic"` // MA 码真伪(链上存在且结构合法)
Compliant bool `json:"compliant"` // 是否合规流通(未下架)
Status string `json:"status"`
Title string `json:"title"`
Parsed ParsedMA `json:"parsed"`
Screens []ScreenType `json:"screens"`
Message string `json:"message"`
}
// PurchaseRecord 用户一次购买记录(四期 D.1)。
type PurchaseRecord struct {
MACode string `json:"ma_code"`
UserHash string `json:"user_hash"`
Screen ScreenType `json:"screen"` // 购买时所在屏
PurchasedAt time.Time `json:"purchased_at"`
}
// UserRights 用户跨屏权益账户:以 MA 码为维度记录购买,任一屏购买即全屏通看。
type UserRights struct {
UserHash string `json:"user_hash"`
Purchases map[string]PurchaseRecord `json:"purchases"` // maCode -> record
}
// CrossScreenRightsResult 跨屏权益核验返回(四期 D.1)。
type CrossScreenRightsResult struct {
MACode string `json:"ma_code"`
UserHash string `json:"user_hash"`
Entitled bool `json:"entitled"` // 是否有权益(任一屏购买即全屏通看)
RequestScreen ScreenType `json:"request_screen"` // 当前请求屏
PurchaseScreen ScreenType `json:"purchase_screen,omitempty"` // 原始购买屏
PurchasedAt time.Time `json:"purchased_at,omitempty"`
Message string `json:"message"`
}