syntax = "proto3"; package appks.im.v1; import "google/protobuf/timestamp.proto"; // ── ChannelMemberRole ────────────────────────────────────────────────── message ChannelRole { string id = 1; string channel_id = 2; string name = 3; repeated string permissions = 4; bool assignable = 5; google.protobuf.Timestamp created_at = 6; google.protobuf.Timestamp updated_at = 7; } message ListChannelRolesRequest { string channel_id = 1; } message ListChannelRolesResponse { repeated ChannelRole roles = 1; } message CreateChannelRoleRequest { string channel_id = 1; string name = 2; repeated string permissions = 3; bool assignable = 4; } message CreateChannelRoleResponse { ChannelRole role = 1; } message UpdateChannelRoleRequest { string role_id = 1; optional string name = 2; repeated string permissions = 3; optional bool assignable = 4; } message UpdateChannelRoleResponse { ChannelRole role = 1; } message DeleteChannelRoleRequest { string role_id = 1; } message DeleteChannelRoleResponse {} service ChannelRoleService { rpc ListChannelRoles(ListChannelRolesRequest) returns (ListChannelRolesResponse); rpc CreateChannelRole(CreateChannelRoleRequest) returns (CreateChannelRoleResponse); rpc UpdateChannelRole(UpdateChannelRoleRequest) returns (UpdateChannelRoleResponse); rpc DeleteChannelRole(DeleteChannelRoleRequest) returns (DeleteChannelRoleResponse); } // ── ChannelInvitation ────────────────────────────────────────────────── message ChannelInvitation { string id = 1; string channel_id = 2; string invited_by = 3; string invited_user_id = 4; string role = 5; string status = 6; google.protobuf.Timestamp created_at = 7; google.protobuf.Timestamp updated_at = 8; } message ListInvitationsRequest { string channel_id = 1; } message ListInvitationsResponse { repeated ChannelInvitation invitations = 1; } message CreateInvitationRequest { string channel_id = 1; string invited_user_id = 2; string role = 3; } message CreateInvitationResponse { ChannelInvitation invitation = 1; } message AcceptInvitationRequest { string invitation_id = 1; } message AcceptInvitationResponse { ChannelInvitation invitation = 1; } message RevokeInvitationRequest { string invitation_id = 1; } message RevokeInvitationResponse {} service ChannelInvitationService { rpc ListInvitations(ListInvitationsRequest) returns (ListInvitationsResponse); rpc CreateInvitation(CreateInvitationRequest) returns (CreateInvitationResponse); rpc AcceptInvitation(AcceptInvitationRequest) returns (AcceptInvitationResponse); rpc RevokeInvitation(RevokeInvitationRequest) returns (RevokeInvitationResponse); } // ── ChannelWebhook ───────────────────────────────────────────────────── message ChannelWebhook { string id = 1; string channel_id = 2; string name = 3; string url = 4; string secret = 5; repeated string events = 6; bool active = 7; google.protobuf.Timestamp created_at = 8; google.protobuf.Timestamp updated_at = 9; } message ListWebhooksRequest { string channel_id = 1; } message ListWebhooksResponse { repeated ChannelWebhook webhooks = 1; } message CreateWebhookRequest { string channel_id = 1; string name = 2; string url = 3; optional string secret = 4; repeated string events = 5; } message CreateWebhookResponse { ChannelWebhook webhook = 1; } message UpdateWebhookRequest { string webhook_id = 1; optional string name = 2; optional string url = 3; optional string secret = 4; repeated string events = 5; optional bool active = 6; } message UpdateWebhookResponse { ChannelWebhook webhook = 1; } message DeleteWebhookRequest { string webhook_id = 1; } message DeleteWebhookResponse {} service ChannelWebhookService { rpc ListWebhooks(ListWebhooksRequest) returns (ListWebhooksResponse); rpc CreateWebhook(CreateWebhookRequest) returns (CreateWebhookResponse); rpc UpdateWebhook(UpdateWebhookRequest) returns (UpdateWebhookResponse); rpc DeleteWebhook(DeleteWebhookRequest) returns (DeleteWebhookResponse); } // ── ChannelSlashCommand ──────────────────────────────────────────────── message ChannelSlashCommand { string id = 1; string channel_id = 2; string command = 3; string description = 4; string request_url = 5; repeated string scopes = 6; google.protobuf.Timestamp created_at = 7; google.protobuf.Timestamp updated_at = 8; } message ListSlashCommandsRequest { string channel_id = 1; } message ListSlashCommandsResponse { repeated ChannelSlashCommand commands = 1; } message CreateSlashCommandRequest { string channel_id = 1; string command = 2; string description = 3; string request_url = 4; repeated string scopes = 5; } message CreateSlashCommandResponse { ChannelSlashCommand command = 1; } message UpdateSlashCommandRequest { string command_id = 1; optional string description = 2; optional string request_url = 3; repeated string scopes = 4; } message UpdateSlashCommandResponse { ChannelSlashCommand command = 1; } message DeleteSlashCommandRequest { string command_id = 1; } message DeleteSlashCommandResponse {} service ChannelSlashCommandService { rpc ListSlashCommands(ListSlashCommandsRequest) returns (ListSlashCommandsResponse); rpc CreateSlashCommand(CreateSlashCommandRequest) returns (CreateSlashCommandResponse); rpc UpdateSlashCommand(UpdateSlashCommandRequest) returns (UpdateSlashCommandResponse); rpc DeleteSlashCommand(DeleteSlashCommandRequest) returns (DeleteSlashCommandResponse); } // ── ChannelRepoLink ──────────────────────────────────────────────────── message ChannelRepoLink { string id = 1; string channel_id = 2; string repo_id = 3; string link_type = 4; repeated string events = 5; google.protobuf.Timestamp created_at = 6; google.protobuf.Timestamp updated_at = 7; } message ListRepoLinksRequest { string channel_id = 1; } message ListRepoLinksResponse { repeated ChannelRepoLink links = 1; } message CreateRepoLinkRequest { string channel_id = 1; string repo_id = 2; string link_type = 3; repeated string events = 4; } message CreateRepoLinkResponse { ChannelRepoLink link = 1; } message DeleteRepoLinkRequest { string link_id = 1; } message DeleteRepoLinkResponse {} service ChannelRepoLinkService { rpc ListRepoLinks(ListRepoLinksRequest) returns (ListRepoLinksResponse); rpc CreateRepoLink(CreateRepoLinkRequest) returns (CreateRepoLinkResponse); rpc DeleteRepoLink(DeleteRepoLinkRequest) returns (DeleteRepoLinkResponse); } // ── ImIntegration ────────────────────────────────────────────────────── message ImIntegration { string id = 1; string channel_id = 2; string provider = 3; string external_channel_id = 4; string sync_direction = 5; bool active = 6; google.protobuf.Timestamp created_at = 7; google.protobuf.Timestamp updated_at = 8; } message ListIntegrationsRequest { string channel_id = 1; } message ListIntegrationsResponse { repeated ImIntegration integrations = 1; } message CreateIntegrationRequest { string channel_id = 1; string provider = 2; string external_channel_id = 3; string sync_direction = 4; } message CreateIntegrationResponse { ImIntegration integration = 1; } message UpdateIntegrationRequest { string integration_id = 1; optional string sync_direction = 2; optional bool active = 3; } message UpdateIntegrationResponse { ImIntegration integration = 1; } message DeleteIntegrationRequest { string integration_id = 1; } message DeleteIntegrationResponse {} service ImIntegrationService { rpc ListIntegrations(ListIntegrationsRequest) returns (ListIntegrationsResponse); rpc CreateIntegration(CreateIntegrationRequest) returns (CreateIntegrationResponse); rpc UpdateIntegration(UpdateIntegrationRequest) returns (UpdateIntegrationResponse); rpc DeleteIntegration(DeleteIntegrationRequest) returns (DeleteIntegrationResponse); } // ── CustomEmoji ──────────────────────────────────────────────────────── message CustomEmoji { string id = 1; string workspace_id = 2; string name = 3; string image_url = 4; google.protobuf.Timestamp created_at = 5; } message ListCustomEmojisRequest { string workspace_id = 1; } message ListCustomEmojisResponse { repeated CustomEmoji emojis = 1; } message CreateCustomEmojiRequest { string workspace_id = 1; string name = 2; string image_url = 3; } message CreateCustomEmojiResponse { CustomEmoji emoji = 1; } message DeleteCustomEmojiRequest { string emoji_id = 1; } message DeleteCustomEmojiResponse {} service CustomEmojiService { rpc ListCustomEmojis(ListCustomEmojisRequest) returns (ListCustomEmojisResponse); rpc CreateCustomEmoji(CreateCustomEmojiRequest) returns (CreateCustomEmojiResponse); rpc DeleteCustomEmoji(DeleteCustomEmojiRequest) returns (DeleteCustomEmojiResponse); } // ── ForumTag ─────────────────────────────────────────────────────────── message ForumTag { string id = 1; string channel_id = 2; string name = 3; bool moderated = 4; int32 position = 5; google.protobuf.Timestamp created_at = 6; google.protobuf.Timestamp updated_at = 7; } message ListForumTagsRequest { string channel_id = 1; } message ListForumTagsResponse { repeated ForumTag tags = 1; } message CreateForumTagRequest { string channel_id = 1; string name = 2; bool moderated = 3; optional int32 position = 4; } message CreateForumTagResponse { ForumTag tag = 1; } message UpdateForumTagRequest { string tag_id = 1; optional string name = 2; optional bool moderated = 3; optional int32 position = 4; } message UpdateForumTagResponse { ForumTag tag = 1; } message DeleteForumTagRequest { string tag_id = 1; } message DeleteForumTagResponse {} service ForumTagService { rpc ListForumTags(ListForumTagsRequest) returns (ListForumTagsResponse); rpc CreateForumTag(CreateForumTagRequest) returns (CreateForumTagResponse); rpc UpdateForumTag(UpdateForumTagRequest) returns (UpdateForumTagResponse); rpc DeleteForumTag(DeleteForumTagRequest) returns (DeleteForumTagResponse); } // ── VoiceParticipant ─────────────────────────────────────────────────── message VoiceParticipant { string id = 1; string channel_id = 2; string user_id = 3; bool muted = 4; bool deafened = 5; google.protobuf.Timestamp joined_at = 6; } message ListVoiceParticipantsRequest { string channel_id = 1; } message ListVoiceParticipantsResponse { repeated VoiceParticipant participants = 1; } message UpdateVoiceStateRequest { string channel_id = 1; string user_id = 2; optional bool muted = 3; optional bool deafened = 4; } message UpdateVoiceStateResponse { VoiceParticipant participant = 1; } service VoiceService { rpc ListVoiceParticipants(ListVoiceParticipantsRequest) returns (ListVoiceParticipantsResponse); rpc UpdateVoiceState(UpdateVoiceStateRequest) returns (UpdateVoiceStateResponse); } // ── Stage ────────────────────────────────────────────────────────────── message Stage { string id = 1; string channel_id = 2; string topic = 3; string privacy_level = 4; bool discoverable = 5; google.protobuf.Timestamp started_at = 6; google.protobuf.Timestamp ended_at = 7; google.protobuf.Timestamp created_at = 8; google.protobuf.Timestamp updated_at = 9; } message GetStageRequest { string channel_id = 1; } message GetStageResponse { Stage stage = 1; } message CreateStageRequest { string channel_id = 1; string topic = 2; string privacy_level = 3; bool discoverable = 4; } message CreateStageResponse { Stage stage = 1; } message UpdateStageRequest { string stage_id = 1; optional string topic = 2; optional string privacy_level = 3; optional bool discoverable = 4; } message UpdateStageResponse { Stage stage = 1; } message DeleteStageRequest { string stage_id = 1; } message DeleteStageResponse {} service StageService { rpc GetStage(GetStageRequest) returns (GetStageResponse); rpc CreateStage(CreateStageRequest) returns (CreateStageResponse); rpc UpdateStage(UpdateStageRequest) returns (UpdateStageResponse); rpc DeleteStage(DeleteStageRequest) returns (DeleteStageResponse); } // ── ChannelEvent (Audit Log) ─────────────────────────────────────────── message ChannelAuditEvent { string id = 1; string channel_id = 2; string actor_id = 3; string event_type = 4; string target_type = 5; string target_id = 6; optional string old_value = 7; optional string new_value = 8; google.protobuf.Timestamp created_at = 9; } message ListChannelEventsRequest { string channel_id = 1; int32 limit = 2; int32 offset = 3; } message ListChannelEventsResponse { repeated ChannelAuditEvent events = 1; int32 total = 2; } service ChannelAuditService { rpc ListChannelEvents(ListChannelEventsRequest) returns (ListChannelEventsResponse); }