go-ssb-room/roomdb/sqlite/denied.go

149 lines
3.5 KiB
Go
Raw Normal View History

2021-02-09 11:53:33 +00:00
// SPDX-License-Identifier: MIT
// +build ignore
2021-02-08 16:47:42 +00:00
package sqlite
import (
2021-02-11 15:43:19 +00:00
"context"
2021-02-08 16:47:42 +00:00
"database/sql"
2021-02-11 15:43:19 +00:00
"fmt"
2021-02-15 16:21:06 +00:00
"github.com/friendsofgo/errors"
"github.com/mattn/go-sqlite3"
2021-02-11 15:43:19 +00:00
"github.com/volatiletech/sqlboiler/v4/boil"
"github.com/volatiletech/sqlboiler/v4/queries/qm"
2021-02-08 16:47:42 +00:00
2021-03-10 15:44:46 +00:00
"github.com/ssb-ngi-pointer/go-ssb-room/roomdb"
"github.com/ssb-ngi-pointer/go-ssb-room/roomdb/sqlite/models"
2021-02-11 15:43:19 +00:00
refs "go.mindeco.de/ssb-refs"
2021-02-08 16:47:42 +00:00
)
// compiler assertion to ensure the struct fullfills the interface
var _ roomdb.DeniedListService = (*DeniedList)(nil)
2021-02-08 16:47:42 +00:00
// The DeniedList is backed by the members table
type DeniedList struct {
2021-02-08 16:47:42 +00:00
db *sql.DB
}
2021-02-11 15:43:19 +00:00
// Add adds the feed to the list.
func (al DeniedList) Add(ctx context.Context, a refs.FeedRef) error {
// single insert transaction but this makes it easier to re-use in invites.Consume
return transact(al.db, func(tx *sql.Tx) error {
return al.add(ctx, tx, a)
})
}
// this add is not exported and for internal use with transactions.
func (al DeniedList) add(ctx context.Context, tx *sql.Tx, a refs.FeedRef) error {
2021-02-11 15:43:19 +00:00
// TODO: better valid
if _, err := refs.ParseFeedRef(a.Ref()); err != nil {
return err
}
var entry models.Member
2021-02-11 15:43:19 +00:00
entry.PubKey.FeedRef = a
err := entry.Insert(ctx, tx, boil.Whitelist("pub_key"))
2021-02-11 15:43:19 +00:00
if err != nil {
2021-02-15 16:21:06 +00:00
var sqlErr sqlite3.Error
if errors.As(err, &sqlErr) && sqlErr.ExtendedCode == sqlite3.ErrConstraintUnique {
2021-03-10 15:44:46 +00:00
return roomdb.ErrAlreadyAdded{Ref: a}
2021-02-15 16:21:06 +00:00
}
return fmt.Errorf("Denied-list: failed to insert new entry %s: %w - type:%T", entry.PubKey, err, err)
2021-02-11 15:43:19 +00:00
}
return nil
}
// HasFeed returns true if a feed is on the list.
func (al DeniedList) HasFeed(ctx context.Context, h refs.FeedRef) bool {
_, err := models.DeniedLists(qm.Where("pub_key = ?", h.Ref())).One(ctx, al.db)
2021-02-11 15:43:19 +00:00
if err != nil {
return false
}
return true
}
// HasID returns true if a feed is on the list.
func (al DeniedList) HasID(ctx context.Context, id int64) bool {
_, err := models.FindDeniedList(ctx, al.db, id)
if err != nil {
return false
}
return true
}
// GetByID returns the entry if a feed with that ID is on the list.
func (al DeniedList) GetByID(ctx context.Context, id int64) (roomdb.ListEntry, error) {
2021-03-10 15:44:46 +00:00
var le roomdb.ListEntry
entry, err := models.FindDeniedList(ctx, al.db, id)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
2021-03-10 15:44:46 +00:00
return le, roomdb.ErrNotFound
}
return le, err
}
le.ID = entry.ID
le.PubKey = entry.PubKey.FeedRef
return le, nil
}
2021-02-11 15:43:19 +00:00
// List returns a list of all the feeds.
func (al DeniedList) List(ctx context.Context) (roomdb.ListEntries, error) {
all, err := models.DeniedLists().All(ctx, al.db)
2021-02-11 15:43:19 +00:00
if err != nil {
return nil, err
}
2021-03-10 15:44:46 +00:00
var asRefs = make(roomdb.ListEntries, len(all))
for i, Denieded := range all {
2021-03-10 15:44:46 +00:00
asRefs[i] = roomdb.ListEntry{
ID: Denieded.ID,
PubKey: Denieded.PubKey.FeedRef,
}
2021-02-11 15:43:19 +00:00
}
return asRefs, nil
}
// RemoveFeed removes the feed from the list.
func (al DeniedList) RemoveFeed(ctx context.Context, r refs.FeedRef) error {
entry, err := models.DeniedLists(qm.Where("pub_key = ?", r.Ref())).One(ctx, al.db)
2021-02-11 15:43:19 +00:00
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
2021-03-10 15:44:46 +00:00
return roomdb.ErrNotFound
}
return err
}
_, err = entry.Delete(ctx, al.db)
if err != nil {
return err
}
return nil
}
// RemoveID removes the feed from the list.
func (al DeniedList) RemoveID(ctx context.Context, id int64) error {
entry, err := models.FindDeniedList(ctx, al.db, id)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
2021-03-10 15:44:46 +00:00
return roomdb.ErrNotFound
}
2021-02-11 15:43:19 +00:00
return err
}
_, err = entry.Delete(ctx, al.db)
2021-02-11 15:43:19 +00:00
if err != nil {
return err
}
return nil
}