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 }