diff --git a/api/chat.go b/api/chat.go new file mode 100644 index 0000000..f878998 --- /dev/null +++ b/api/chat.go @@ -0,0 +1,22 @@ +package api + +import ( + "net/http" + + "github.com/gin-gonic/gin" +) + +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, + }) +} diff --git a/api/endpoints.go b/api/endpoints.go index 7e2a9a0..46b1a0d 100644 --- a/api/endpoints.go +++ b/api/endpoints.go @@ -32,7 +32,7 @@ func initControlles() *util.ChatError { userController = controller.MakeUserController(userDAO) authController = controller.MakeAuthController(userDAO, sessionDAO) - chatController = controller.MakeChatController(channelDAO) + chatController = controller.MakeChatController(channelDAO, sessionDAO) return nil } @@ -56,6 +56,10 @@ func Listen(address string, base string) error { user.Use(isLoggedIn) user.GET("info/:username", userInfo) + chat := api.Group("chat") + chat.Use(isLoggedIn) + chat.GET("channels", listAvailableChannels) + server := &http.Server{ Addr: address, Handler: router, diff --git a/controller/ChatController.go b/controller/ChatController.go index f51d9f4..8d39205 100644 --- a/controller/ChatController.go +++ b/controller/ChatController.go @@ -2,13 +2,25 @@ package controller import ( "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 } -func MakeChatController(channelDAO dao.IChannelDAO) ChatController { - controller := ChatController{channelDAO: channelDAO} +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 MakeChatController(channelDAO dao.IChannelDAO, sessionDAO dao.ISessionDAO) ChatController { + controller := ChatController{channelDAO: channelDAO, sessionDAO: sessionDAO} return controller } diff --git a/dao/IChannelDAD.go b/dao/IChannelDAD.go index 93779b5..c9f192f 100644 --- a/dao/IChannelDAD.go +++ b/dao/IChannelDAD.go @@ -9,6 +9,7 @@ type IChannelDAO interface { Create(channel model.Channel) *util.ChatError Read(channel model.Channel) (model.Channel, *util.ChatError) List() ([]model.Channel, *util.ChatError) + ListAvailableChannels(userID int) ([]model.Channel, *util.ChatError) Update(channel model.Channel) *util.ChatError Delete(channel model.Channel) *util.ChatError } diff --git a/dao/postgres/ChannelDAO.go b/dao/postgres/ChannelDAO.go index 3c31356..7a0795b 100644 --- a/dao/postgres/ChannelDAO.go +++ b/dao/postgres/ChannelDAO.go @@ -58,6 +58,30 @@ func (d ChannelDAOPG) List() ([]model.Channel, *util.ChatError) { return channels, util.MakeError(err, util.DATABASE_QUERY_FAULT) } +// ListAvailableChannels returns channels that the given user has access to +func (d ChannelDAOPG) ListAvailableChannels(userID int) ([]model.Channel, *util.ChatError) { + rows, err := d.db.Queryx(`select "channel_id" as "id", "channel_name" as "name", "channel_description" as "description" from "user_rigths_per_channel" where "user_id" = $1`, userID) + if err != nil { + return nil, util.MakeError(err, util.DATABASE_QUERY_FAULT) + } + defer rows.Close() + + channels := make([]model.Channel, 0) + + for rows.Next() { + channel := model.Channel{} + + err = rows.StructScan(&channel) + if err != nil { + break + } + + channels = append(channels, channel) + } + + return channels, util.MakeError(err, util.DATABASE_QUERY_FAULT) +} + // Update sets all the fields of the Channel with the given ID func (d ChannelDAOPG) Update(channel model.Channel) *util.ChatError { _, err := d.db.NamedExec(`update "channel" set "name" = :name, "description" = :description where "id" = :id`, &channel)