server/controller/ChatController.go

81 lines
1.9 KiB
Go

package controller
import (
"context"
"time"
"git.tek.govt.hu/dowerx/chat/server/dao"
"git.tek.govt.hu/dowerx/chat/server/model"
"git.tek.govt.hu/dowerx/chat/server/util"
)
type ChatController struct {
channelDAO dao.IChannelDAO
sessionDAO dao.ISessionDAO
messageDAO dao.IMessageDAO
notifcationDAO dao.INotificationDAO
userDAO dao.IUserDAO
}
func (c ChatController) ListAvailableChannels(token string) ([]model.Channel, *util.ChatError) {
userID, err := c.sessionDAO.Get(token)
if err != nil {
return nil, err
}
return c.channelDAO.ListAvailableChannels(userID)
}
func (c ChatController) GetMessages(channel int) ([]model.Message, *util.ChatError) {
return c.messageDAO.List(model.Channel{ID: channel})
}
func (c ChatController) SendMessage(token string, channel int, content string) *util.ChatError {
sender_id, err := c.sessionDAO.Get(token)
if err != nil {
return err
}
user, err := c.userDAO.Read(model.User{ID: sender_id})
if err != nil {
return err
}
// TODO: check if user has right to send message in the given channel
message := model.Message{
SenderID: user.ID,
SenderName: user.Username,
Channel: channel,
Time: time.Now().UTC(),
Content: content,
}
message.ID, err = c.messageDAO.Create(message)
if err != nil {
return err
}
return c.notifcationDAO.SendMessage(message)
}
func (c ChatController) SubscribeToChannel(ctx context.Context, id int) (<-chan model.Message, <-chan *util.ChatError) {
return c.notifcationDAO.SubscribeToChannel(ctx, id)
}
func MakeChatController(
channelDAO dao.IChannelDAO,
sessionDAO dao.ISessionDAO,
messageDAO dao.IMessageDAO,
notificationDAO dao.INotificationDAO,
userDAO dao.IUserDAO) ChatController {
controller := ChatController{
channelDAO: channelDAO,
sessionDAO: sessionDAO,
messageDAO: messageDAO,
notifcationDAO: notificationDAO,
userDAO: userDAO,
}
return controller
}