81 lines
1.9 KiB
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, from time.Time, limit int) ([]model.Message, *util.ChatError) {
|
|
return c.messageDAO.List(model.Channel{ID: channel}, from, limit)
|
|
}
|
|
|
|
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
|
|
}
|