Files
shagram/cmd/server/main.go
T
2026-01-13 01:07:56 +03:00

89 lines
1.9 KiB
Go

package main
import (
"log"
"net/http"
"shagram/internal/api"
"shagram/internal/db"
"shagram/internal/models"
"shagram/internal/websocket"
"github.com/gin-gonic/gin"
)
func main() {
database, err := db.NewDB("shagram.db")
if err != nil {
log.Fatal(err)
}
defer database.Close()
hub := websocket.NewHub()
hub.GetOrCreateRoom("general")
hub.GetOrCreateRoom("chat")
hub.GetOrCreateRoom("dev")
router := gin.Default()
router.GET("/ws/:room", func(c *gin.Context) {
api.WebSocketHandler(hub, database)(c)
})
router.GET("/api/rooms", func(c *gin.Context) {
rows, err := database.Query(`
SELECT DISTINCT room_id
FROM messages
ORDER BY room_id`)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
defer rows.Close()
var rooms []string
for rows.Next() {
var roomID string
err := rows.Scan(&roomID)
if err != nil {
continue
}
rooms = append(rooms, roomID)
}
if len(rooms) == 0 {
rooms = []string{"general", "chat", "dev"}
}
c.JSON(200, gin.H{"rooms": rooms})
})
router.GET("/api/messages/:room", func(c *gin.Context) {
roomID := c.Param("room")
rows, err := database.Query(`
SELECT id, room_id, user, text, created_at
FROM messages
WHERE room_id = ?
ORDER BY created_at DESC
LIMIT 50`, roomID)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
defer rows.Close()
var messages []models.Message
for rows.Next() {
var msg models.Message
err := rows.Scan(&msg.ID, &msg.RoomID, &msg.User, &msg.Text, &msg.CreatedAt)
if err != nil {
log.Printf("Scan error: %v", err)
continue
}
messages = append(messages, msg)
}
c.JSON(200, gin.H{"messages": messages})
})
router.Static("/static", "./static")
router.GET("/", func(c *gin.Context) {
c.File("./static/index.html")
})
router.Run(":8080")
}