syntax = "proto3"; package proto; option csharp_namespace = "DysonNetwork.Shared.Proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/wrappers.proto"; import "google/protobuf/field_mask.proto"; import "google/protobuf/struct.proto"; import 'file.proto'; // Account represents a user account in the system message Account { string id = 1; string name = 2; string nick = 3; string language = 4; google.protobuf.Timestamp activated_at = 5; bool is_superuser = 6; AccountProfile profile = 7; repeated AccountContact contacts = 8; repeated AccountBadge badges = 9; repeated AccountAuthFactor auth_factors = 10; repeated AccountConnection connections = 11; repeated Relationship outgoing_relationships = 12; repeated Relationship incoming_relationships = 13; google.protobuf.Timestamp created_at = 14; google.protobuf.Timestamp updated_at = 15; } // Profile contains detailed information about a user message AccountProfile { string id = 1; google.protobuf.StringValue first_name = 2; google.protobuf.StringValue middle_name = 3; google.protobuf.StringValue last_name = 4; google.protobuf.StringValue bio = 5; google.protobuf.StringValue gender = 6; google.protobuf.StringValue pronouns = 7; google.protobuf.StringValue time_zone = 8; google.protobuf.StringValue location = 9; google.protobuf.Timestamp birthday = 10; google.protobuf.Timestamp last_seen_at = 11; VerificationMark verification = 12; BadgeReferenceObject active_badge = 13; int32 experience = 14; int32 level = 15; double leveling_progress = 16; CloudFile picture = 19; CloudFile background = 20; string account_id = 21; google.protobuf.Timestamp created_at = 22; google.protobuf.Timestamp updated_at = 23; } // AccountContact represents a contact method for an account message AccountContact { string id = 1; AccountContactType type = 2; google.protobuf.Timestamp verified_at = 3; bool is_primary = 4; string content = 5; string account_id = 6; google.protobuf.Timestamp created_at = 7; google.protobuf.Timestamp updated_at = 8; } // Enum for contact types enum AccountContactType { ACCOUNT_CONTACT_TYPE_UNSPECIFIED = 0; EMAIL = 1; PHONE_NUMBER = 2; ADDRESS = 3; } // AccountAuthFactor represents an authentication factor for an account message AccountAuthFactor { string id = 1; AccountAuthFactorType type = 2; google.protobuf.StringValue secret = 3; // Omitted from JSON serialization in original map config = 4; // Omitted from JSON serialization in original int32 trustworthy = 5; google.protobuf.Timestamp enabled_at = 6; google.protobuf.Timestamp expired_at = 7; string account_id = 8; map created_response = 9; // For initial setup google.protobuf.Timestamp created_at = 10; google.protobuf.Timestamp updated_at = 11; } // Enum for authentication factor types enum AccountAuthFactorType { AUTH_FACTOR_TYPE_UNSPECIFIED = 0; PASSWORD = 1; EMAIL_CODE = 2; IN_APP_CODE = 3; TIMED_CODE = 4; PIN_CODE = 5; } // AccountBadge represents a badge associated with an account message AccountBadge { string id = 1; // Unique identifier for the badge string type = 2; // Type/category of the badge google.protobuf.StringValue label = 3; // Display name of the badge google.protobuf.StringValue caption = 4; // Optional description of the badge map meta = 5; // Additional metadata for the badge google.protobuf.Timestamp activated_at = 6; // When the badge was activated google.protobuf.Timestamp expired_at = 7; // Optional expiration time string account_id = 8; // ID of the account this badge belongs to google.protobuf.Timestamp created_at = 9; google.protobuf.Timestamp updated_at = 10; } // AccountConnection represents a third-party connection for an account message AccountConnection { string id = 1; string provider = 2; string provided_identifier = 3; map meta = 4; google.protobuf.StringValue access_token = 5; // Omitted from JSON serialization google.protobuf.StringValue refresh_token = 6; // Omitted from JSON serialization google.protobuf.Timestamp last_used_at = 7; string account_id = 8; google.protobuf.Timestamp created_at = 9; google.protobuf.Timestamp updated_at = 10; } // VerificationMark represents verification status message VerificationMark { VerificationMarkType type = 1; string title = 2; string description = 3; string verified_by = 4; google.protobuf.Timestamp created_at = 5; google.protobuf.Timestamp updated_at = 6; } enum VerificationMarkType { VERIFICATION_MARK_TYPE_UNSPECIFIED = 0; OFFICIAL = 1; INDIVIDUAL = 2; ORGANIZATION = 3; GOVERNMENT = 4; CREATOR = 5; DEVELOPER = 6; PARODY = 7; } // BadgeReferenceObject represents a reference to a badge with minimal information message BadgeReferenceObject { string id = 1; // Unique identifier for the badge string type = 2; // Type/category of the badge google.protobuf.StringValue label = 3; // Display name of the badge google.protobuf.StringValue caption = 4; // Optional description of the badge map meta = 5; // Additional metadata for the badge google.protobuf.Timestamp activated_at = 6; // When the badge was activated google.protobuf.Timestamp expired_at = 7; // Optional expiration time string account_id = 8; // ID of the account this badge belongs to } // Relationship represents a connection between two accounts message Relationship { string account_id = 1; string related_id = 2; optional Account account = 3; optional Account related = 4; int32 status = 5; google.protobuf.Timestamp created_at = 6; google.protobuf.Timestamp updated_at = 7; } // Leveling information message LevelingInfo { int32 current_level = 1; int32 current_experience = 2; int32 next_level_experience = 3; int32 previous_level_experience = 4; double level_progress = 5; repeated int32 experience_per_level = 6; } // ActionLog represents a record of an action taken by a user message ActionLog { string id = 1; // Unique identifier for the log entry string action = 2; // The action that was performed, e.g., "user.login" map meta = 3; // Metadata associated with the action google.protobuf.StringValue user_agent = 4; // User agent of the client google.protobuf.StringValue ip_address = 5; // IP address of the client google.protobuf.StringValue location = 6; // Geographic location of the client, derived from IP string account_id = 7; // The account that performed the action google.protobuf.StringValue session_id = 8; // The session in which the action was performed google.protobuf.Timestamp created_at = 9; // When the action log was created } // ==================================== // Service Definitions // ==================================== // AccountService provides CRUD operations for user accounts and related entities service AccountService { // Account Operations rpc GetAccount(GetAccountRequest) returns (Account) {} rpc GetAccountBatch(GetAccountBatchRequest) returns (GetAccountBatchResponse) {} rpc ListAccounts(ListAccountsRequest) returns (ListAccountsResponse) {} // Profile Operations rpc GetProfile(GetProfileRequest) returns (AccountProfile) {} // Contact Operations rpc ListContacts(ListContactsRequest) returns (ListContactsResponse) {} // Badge Operations rpc ListBadges(ListBadgesRequest) returns (ListBadgesResponse) {} // Authentication Factor Operations rpc ListAuthFactors(ListAuthFactorsRequest) returns (ListAuthFactorsResponse) {} // Connection Operations rpc ListConnections(ListConnectionsRequest) returns (ListConnectionsResponse) {} // Relationship Operations rpc ListRelationships(ListRelationshipsRequest) returns (ListRelationshipsResponse) {} rpc GetRelationship(GetRelationshipRequest) returns (GetRelationshipResponse) {} rpc HasRelationship(GetRelationshipRequest) returns (google.protobuf.BoolValue) {} rpc ListFriends(ListRelationshipSimpleRequest) returns (ListRelationshipSimpleResponse) {} rpc ListBlocked(ListRelationshipSimpleRequest) returns (ListRelationshipSimpleResponse) {} } // ActionLogService provides operations for action logs service ActionLogService { rpc CreateActionLog(CreateActionLogRequest) returns (CreateActionLogResponse) {} rpc ListActionLogs(ListActionLogsRequest) returns (ListActionLogsResponse) {} } // ==================================== // Request/Response Messages // ==================================== // ActionLog Requests/Responses message CreateActionLogRequest { string action = 1; map meta = 2; google.protobuf.StringValue user_agent = 3; google.protobuf.StringValue ip_address = 4; google.protobuf.StringValue location = 5; string account_id = 6; google.protobuf.StringValue session_id = 7; } message CreateActionLogResponse { ActionLog action_log = 1; } message ListActionLogsRequest { string account_id = 1; string action = 2; int32 page_size = 3; string page_token = 4; string order_by = 5; } message ListActionLogsResponse { repeated ActionLog action_logs = 1; string next_page_token = 2; int32 total_size = 3; } // Account Requests/Responses message GetAccountRequest { string id = 1; // Account ID to retrieve } message GetAccountBatchRequest { repeated string id = 1; // Account ID to retrieve } message GetAccountBatchResponse { repeated Account accounts = 1; // List of accounts } message CreateAccountRequest { string name = 1; // Required: Unique username string nick = 2; // Optional: Display name string language = 3; // Default language bool is_superuser = 4; // Admin flag AccountProfile profile = 5; // Initial profile data } message UpdateAccountRequest { string id = 1; // Account ID to update google.protobuf.StringValue name = 2; // New username if changing google.protobuf.StringValue nick = 3; // New display name google.protobuf.StringValue language = 4; // New language google.protobuf.BoolValue is_superuser = 5; // Admin status } message DeleteAccountRequest { string id = 1; // Account ID to delete bool purge = 2; // If true, permanently delete instead of soft delete } message ListAccountsRequest { int32 page_size = 1; // Number of results per page string page_token = 2; // Token for pagination string filter = 3; // Filter expression string order_by = 4; // Sort order } message ListAccountsResponse { repeated Account accounts = 1; // List of accounts string next_page_token = 2; // Token for next page int32 total_size = 3; // Total number of accounts } // Profile Requests/Responses message GetProfileRequest { string account_id = 1; // Account ID to get profile for } message UpdateProfileRequest { string account_id = 1; // Account ID to update profile for AccountProfile profile = 2; // Profile data to update google.protobuf.FieldMask update_mask = 3; // Fields to update } // Contact Requests/Responses message AddContactRequest { string account_id = 1; // Account to add contact to AccountContactType type = 2; // Type of contact string content = 3; // Contact content (email, phone, etc.) bool is_primary = 4; // If this should be the primary contact } message ListContactsRequest { string account_id = 1; // Account ID to list contacts for AccountContactType type = 2; // Optional: filter by type bool verified_only = 3; // Only return verified contacts } message ListContactsResponse { repeated AccountContact contacts = 1; // List of contacts } message VerifyContactRequest { string id = 1; // Contact ID to verify string account_id = 2; // Account ID (for validation) string code = 3; // Verification code } // Badge Requests/Responses message ListBadgesRequest { string account_id = 1; // Account to list badges for string type = 2; // Optional: filter by type bool active_only = 3; // Only return active (non-expired) badges } message ListBadgesResponse { repeated AccountBadge badges = 1; // List of badges } message ListAuthFactorsRequest { string account_id = 1; // Account to list factors for bool active_only = 2; // Only return active (non-expired) factors } message ListAuthFactorsResponse { repeated AccountAuthFactor factors = 1; // List of auth factors } message ListConnectionsRequest { string account_id = 1; // Account to list connections for string provider = 2; // Optional: filter by provider } message ListConnectionsResponse { repeated AccountConnection connections = 1; // List of connections } // Relationship Requests/Responses message ListRelationshipsRequest { string account_id = 1; // Account to list relationships for optional int32 status = 2; // Filter by status int32 page_size = 5; // Number of results per page string page_token = 6; // Token for pagination } message ListRelationshipsResponse { repeated Relationship relationships = 1; // List of relationships string next_page_token = 2; // Token for next page int32 total_size = 3; // Total number of relationships } message GetRelationshipRequest { string account_id = 1; string related_id = 2; optional int32 status = 3; } message GetRelationshipResponse { optional Relationship relationship = 1; } message ListRelationshipSimpleRequest { string account_id = 1; } message ListRelationshipSimpleResponse { repeated string accounts_id = 1; }