284 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Protocol Buffer
		
	
	
	
	
	
			
		
		
	
	
			284 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Protocol Buffer
		
	
	
	
	
	
| syntax = "proto3";
 | |
| 
 | |
| package proto;
 | |
| 
 | |
| option csharp_namespace = "DysonNetwork.Shared.Proto";
 | |
| 
 | |
| import "google/protobuf/timestamp.proto";
 | |
| import "google/protobuf/wrappers.proto";
 | |
| import "google/protobuf/struct.proto";
 | |
| import "file.proto";
 | |
| import "realm.proto";
 | |
| import "publisher.proto";
 | |
| 
 | |
| // Enums
 | |
| enum PostType {
 | |
|   POST_TYPE_UNSPECIFIED = 0;
 | |
|   MOMENT = 1;
 | |
|   ARTICLE = 2;
 | |
| }
 | |
| 
 | |
| enum PostVisibility {
 | |
|   VISIBILITY_UNSPECIFIED = 0;
 | |
|   PUBLIC = 1;
 | |
|   FRIENDS = 2;
 | |
|   UNLISTED = 3;
 | |
|   PRIVATE = 4;
 | |
| }
 | |
| 
 | |
| enum PostPinMode {
 | |
|   PIN_MODE_UNSPECIFIED = 0;
 | |
|   PUBLISHER_PAGE = 1;
 | |
|   REALM_PAGE = 2;
 | |
|   REPLY_PAGE = 3;
 | |
| }
 | |
| 
 | |
| enum ContentSensitiveMark {
 | |
|   SENSITIVE_MARK_UNSPECIFIED = 0;
 | |
|   LANGUAGE = 1;
 | |
|   SEXUAL_CONTENT = 2;
 | |
|   VIOLENCE = 3;
 | |
|   PROFANITY = 4;
 | |
|   HATE_SPEECH = 5;
 | |
|   RACISM = 6;
 | |
|   ADULT_CONTENT = 7;
 | |
|   DRUG_ABUSE = 8;
 | |
|   ALCOHOL_ABUSE = 9;
 | |
|   GAMBLING = 10;
 | |
|   SELF_HARM = 11;
 | |
|   CHILD_ABUSE = 12;
 | |
|   OTHER = 13;
 | |
| }
 | |
| 
 | |
| enum PostReactionAttitude {
 | |
|   ATTITUDE_UNSPECIFIED = 0;
 | |
|   POST_ATTITUDE_POSITIVE = 1;
 | |
|   POST_ATTITUDE_NEUTRAL = 2;
 | |
|   POST_ATTITUDE_NEGATIVE = 3;
 | |
| }
 | |
| 
 | |
| enum PostEmbedViewRenderer {
 | |
|   RENDERER_UNSPECIFIED = 0;
 | |
|   WEBVIEW = 1;
 | |
| }
 | |
| 
 | |
| // Messages
 | |
| 
 | |
| message PostEmbedView {
 | |
|   string uri = 1;
 | |
|   optional double aspect_ratio = 2;
 | |
|   PostEmbedViewRenderer renderer = 3;
 | |
| }
 | |
| 
 | |
