From eaba9c8069eddf6f08c2f7eed63f772d52c0e2b8 Mon Sep 17 00:00:00 2001 From: Adam French Date: Thu, 22 Jan 2026 10:47:02 +0000 Subject: [PATCH] websocket? --- backend/handlers/handle_websocket.go | 10 +---- backend/models/models.go | 9 +++++ backend/services/websocket.go | 54 +++++++++++++++++++++++++ nginx/vue/src/components/quick/Chat.vue | 41 +++++++++++++++++++ nginx/vue/src/views/Home.vue | 2 + 5 files changed, 108 insertions(+), 8 deletions(-) create mode 100644 nginx/vue/src/components/quick/Chat.vue diff --git a/backend/handlers/handle_websocket.go b/backend/handlers/handle_websocket.go index 0b4f20e..2c3c7f9 100644 --- a/backend/handlers/handle_websocket.go +++ b/backend/handlers/handle_websocket.go @@ -1,11 +1,8 @@ package handlers import ( - "time" - "adam-french.co.uk/backend/services" "github.com/gin-gonic/gin" - "github.com/gorilla/websocket" ) func (store *Store) ConnectWebSocket(ctx *gin.Context) { @@ -14,9 +11,6 @@ func (store *Store) ConnectWebSocket(ctx *gin.Context) { ctx.JSON(500, gin.H{"error": err.Error()}) return } - defer conn.Close() - for { - conn.WriteMessage(websocket.TextMessage, []byte("Hello Websocket!")) - time.Sleep(time.Second) - } + + services.HandleWebSocket(conn) } diff --git a/backend/models/models.go b/backend/models/models.go index 6b43a6c..8ff210d 100644 --- a/backend/models/models.go +++ b/backend/models/models.go @@ -26,3 +26,12 @@ type Post struct { Author *User `gorm:"foreignKey:AuthorID" json:"author"` Content string `json:"content"` } + +type Message struct { + ID uint `gorm:"primarykey" json:"id"` + Content string `json:"text"` + AuthorID uint `json:"-"` + Author *User `gorm:"foreignKey:AuthorID" json:"author"` + CreatedAt time.Time `json:"createdAt"` + DeletedAt gorm.DeletedAt `gorm:"index" json:"deletedAt"` +} diff --git a/backend/services/websocket.go b/backend/services/websocket.go index 7511961..94e4939 100644 --- a/backend/services/websocket.go +++ b/backend/services/websocket.go @@ -1,6 +1,11 @@ package services import ( + "sync" + "time" + + "adam-french.co.uk/backend/models" + "github.com/gorilla/websocket" ) @@ -8,3 +13,52 @@ var Upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, } + +var ( + clients = make(map[*websocket.Conn]bool) + messages = make([]models.Message, 0) + mu sync.Mutex +) + +func HandleWebSocket(conn *websocket.Conn) { + defer conn.Close() + + mu.Lock() + clients[conn] = true + + // Send existing message history to new client + for _, msg := range messages { + if err := conn.WriteJSON(msg); err != nil { + mu.Unlock() + return + } + } + mu.Unlock() + + // Read loop + for { + var incoming models.Message + if err := conn.ReadJSON(&incoming); err != nil { + break // client disconnected + } + + incoming.CreatedAt = time.Now() + + // Store and broadcast + mu.Lock() + messages = append(messages, incoming) + + for client := range clients { + if err := client.WriteJSON(incoming); err != nil { + client.Close() + delete(clients, client) + } + } + mu.Unlock() + } + + // Cleanup on disconnect + mu.Lock() + delete(clients, conn) + mu.Unlock() +} diff --git a/nginx/vue/src/components/quick/Chat.vue b/nginx/vue/src/components/quick/Chat.vue new file mode 100644 index 0000000..c376510 --- /dev/null +++ b/nginx/vue/src/components/quick/Chat.vue @@ -0,0 +1,41 @@ + + + diff --git a/nginx/vue/src/views/Home.vue b/nginx/vue/src/views/Home.vue index 1642372..c1ed42f 100644 --- a/nginx/vue/src/views/Home.vue +++ b/nginx/vue/src/views/Home.vue @@ -1,6 +1,7 @@