topfans/backend/proto/task.proto
2026-04-17 17:17:32 +08:00

251 lines
6.8 KiB
Protocol Buffer

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;
bool all_tasks_completed = 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
string experience = 4; // 使用 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;
}
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);
}