syntax = "proto3"; package appks.im.v1; import "google/protobuf/timestamp.proto"; // Channel management service for the IM microservice. // Provides CRUD for channels and categories, plus channel statistics. // ── Enums ────────────────────────────────────────────────────────────── enum ChannelType { CHANNEL_TYPE_UNSPECIFIED = 0; CHANNEL_TYPE_PUBLIC = 1; CHANNEL_TYPE_PRIVATE = 2; CHANNEL_TYPE_DIRECT = 3; CHANNEL_TYPE_GROUP = 4; CHANNEL_TYPE_REPO = 5; CHANNEL_TYPE_SYSTEM = 6; } enum ChannelKind { CHANNEL_KIND_UNSPECIFIED = 0; CHANNEL_KIND_TEXT = 1; CHANNEL_KIND_VOICE = 2; CHANNEL_KIND_STAGE = 3; CHANNEL_KIND_FORUM = 4; CHANNEL_KIND_ANNOUNCEMENT = 5; } enum Visibility { VISIBILITY_UNSPECIFIED = 0; VISIBILITY_PUBLIC = 1; VISIBILITY_PRIVATE = 2; VISIBILITY_INTERNAL = 3; VISIBILITY_WORKSPACE = 4; VISIBILITY_PROTECTED = 5; VISIBILITY_HIDDEN = 6; VISIBILITY_SECRET = 7; } // ── Messages ─────────────────────────────────────────────────────────── message Channel { string id = 1; string workspace_id = 2; optional string category_id = 3; optional string parent_channel_id = 4; string name = 5; optional string topic = 6; optional string description = 7; ChannelType channel_type = 8; ChannelKind channel_kind = 9; Visibility visibility = 10; int32 position = 11; bool nsfw = 12; bool read_only = 13; bool archived = 14; optional string created_by = 15; optional int32 rate_limit_per_user = 16; optional google.protobuf.Timestamp archived_at = 17; optional string last_message_id = 18; optional google.protobuf.Timestamp last_message_at = 19; google.protobuf.Timestamp created_at = 20; google.protobuf.Timestamp updated_at = 21; } message ChannelStats { string channel_id = 1; int32 members_count = 2; int32 messages_count = 3; int32 threads_count = 4; int32 reactions_count = 5; int32 mentions_count = 6; int32 files_count = 7; optional google.protobuf.Timestamp last_activity_at = 8; google.protobuf.Timestamp updated_at = 9; } message ChannelCategory { string id = 1; string workspace_id = 2; string name = 3; int32 position = 4; bool collapsed = 5; google.protobuf.Timestamp created_at = 6; google.protobuf.Timestamp updated_at = 7; } // ── Requests / Responses ────────────────────────────────────────────── message GetChannelRequest { string channel_id = 1; } message GetChannelResponse { Channel channel = 1; } message ListChannelsRequest { string workspace_name = 1; optional string category_id = 2; optional ChannelType channel_type = 3; optional ChannelKind channel_kind = 4; int32 limit = 5; int32 offset = 6; } message ListChannelsResponse { repeated Channel channels = 1; int32 total = 2; } message CreateChannelRequest { string workspace_name = 1; string name = 2; optional string topic = 3; optional string description = 4; optional string channel_type = 5; optional string channel_kind = 6; optional string visibility = 7; optional string category_id = 8; optional string parent_channel_id = 9; optional string created_by = 10; optional int32 rate_limit_per_user = 11; } message CreateChannelResponse { Channel channel = 1; } message UpdateChannelRequest { string channel_id = 1; optional string name = 2; optional string topic = 3; optional string description = 4; optional string visibility = 5; optional int32 position = 6; optional bool nsfw = 7; optional bool read_only = 8; optional bool archived = 9; optional string category_id = 10; optional int32 rate_limit_per_user = 11; } message UpdateChannelResponse { Channel channel = 1; } message DeleteChannelRequest { string channel_id = 1; } message DeleteChannelResponse {} message GetChannelStatsRequest { string channel_id = 1; } message GetChannelStatsResponse { ChannelStats stats = 1; } message ListCategoriesRequest { string workspace_name = 1; } message ListCategoriesResponse { repeated ChannelCategory categories = 1; } message CreateCategoryRequest { string workspace_name = 1; string name = 2; optional int32 position = 3; } message CreateCategoryResponse { ChannelCategory category = 1; } message UpdateCategoryRequest { string category_id = 1; optional string name = 2; optional int32 position = 3; optional bool collapsed = 4; } message UpdateCategoryResponse { ChannelCategory category = 1; } message DeleteCategoryRequest { string category_id = 1; } message DeleteCategoryResponse {} // ── Service ─────────────────────────────────────────────────────────── service ChannelService { rpc GetChannel(GetChannelRequest) returns (GetChannelResponse); rpc ListChannels(ListChannelsRequest) returns (ListChannelsResponse); rpc CreateChannel(CreateChannelRequest) returns (CreateChannelResponse); rpc UpdateChannel(UpdateChannelRequest) returns (UpdateChannelResponse); rpc DeleteChannel(DeleteChannelRequest) returns (DeleteChannelResponse); rpc GetChannelStats(GetChannelStatsRequest) returns (GetChannelStatsResponse); rpc ListCategories(ListCategoriesRequest) returns (ListCategoriesResponse); rpc CreateCategory(CreateCategoryRequest) returns (CreateCategoryResponse); rpc UpdateCategory(UpdateCategoryRequest) returns (UpdateCategoryResponse); rpc DeleteCategory(DeleteCategoryRequest) returns (DeleteCategoryResponse); }