syntax = "proto3"; package proto; option csharp_namespace = "DysonNetwork.Shared.Proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/wrappers.proto"; import "publisher.proto"; // Enums enum PollQuestionType { POLL_QUESTION_TYPE_UNSPECIFIED = 0; SINGLE_CHOICE = 1; MULTIPLE_CHOICE = 2; YES_NO = 3; RATING = 4; FREE_TEXT = 5; } // Messages message PollOption { string id = 1; string label = 2; google.protobuf.StringValue description = 3; int32 order = 4; } message PollQuestion { string id = 1; PollQuestionType type = 2; repeated PollOption options = 3; string title = 4; google.protobuf.StringValue description = 5; int32 order = 6; bool is_required = 7; } message Poll { string id = 1; google.protobuf.StringValue title = 2; google.protobuf.StringValue description = 3; optional google.protobuf.Timestamp ended_at = 4; bool is_anonymous = 5; string publisher_id = 6; optional Publisher publisher = 7; repeated PollQuestion questions = 8; google.protobuf.Timestamp created_at = 9; google.protobuf.Timestamp updated_at = 10; optional google.protobuf.Timestamp deleted_at = 11; } message PollAnswer { string id = 1; bytes answer = 2; // Dictionary string account_id = 3; string poll_id = 4; google.protobuf.Timestamp created_at = 5; google.protobuf.Timestamp updated_at = 6; optional google.protobuf.Timestamp deleted_at = 7; } // ==================================== // Request/Response Messages // ==================================== message GetPollRequest { oneof identifier { string id = 1; } } message GetPollBatchRequest { repeated string ids = 1; } message GetPollBatchResponse { repeated Poll polls = 1; } message ListPollsRequest { google.protobuf.StringValue publisher_id = 1; int32 page_size = 2; string page_token = 3; google.protobuf.StringValue order_by = 4; bool order_desc = 5; } message ListPollsResponse { repeated Poll polls = 1; string next_page_token = 2; int32 total_size = 3; } message GetPollAnswerRequest { string poll_id = 1; string account_id = 2; } message GetPollStatsRequest { string poll_id = 1; } message GetPollStatsResponse { map stats = 1; // Question ID -> JSON string of stats (option_id -> count) } message GetPollQuestionStatsRequest { string question_id = 1; } message GetPollQuestionStatsResponse { map stats = 1; // Option ID -> count } // ==================================== // Service Definitions // ==================================== service PollService { rpc GetPoll(GetPollRequest) returns (Poll); rpc GetPollBatch(GetPollBatchRequest) returns (GetPollBatchResponse); rpc ListPolls(ListPollsRequest) returns (ListPollsResponse); rpc GetPollAnswer(GetPollAnswerRequest) returns (PollAnswer); rpc GetPollStats(GetPollStatsRequest) returns (GetPollStatsResponse); rpc GetPollQuestionStats(GetPollQuestionStatsRequest) returns (GetPollQuestionStatsResponse); }