You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
96 lines
2.6 KiB
96 lines
2.6 KiB
package database
|
|
|
|
import (
|
|
"database/sql"
|
|
"log"
|
|
|
|
"github.com/dustinpianalto/geeksbot"
|
|
"github.com/lib/pq"
|
|
)
|
|
|
|
type messageService struct {
|
|
db *sql.DB
|
|
}
|
|
|
|
func (s messageService) Message(id string) (geeksbot.Message, error) {
|
|
var m geeksbot.Message
|
|
var channel_id string
|
|
var author_id string
|
|
queryString := `SELECT m.id, m.created_at, m.modified_at, m.content,
|
|
m.previous_content, m.channel_id, m.author_id
|
|
FROM messages as m
|
|
WHERE m.id = $1`
|
|
row := s.db.QueryRow(queryString, id)
|
|
err := row.Scan(&m.ID, &m.CreatedAt, &m.ModifiedAt, &m.Content,
|
|
pq.Array(&m.PreviousContent), &channel_id, &author_id)
|
|
if err != nil {
|
|
return geeksbot.Message{}, err
|
|
}
|
|
author, err := UserService.User(author_id)
|
|
if err != nil {
|
|
return geeksbot.Message{}, err
|
|
}
|
|
m.Author = author
|
|
channel, err := ChannelService.Channel(channel_id)
|
|
if err != nil {
|
|
return geeksbot.Message{}, err
|
|
}
|
|
m.Channel = channel
|
|
return m, nil
|
|
}
|
|
|
|
func (s messageService) CreateMessage(m geeksbot.Message) (geeksbot.Message, error) {
|
|
queryString := `INSERT INTO messages (id, created_at, content, channel_id, author_id)
|
|
VALUES ($1, $2, $3, $4, $5)`
|
|
_, err := s.db.Exec(queryString, m.ID, m.CreatedAt, m.Content, m.Channel.ID, m.Author.ID)
|
|
return m, err
|
|
}
|
|
|
|
func (s messageService) UpdateMessage(m geeksbot.Message) (geeksbot.Message, error) {
|
|
var content string
|
|
var previousContent []string
|
|
queryString := "SELECT content, previous_content FROM messages WHERE id = $1"
|
|
row := s.db.QueryRow(queryString, m.ID)
|
|
err := row.Scan(&content, &previousContent)
|
|
if err != nil {
|
|
return geeksbot.Message{}, err
|
|
}
|
|
if m.Content != content {
|
|
previousContent = append(previousContent, content)
|
|
}
|
|
queryString = "UPDATE messages SET modified_at = $2, content = $3, previous_content = $4 WHERE id = $1"
|
|
_, err = s.db.Exec(queryString, m.ID, m.ModifiedAt, m.Content, previousContent)
|
|
m.PreviousContent = previousContent
|
|
return m, nil
|
|
}
|
|
|
|
func (s messageService) DeleteMessage(m geeksbot.Message) error {
|
|
queryString := "DELETE FROM messages WHERE id = $1"
|
|
_, err := s.db.Exec(queryString, m.ID)
|
|
return err
|
|
}
|
|
|
|
func (s messageService) ChannelMessages(c geeksbot.Channel) ([]geeksbot.Message, error) {
|
|
var messages []geeksbot.Message
|
|
queryString := `SELECT id FROM messages WHERE channel_id = $1`
|
|
rows, err := s.db.Query(queryString, c.ID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
for rows.Next() {
|
|
var id string
|
|
err = rows.Scan(&id)
|
|
if err != nil {
|
|
log.Println(err)
|
|
continue
|
|
}
|
|
m, err := s.Message(id)
|
|
if err != nil {
|
|
log.Println(err)
|
|
continue
|
|
}
|
|
messages = append(messages, m)
|
|
}
|
|
return messages, nil
|
|
}
|