Chat Service
classDiagram direction TB class ChatController { - service: Service - AuthMiddleware: AuthMiddleware +HandleGetChats(w http.ResponseWriter, r *http.Request) +CreateChat(w http.ResponseWriter, r *http.Request) +HandleGetChat(w http.ResponseWriter, r *http.Request) +HandleSendMessage(w http.ResponseWriter, r *http.Request) +setupRoutes() } class Service { +GetChats(userId uuid.UUID) []Chat +CreateChat(userIds ...uuid.UUID) uuid.UUID +GetChat(chatId, userId uuid.UUID) []Message +SendMessage(userId, chatId uuid.UUID, content string) error } class AuthMiddleware { +EnsureJWT(handler http.HandlerFunc) http.HandlerFunc } class Server { +WithHandlerFunc(path string, handler http.HandlerFunc, method string) +Error(w http.ResponseWriter, message string, statusCode int) +GetLogger() Logger } ChatController --> Service ChatController --> AuthMiddleware ChatController --> Server Service --> Repo class Repo { <<interface>> }
📦 ChatController – Dokumentation
🧭 Übersicht
Der ChatController
ist ein HTTP-Controller für den Chat-Service der Anwendung. Er stellt verschiedene REST-Endpoints zur Verfügung, um Chats zu erstellen, abzurufen und Nachrichten zu versenden. Der Controller verwendet JWT-Authentifizierung und basiert auf Gorilla Mux für das Routing.
🧩 Abhängigkeiten
github.com/google/uuid
– zur Arbeit mit UUIDs.github.com/gorilla/mux
– HTTP-Router.Benutzerdefinierte Module:
service
– enthält die Geschäftslogik für Chats.repo
– Schnittstelle zur Datenbank.auth
– JWT-Authentifizierung.server
– generische Server-Initialisierung und Hilfsmethoden.
🔐 Authentifizierung
Alle Endpunkte sind durch ein JWT geschützt. Der Authentifizierungs-Middleware EnsureJWT()
überprüft den Token und stellt sicher, dass der Request gültig ist. Die UserId
wird aus dem HTTP-Header UserIdHeader
gelesen, der durch die Middleware gesetzt wird.
📚 API-Endpunkte
GET /chat
Beschreibung: Gibt alle Chats des authentifizierten Nutzers zurück.
Header: Authorization: Bearer <JWT>
Antwort: JSON-Liste von repo.Chat
Objekten.
POST /chat
Beschreibung: Erstellt einen neuen Chat mit den angegebenen Benutzer-IDs (inklusive sich selbst). Body:
{
"userIds": ["<uuid1>", "<uuid2>", ...]
}
Antwort: ID des neu erstellten Chats als JSON-String.
GET /chat/{chatId}
Beschreibung: Gibt alle Nachrichten für einen bestimmten Chat zurück.
Path-Parameter: chatId
(UUID)
Antwort: JSON-Liste von repo.Message
Objekten.
POST /chat/{chatId}/messages
Beschreibung: Sendet eine Nachricht in einen bestimmten Chat.
Path-Parameter: chatId
(UUID)
Body:
{
"content": "Hallo Welt!"
}
Antwort: HTTP 201 Created, keine Body-Antwort.
⚙️ Funktionsweise im Detail
- Initialisierung: Die Funktion
New()
erstellt eine neueChatController
-Instanz, registriert alle Routen und initialisiert den Service. - Routing: Wird durch
setupRoutes()
konfiguriert. - Fehlerbehandlung: Einheitlich über die Methode
Error(w, message, code)
aus der eingebetteten Server-Struktur. - Logging: Der Controller nutzt
GetLogger().Debug()
zur Protokollierung von Nachrichten.
🧪 Fehlerbehandlung
Die API gibt im Fehlerfall strukturierte JSON-Objekte vom Typ ErrorResponse
zurück:
{
"message": "Fehlermeldung"
}
HTTP-Statuscodes:
400 Bad Request
: Ungültige UUIDs, fehlerhaftes JSON etc.500 Internal Server Error
: Fehler aus der Geschäftslogik oder Datenbank.
🔄 Erweiterbarkeit
Der Controller ist modular aufgebaut:
- Neue Endpunkte können leicht durch weitere Methoden und
WithHandlerFunc
-Registrierungen ergänzt werden. Service
-Schicht kapselt die Geschäftslogik und ist leicht austauschbar/testbar.- Durch Middleware flexibel erweiterbar (z. B. für Rate-Limiting, Logging, etc.).