Files
Swarm/DysonNetwork.Shared/Proto/post.proto

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';