topfans/backend/proto/asset.proto
2026-04-07 22:29:48 +08:00

359 lines
13 KiB
Protocol Buffer
Raw Permalink 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.

syntax = "proto3";
package topfans.asset;
option go_package = "github.com/topfans/backend/pkg/proto/asset;asset";
import "proto/common.proto";
import "google/api/annotations.proto";
// ==================== 资产域 ====================
// 资产信息
message Asset {
int64 asset_id = 1; // 资产ID
int64 owner_uid = 2; // 当前持有者
int64 star_id = 3; // 所属星球
string name = 4; // 藏品名称
string cover_url = 5; // 封面图URL
string material_url = 6; // 用户上传的素材URL
string description = 7; // 藏品描述(可选)
int32 rarity = 8; // 稀有度(可选)
repeated string tags = 9; // 标签数组(可选)
string visibility = 10; // 可见性private, friends, public预留
int32 status = 11; // 状态0=Pending, 1=Active
string tx_hash = 12; // 交易哈希(可选)
int64 block_number = 13; // 区块号(可选)
int32 like_count = 14; // 点赞数
int64 created_at = 15; // 创建时间(毫秒时间戳)
int64 updated_at = 16; // 更新时间(毫秒时间戳)
int64 minted_at = 17; // 上链成功时间(毫秒时间戳,可选)
// 扩展字段:持有者信息(用于详情展示)
OwnerInfo owner = 18; // 持有者信息(保留用于兼容性)
string owner_nickname = 19; // 持有者昵称在该star下的昵称
bool is_liked = 20; // 当前用户是否已点赞
}
// 持有者信息
message OwnerInfo {
int64 user_id = 1; // 用户ID
string nickname = 2; // 昵称
string avatar = 3; // 头像URL
}
// 铸造订单信息
message MintOrder {
string order_id = 1; // 订单IDUUID
int64 user_id = 2; // 用户ID
int64 asset_id = 3; // 关联资产ID可选创建后回填
int64 star_id = 4; // 明星ID
string status = 5; // 状态PENDING, PROCESSING, SUCCESS, FAILED
int64 cost_crystal = 6; // 消耗的水晶数量
string error_message = 7; // 错误信息(可选)
int32 retry_count = 8; // 重试次数
string material_url = 9; // 阶段一保存的素材URL可选
string name = 10; // 阶段一保存的藏品名称(可选)
string description = 11; // 阶段一保存的藏品描述(可选)
string material_type = 12; // 素材类型(可选)
string event = 13; // 藏品事件(可选)
int64 created_at = 14; // 创建时间(毫秒时间戳)
int64 updated_at = 15; // 更新时间(毫秒时间戳)
int64 minted_at = 16; // 上链成功时间(毫秒时间戳,可选)
}
// ==================== 铸造相关消息 ====================
// 阶段一:初始化铸造订单(仅生成并落库 order_idstatus=PENDING
message InitMintOrderRequest {
string order_id = 1; // 订单ID必填gateway生成或前端传入
}
message InitMintOrderResponse {
topfans.common.BaseResponse base = 1;
MintOrder order = 2; // 订单信息status=PENDING
}
// 创建铸造订单请求
message CreateMintOrderRequest {
string order_id = 2; // 阶段一生成的订单ID必填
string name = 1; // 藏品名称(必填,可覆盖阶段一保存值)
string material_url = 3; // 用户上传的素材URL必填前端已上传到OSS
string description = 4; // 藏品描述(可选)
int32 rarity = 5; // 稀有度(可选)
repeated string tags = 6; // 标签列表(可选)
string material_type = 7; // 素材类型(可选)
string event = 8; // 藏品事件(可选)
// cover_url 不再需要前端传入,由后端 AI 处理完成后自动生成
}
// ==================== 阶段一:预创建订单(返回 order_id ====================
message PreCreateMintOrderRequest {
string name = 1; // 藏品名称(可选)
string material_url = 2; // 素材URL必填
string description = 3; // 描述(可选)
string material_type = 4; // 素材类型(可选)
string event = 5; // 藏品事件(可选)
}
message PreCreateMintOrderResponse {
topfans.common.BaseResponse base = 1;
MintOrder order = 2; // 预创建的订单信息status=PENDING
}
// 创建铸造订单响应
message CreateMintOrderResponse {
topfans.common.BaseResponse base = 1;
MintOrder order = 2; // 创建的订单信息
Asset asset = 3; // 创建的资产信息
}
// ==================== 资产查询相关消息 ====================
// 获取我的藏品列表请求
message GetMyAssetsRequest {
int32 page = 1; // 页码默认1
int32 page_size = 2; // 每页数量默认20最大100
string status = 3; // 状态筛选all, pending, minted, failed可选
string keyword = 4; // 关键词搜索(资产名称,可选)
string sort = 5; // 排序方式created_at_desc, created_at_asc, name_asc可选默认created_at_desc
}
// 获取我的藏品列表响应
message GetMyAssetsResponse {
topfans.common.BaseResponse base = 1;
repeated AssetListItem items = 2; // 资产列表
int64 total = 3; // 总数
int32 page = 4; // 当前页码
int32 page_size = 5; // 每页数量
bool has_more = 6; // 是否有更多
}
// 资产列表项(简化版,用于列表展示)
message AssetListItem {
int64 asset_id = 1; // 资产ID
string name = 2; // 藏品名称
string cover_url = 3; // 封面图URL
string status = 4; // 状态pending, minting, minted, failed
string tx_hash = 5; // 交易哈希(可选)
int64 created_at = 6; // 创建时间(毫秒时间戳)
int64 minted_at = 7; // 上链成功时间(毫秒时间戳,可选)
int32 like_count = 8; // 点赞数
}
// 获取资产详情请求
message GetAssetRequest {
int64 asset_id = 1; // 资产ID
}
// 获取资产详情响应
message GetAssetResponse {
topfans.common.BaseResponse base = 1;
Asset asset = 2; // 资产详细信息包含is_liked字段
}
// 查询上链状态请求
message GetAssetStatusRequest {
int64 asset_id = 1; // 资产ID
}
// 查询上链状态响应
message GetAssetStatusResponse {
topfans.common.BaseResponse base = 1;
int64 asset_id = 2; // 资产ID
string status = 3; // 状态pending, minting, minted, failed
string tx_hash = 4; // 交易哈希(可选)
int64 block_number = 5; // 区块号(可选)
int64 minted_at = 6; // 上链成功时间(毫秒时间戳,可选)
string error_message = 7; // 错误信息(如果失败,可选)
}
// 查询铸造订单状态请求
message GetMintOrderRequest {
string order_id = 1; // 订单ID必填
}
// 查询铸造订单状态响应
message GetMintOrderResponse {
topfans.common.BaseResponse base = 1;
MintOrder order = 2; // 订单信息
Asset asset = 3; // 关联的资产信息(如果存在)
}
// 取消铸造订单请求
message CancelMintOrderRequest {
string order_id = 1; // 订单ID必填
}
// 取消铸造订单响应
message CancelMintOrderResponse {
topfans.common.BaseResponse base = 1;
string order_id = 2; // 订单ID
string status = 3; // 订单状态CANCELLED
}
// ==================== 点赞相关消息 ====================
// 点赞资产请求内部RPC供Social Service调用
message LikeAssetRequest {
int64 asset_id = 1; // 资产ID
}
// 点赞资产响应
message LikeAssetResponse {
topfans.common.BaseResponse base = 1;
int32 like_count = 2; // 点赞后的总数
}
// 取消点赞资产请求内部RPC供Social Service调用
message UnlikeAssetRequest {
int64 asset_id = 1; // 资产ID
}
// 取消点赞资产响应
message UnlikeAssetResponse {
topfans.common.BaseResponse base = 1;
int32 like_count = 2; // 取消点赞后的总数
}
// 检查是否已点赞请求内部RPC供Social Service调用
message CheckAssetLikeRequest {
int64 asset_id = 1; // 资产ID
}
// 检查是否已点赞响应
message CheckAssetLikeResponse {
topfans.common.BaseResponse base = 1;
bool is_liked = 2; // 是否已点赞
}
// 点赞记录信息
message AssetLike {
int64 id = 1; // 点赞记录ID
int64 asset_id = 2; // 资产ID
int64 user_id = 3; // 用户ID
int64 star_id = 4; // 明星ID
int64 created_at = 5; // 点赞时间(毫秒时间戳)
}
// 获取资产点赞列表请求内部RPC供Social Service调用
message GetAssetLikesRequest {
int64 asset_id = 1; // 资产ID
int32 page = 2; // 页码默认1
int32 page_size = 3; // 每页数量默认20最大100
}
// 获取资产点赞列表响应
message GetAssetLikesResponse {
topfans.common.BaseResponse base = 1;
repeated AssetLike likes = 2; // 点赞列表
int64 total = 3; // 总数
int32 page = 4; // 当前页码
int32 page_size = 5; // 每页数量
bool has_more = 6; // 是否有更多
}
// ==================== 内部RPC消息供其他服务调用====================
// 获取资产信息请求内部RPC供Social Service调用
message GetAssetForRPCRequest {
int64 asset_id = 1; // 资产ID
}
// 获取资产信息响应内部RPC
message GetAssetForRPCResponse {
topfans.common.BaseResponse base = 1;
int64 asset_id = 2; // 资产ID
int64 owner_uid = 3; // 持有者ID
int64 star_id = 4; // 明星ID
int32 status = 5; // 状态0=Pending, 1=Active
bool is_active = 6; // 是否激活
}
// ==================== 资产服务 ====================
service AssetService {
// 阶段一:初始化订单(生成并落库 order_id由 /api/v1/assets/oss/signature 触发)
rpc InitMintOrder(InitMintOrderRequest) returns (InitMintOrderResponse);
// 阶段一:预创建订单(生成 order_id让前端决定是否继续铸造
rpc PreCreateMintOrder(PreCreateMintOrderRequest) returns (PreCreateMintOrderResponse) {
option (google.api.http) = {
post: "/api/v1/assets/mints/precreate"
body: "*"
};
}
// 创建铸造订单
rpc CreateMintOrder(CreateMintOrderRequest) returns (CreateMintOrderResponse) {
option (google.api.http) = {
post: "/api/v1/assets/mints"
body: "*"
};
}
// 获取我的藏品列表
rpc GetMyAssets(GetMyAssetsRequest) returns (GetMyAssetsResponse) {
option (google.api.http) = {
get: "/api/v1/assets/me"
};
}
// 获取资产详情
rpc GetAsset(GetAssetRequest) returns (GetAssetResponse) {
option (google.api.http) = {
get: "/api/v1/assets/{asset_id}"
};
}
// 查询上链状态
rpc GetAssetStatus(GetAssetStatusRequest) returns (GetAssetStatusResponse) {
option (google.api.http) = {
get: "/api/v1/assets/{asset_id}/status"
};
}
// 查询铸造订单状态
rpc GetMintOrder(GetMintOrderRequest) returns (GetMintOrderResponse) {
option (google.api.http) = {
get: "/api/v1/assets/mints/{order_id}"
};
}
// 取消铸造订单
rpc CancelMintOrder(CancelMintOrderRequest) returns (CancelMintOrderResponse) {
option (google.api.http) = {
delete: "/api/v1/assets/mints/{order_id}"
};
}
// 内部RPC获取资产信息供Social Service调用用于验证资产是否存在
rpc GetAssetForRPC(GetAssetForRPCRequest) returns (GetAssetForRPCResponse);
// 内部RPC点赞资产供Social Service调用
rpc LikeAsset(LikeAssetRequest) returns (LikeAssetResponse);
// 内部RPC取消点赞资产供Social Service调用
rpc UnlikeAsset(UnlikeAssetRequest) returns (UnlikeAssetResponse);
// 内部RPC检查是否已点赞供Social Service调用
rpc CheckAssetLike(CheckAssetLikeRequest) returns (CheckAssetLikeResponse);
// 内部RPC获取资产点赞列表供Social Service调用
rpc GetAssetLikes(GetAssetLikesRequest) returns (GetAssetLikesResponse);
// 内部RPC清除资产点赞记录供Gallery Service调用下架时清除记录以便下次展出可再次点赞
rpc ClearAssetLikeRecords(ClearAssetLikeRecordsRequest) returns (ClearAssetLikeRecordsResponse);
}
// 清除资产点赞记录请求内部RPC供Gallery Service调用
message ClearAssetLikeRecordsRequest {
int64 asset_id = 1; // 资产ID
}
// 清除资产点赞记录响应
message ClearAssetLikeRecordsResponse {
topfans.common.BaseResponse base = 1;
}