api/internal/storage/datastore.go

77 lines
1.5 KiB
Go

package storage
import (
"encoding/json"
"log/slog"
"os"
"sync"
)
type DataStore struct {
Data map[string]any
Mutex sync.Mutex
}
var GlobalDataStore = &DataStore{
Data: make(map[string]any),
}
func InitDataStore() *DataStore {
GlobalDataStore = &DataStore{
Data: make(map[string]any),
}
file, err := os.Open("./data.json")
if err != nil {
if os.IsNotExist(err) {
slog.Warn("Data store file not found; creating new file")
GlobalDataStore.Save()
return GlobalDataStore
}
slog.Error("Could not load data store file!", slog.Any("error", err))
return nil
}
defer file.Close()
decoder := json.NewDecoder(file)
if err := decoder.Decode(&GlobalDataStore.Data); err != nil {
slog.Error("Failed to decode data store file", slog.Any("error", err))
return nil
}
slog.Info("Data store loaded")
return GlobalDataStore
}
func (store *DataStore) Get(key string) any {
store.Mutex.Lock()
defer store.Mutex.Unlock()
return store.Data[key]
}
func (store *DataStore) Set(key string, value any) {
store.Mutex.Lock()
defer store.Mutex.Unlock()
store.Data[key] = value
}
func (store *DataStore) Save() error {
store.Mutex.Lock()
defer store.Mutex.Unlock()
file, err := os.Create("./data.json")
if err != nil {
slog.Error("Could not create data store file", slog.Any("error", err))
return err
}
defer file.Close()
encoder := json.NewEncoder(file)
if err := encoder.Encode(store.Data); err != nil {
slog.Error("Failed to encode data store", slog.Any("error", err))
return err
}
return nil
}