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; int64 exp_reward = 6; string status = 7; // pending/completed/claimed bool can_claim = 8; } 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; int64 experience = 4; } message ClaimAllDailyTasksRequest { int64 star_id = 1; } message ClaimAllDailyTasksResponse { topfans.common.BaseResponse base = 1; int32 claimed_count = 2; int64 crystal_balance = 3; int64 experience = 4; repeated string claimed_task_keys = 5; } // ==================== 引导任务 ==================== message OnboardingStage { int32 stage = 1; string name = 2; repeated string required_task_keys = 3; int64 crystal_reward = 4; int64 exp_reward = 5; string status = 6; // pending/completed/in_progress bool is_current = 7; } message CompleteGuideRequest { string task_key = 1; } 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; } // ==================== 展示收益 ==================== 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; } message ClaimAllExhibitionRevenueRequest { int64 star_id = 1; } message ClaimAllExhibitionRevenueResponse { 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; } message OnExhibitionCompletedResponse { topfans.common.BaseResponse base = 1; int64 revenue_record_id = 2; } // ==================== 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/tasks/exhibition-revenue"; }; } rpc ClaimExhibitionRevenue(ClaimExhibitionRevenueRequest) returns (ClaimExhibitionRevenueResponse) { option (google.api.http) = { post: "/api/tasks/exhibition-revenue/claim"; body: "*"; }; } rpc ClaimAllExhibitionRevenue(ClaimAllExhibitionRevenueRequest) returns (ClaimAllExhibitionRevenueResponse) { option (google.api.http) = { post: "/api/tasks/exhibition-revenue/claim-all"; body: "*"; }; } } // ==================== Internal RPC Service ==================== service TaskInternalService { rpc InitUserTasks(InitUserTasksRequest) returns (InitUserTasksResponse); rpc OnExhibitionCompleted(OnExhibitionCompletedRequest) returns (OnExhibitionCompletedResponse); }