mirror of
https://github.com/aljazceru/lspd.git
synced 2025-12-20 15:24:23 +01:00
notifications: postgres datastore implementation
This commit is contained in:
76
postgresql/notifications_store.go
Normal file
76
postgresql/notifications_store.go
Normal file
@@ -0,0 +1,76 @@
|
||||
package postgresql
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/hex"
|
||||
"time"
|
||||
|
||||
"github.com/jackc/pgx/v4/pgxpool"
|
||||
)
|
||||
|
||||
type NotificationsStore struct {
|
||||
pool *pgxpool.Pool
|
||||
}
|
||||
|
||||
func NewNotificationsStore(pool *pgxpool.Pool) *NotificationsStore {
|
||||
return &NotificationsStore{pool: pool}
|
||||
}
|
||||
|
||||
func (s *NotificationsStore) Register(
|
||||
ctx context.Context,
|
||||
pubkey string,
|
||||
url string,
|
||||
) error {
|
||||
pk, err := hex.DecodeString(pubkey)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
now := time.Now().UnixMicro()
|
||||
_, err = s.pool.Exec(
|
||||
ctx,
|
||||
`INSERT INTO public.notification_subscriptions (pubkey, url, created_at, refreshed_at)
|
||||
values ($1, $2, $3, $4)
|
||||
ON CONFLICT (pubkey, url) DO UPDATE SET refreshed_at = $4`,
|
||||
pk,
|
||||
url,
|
||||
now,
|
||||
now,
|
||||
)
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func (s *NotificationsStore) GetRegistrations(
|
||||
ctx context.Context,
|
||||
pubkey string,
|
||||
) ([]string, error) {
|
||||
pk, err := hex.DecodeString(pubkey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rows, err := s.pool.Query(
|
||||
ctx,
|
||||
`SELECT url
|
||||
FROM public.notification_subscriptions
|
||||
WHERE pubkey = $1`,
|
||||
pk,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var result []string
|
||||
for rows.Next() {
|
||||
var url string
|
||||
err = rows.Scan(&url)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result = append(result, url)
|
||||
}
|
||||
|
||||
return result, nil
|
||||
}
|
||||
Reference in New Issue
Block a user