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; } // 内部 RPC:cleanup_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); }