Remove the module "xxx" { source = "./module" } indirection layer
from all 66 service stacks. Resources are now defined directly in
each stack's main.tf instead of through a wrapper module.
- Merge module/main.tf contents into stack main.tf
- Apply variable replacements (var.tier -> local.tiers.X, renamed vars)
- Fix shared module paths (one fewer ../ at each level)
- Move extra files/dirs (factory/, chart_values, subdirs) to stack root
- Update state files to strip module.<name>. prefix
- Update CLAUDE.md to reflect flat structure
Verified: terragrunt plan shows 0 add, 0 destroy across all stacks.
91 lines
2 KiB
Go
91 lines
2 KiB
Go
package store
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"f1-stream/internal/models"
|
|
|
|
"github.com/go-webauthn/webauthn/webauthn"
|
|
)
|
|
|
|
func (s *Store) LoadUsers() ([]models.User, error) {
|
|
s.usersMu.RLock()
|
|
defer s.usersMu.RUnlock()
|
|
var users []models.User
|
|
if err := readJSON(s.filePath("users.json"), &users); err != nil {
|
|
return nil, err
|
|
}
|
|
return users, nil
|
|
}
|
|
|
|
func (s *Store) GetUserByName(username string) (*models.User, error) {
|
|
s.usersMu.RLock()
|
|
defer s.usersMu.RUnlock()
|
|
var users []models.User
|
|
if err := readJSON(s.filePath("users.json"), &users); err != nil {
|
|
return nil, err
|
|
}
|
|
for _, u := range users {
|
|
if u.Username == username {
|
|
return &u, nil
|
|
}
|
|
}
|
|
return nil, nil
|
|
}
|
|
|
|
func (s *Store) GetUserByID(id string) (*models.User, error) {
|
|
s.usersMu.RLock()
|
|
defer s.usersMu.RUnlock()
|
|
var users []models.User
|
|
if err := readJSON(s.filePath("users.json"), &users); err != nil {
|
|
return nil, err
|
|
}
|
|
for _, u := range users {
|
|
if u.ID == id {
|
|
return &u, nil
|
|
}
|
|
}
|
|
return nil, nil
|
|
}
|
|
|
|
func (s *Store) CreateUser(user models.User) error {
|
|
s.usersMu.Lock()
|
|
defer s.usersMu.Unlock()
|
|
var users []models.User
|
|
if err := readJSON(s.filePath("users.json"), &users); err != nil {
|
|
return err
|
|
}
|
|
for _, u := range users {
|
|
if u.Username == user.Username {
|
|
return fmt.Errorf("username already exists")
|
|
}
|
|
}
|
|
users = append(users, user)
|
|
return writeJSON(s.filePath("users.json"), users)
|
|
}
|
|
|
|
func (s *Store) UpdateUserCredentials(userID string, creds []webauthn.Credential) error {
|
|
s.usersMu.Lock()
|
|
defer s.usersMu.Unlock()
|
|
var users []models.User
|
|
if err := readJSON(s.filePath("users.json"), &users); err != nil {
|
|
return err
|
|
}
|
|
for i, u := range users {
|
|
if u.ID == userID {
|
|
users[i].Credentials = creds
|
|
return writeJSON(s.filePath("users.json"), users)
|
|
}
|
|
}
|
|
return fmt.Errorf("user not found")
|
|
}
|
|
|
|
func (s *Store) UserCount() (int, error) {
|
|
s.usersMu.RLock()
|
|
defer s.usersMu.RUnlock()
|
|
var users []models.User
|
|
if err := readJSON(s.filePath("users.json"), &users); err != nil {
|
|
return 0, err
|
|
}
|
|
return len(users), nil
|
|
}
|