server/dao/postgres/MessageDAO.go

93 lines
2.4 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 MessageDAO struct {
pgDAO
}
// Create a new message
func (d MessageDAO) Create(message model.Message) *util.ChatError {
_, err := d.db.NamedExec(`insert into "message" ("sender_id", "channel_id", "time", "content") values (:sender_id, :channel_id, :time, :content)`, &message)
return util.MakeError(err, util.DATABASE_QUERY_FAULT)
}
// Read returns a message by ID
func (d MessageDAO) Read(id int) (model.Message, *util.ChatError) {
message := model.Message{}
var rows *sqlx.Rows
var err error
rows, err = d.db.NamedQuery(`select * from "message" where "id" = $1`, id)
if err != nil {
return message, util.MakeError(err, util.DATABASE_QUERY_FAULT)
}
defer rows.Close()
if !rows.Next() {
return message, &util.ChatError{Message: "", Code: util.NOT_FOUND}
}
err = rows.StructScan(&message)
return message, util.MakeError(err, util.DATABASE_QUERY_FAULT)
}
// List all messages in channel by ID or name
func (d MessageDAO) List(channel model.Channel) ([]model.Message, *util.ChatError) {
var rows *sqlx.Rows
var err error
if channel.ID != 0 {
rows, err = d.db.Queryx(`select * from "message" where "id" = :id order by "time"`, &channel)
} else {
rows, err = d.db.Queryx(`select * from "message" where "name" = :name order by "time"`, &channel)
}
if err != nil {
return nil, util.MakeError(err, util.DATABASE_QUERY_FAULT)
}
defer rows.Close()
messages := make([]model.Message, 0)
for rows.Next() {
message := model.Message{}
err = rows.StructScan(&channel)
if err != nil {
break
}
messages = append(messages, message)
}
return messages, util.MakeError(err, util.DATABASE_QUERY_FAULT)
}
// Update the contents and time of a Message with the given ID
func (d MessageDAO) Update(message model.Message) *util.ChatError {
_, err := d.db.NamedExec(`update "message" set "content" = :content, "time" = :time where "id" = :id`, &message)
return util.MakeError(err, util.DATABASE_QUERY_FAULT)
}
// Delete a message by ID
func (d MessageDAO) Delete(id int) *util.ChatError {
var err error
_, err = d.db.NamedExec(`delete from "message" where "id" = $1`, id)
return util.MakeError(err, util.DATABASE_QUERY_FAULT)
}
func MakeMessageDAO() (MessageDAO, *util.ChatError) {
dao := MessageDAO{}
conn, err := getDatabase()
if err != nil {
return dao, err
}
dao.db = conn
return dao, nil
}