# Feature Specification: Channel Management

**ID:** CHANNEL-001
**Version:** 1.0
**Status:** Planned
**Priority:** Critical

## Overview
Channel management system for creating, updating, deleting, and organizing voice communication spaces.

## Channel Model

### Channel Entity
```protobuf
message Channel {
  string id = 1;                    // Unique identifier (UUID)
  string name = 2;                  // Display name
  string description = 3;           // Optional description
  bool is_public = 4;              // Public or private
  string owner_id = 5;             // User who created the channel
  repeated string member_ids = 6;  // List of member IDs
  int32 max_users = 7;             // Max concurrent users (0 = unlimited)
  int64 created_at = 8;            // Unix timestamp
  int64 updated_at = 9;            // Unix timestamp
  ChannelStatus status = 10;       // Active, archived, deleted
}

enum ChannelStatus {
  ACTIVE = 0;
  ARCHIVED = 1;
  DELETED = 2;
}
```

### Channel Properties
- **ID:** UUID v4, immutable
- **Name:** 1-50 characters, alphanumeric + spaces/hyphens
- **Description:** Optional, max 500 characters
- **Public:** Anyone can join (requires authentication only)
- **Private:** Admin only, membership by invitation
- **Max Users:** Unlimited by default, configurable per channel
- **Status:** Active by default, can be archived (soft-delete) or deleted (hard-delete)

## Channel Lifecycle

### Creation
**Requirements:**
- User must be authenticated
- User must have `channels:create` permission
- Name must be unique (case-insensitive)
- At least 2 characters, max 50

**Process:**
```
Client requests CreateChannel
    ↓
Server validates permissions
    ↓
Server validates name uniqueness and format
    ↓
Server creates channel with unique ID
    ↓
Server marks creator as owner
    ↓
Server broadcasts ChannelCreated event
    ↓
Return channel object to client
```

### Joining
**Requirements:**
- User must be authenticated
- Channel must exist and be active
- For public channels: user must be authenticated
- For private channels: user must be invited or owner

**Process:**
```
Client requests JoinChannel(channel_id)
    ↓
Server validates channel exists
    ↓
Server validates access permissions
    ↓
Check max_users capacity
    ↓
Add user to channel members list
    ↓
Broadcast UserJoined event to channel
    ↓
Return success and list of current members
```

### Leaving
**Requirements:**
- User must be in channel

**Process:**
```
User requests LeaveChannel or disconnects
    ↓
Server removes user from channel members
    ↓
Broadcast UserLeft event to channel
    ↓
Clean up user's audio streams
    ↓
Confirm departure
```

### Updates
**Allowed Updates:**
- Name (must remain unique)
- Description
- Public/Private status
- Max users capacity
- Owner reassignment

**Requirements:**
- Only channel owner or admin can update
- Name must remain unique
- Validation of new values

### Deletion
**Soft Delete (Archive):**
- Channel marked as archived
- Existing members can still access
- New users cannot join
- Data preserved for recovery
- Used for channels that may return

**Hard Delete:**
- Permanently removed from system
- All associated data deleted
- Cannot be recovered
- Used for spam/abuse

## Presence & Status

### User Presence
**User State in Channel:**
```
Connected: User is in channel voice call
Inactive: User is in channel but no audio activity (15+ seconds)
Typing: User has text input focus (future)
Away: User idle for >5 minutes (future)
```

### Channel Activity Feed (Future)
- User joined
- User left
- User muted/unmuted
- Channel created/updated
- Admin actions

## Permissions Model

### Channel Owner
- Can modify channel settings
- Can kick members
- Can delete channel
- Can transfer ownership
- Can make channel private/public

### Channel Member
- Can join/leave
- Can speak in channel
- Can see member list
- Can see channel info

### Server Admin
- Can manage all channels
- Can override any permission
- Can archive/delete channels
- Can view audit logs

## API Endpoints (gRPC)

### Channel Service
```protobuf
service ChannelService {
  rpc CreateChannel(CreateChannelRequest) returns (CreateChannelResponse);
  rpc GetChannel(GetChannelRequest) returns (Channel);
  rpc ListChannels(ListChannelsRequest) returns (ListChannelsResponse);
  rpc UpdateChannel(UpdateChannelRequest) returns (Channel);
  rpc DeleteChannel(DeleteChannelRequest) returns (DeleteChannelResponse);
  rpc JoinChannel(JoinChannelRequest) returns (JoinChannelResponse);
  rpc LeaveChannel(LeaveChannelRequest) returns (LeaveChannelResponse);
  rpc ListMembers(ListMembersRequest) returns (ListMembersResponse);
  rpc KickMember(KickMemberRequest) returns (KickMemberResponse);
}
```

## Data Persistence (Phase 2)
Initially, channels are in-memory and lost on server restart.

**Future:** Persistent storage
- Channel metadata in database
- Member lists persisted
- Activity logs
- Backup/restore capability

## Configuration
- Max channels allowed on server
- Max members per channel (default)
- Channel name validation rules
- Soft delete retention period (before hard delete)
- Archive auto-cleanup policy

## Error Handling
- Duplicate channel name: Return AlreadyExists error
- Channel not found: Return NotFound error
- Access denied: Return PermissionDenied error
- Channel full: Return ResourceExhausted error
- User already in channel: Return AlreadyExists error

## Notifications

**Events Broadcast to Channel:**
- UserJoined(user_id, timestamp)
- UserLeft(user_id, timestamp)
- ChannelUpdated(channel, updater_id)
- ChannelDeleted(channel_id, timestamp)

## Testing Strategy
- Unit tests for channel creation with various inputs
- Unit tests for permission validation
- Integration tests for join/leave operations
- Concurrency tests for multiple users joining simultaneously
- Tests for max capacity enforcement
- Soft delete and restore functionality tests
- Event broadcast verification
