syntax = "proto3"; package github.com.topfans.backend.pkg.proto.moderation; option go_package = "github.com/topfans/backend/pkg/proto/moderation;moderation"; // ModerationService - 客户端举报与反馈 API (spec §5.1) // 端口 20011 (接续 aiChatService 20008 + 3, 由 Plan A 修订) service ModerationService { // 举报分类 rpc GetReportCategories(GetReportCategoriesRequest) returns (GetReportCategoriesResponse); rpc GetFeedbackCategories(GetFeedbackCategoriesRequest) returns (GetFeedbackCategoriesResponse); // 举报 rpc SubmitReport(SubmitReportRequest) returns (SubmitReportResponse); rpc ListMyReports(ListMyReportsRequest) returns (ListMyReportsResponse); rpc GetReport(GetReportRequest) returns (GetReportResponse); // 反馈 rpc SubmitFeedback(SubmitFeedbackRequest) returns (SubmitFeedbackResponse); rpc ListMyFeedbacks(ListMyFeedbacksRequest) returns (ListMyFeedbacksResponse); rpc GetFeedback(GetFeedbackRequest) returns (GetFeedbackResponse); } // ====== 举报 ====== message SubmitReportRequest { int64 reporter_id = 1; string target_type = 2; // asset | user_profile int64 target_id = 3; string category_code = 4; // 举报分类 code string description = 5; // <= 500 bool is_anonymous = 6; repeated string evidence_keys = 7; // OSS keys, <= 5 string client_ip = 8; string device_fp = 9; } message SubmitReportResponse { int64 report_id = 1; string status = 2; // pending | auto_hidden bool auto_hidden = 3; bool target_hidden = 4; // 本次 auto-hide 是否执行了 UPDATE int64 claimed_by = 5; int64 claimed_at = 6; int64 created_at = 7; } message ListMyReportsRequest { int64 reporter_id = 1; string status = 2; // 可选过滤 int32 page = 3; int32 page_size = 4; } message ReportSummary { int64 id = 1; string target_type = 2; int64 target_id = 3; string category_code = 4; string status = 5; int64 created_at = 6; int64 resolved_at = 7; string resolved_action = 8; } message ListMyReportsResponse { repeated ReportSummary reports = 1; int32 total = 2; } message GetReportRequest { int64 reporter_id = 1; int64 id = 2; } message GetReportResponse { ReportSummary report = 1; string description = 2; repeated EvidenceSummary evidence = 3; string target_snapshot_json = 4; } message EvidenceSummary { string oss_key = 1; string oss_url = 2; } // ====== 反馈 ====== message SubmitFeedbackRequest { int64 user_id = 1; int64 star_id = 2; string category_code = 3; string title = 4; // <= 100 string content = 5; string contact = 6; // <= 320 bool is_anonymous = 7; repeated string evidence_keys = 8; } message SubmitFeedbackResponse { int64 feedback_id = 1; string status = 2; int64 claimed_by = 3; int64 claimed_at = 4; int64 created_at = 5; } message ListMyFeedbacksRequest { int64 user_id = 1; string status = 2; int32 page = 3; int32 page_size = 4; } message FeedbackSummary { int64 id = 1; string category_code = 2; string title = 3; string status = 4; int64 created_at = 5; int64 replied_at = 6; } message ListMyFeedbacksResponse { repeated FeedbackSummary feedbacks = 1; int32 total = 2; } message GetFeedbackRequest { int64 user_id = 1; int64 id = 2; } message GetFeedbackResponse { FeedbackSummary feedback = 1; string content = 2; string reply_content = 3; repeated EvidenceSummary evidence = 4; } // ====== 分类 ====== message GetReportCategoriesRequest {} message GetFeedbackCategoriesRequest {} message CategoryItem { string code = 1; string name = 2; string description = 3; int32 severity = 4; int32 sort_order = 5; } message GetReportCategoriesResponse { repeated CategoryItem categories = 1; } message GetFeedbackCategoriesResponse { repeated CategoryItem categories = 1; }