82 lines
1.6 KiB
Go
82 lines
1.6 KiB
Go
package api
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"os"
|
|
"shagram/internal/auth"
|
|
"shagram/internal/db"
|
|
"shagram/internal/websocket"
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
gws "github.com/gorilla/websocket"
|
|
)
|
|
|
|
var upgrader = gws.Upgrader{
|
|
CheckOrigin: func(r *http.Request) bool {
|
|
origin := r.Header.Get("Origin")
|
|
if origin == "" {
|
|
return false
|
|
}
|
|
allowed := strings.Split(os.Getenv("WS_ALLOWED_ORIGINS"), ",")
|
|
for _, a := range allowed {
|
|
if strings.TrimSpace(a) == origin {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
},
|
|
}
|
|
|
|
func WebSocketHandler(hub *websocket.Hub, database *db.DB) gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
roomID := c.Param("room")
|
|
room := hub.GetOrCreateRoom(roomID)
|
|
|
|
tokenString := c.Query("token")
|
|
claims, err := auth.ParseAccessToken(tokenString)
|
|
if err != nil {
|
|
c.JSON(http.StatusUnauthorized, gin.H{"error": "invalid token"})
|
|
return
|
|
}
|
|
username := claims.Username
|
|
|
|
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
client := &websocket.Client{Conn: conn, Room: room}
|
|
room.Register(client)
|
|
|
|
go func() {
|
|
defer func() {
|
|
room.Unregister(client)
|
|
hub.CleanupRoom(roomID)
|
|
}()
|
|
|
|
for {
|
|
var msg map[string]string
|
|
if err := client.Conn.ReadJSON(&msg); err != nil {
|
|
break
|
|
}
|
|
|
|
text := msg["text"]
|
|
if text == "" {
|
|
continue
|
|
}
|
|
|
|
_, err = database.Exec(`
|
|
INSERT INTO messages (room_id, user, text)
|
|
VALUES (?, ?, ?)`, roomID, username, text)
|
|
if err != nil {
|
|
log.Printf("Save message error: %v", err)
|
|
}
|
|
|
|
room.Broadcast([]byte(username + ": " + text))
|
|
}
|
|
}()
|
|
}
|
|
}
|