| message Post {
 | |
|   string id = 1;
 | |
|   string title = 2;
 | |
|   string description = 3;
 | |
|   string slug = 4;
 | |
|   optional google.protobuf.Timestamp edited_at = 5;
 | |
|   optional google.protobuf.Timestamp published_at = 6;
 | |
|   PostVisibility visibility = 7;
 | |
|   optional string content = 8;
 | |
| 
 | |
|   PostType type = 9;
 | |
|   optional PostPinMode pin_mode = 10;
 | |
|   optional bytes meta = 11; // Dictionary<string, object>
 | |
|   optional bytes sensitive_marks = 12; // List<ContentSensitiveMark>
 | |
|   optional PostEmbedView embed_view = 13;
 | |
| 
 | |
|   int32 views_unique = 14;
 | |
|   int32 views_total = 15;
 | |
|   int32 upvotes = 16;
 | |
|   int32 downvotes = 17;
 | |
|   double awarded_score = 18;
 | |
| 
 | |
|   // Not mapped fields: handled client-side
 | |
|   map<string, int32> reactions_count = 19; // Dictionary<string, int>
 | |
|   int32 replies_count = 20;
 | |
|   map<string, bool> reactions_made = 21; // Dictionary<string, bool>
 | |
| 
 | |
|   bool replied_gone = 22;
 | |
|   bool forwarded_gone = 23;
 | |
| 
 | |
|   optional string replied_post_id = 24;
 | |
|   optional Post replied_post = 25; // full if populated
 | |
|   optional string forwarded_post_id = 26;
 | |
|   optional Post forwarded_post = 27; // full if populated
 | |
| 
 | |
|   optional string realm_id = 28;
 | |
|   optional Realm realm = 29; // full if populated
 | |
| 
 | |
|   repeated CloudFile attachments = 30; // List<SnCloudFileReferenceObject>
 | |
| 
 | |
|   string publisher_id = 31;
 | |
|   Publisher publisher = 32;
 | |
| 
 | |
|   repeated PostAward awards = 33;
 | |
|   repeated PostReaction reactions = 34;
 | |
|   repeated PostTag tags = 35;
 | |
|   repeated PostCategory categories = 36;
 | |
|   repeated PostFeaturedRecord featured_records = 37;
 | |
| 
 | |
|   // Added for ToActivity
 | |
|   google.protobuf.Timestamp created_at = 38;
 | |
|   google.protobuf.Timestamp updated_at = 39;
 | |
|   optional google.protobuf.Timestamp deleted_at = 40;
 | |
| }
 | |
| 
 | |
| message PostTag {
 | |
|   string id = 1;
 | |
|   string slug = 2;
 | |
|   string name = 3;
 | |
| 
 | |
|   google.protobuf.Timestamp created_at = 4;
 | |
|   google.protobuf.Timestamp updated_at = 5;
 | |
| }
 | |
| 
 | |
| message PostCategory {
 | |
|   string id = 1;
 | |
|   string slug = 2;
 | |
|   string name = 3;
 | |
| 
 | |
|   google.protobuf.Timestamp created_at = 4;
 | |
|   google.protobuf.Timestamp updated_at = 5;
 | |
| }
 | |
| 
 | |
| message PostCategorySubscription {
 | |
|   string id = 1;
 | |
|   string account_id = 2;
 | |
| 
 | |
|   optional string category_id = 3;
 | |
|   optional PostCategory category = 4;
 | |
|   optional string tag_id = 5;
 | |
|   optional PostTag tag = 6;
 | |
| 
 | |
|   google.protobuf.Timestamp created_at = 7;
 | |
|   google.protobuf.Timestamp updated_at = 8;
 | |
| }
 | |
| 
 | |
| message PostCollection {
 | |
|   string id = 1;
 | |
|   string slug = 2;
 | |
|   optional google.protobuf.StringValue name = 3;
 | |
|   optional google.protobuf.StringValue description = 4;
 | |
| 
 | |
|   Publisher publisher = 5;
 | |
|   optional string publisher_id = 6; // for cases where full publisher not needed
 | |
| 
 | |
|   repeated Post posts = 7;
 | |
| 
 | |
|   google.protobuf.Timestamp created_at = 8;
 | |
|   google.protobuf.Timestamp updated_at = 9;
 | |
| }
 | |
| 
 | |
| message PostFeaturedRecord {
 | |
|   string id = 1;
 | |
|   string post_id = 2;
 | |
|   optional google.protobuf.Timestamp featured_at = 3;
 | |
|   int32 social_credits = 4;
 | |
| 
 | |
|   google.protobuf.Timestamp created_at = 5;
 | |
|   google.protobuf.Timestamp updated_at = 6;
 | |
| }
 | |
