server/dao/postgres/ChannelDAO.go
2025-06-05 14:34:46 +02:00

108 lines
2.9 KiB
Go

package postgres
import (
"git.tek.govt.hu/dowerx/chat/server/model"
"git.tek.govt.hu/dowerx/chat/server/util"
"github.com/jmoiron/sqlx"
)
type ChannelDAOPG struct {
pgDAO
}
// Create a new channel
func (d ChannelDAOPG) Create(channel model.Channel) *util.ChatError {
_, err := d.db.NamedExec(`call add_channel(:name, :description)`, &channel)
return util.MakeError(err, util.DATABASE_QUERY_FAULT)
}
// Read returns a channel by ID
func (d ChannelDAOPG) Read(channel model.Channel) (model.Channel, *util.ChatError) {
var rows *sqlx.Rows
var err error
rows, err = d.db.NamedQuery(`select * from "channel" where "id" = :id`, &channel)
if err != nil {
return channel, util.MakeError(err, util.DATABASE_QUERY_FAULT)
}
defer rows.Close()
if !rows.Next() {
return channel, &util.ChatError{Message: "", Code: util.NOT_FOUND}
}
err = rows.StructScan(&channel)
return channel, util.MakeError(err, util.DATABASE_QUERY_FAULT)
}
// List all channels
func (d ChannelDAOPG) List() ([]model.Channel, *util.ChatError) {
rows, err := d.db.Queryx(`select * from "channel" order by "name"`)
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)
}
// 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)
return util.MakeError(err, util.DATABASE_QUERY_FAULT)
}
// Delete removes a channel by ID
func (d ChannelDAOPG) Delete(channel model.Channel) *util.ChatError {
var err error
_, err = d.db.NamedExec(`delete from "channel" where "id" = :id`, &channel)
return util.MakeError(err, util.DATABASE_QUERY_FAULT)
}
func MakeChannelDAO() (ChannelDAOPG, *util.ChatError) {
dao := ChannelDAOPG{}
conn, err := getDatabase()
if err != nil {
return dao, err
}
dao.db = conn
return dao, nil
}