topfans/backend/proto/task.proto
2026-06-29 14:47:32 +08:00

328 lines
9.5 KiB
Protocol Buffer
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.

syntax = "proto3";
package topfans.task;
option go_package = "github.com/topfans/backend/pkg/proto/task;task";
import "proto/common.proto";
import "google/api/annotations.proto";
// ==================== 每日任务 ====================
message DailyTaskItem {
string task_key = 1;
int64 star_id = 2;
string name = 3;
string description = 4;
int64 crystal_reward = 5;
string status = 6; // pending/completed/claimed
bool can_claim = 7;
}
message GetDailyTasksRequest {
int64 star_id = 1;
}
message GetDailyTasksResponse {
topfans.common.BaseResponse base = 1;
int64 star_id = 2;
repeated DailyTaskItem tasks = 3;
}
message ReportEventRequest {
string event_type = 1; // 如 "daily_browse_asset", "daily_login"
int64 star_id = 2;
}
message ReportEventResponse {
topfans.common.BaseResponse base = 1;
bool success = 2;
string task_key = 3;
bool task_completed = 4;
string message = 5;
}
message ClaimDailyTaskRequest {
string task_key = 1;
int64 star_id = 2;
}
message ClaimDailyTaskResponse {
topfans.common.BaseResponse base = 1;
bool success = 2;
int64 crystal_balance = 3;
}
message ClaimAllDailyTasksRequest {
int64 star_id = 1;
}
message ClaimAllDailyTasksResponse {
topfans.common.BaseResponse base = 1;
int32 claimed_count = 2;
int64 crystal_balance = 3;
repeated string claimed_task_keys = 4;
}
// ==================== 引导任务 ====================
message OnboardingStage {
int32 stage = 1;
string name = 2;
repeated string required_task_keys = 3;
int64 crystal_reward = 4;
string status = 5; // pending/completed/in_progress
bool is_current = 6;
bool all_tasks_completed = 7; // 该阶段所有任务是否完成
bool is_reward_claimed = 8; // 该阶段奖励是否已领取
}
message CompleteGuideRequest {
string task_key = 1;
repeated OnboardingStage stages = 2; // 前端传入的阶段配置,首次调用时存储
}
message CompleteGuideResponse {
topfans.common.BaseResponse base = 1;
int64 user_id = 2;
int32 current_stage = 3;
string status = 4; // pending/in_progress/completed
repeated OnboardingStage stages = 5;
}
message GetOnboardingStatusRequest {}
message GetOnboardingStatusResponse {
topfans.common.BaseResponse base = 1;
int64 user_id = 2;
int32 current_stage = 3;
string status = 4;
repeated OnboardingStage stages = 5;
}
message AdvanceStageRequest {
int32 target_stage = 1;
}
message AdvanceStageResponse {
topfans.common.BaseResponse base = 1;
int32 current_stage = 2;
string status = 3;
repeated OnboardingStage stages = 4;
}
message ClaimOnboardingRewardRequest {
int32 stage = 1;
}
message ClaimOnboardingRewardResponse {
topfans.common.BaseResponse base = 1;
bool success = 2;
string crystal_balance = 3; // 使用 string 避免 Dubbo int64 序列化 bug
}
// ==================== 展示收益 ====================
message ExhibitionRevenueItem {
int64 id = 1;
int64 star_id = 2;
int64 exhibition_id = 3;
int64 asset_id = 4;
int64 slot_id = 5;
string slot_type = 6; // own/friend
int64 crystal_amount = 7;
int64 cycle_start_time = 8;
int64 cycle_end_time = 9;
string status = 10; // claimable/claimed/failed
bool can_claim = 11;
}
message GetExhibitionRevenueRequest {
int64 star_id = 1;
string status = 2; // 可选筛选
int32 page = 3;
int32 page_size = 4;
}
message GetExhibitionRevenueResponse {
topfans.common.BaseResponse base = 1;
repeated ExhibitionRevenueItem items = 2;
int64 total = 3;
int32 page = 4;
int32 page_size = 5;
}
message ClaimExhibitionRevenueRequest {
int64 revenue_id = 1;
int64 star_id = 2;
}
message ClaimExhibitionRevenueResponse {
topfans.common.BaseResponse base = 1;
bool success = 2;
int64 crystal_amount = 3; // 当前领取的收益金额
int64 total_balance = 4; // 领取后的当前用户全部余额
}
message ClaimAllExhibitionRevenueRequest {
int64 star_id = 1;
}
message ClaimAllExhibitionRevenueResponse {
topfans.common.BaseResponse base = 1;
int32 claimed_count = 2;
}
// ==================== 点赞押注收益 ====================
message LikeBetRevenueItem {
int64 id = 1;
int64 star_id = 2;
int64 exhibition_id = 3;
int64 asset_id = 4;
int64 like_id = 5; // 关联 asset_likes.id
int32 bet_order = 6; // 第几位点赞(按 asset_likes.created_at ASC, id ASC
int32 total_likes = 7; // 该展览内的总押注数审计字段NOT 藏品全局点赞数
int64 crystal_amount = 8;
int64 cycle_start_time = 9;
int64 cycle_end_time = 10;
string status = 11; // claimable/claimed/failed
bool can_claim = 12;
}
message GetLikeBetRevenueRequest {
int64 star_id = 1;
string status = 2; // 可选筛选
int32 page = 3;
int32 page_size = 4;
}
message GetLikeBetRevenueResponse {
topfans.common.BaseResponse base = 1;
repeated LikeBetRevenueItem items = 2;
int64 total = 3;
int32 page = 4;
int32 page_size = 5;
}
message ClaimLikeBetRevenueRequest {
int64 revenue_id = 1;
int64 star_id = 2;
}
message ClaimLikeBetRevenueResponse {
topfans.common.BaseResponse base = 1;
bool success = 2;
int64 crystal_amount = 3; // 当前领取的收益金额
int64 total_balance = 4; // 领取后的当前用户全部余额
}
message ClaimAllLikeBetRevenueRequest {
int64 star_id = 1;
}
message ClaimAllLikeBetRevenueResponse {
topfans.common.BaseResponse base = 1;
int32 claimed_count = 2;
}
// ==================== 内部RPC服务 ====================
message InitUserTasksRequest {
int64 user_id = 1;
int64 star_id = 2;
}
message InitUserTasksResponse {
topfans.common.BaseResponse base = 1;
bool success = 2;
}
message OnExhibitionCompletedRequest {
int64 exhibition_id = 1;
int64 asset_id = 2;
int64 slot_id = 3;
int64 occupier_uid = 4;
int64 occupier_star_id = 5;
int64 slot_owner_uid = 6;
int64 crystal_amount = 7;
int64 start_time = 8;
int64 expire_at = 9;
int32 like_count = 10; // 点赞数用于在taskService中根据资产等级重新计算收益
}
message OnExhibitionCompletedResponse {
topfans.common.BaseResponse base = 1;
int64 revenue_record_id = 2;
}
// 内部 RPCcleanup_worker 调用,记录一次展览到期产生的所有点赞押注收益
message RecordLikeBetRevenueRequest {
int64 exhibition_id = 1;
int64 asset_id = 2;
int64 total_likes = 3; // 展览内总点赞数len(likes)NOT 藏品全局点赞数。RPC 内部自行计算,调用方传入值仅作日志审计
int64 start_time = 4;
int64 expire_at = 5;
}
message RecordLikeBetRevenueResponse {
topfans.common.BaseResponse base = 1;
repeated int64 revenue_record_ids = 2;
int32 created_count = 3;
}
// ==================== Mobile API Service ====================
service TaskMobileService {
rpc GetDailyTasks(GetDailyTasksRequest) returns (GetDailyTasksResponse) {
option (google.api.http) = { get: "/api/tasks/daily"; };
}
rpc ReportEvent(ReportEventRequest) returns (ReportEventResponse) {
option (google.api.http) = { post: "/api/tasks/report-event"; body: "*"; };
}
rpc ClaimDailyTask(ClaimDailyTaskRequest) returns (ClaimDailyTaskResponse) {
option (google.api.http) = { post: "/api/tasks/daily/claim"; body: "*"; };
}
rpc ClaimAllDailyTasks(ClaimAllDailyTasksRequest) returns (ClaimAllDailyTasksResponse) {
option (google.api.http) = { post: "/api/tasks/daily/claim-all"; body: "*"; };
}
rpc CompleteGuide(CompleteGuideRequest) returns (CompleteGuideResponse) {
option (google.api.http) = { post: "/api/tasks/guide/complete"; body: "*"; };
}
rpc GetOnboardingStatus(GetOnboardingStatusRequest) returns (GetOnboardingStatusResponse) {
option (google.api.http) = { get: "/api/tasks/onboarding/status"; };
}
rpc AdvanceStage(AdvanceStageRequest) returns (AdvanceStageResponse) {
option (google.api.http) = { post: "/api/tasks/onboarding/advance-stage"; body: "*"; };
}
rpc ClaimOnboardingReward(ClaimOnboardingRewardRequest) returns (ClaimOnboardingRewardResponse) {
option (google.api.http) = { post: "/api/tasks/onboarding/claim-reward"; body: "*"; };
}
rpc GetExhibitionRevenue(GetExhibitionRevenueRequest) returns (GetExhibitionRevenueResponse) {
option (google.api.http) = { get: "/api/v1/tasks/exhibition-revenue"; };
}
rpc ClaimExhibitionRevenue(ClaimExhibitionRevenueRequest) returns (ClaimExhibitionRevenueResponse) {
option (google.api.http) = { post: "/api/v1/tasks/exhibition-revenue/claim"; body: "*"; };
}
rpc ClaimAllExhibitionRevenue(ClaimAllExhibitionRevenueRequest) returns (ClaimAllExhibitionRevenueResponse) {
option (google.api.http) = { post: "/api/v1/tasks/exhibition-revenue/claim-all"; body: "*"; };
}
rpc GetLikeBetRevenue(GetLikeBetRevenueRequest) returns (GetLikeBetRevenueResponse) {
option (google.api.http) = { get: "/api/v1/tasks/like-bet-revenue"; };
}
rpc ClaimLikeBetRevenue(ClaimLikeBetRevenueRequest) returns (ClaimLikeBetRevenueResponse) {
option (google.api.http) = { post: "/api/v1/tasks/like-bet-revenue/claim"; body: "*"; };
}
rpc ClaimAllLikeBetRevenue(ClaimAllLikeBetRevenueRequest) returns (ClaimAllLikeBetRevenueResponse) {
option (google.api.http) = { post: "/api/v1/tasks/like-bet-revenue/claim-all"; body: "*"; };
}
}
// ==================== Internal RPC Service ====================
service TaskInternalService {
rpc InitUserTasks(InitUserTasksRequest) returns (InitUserTasksResponse);
rpc OnExhibitionCompleted(OnExhibitionCompletedRequest) returns (OnExhibitionCompletedResponse);
rpc RecordLikeBetRevenue(RecordLikeBetRevenueRequest) returns (RecordLikeBetRevenueResponse);
}