139 lines
2.6 KiB
Go
139 lines
2.6 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) {
|
|
channels, err := chatController.ListAvailableChannels(c.GetInt(USER_ID))
|
|
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
|
|
}
|
|
}
|
|
|
|
messages, msgErr := chatController.GetMessages(c.GetInt(USER_ID), 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) {
|
|
message := model.Message{}
|
|
if err := c.Bind(&message); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"error": err.Error(),
|
|
})
|
|
return
|
|
}
|
|
|
|
err := chatController.SendMessage(c.GetInt(USER_ID), 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) {
|
|
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, c.GetInt(USER_ID))
|
|
|
|
for {
|
|
select {
|
|
case msg := <-messages:
|
|
if err := conn.WriteJSON(msg); err != nil {
|
|
return
|
|
}
|
|
|
|
case err := <-chanErr:
|
|
fmt.Println(err.Error())
|
|
return
|
|
}
|
|
}
|
|
}
|