Files
remark42/backend/app/store/admin/admin.go
T

86 lines
2.3 KiB
Go

// Package admin defines and implements store for admin-level data like secret key, list of admins and so on
package admin
import (
"fmt"
"strings"
log "github.com/go-pkgz/lgr"
)
// NOTE: matryer/moq should be installed globally and works with `go generate ./...`
//go:generate moq --out admin_mock.go . Store
// Store defines interface returning admins info for given site
type Store interface {
Key(siteID string) (key string, err error)
Admins(siteID string) (ids []string, err error)
Email(siteID string) (email string, err error)
Enabled(siteID string) (ok bool, err error)
OnEvent(siteID string, et EventType) error
}
// EventType indicates type of the event
type EventType int
// enum of all event types
const (
EvCreate EventType = iota
EvDelete
EvUpdate
EvVote
)
// StaticStore implements keys.Store with a single set of admins and email for all sites
type StaticStore struct {
admins []string
email string
key string
sites []string
}
// NewStaticStore makes StaticStore instance with given key
func NewStaticStore(key string, sites, adminIDs []string, email string) *StaticStore {
log.Printf("[DEBUG] admin users %+v, email %s", adminIDs, email)
return &StaticStore{key: key, sites: sites, admins: adminIDs, email: email}
}
// NewStaticKeyStore is a shortcut for making StaticStore for key consumers only
func NewStaticKeyStore(key string) *StaticStore {
return &StaticStore{key: key, admins: []string{}, email: ""}
}
// Key returns static key, same for all sites
func (s *StaticStore) Key(_ string) (key string, err error) {
if s.key == "" {
return "", fmt.Errorf("empty key for static key store")
}
return s.key, nil
}
// Admins returns static list of admin ids, the same for all sites
func (s *StaticStore) Admins(string) (ids []string, err error) {
return s.admins, nil
}
// Email gets static email address
func (s *StaticStore) Email(string) (email string, err error) {
return s.email, nil
}
// Enabled if always true for StaticStore
func (s *StaticStore) Enabled(site string) (ok bool, err error) {
if len(s.sites) == 0 {
return true, nil
}
for _, allowedSite := range s.sites {
if strings.EqualFold(allowedSite, site) {
return true, nil
}
}
return false, nil
}
// OnEvent does nothing for StaticStore
func (s *StaticStore) OnEvent(_ string, _ EventType) error { return nil }