Aggiunte tante cose
This commit is contained in:
+136
-17
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user