Files
noteplace-server/internal/store/store.go
T
haopengzhan f1909da1ad
Go CI / build (push) Failing after 2m42s
Initial commit
feat: create basic server to manage google oauth, account, sessions, places, attributes and ratings.
2025-09-19 02:43:04 -07:00

83 lines
1.9 KiB
Go

package store
import (
"encoding/json"
"os"
"sync"
"git.pengzhan.dev/noteplace-server/internal/models"
)
// DB represents the structure of the entire JSON database.
type DB struct {
Users map[string]models.User `json:"users"`
Sessions map[string]models.Session `json:"sessions"`
Places map[string]models.Place `json:"places"`
Addresses map[string]models.Address `json:"addresses"`
Categories map[string]models.Category `json:"categories"`
Attributes map[string]models.Attribute `json:"attributes"`
Ratings map[string]models.Rating `json:"ratings"`
}
// Store manages the in-memory data and provides safe access.
type Store struct {
Mu sync.RWMutex
path string
Data *DB
}
// New creates and initializes a new Store.
func New(path string) (*Store, error) {
s := &Store{
path: path,
Data: &DB{},
}
if err := s.load(); err != nil {
return nil, err
}
return s, nil
}
// load reads the database file from disk into the Store.
func (s *Store) load() error {
s.Mu.Lock()
defer s.Mu.Unlock()
file, err := os.ReadFile(s.path)
if err != nil {
// If the file doesn't exist, we can assume an empty database.
if os.IsNotExist(err) {
s.Data = &DB{
Users: map[string]models.User{},
Sessions: map[string]models.Session{},
Places: map[string]models.Place{},
Addresses: map[string]models.Address{},
Categories: map[string]models.Category{},
Attributes: map[string]models.Attribute{},
Ratings: map[string]models.Rating{},
}
return nil
}
return err
}
return json.Unmarshal(file, s.Data)
}
// Save writes the current in-memory data back to the JSON file.
func (s *Store) Save() error {
s.Mu.RLock()
defer s.Mu.RUnlock()
data, err := json.MarshalIndent(s.Data, "", " ")
if err != nil {
return err
}
return os.WriteFile(s.path, data, 0644)
}
// CreateSession adds a new session to the store.