四期(大小屏融合)后端可代码部分:跨域解析网关/扫码验真/跨屏权益通兑
- 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 进度
This commit is contained in:
@@ -0,0 +1,94 @@
|
||||
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"`
|
||||
}
|
||||
Reference in New Issue
Block a user