Files
go_oxspeak_server/openapi.yaml
2025-11-17 01:06:03 +01:00

493 lines
14 KiB
YAML

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' }