basePath: /api/v1
definitions:
  auth.UserProfile:
    properties:
      accent_color:
        type: string
      avatar:
        type: string
      bio:
        type: string
      created_at:
        type: string
      display_name:
        type: string
      email:
        type: string
      id:
        type: string
      status:
        type: string
      status_text:
        type: string
      username:
        type: string
    type: object
  auth.loginRequest:
    properties:
      email:
        type: string
      password:
        type: string
    type: object
  auth.registerRequest:
    properties:
      display_name:
        type: string
      email:
        type: string
      password:
        type: string
      username:
        type: string
    type: object
  auth.updateProfileRequest:
    properties:
      accent_color:
        type: string
      bio:
        type: string
      display_name:
        type: string
      status_text:
        type: string
    type: object
  bot.addToServerRequest:
    properties:
      server_id:
        type: string
    type: object
  bot.botResponse:
    properties:
      avatar:
        type: string
      created_at:
        type: string
      description:
        type: string
      id:
        type: string
      name:
        type: string
      owner_id:
        type: string
    type: object
  bot.botWithToken:
    properties:
      avatar:
        type: string
      created_at:
        type: string
      description:
        type: string
      id:
        type: string
      name:
        type: string
      owner_id:
        type: string
      token:
        type: string
    type: object
  bot.createBotRequest:
    properties:
      description:
        type: string
      name:
        type: string
    type: object
  bot.createCommandRequest:
    properties:
      description:
        type: string
      name:
        type: string
      options: {}
      server_id:
        type: string
    type: object
  bot.slashCommandResponse:
    properties:
      bot_id:
        type: string
      created_at:
        type: string
      description:
        type: string
      id:
        type: string
      name:
        type: string
      options: {}
      server_id:
        type: string
    type: object
  bot.updateBotRequest:
    properties:
      avatar:
        type: string
      description:
        type: string
      name:
        type: string
    type: object
  channel.channelResponse:
    properties:
      category:
        type: string
      created_at:
        type: string
      id:
        type: string
      name:
        type: string
      position:
        type: integer
      server_id:
        type: string
      type:
        type: string
    type: object
  channel.createChannelRequest:
    properties:
      category:
        type: string
      name:
        type: string
      position:
        type: integer
      server_id:
        type: string
      type:
        type: string
    type: object
  channel.updateChannelRequest:
    properties:
      category:
        type: string
      name:
        type: string
      position:
        type: integer
      type:
        type: string
    type: object
  invite.createInviteRequest:
    properties:
      expires_hours:
        type: integer
      max_uses:
        type: integer
    type: object
  invite.inviteResponse:
    properties:
      code:
        type: string
      created_at:
        type: string
      creator_id:
        type: string
      expires_at:
        type: string
      id:
        type: string
      max_uses:
        type: integer
      server_id:
        type: string
      server_name:
        type: string
      use_count:
        type: integer
    type: object
  message.createMessageRequest:
    properties:
      content:
        type: string
      reply_to:
        type: string
    type: object
  message.messageResponse:
    properties:
      author_display_name:
        type: string
      author_id:
        type: string
      author_username:
        type: string
      channel_id:
        type: string
      content:
        type: string
      created_at:
        type: string
      edited_at:
        type: string
      id:
        type: string
    type: object
  message.updateMessageRequest:
    properties:
      content:
        type: string
    type: object
  reaction.addReactionRequest:
    properties:
      emoji:
        type: string
    type: object
  reaction.emojiGroup:
    properties:
      count:
        type: integer
      details:
        items:
          $ref: '#/definitions/reaction.reactionResponse'
        type: array
      emoji:
        type: string
      users:
        items:
          type: string
        type: array
    type: object
  reaction.reactionResponse:
    properties:
      created_at:
        type: string
      emoji:
        type: string
      id:
        type: string
      message_id:
        type: string
      user_id:
        type: string
    type: object
  server.createServerRequest:
    properties:
      icon:
        type: string
      name:
        type: string
    type: object
  server.serverResponse:
    properties:
      icon:
        type: string
      id:
        type: string
      name:
        type: string
      owner_id:
        type: string
    type: object
  server.updateServerRequest:
    properties:
      icon:
        type: string
      name:
        type: string
    type: object
  voice.tokenRequest:
    properties:
      room_name:
        type: string
    type: object
  voice.tokenResponse:
    properties:
      livekit_url:
        type: string
      token:
        type: string
    type: object
  webhook.createWebhookRequest:
    properties:
      avatar:
        type: string
      name:
        type: string
    type: object
  webhook.executeWebhookRequest:
    properties:
      avatar:
        type: string
      content:
        type: string
      username:
        type: string
    type: object
  webhook.webhookResponse:
    properties:
      avatar:
        type: string
      channel_id:
        type: string
      created_at:
        type: string
      created_by:
        type: string
      id:
        type: string
      name:
        type: string
    type: object
  webhook.webhookWithToken:
    properties:
      avatar:
        type: string
      channel_id:
        type: string
      created_at:
        type: string
      created_by:
        type: string
      id:
        type: string
      name:
        type: string
      token:
        type: string
    type: object
