Aggiunte tante cose

This commit is contained in:
2022-07-04 03:49:29 +02:00
parent 658a40c8bb
commit 8823418daa
20 changed files with 1354 additions and 313 deletions
+136 -17
View File
@@ -8,6 +8,7 @@ import (
"os"
"git.phc.dm.unipi.it/phc/storage/store"
"git.phc.dm.unipi.it/phc/storage/utils"
"golang.org/x/exp/slices"
)
@@ -26,6 +27,13 @@ type Database interface {
GetDashboardState() (DashboardState, error)
SetDashboardState(DashboardState) error
// API Keys
CreateAPIKey() (string, error)
CheckAPIKey(key string) error
RemoveAPIKey(key string) error
AllAPIKeys() ([]string, error)
// Bucket Operations
CreateBucket(bucket string, options ...any) error
@@ -57,6 +65,8 @@ type jsonDB struct {
DashboardState DashboardState `json:"dashboardState"`
Buckets map[string]*jsonBucket `json:"buckets"`
APIKeys []string `json:"api-keys"`
}
func NewJSON(file string) Database {
@@ -67,6 +77,7 @@ func NewJSON(file string) Database {
Widgets: []MonitorWidget{},
},
Buckets: map[string]*jsonBucket{},
APIKeys: []string{},
}
err := db.load()
@@ -77,6 +88,18 @@ func NewJSON(file string) Database {
return db
}
// func writeTransaction[T any](db *jsonDB, transactionFunc func(db *jsonDB) (T, error)) (T, error) {
// var zero T
// if err := db.load(); err != nil {
// return zero, err
// }
// v, err := transactionFunc(db)
// if err := db.store(); err != nil {
// return zero, err
// }
// return v, err
// }
func (db *jsonDB) setup() error {
if _, err := os.Stat(db.file); !os.IsNotExist(err) {
return nil
@@ -134,21 +157,85 @@ func (db *jsonDB) load() error {
}
func (db *jsonDB) GetDashboardState() (DashboardState, error) {
db.load()
if err := db.load(); err != nil {
return DashboardState{}, err
}
return db.DashboardState, nil
}
func (db *jsonDB) SetDashboardState(state DashboardState) error {
db.load()
if err := db.load(); err != nil {
return err
}
db.DashboardState = state
db.store()
if err := db.store(); err != nil {
return err
}
return nil
}
func (db *jsonDB) CreateAPIKey() (string, error) {
if err := db.load(); err != nil {
return "", err
}
key := utils.GenerateRandomString(32)
db.APIKeys = append(db.APIKeys, key)
if err := db.store(); err != nil {
return "", err
}
return key, nil
}
func (db *jsonDB) AllAPIKeys() ([]string, error) {
if err := db.load(); err != nil {
return nil, err
}
return db.APIKeys, nil
}
func (db *jsonDB) CheckAPIKey(key string) error {
if err := db.load(); err != nil {
return err
}
if !slices.Contains(db.APIKeys, key) {
return fmt.Errorf("the given API key %q is invalid", key)
}
return nil
}
func (db *jsonDB) RemoveAPIKey(key string) error {
if err := db.load(); err != nil {
return err
}
i := slices.Index(db.APIKeys, key)
if i == -1 {
return fmt.Errorf("the given API key %q is invalid", key)
}
db.APIKeys = append(db.APIKeys[:i], db.APIKeys[i+1:]...)
if err := db.store(); err != nil {
return err
}
return nil
}
func (db *jsonDB) CreateBucket(bucket string, options ...any) error {
db.load()
if err := db.load(); err != nil {
return err
}
if _, found := db.Buckets[bucket]; found {
return fmt.Errorf("bucket named %q already present", bucket)
@@ -165,12 +252,17 @@ func (db *jsonDB) CreateBucket(bucket string, options ...any) error {
db.Buckets[bucket] = bi
db.store()
if err := db.store(); err != nil {
return err
}
return nil
}
func (db *jsonDB) DeleteBucket(bucket string) error {
db.load()
if err := db.load(); err != nil {
return err
}
if _, found := db.Buckets[bucket]; !found {
return fmt.Errorf("bucket named %q not found", bucket)
@@ -180,12 +272,17 @@ func (db *jsonDB) DeleteBucket(bucket string) error {
log.Printf("The bucket named %q was removed but its files are still on disk", bucket)
db.store()
if err := db.store(); err != nil {
return err
}
return nil
}
func (db *jsonDB) AllBuckets() ([]string, error) {
db.load()
if err := db.load(); err != nil {
return nil, err
}
buckets := make([]string, 0, len(db.Buckets))
@@ -197,7 +294,9 @@ func (db *jsonDB) AllBuckets() ([]string, error) {
}
func (db *jsonDB) CreateBucketObject(bucket string, r io.Reader) (string, error) {
db.load()
if err := db.load(); err != nil {
return "", err
}
b, found := db.Buckets[bucket]
if !found {
@@ -211,24 +310,34 @@ func (db *jsonDB) CreateBucketObject(bucket string, r io.Reader) (string, error)
b.Objects = append(b.Objects, id)
db.store()
if err := db.store(); err != nil {
return "", err
}
return id, err
}
func (db *jsonDB) SetBucketObject(bucket, id string, r io.Reader) error {
db.load()
if err := db.load(); err != nil {
return err
}
b, found := db.Buckets[bucket]
if !found {
return fmt.Errorf("bucket named %q not found", bucket)
}
db.store()
if err := db.store(); err != nil {
return err
}
return store.Update(b.Path, db.PrefixSize, id, r)
}
func (db *jsonDB) GetBucketObject(bucket, id string, w io.Writer) error {
db.load()
if err := db.load(); err != nil {
return err
}
b, found := db.Buckets[bucket]
if !found {
@@ -239,7 +348,9 @@ func (db *jsonDB) GetBucketObject(bucket, id string, w io.Writer) error {
}
func (db *jsonDB) DeleteBucketObject(bucket, id string) error {
db.load()
if err := db.load(); err != nil {
return err
}
b, found := db.Buckets[bucket]
if !found {
@@ -253,12 +364,17 @@ func (db *jsonDB) DeleteBucketObject(bucket, id string) error {
i := slices.Index(b.Objects, id)
b.Objects = append(b.Objects[:i], b.Objects[i+1:]...)
db.store()
if err := db.store(); err != nil {
return err
}
return nil
}
func (db *jsonDB) AllBucketObjects(bucket string) ([]string, error) {
db.load()
if err := db.load(); err != nil {
return nil, err
}
b, found := db.Buckets[bucket]
if !found {
@@ -272,6 +388,9 @@ func (db *jsonDB) AllBucketObjects(bucket string) ([]string, error) {
b.Objects = objects
db.store()
if err := db.store(); err != nil {
return nil, err
}
return b.Objects, nil
}