server/api/chat.go

146 lines
2.7 KiB
Go

package api
import (
"fmt"
"net/http"
"strconv"
"time"
"git.tek.govt.hu/dowerx/chat/server/model"
"github.com/gin-gonic/gin"
"github.com/gorilla/websocket"
)
const (
CHANNEL_ID string = "id"
DEFAULT_MESSAGE_LIMIT int = 100
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
CheckOrigin: func(r *http.Request) bool { return true },
}
func listAvailableChannels(c *gin.Context) {
token, _ := c.Get(SESSION_COOKIE)
channels, err := chatController.ListAvailableChannels(token.(string))
if err != nil {
sendError(c, err)
return
}
c.JSON(http.StatusOK, gin.H{
"message": "channels listed",
"channels": channels,
})
}
func getMessages(c *gin.Context) {
id, err := strconv.Atoi(c.Param(CHANNEL_ID))
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "invalid channel id",
})
return
}
limitStr := c.Query("limit")
fromStr := c.Query("from")
var limit int = DEFAULT_MESSAGE_LIMIT
var from time.Time = time.Now().UTC()
var parseErr error
if limitStr != "" {
limit, parseErr = strconv.Atoi(limitStr)
if parseErr != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "invalid limit parameter",
})
return
}
}
if fromStr != "" {
from, parseErr = time.Parse(time.RFC3339, fromStr)
if parseErr != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "invalid from parameter",
})
return
}
}
fmt.Println(from, limit)
messages, msgErr := chatController.GetMessages(id, from, limit)
if msgErr != nil {
sendError(c, msgErr)
return
}
c.JSON(http.StatusOK, gin.H{
"message": "messages listed",
"messages": messages,
})
}
func sendMessage(c *gin.Context) {
token, _ := c.Get(SESSION_COOKIE)
message := model.Message{}
if err := c.Bind(&message); err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": err.Error(),
})
return
}
err := chatController.SendMessage(token.(string), message.Channel, message.Content)
if err != nil {
fmt.Println(err.Error())
sendError(c, err)
return
}
c.JSON(http.StatusOK, gin.H{
"message": "message sent",
})
}
func subscribeToChannel(c *gin.Context) {
// TODO: check if the user has right to subscribe to the given channel
id, err := strconv.Atoi(c.Param(CHANNEL_ID))
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{
"error": "invalid channel id",
})
return
}
conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
if err != nil {
fmt.Println(err.Error())
return
}
defer conn.Close()
messages, chanErr := chatController.SubscribeToChannel(c, id)
for {
select {
case msg := <-messages:
if err := conn.WriteJSON(msg); err != nil {
return
}
case err := <-chanErr:
fmt.Println(err.Error())
return
}
}
}