223 lines
4.8 KiB
Go
223 lines
4.8 KiB
Go
package types
|
|
|
|
import (
|
|
"strings"
|
|
)
|
|
|
|
// StorageBackend is the interface used to persist data.
|
|
type StorageBackend interface {
|
|
GetUserByID(uint) (*User, error)
|
|
GetUserByUsername(string) (*User, error)
|
|
GetUsers() ([]*User, error)
|
|
SaveUser(u *User) error
|
|
UpdateUser(u *User, fields ...string) error
|
|
DeleteUserByID(uint) error
|
|
DeleteUserByUsername(string) error
|
|
GetSettings() (*Settings, error)
|
|
SaveSettings(*Settings) error
|
|
GetAuther(AuthMethod) (Auther, error)
|
|
SaveAuther(Auther) error
|
|
GetLinkByHash(hash string) (*ShareLink, error)
|
|
GetLinkPermanent(path string) (*ShareLink, error)
|
|
GetLinksByPath(path string) ([]*ShareLink, error)
|
|
SaveLink(s *ShareLink) error
|
|
DeleteLink(hash string) error
|
|
}
|
|
|
|
// Storage implements Storage interface and verifies
|
|
// the data before getting in and out the database.
|
|
type Storage struct {
|
|
src StorageBackend
|
|
}
|
|
|
|
// NewStorage creates a Storage from a StorageBackend.
|
|
func NewStorage(src StorageBackend) *Storage {
|
|
return &Storage{src: src}
|
|
}
|
|
|
|
// GetUser allows you to get a user by its name or username. The provided
|
|
// id must be a string for username lookup or a uint for id lookup. If id
|
|
// is neither, a ErrInvalidDataType will be returned.
|
|
func (v *Storage) GetUser(id interface{}) (*User, error) {
|
|
var (
|
|
user *User
|
|
err error
|
|
)
|
|
|
|
switch id.(type) {
|
|
case string:
|
|
user, err = v.src.GetUserByUsername(id.(string))
|
|
case uint:
|
|
user, err = v.src.GetUserByID(id.(uint))
|
|
default:
|
|
return nil, ErrInvalidDataType
|
|
}
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
settings, err := v.GetSettings()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
user.clean(settings)
|
|
return user, err
|
|
}
|
|
|
|
// GetUsers gets a list of all users.
|
|
func (v *Storage) GetUsers() ([]*User, error) {
|
|
users, err := v.src.GetUsers()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
settings, err := v.GetSettings()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
for _, user := range users {
|
|
user.clean(settings)
|
|
}
|
|
|
|
return users, err
|
|
}
|
|
|
|
// UpdateUser updates a user in the database.
|
|
func (v *Storage) UpdateUser(user *User, fields ...string) error {
|
|
settings, err := v.GetSettings()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = user.clean(settings, fields...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return v.src.UpdateUser(user, fields...)
|
|
}
|
|
|
|
// SaveUser saves the user in a storage.
|
|
func (v *Storage) SaveUser(user *User) error {
|
|
settings, err := v.GetSettings()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := user.clean(settings); err != nil {
|
|
return err
|
|
}
|
|
|
|
return v.src.SaveUser(user)
|
|
}
|
|
|
|
// DeleteUser allows you to delete a user by its name or username. The provided
|
|
// id must be a string for username lookup or a uint for id lookup. If id
|
|
// is neither, a ErrInvalidDataType will be returned.
|
|
func (v *Storage) DeleteUser(id interface{}) (err error) {
|
|
switch id.(type) {
|
|
case string:
|
|
err = v.src.DeleteUserByUsername(id.(string))
|
|
case uint:
|
|
err = v.src.DeleteUserByID(id.(uint))
|
|
default:
|
|
err = ErrInvalidDataType
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// GetSettings wraps a ConfigStore.GetSettings
|
|
func (v *Storage) GetSettings() (*Settings, error) {
|
|
return v.src.GetSettings()
|
|
}
|
|
|
|
// SaveSettings wraps a ConfigStore.SaveSettings
|
|
func (v *Storage) SaveSettings(s *Settings) error {
|
|
s.BaseURL = strings.TrimSuffix(s.BaseURL, "/")
|
|
|
|
if len(s.Key) == 0 {
|
|
return ErrEmptyKey
|
|
}
|
|
|
|
if s.Defaults.Locale == "" {
|
|
s.Defaults.Locale = "en"
|
|
}
|
|
|
|
if s.Defaults.Commands == nil {
|
|
s.Defaults.Commands = []string{}
|
|
}
|
|
|
|
if s.Defaults.ViewMode == "" {
|
|
s.Defaults.ViewMode = MosaicViewMode
|
|
}
|
|
|
|
if s.Rules == nil {
|
|
s.Rules = []Rule{}
|
|
}
|
|
|
|
if s.Shell == nil {
|
|
s.Shell = []string{}
|
|
}
|
|
|
|
if s.Commands == nil {
|
|
s.Commands = map[string][]string{}
|
|
}
|
|
|
|
for _, event := range defaultEvents {
|
|
if _, ok := s.Commands["before_"+event]; !ok {
|
|
s.Commands["before_"+event] = []string{}
|
|
}
|
|
|
|
if _, ok := s.Commands["after_"+event]; !ok {
|
|
s.Commands["after_"+event] = []string{}
|
|
}
|
|
}
|
|
|
|
return v.src.SaveSettings(s)
|
|
}
|
|
|
|
// GetAuther wraps a ConfigStore.GetAuther
|
|
func (v *Storage) GetAuther(t AuthMethod) (Auther, error) {
|
|
auther, err := v.src.GetAuther(t)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
auther.SetStorage(v)
|
|
return auther, nil
|
|
}
|
|
|
|
// SaveAuther wraps a ConfigStore.SaveAuther
|
|
func (v *Storage) SaveAuther(a Auther) error {
|
|
return v.src.SaveAuther(a)
|
|
}
|
|
|
|
// GetLinkByHash wraps a Storage.GetLinkByHash.
|
|
func (v *Storage) GetLinkByHash(hash string) (*ShareLink, error) {
|
|
return v.src.GetLinkByHash(hash)
|
|
}
|
|
|
|
// GetLinkPermanent wraps a Storage.GetLinkPermanent
|
|
func (v *Storage) GetLinkPermanent(path string) (*ShareLink, error) {
|
|
return v.src.GetLinkPermanent(path)
|
|
}
|
|
|
|
// GetLinksByPath wraps a Storage.GetLinksByPath
|
|
func (v *Storage) GetLinksByPath(path string) ([]*ShareLink, error) {
|
|
return v.src.GetLinksByPath(path)
|
|
}
|
|
|
|
// SaveLink wraps a Storage.SaveLink
|
|
func (v *Storage) SaveLink(s *ShareLink) error {
|
|
return v.src.SaveLink(s)
|
|
}
|
|
|
|
// DeleteLink wraps a Storage.DeleteLink
|
|
func (v *Storage) DeleteLink(hash string) error {
|
|
return v.src.DeleteLink(hash)
|
|
}
|