host: localhost:8080
info:
  contact: {}
  description: A chaotic, self-hosted Discord-like platform API
  title: Dumpster API
  version: "1.0"
paths:
  /auth/login/password:
    post:
      consumes:
      - application/json
      description: Authenticate with email and password
      parameters:
      - description: Login credentials
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/auth.loginRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
      summary: Login with email and password
      tags:
      - auth
  /auth/logout:
    post:
      description: End the current session
      responses:
        "204":
          description: No Content
      summary: Logout
      tags:
      - auth
  /auth/me:
    get:
      description: Get the authenticated user's profile
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/auth.UserProfile'
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Get current user profile
      tags:
      - auth
    patch:
      consumes:
      - application/json
      description: Update the authenticated user's profile
      parameters:
      - description: Profile update data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/auth.updateProfileRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/auth.UserProfile'
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Update current user profile
      tags:
      - auth
  /auth/register:
    post:
      consumes:
      - application/json
      description: Create a new user account
      parameters:
      - description: Registration data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/auth.registerRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "409":
          description: Conflict
          schema:
            additionalProperties:
              type: string
            type: object
      summary: Register a new user
      tags:
      - auth
  /auth/webauthn/login/begin:
    post:
      description: Start passkey authentication
      produces:
      - application/json
      responses:
        "200":
          description: WebAuthn login options
          schema:
            type: object
        "500":
          description: Internal Server Error
          schema:
            additionalProperties:
              type: string
            type: object
      summary: Begin passkey login
      tags:
      - webauthn
  /auth/webauthn/login/finish:
    post:
      consumes:
      - application/json
      description: Complete passkey authentication
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
      summary: Finish passkey login
      tags:
      - webauthn
  /auth/webauthn/register/begin:
    post:
      description: Start passkey registration for an authenticated user
      produces:
      - application/json
      responses:
        "200":
          description: WebAuthn registration options
          schema:
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
        "500":
          description: Internal Server Error
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Begin passkey registration
      tags:
      - webauthn
  /auth/webauthn/register/finish:
    post:
      description: Complete passkey registration
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "500":
          description: Internal Server Error
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Finish passkey registration
      tags:
      - webauthn
  /bots:
    get:
      description: List all bots owned by the current user
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/bot.botResponse'
            type: array
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: List bots
      tags:
      - bots
    post:
      consumes:
      - application/json
      description: Create a new bot
      parameters:
      - description: Bot data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/bot.createBotRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/bot.botWithToken'
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Create a bot
      tags:
      - bots
  /bots/{botID}:
    delete:
      description: Delete a bot (owner only)
      parameters:
      - description: Bot ID
        in: path
        name: botID
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Delete a bot
      tags:
      - bots
    get:
      description: Get a bot by ID (owner only)
      parameters:
      - description: Bot ID
        in: path
        name: botID
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/bot.botResponse'
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Get a bot
      tags:
      - bots
    patch:
      consumes:
      - application/json
      description: Update a bot's name, description, or avatar (owner only)
      parameters:
      - description: Bot ID
        in: path
        name: botID
        required: true
        type: string
      - description: Bot update data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/bot.updateBotRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/bot.botResponse'
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Update a bot
      tags:
      - bots
  /bots/{botID}/commands:
    get:
      description: List all slash commands for a bot
      parameters:
      - description: Bot ID
        in: path
        name: botID
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/bot.slashCommandResponse'
            type: array
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: List bot commands
      tags:
      - bot commands
    post:
      consumes:
      - application/json
      description: Create a new slash command for a bot
      parameters:
      - description: Bot ID
        in: path
        name: botID
        required: true
        type: string
      - description: Command data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/bot.createCommandRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/bot.slashCommandResponse'
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "409":
          description: Conflict
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Create a slash command
      tags:
      - bot commands
  /bots/{botID}/commands/{cmdID}:
    delete:
      description: Delete a slash command
      parameters:
      - description: Bot ID
        in: path
        name: botID
        required: true
        type: string
      - description: Command ID
        in: path
        name: cmdID
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Delete a slash command
      tags:
      - bot commands
  /bots/{botID}/regenerate-token:
    post:
      description: Regenerate a bot's API token (owner only)
      parameters:
      - description: Bot ID
        in: path
        name: botID
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/bot.botWithToken'
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Regenerate bot token
      tags:
      - bots
  /bots/{botID}/servers:
    post:
      consumes:
      - application/json
      description: Add a bot to a server
      parameters:
      - description: Bot ID
        in: path
        name: botID
        required: true
        type: string
      - description: Server data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/bot.addToServerRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Add bot to server
      tags:
      - bots
  /bots/{botID}/servers/{serverID}:
    delete:
      description: Remove a bot from a server
      parameters:
      - description: Bot ID
        in: path
        name: botID
        required: true
        type: string
      - description: Server ID
        in: path
        name: serverID
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Remove bot from server
      tags:
      - bots
  /bots/servers/{serverID}/commands:
    get:
      description: List all slash commands registered in a server (public)
      parameters:
      - description: Server ID
        in: path
        name: serverID
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/bot.slashCommandResponse'
            type: array
        "500":
          description: Internal Server Error
          schema:
            additionalProperties:
              type: string
            type: object
      summary: List server commands
      tags:
      - bot commands
  /channels/{channelID}/messages:
    get:
      description: List messages in a channel with pagination
      parameters:
      - description: Channel ID
        in: path
        name: channelID
        required: true
        type: string
      - description: Max messages to return (1-100, default 50)
        in: query
        name: limit
        type: integer
      - description: Message ID to fetch messages before
        in: query
        name: before
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/message.messageResponse'
            type: array
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: List messages
      tags:
      - messages
    post:
      consumes:
      - application/json
      description: Send a message to a channel
      parameters:
      - description: Channel ID
        in: path
        name: channelID
        required: true
        type: string
      - description: Message data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/message.createMessageRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/message.messageResponse'
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Create a message
      tags:
      - messages
  /channels/{channelID}/messages/{messageID}:
    delete:
      description: Delete a message (author only)
      parameters:
      - description: Channel ID
        in: path
        name: channelID
        required: true
        type: string
      - description: Message ID
        in: path
        name: messageID
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Delete a message
      tags:
      - messages
    patch:
      consumes:
      - application/json
      description: Edit a message (author only)
      parameters:
      - description: Channel ID
        in: path
        name: channelID
        required: true
        type: string
      - description: Message ID
        in: path
        name: messageID
        required: true
        type: string
      - description: Message update data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/message.updateMessageRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/message.messageResponse'
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Update a message
      tags:
      - messages
  /channels/{channelID}/webhooks:
    get:
      description: List webhooks for a channel
      parameters:
      - description: Channel ID
        in: path
        name: channelID
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/webhook.webhookResponse'
            type: array
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: List webhooks
      tags:
      - webhooks
    post:
      consumes:
      - application/json
      description: Create a new webhook for a channel
      parameters:
      - description: Channel ID
        in: path
        name: channelID
        required: true
        type: string
      - description: Webhook data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/webhook.createWebhookRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/webhook.webhookWithToken'
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Create a webhook
      tags:
      - webhooks
  /invites/{code}:
    get:
      description: Get information about an invite by code
      parameters:
      - description: Invite code
        in: path
        name: code
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/invite.inviteResponse'
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      summary: Get invite info
      tags:
      - invites
  /invites/{code}/join:
    post:
      description: Join a server using an invite code
      parameters:
      - description: Invite code
        in: path
        name: code
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
        "409":
          description: Conflict
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Join server via invite
      tags:
      - invites
  /messages/{messageID}/reactions:
    get:
      description: List reactions on a message grouped by emoji
      parameters:
      - description: Message ID
        in: path
        name: messageID
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/reaction.emojiGroup'
            type: array
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: List reactions
      tags:
      - reactions
    post:
      consumes:
      - application/json
      description: Add a reaction to a message
      parameters:
      - description: Message ID
        in: path
        name: messageID
        required: true
        type: string
      - description: Reaction data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/reaction.addReactionRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/reaction.reactionResponse'
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Add a reaction
      tags:
      - reactions
  /messages/{messageID}/reactions/{emoji}:
    delete:
      description: Remove a reaction from a message
      parameters:
      - description: Message ID
        in: path
        name: messageID
        required: true
        type: string
      - description: Emoji to remove
        in: path
        name: emoji
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Remove a reaction
      tags:
      - reactions
  /push/subscribe:
    post:
      consumes:
      - application/json
      description: Subscribe to push notifications
      parameters:
      - description: Push subscription with endpoint, p256dh, and auth
        in: body
        name: body
        required: true
        schema:
          type: object
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Subscribe to push notifications
      tags:
      - push
  /push/unsubscribe:
    post:
      consumes:
      - application/json
      description: Unsubscribe from push notifications
      parameters:
      - description: Endpoint to unsubscribe
        in: body
        name: body
        required: true
        schema:
          type: object
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Unsubscribe from push notifications
      tags:
      - push
  /push/vapid-public-key:
    get:
      description: Get the VAPID public key for push notification subscriptions
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            additionalProperties:
              type: string
            type: object
      summary: Get VAPID public key
      tags:
      - push
  /servers:
    get:
      description: List all servers the current user is a member of
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/server.serverResponse'
            type: array
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: List servers
      tags:
      - servers
    post:
      consumes:
      - application/json
      description: Create a new server
      parameters:
      - description: Server data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/server.createServerRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/server.serverResponse'
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Create a server
      tags:
      - servers
  /servers/{serverID}:
    delete:
      description: Delete a server (owner only)
      parameters:
      - description: Server ID
        in: path
        name: serverID
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Delete a server
      tags:
      - servers
    get:
      description: Get a server by ID
      parameters:
      - description: Server ID
        in: path
        name: serverID
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/server.serverResponse'
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Get a server
      tags:
      - servers
    patch:
      consumes:
      - application/json
      description: Update a server's name or icon (owner only)
      parameters:
      - description: Server ID
        in: path
        name: serverID
        required: true
        type: string
      - description: Server update data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/server.updateServerRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/server.serverResponse'
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Update a server
      tags:
      - servers
  /servers/{serverID}/channels:
    get:
      description: List channels in a server
      parameters:
      - description: Server ID
        in: query
        name: server_id
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              $ref: '#/definitions/channel.channelResponse'
            type: array
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: List channels
      tags:
      - channels
    post:
      consumes:
      - application/json
      description: Create a new channel in a server
      parameters:
      - description: Channel data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/channel.createChannelRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/channel.channelResponse'
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Create a channel
      tags:
      - channels
  /servers/{serverID}/channels/{channelID}:
    delete:
      description: Delete a channel (server owner only)
      parameters:
      - description: Channel ID
        in: path
        name: channelID
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Delete a channel
      tags:
      - channels
    get:
      description: Get a channel by ID
      parameters:
      - description: Channel ID
        in: path
        name: channelID
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/channel.channelResponse'
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Get a channel
      tags:
      - channels
    patch:
      consumes:
      - application/json
      description: Update a channel's properties
      parameters:
      - description: Channel ID
        in: path
        name: channelID
        required: true
        type: string
      - description: Channel update data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/channel.updateChannelRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/channel.channelResponse'
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Update a channel
      tags:
      - channels
  /servers/{serverID}/invites:
    post:
      consumes:
      - application/json
      description: Create an invite code for a server
      parameters:
      - description: Server ID
        in: path
        name: serverID
        required: true
        type: string
      - description: Invite options
        in: body
        name: body
        schema:
          $ref: '#/definitions/invite.createInviteRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            $ref: '#/definitions/invite.inviteResponse'
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Create an invite
      tags:
      - invites
  /voice/rooms/{roomID}/participants:
    get:
      description: Get participants in a voice room
      parameters:
      - description: Room ID
        in: path
        name: roomID
        required: true
        type: string
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            items:
              type: object
            type: array
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "500":
          description: Internal Server Error
          schema:
            additionalProperties:
              type: string
            type: object
      summary: Get voice room participants
      tags:
      - voice
  /voice/token:
    post:
      consumes:
      - application/json
      description: Get a LiveKit access token for a voice room
      parameters:
      - description: Room data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/voice.tokenRequest'
      produces:
      - application/json
      responses:
        "200":
          description: OK
          schema:
            $ref: '#/definitions/voice.tokenResponse'
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Get voice token
      tags:
      - voice
  /webhooks/{webhookID}:
    delete:
      description: Delete a webhook
      parameters:
      - description: Webhook ID
        in: path
        name: webhookID
        required: true
        type: string
      responses:
        "204":
          description: No Content
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "403":
          description: Forbidden
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      security:
      - SessionAuth: []
      summary: Delete a webhook
      tags:
      - webhooks
  /webhooks/{webhookID}/{token}:
    post:
      consumes:
      - application/json
      description: Execute a webhook to send a message (no auth required)
      parameters:
      - description: Webhook ID
        in: path
        name: webhookID
        required: true
        type: string
      - description: Webhook token
        in: path
        name: token
        required: true
        type: string
      - description: Message data
        in: body
        name: body
        required: true
        schema:
          $ref: '#/definitions/webhook.executeWebhookRequest'
      produces:
      - application/json
      responses:
        "201":
          description: Created
          schema:
            additionalProperties: true
            type: object
        "400":
          description: Bad Request
          schema:
            additionalProperties:
              type: string
            type: object
        "401":
          description: Unauthorized
          schema:
            additionalProperties:
              type: string
            type: object
        "404":
          description: Not Found
          schema:
            additionalProperties:
              type: string
            type: object
      summary: Execute a webhook
      tags:
      - webhooks
schemes:
- http
- https
securityDefinitions:
  SessionAuth:
    in: cookie
    name: dumpster_session
    type: apiKey
swagger: "2.0"
