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 optional bytes sensitive_marks = 12; // List 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 reactions_count = 19; // Dictionary int32 replies_count = 20; map reactions_made = 21; // Dictionary 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 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';