websub-hub/cmd/hubserver/storage/postgres.go
Peter Stuifzand 6f05bd0f85
All checks were successful
continuous-integration/drone/push Build is passing
Filter on topic
2019-03-19 07:18:24 +01:00

63 lines
1.3 KiB
Go

package storage
import (
"database/sql"
"fmt"
_ "github.com/lib/pq"
)
type postgres struct {
db *sql.DB
}
func New(dsn string) (Service, error) {
pool, err := sql.Open("postgres", dsn)
if err != nil {
return nil, fmt.Errorf("could not open database connection: %v", err)
}
return &postgres{pool}, nil
}
func (s *postgres) Close() error {
return s.db.Close()
}
func (s *postgres) Subscribe(topic string, sub Subscriber) error {
_, err := s.db.Exec(
`INSERT INTO "subscribers" ("topic", "callback", "lease_seconds", "secret", "created") VALUES ($1, $2, $3, $4, now())`,
topic,
sub.Callback,
sub.LeaseSeconds,
sub.Secret,
)
return err
}
func (s *postgres) Unsubscribe(topic, callback string) error {
_, err := s.db.Exec(
`DELETE FROM "subscribers" WHERE "topic" = ? AND "callback" = $1`,
topic,
callback,
)
return err
}
func (s *postgres) Subscribers(topic string) ([]Subscriber, error) {
rows, err := s.db.Query(`SELECT callback, lease_seconds, secret, created FROM "subscribers" WHERE "topic" = $1`, topic)
if err != nil {
return nil, err
}
var subscribers []Subscriber
for rows.Next() {
var sub Subscriber
err := rows.Scan(&sub.Callback, &sub.LeaseSeconds, &sub.Secret, &sub.Created)
if err != nil {
return nil, err
}
subscribers = append(subscribers, sub)
}
return subscribers, nil
}