openapi: 3.1.0 info: title: OXSpeak Server API version: 1.0.0 description: API HTTP exposée par le serveur OXSpeak. servers: - url: http://localhost:7000 paths: /health: get: summary: Vérifie l'état du service responses: '200': description: OK content: application/json: schema: type: object properties: status: type: string example: ok /auth/channel/login/: get: summary: Authentification par clé publique (renvoie un JWT) requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/AuthRequest' responses: '200': description: Jeton JWT généré content: application/json: schema: $ref: '#/components/schemas/AuthResponse' '400': description: Requête invalide content: application/json: schema: $ref: '#/components/schemas/Error' '500': description: Erreur interne content: application/json: schema: $ref: '#/components/schemas/Error' /api/server/: get: summary: Liste des serveurs responses: '200': description: Liste de serveurs content: application/json: schema: type: array items: $ref: '#/components/schemas/Server' '500': description: Erreur serveur content: application/json: schema: $ref: '#/components/schemas/Error' post: summary: Crée un serveur requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateServerRequest' responses: '201': description: Serveur créé content: application/json: schema: $ref: '#/components/schemas/Server' '400': { description: Requête invalide } '500': { description: Erreur interne } /api/server/{id}/: parameters: - name: id in: path required: true schema: type: string format: uuid get: summary: Détail d'un serveur responses: '200': description: Serveur content: application/json: schema: $ref: '#/components/schemas/Server' '404': { description: Introuvable } '500': { description: Erreur interne } put: summary: Met à jour un serveur requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateServerRequest' responses: '200': description: Serveur mis à jour content: application/json: schema: $ref: '#/components/schemas/Server' '400': { description: Requête invalide } '404': { description: Introuvable } '500': { description: Erreur interne } delete: summary: Supprime un serveur responses: '204': { description: Supprimé } '404': { description: Introuvable } '500': { description: Erreur interne } /api/category/: get: summary: Liste des catégories responses: '200': description: Liste des catégories content: application/json: schema: type: array items: $ref: '#/components/schemas/Category' '500': { description: Erreur interne } post: summary: Crée une catégorie requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateCategoryRequest' responses: '201': description: Catégorie créée content: application/json: schema: $ref: '#/components/schemas/Category' '400': { description: Requête invalide } '500': { description: Erreur interne } /api/category/{id}/: parameters: - name: id in: path required: true schema: type: string format: uuid get: summary: Détail d'une catégorie responses: '200': description: Catégorie content: application/json: schema: $ref: '#/components/schemas/Category' '404': { description: Introuvable } '500': { description: Erreur interne } put: summary: Met à jour une catégorie requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateCategoryRequest' responses: '200': description: Catégorie mise à jour content: application/json: schema: $ref: '#/components/schemas/Category' '400': { description: Requête invalide } '404': { description: Introuvable } '500': { description: Erreur interne } delete: summary: Supprime une catégorie responses: '204': { description: Supprimé } '404': { description: Introuvable } '500': { description: Erreur interne } /api/channel/: get: summary: Liste des canaux responses: '200': description: Liste des canaux content: application/json: schema: type: array items: $ref: '#/components/schemas/Channel' '500': { description: Erreur interne } post: summary: Crée un canal requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateChannelRequest' responses: '201': description: Canal créé content: application/json: schema: $ref: '#/components/schemas/Channel' '400': { description: Requête invalide } '500': { description: Erreur interne } /api/channel/{id}/: parameters: - name: id in: path required: true schema: type: string format: uuid get: summary: Détail d'un canal responses: '200': description: Canal content: application/json: schema: $ref: '#/components/schemas/Channel' '404': { description: Introuvable } '500': { description: Erreur interne } put: summary: Met à jour un canal requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateChannelRequest' responses: '200': description: Canal mis à jour content: application/json: schema: $ref: '#/components/schemas/Channel' '400': { description: Requête invalide } '404': { description: Introuvable } '500': { description: Erreur interne } delete: summary: Supprime un canal responses: '204': { description: Supprimé } '404': { description: Introuvable } '500': { description: Erreur interne } /api/message/: get: summary: Liste des messages responses: '200': description: Liste des messages content: application/json: schema: type: array items: $ref: '#/components/schemas/Message' '500': { description: Erreur interne } post: summary: Crée un message requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateMessageRequest' responses: '201': description: Message créé content: application/json: schema: $ref: '#/components/schemas/Message' '400': { description: Requête invalide } '500': { description: Erreur interne } /api/message/{id}/: parameters: - name: id in: path required: true schema: type: string format: uuid get: summary: Détail d'un message responses: '200': description: Message content: application/json: schema: $ref: '#/components/schemas/Message' '404': { description: Introuvable } '500': { description: Erreur interne } put: summary: Met à jour un message requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/UpdateMessageRequest' responses: '200': description: Message mis à jour content: application/json: schema: $ref: '#/components/schemas/Message' '400': { description: Requête invalide } '404': { description: Introuvable } '500': { description: Erreur interne } delete: summary: Supprime un message responses: '204': { description: Supprimé } '404': { description: Introuvable } '500': { description: Erreur interne } components: schemas: UUID: type: string format: uuid Error: type: object properties: error: type: string AuthRequest: type: object required: [pub_key] properties: pub_key: type: string description: Clé publique du client AuthResponse: type: object properties: JWT: type: string Server: type: object properties: id: { $ref: '#/components/schemas/UUID' } name: { type: string } created_at: { type: string, format: date-time } updated_at: { type: string, format: date-time } required: [id, name, created_at, updated_at] CreateServerRequest: type: object required: [name] properties: name: { type: string } password: { type: string, nullable: true } UpdateServerRequest: type: object required: [name] properties: name: { type: string } password: { type: string, nullable: true } Category: type: object properties: id: { $ref: '#/components/schemas/UUID' } server_id: { $ref: '#/components/schemas/UUID' } name: { type: string } created_at: { type: string, format: date-time } updated_at: { type: string, format: date-time } required: [id, server_id, name, created_at, updated_at] CreateCategoryRequest: type: object required: [server_id, name] properties: server_id: { $ref: '#/components/schemas/UUID' } name: { type: string } UpdateCategoryRequest: type: object required: [name] properties: name: { type: string } Channel: type: object properties: id: { $ref: '#/components/schemas/UUID' } server_id: { $ref: '#/components/schemas/UUID' } category_id: { $ref: '#/components/schemas/UUID' } position: { type: integer, format: int32 } type: { $ref: '#/components/schemas/ChannelType' } name: { type: string, nullable: true } created_at: { type: string, format: date-time } updated_at: { type: string, format: date-time } required: [id, position, type, created_at, updated_at] ChannelType: type: string enum: [text, voice, dm] CreateChannelRequest: type: object required: [type] properties: server_id: { $ref: '#/components/schemas/UUID' } category_id: { $ref: '#/components/schemas/UUID' } position: { type: integer, format: int32 } type: { $ref: '#/components/schemas/ChannelType' } name: { type: string, nullable: true } UpdateChannelRequest: type: object properties: server_id: { $ref: '#/components/schemas/UUID' } category_id: { $ref: '#/components/schemas/UUID' } position: { type: integer, format: int32 } type: { $ref: '#/components/schemas/ChannelType' } name: { type: string, nullable: true } Message: type: object properties: id: { $ref: '#/components/schemas/UUID' } channel_id: { $ref: '#/components/schemas/UUID' } user_id: { $ref: '#/components/schemas/UUID' } content: { type: string } created_at: { type: string, format: date-time } edited_at: { type: string, format: date-time, nullable: true } reply_to_id: { $ref: '#/components/schemas/UUID' } required: [id, channel_id, user_id, content, created_at] CreateMessageRequest: type: object required: [channel_id, user_id, content] properties: channel_id: { $ref: '#/components/schemas/UUID' } user_id: { $ref: '#/components/schemas/UUID' } content: { type: string } reply_to_id: { $ref: '#/components/schemas/UUID' } UpdateMessageRequest: type: object required: [content] properties: content: { type: string } reply_to_id: { $ref: '#/components/schemas/UUID' }