250 lines
7.0 KiB
Protocol Buffer
250 lines
7.0 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;
|
||
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;
|
||
}
|
||
|
||
// ==================== 内部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;
|
||
}
|
||
|
||
// ==================== 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: "*"; };
|
||
}
|
||
}
|
||
|
||
// ==================== Internal RPC Service ====================
|
||
|
||
service TaskInternalService {
|
||
rpc InitUserTasks(InitUserTasksRequest) returns (InitUserTasksResponse);
|
||
rpc OnExhibitionCompleted(OnExhibitionCompletedRequest) returns (OnExhibitionCompletedResponse);
|
||
}
|