| 
 | |
| message PostReaction {
 | |
|   string id = 1;
 | |
|   string symbol = 2;
 | |
|   PostReactionAttitude attitude = 3;
 | |
| 
 | |
|   string post_id = 4;
 | |
|   string account_id = 5;
 | |
|   optional Account account = 6; // optional full account
 | |
| 
 | |
|   google.protobuf.Timestamp created_at = 7;
 | |
|   google.protobuf.Timestamp updated_at = 8;
 | |
| }
 | |
| 
 | |
| message PostAward {
 | |
|   string id = 1;
 | |
|   double amount = 2;
 | |
|   PostReactionAttitude attitude = 3;
 | |
|   optional google.protobuf.StringValue message = 4;
 | |
| 
 | |
|   string post_id = 5;
 | |
|   string account_id = 6;
 | |
| 
 | |
|   google.protobuf.Timestamp created_at = 7;
 | |
|   google.protobuf.Timestamp updated_at = 8;
 | |
| }
 | |
| 
 | |
| // ====================================
 | |
| // Request/Response Messages
 | |
| // ====================================
 | |
| 
 | |
| message GetPostRequest {
 | |
|   string id = 1;
 | |
| }
 | |
| 
 | |
| message GetPostBatchRequest {
 | |
|   repeated string ids = 1;
 | |
| }
 | |
| 
 | |
| message GetPostBatchResponse {
 | |
|   repeated Post posts = 1;
 | |
| }
 | |
| 
 | |
| message SearchPostsRequest {
 | |
|   string query = 1;
 | |
|   string publisher_id = 2;
 | |
|   string realm_id = 3;
 | |
|   int32 page_size = 4;
 | |
|   string page_token = 5;
 | |
|   string order_by = 6;
 | |
| }
 | |
| 
 | |
| message SearchPostsResponse {
 | |
|   repeated Post posts = 1;
 | |
|   string next_page_token = 2;
 | |
|   int32 total_size = 3;
 | |
| }
 | |
| 
 | |
| message ListPostsRequest {
 | |
|   string publisher_id = 1;
 | |
|   string realm_id = 2;
 | |
|   int32 page_size = 3;
 | |
|   string page_token = 4;
 | |
|   string order_by = 5;
 | |
|   repeated string categories = 6;
 | |
|   repeated string tags = 7;
 | |
|   string query = 8;
 | |
|   repeated PostType types = 9;
 | |
|   optional google.protobuf.Timestamp after = 10;  // Filter posts created after this timestamp
 | |
|   optional google.protobuf.Timestamp before = 11; // Filter posts created before this timestamp
 | |
|   bool include_replies = 12; // Include reply posts
 | |
|   optional PostPinMode pinned = 13; // Filter by pinned mode (if present, null means not pinned)
 | |
|   bool only_media = 14; // Only return posts with attachments
 | |
|   bool shuffle = 15; // Random order
 | |
| }
 | |
| 
 | |
| message ListPostsResponse {
 | |
|   repeated Post posts = 1;
 | |
|   string next_page_token = 2;
 | |
|   int32 total_size = 3;
 | |
| }
 | |
| 
 | |
| // ====================================
 | |
| // Service Definitions
 | |
| // ====================================
 | |
| 
 | |
| service PostService {
 | |
|   // Get a single post by id
 | |
|   rpc GetPost(GetPostRequest) returns (Post);
 | |
| 
 | |
|   // Get multiple posts by ids
 | |
|   rpc GetPostBatch(GetPostBatchRequest) returns (GetPostBatchResponse);
 | |
| 
 | |
|   // Search posts
 | |
|   rpc SearchPosts(SearchPostsRequest) returns (SearchPostsResponse);
 | |
| 
 | |
|   // List posts with filters
 | |
|   rpc ListPosts(ListPostsRequest) returns (ListPostsResponse);
 | |
| }
 | |
| 
 | |
| import 'account.proto';
 |