# Class ChannelsController | EchoHub Documentation

# Class ChannelsController

Namespace
  EchoHub.Server.Controllers

Assembly
  EchoHub.Server.dll

    [ApiController]
    [Route("api/channels")]
    [Authorize]
    [EnableRateLimiting("general")]
    public class ChannelsController : ControllerBase

Inheritance
  object
  ControllerBase
  ChannelsController

Inherited Members
  object.GetType()
  object.MemberwiseClone()
  object.ToString()
  object.Equals(object)
  object.Equals(object, object)
  object.ReferenceEquals(object, object)
  object.GetHashCode()

## Constructors

### ChannelsController(IChannelService, EchoHubDbContext, FileStorageService, ImageToAsciiService, IHttpClientFactory, IChatService, IMessageEncryptionService, UploadLimits, ILogger<ChannelsController>)

    public ChannelsController(IChannelService channelService, EchoHubDbContext db, FileStorageService fileStorage, ImageToAsciiService asciiService, IHttpClientFactory httpClientFactory, IChatService chatService, IMessageEncryptionService encryption, UploadLimits uploadLimits, ILogger<ChannelsController> logger)

#### Parameters

`channelService` IChannelService
`db` EchoHubDbContext
`fileStorage` FileStorageService
`asciiService` ImageToAsciiService
`httpClientFactory` IHttpClientFactory
`chatService` IChatService
`encryption` IMessageEncryptionService
`uploadLimits` UploadLimits
`logger` ILogger<ChannelsController>

## Methods

### CreateChannel(CreateChannelRequest)

    [HttpPost]
    public Task<IActionResult> CreateChannel(CreateChannelRequest request)

#### Parameters

`request` CreateChannelRequest

#### Returns

Task<IActionResult>

### DeleteChannel(string)

    [HttpDelete("{channel}")]
    public Task<IActionResult> DeleteChannel(string channel)

#### Parameters

`channel` string

#### Returns

Task<IActionResult>

### GetChannelCrypto(string)

Public crypto metadata for a channel: whether it is end-to-end encrypted and the PBKDF2 salt clients need to derive their join credential. Never returns the wrapped room key — that is only handed out after a successful join.

    [HttpGet("{channel}/crypto")]
    public Task<IActionResult> GetChannelCrypto(string channel)

#### Parameters

`channel` string

#### Returns

Task<IActionResult>

### GetChannelMeta(string)

Human-facing summary of a channel (message count, unique posters, estimated size, created date, room id). Available for encrypted channels too — these are metadata the server tracks even though it cannot read the messages themselves.

    [HttpGet("{channel}/meta")]
    public Task<IActionResult> GetChannelMeta(string channel)

#### Parameters

`channel` string

#### Returns

Task<IActionResult>

### GetChannels(int, int)

    [HttpGet]
    public Task<IActionResult> GetChannels(int offset = 0, int limit = 50)

#### Parameters

`offset` int
`limit` int

#### Returns

Task<IActionResult>

### RekeyChannel(string, RekeyChannelRequest)

Changes an encrypted channel's passphrase by re-wrapping its room key. The caller proves knowledge of the old passphrase via the old auth key; history is never re-encrypted (the room content key does not change).

    [HttpPost("{channel}/rekey")]
    public Task<IActionResult> RekeyChannel(string channel, RekeyChannelRequest request)

#### Parameters

`channel` string
`request` RekeyChannelRequest

#### Returns

Task<IActionResult>

### SendMessageWithAttachments(string, string?)

Sends one message carrying optional text (`content` form field) plus zero or more file attachments (Discord-style). For non-encrypted channels the server sniffs each file's kind and renders ASCII previews for images. For end-to-end encrypted channels the client uploads ciphertext blobs and declares each file's kind (`kind`) and pre-rendered, room-encrypted preview (`preview`), aligned by file order — the server never inspects them.

    [HttpPost("{channel}/messages")]
    [EnableRateLimiting("upload")]
    public Task<IActionResult> SendMessageWithAttachments(string channel, string? size = null)

#### Parameters

`channel` string
`size` string

#### Returns

Task<IActionResult>

### SendUrl(string, SendUrlRequest, string?)

    [HttpPost("{channel}/send-url")]
    [EnableRateLimiting("upload")]
    public Task<IActionResult> SendUrl(string channel, SendUrlRequest request, string? size = null)

#### Parameters

`channel` string
`request` SendUrlRequest
`size` string

#### Returns

Task<IActionResult>

### UpdateTopic(string, UpdateTopicRequest)

    [HttpPut("{channel}/topic")]
    public Task<IActionResult> UpdateTopic(string channel, UpdateTopicRequest request)

#### Parameters

`channel` string
`request` UpdateTopicRequest

#### Returns

Task<IActionResult>