idiomatic project structure

This commit is contained in:
2024-11-26 11:31:46 -06:00
parent 1200380341
commit 052f95702d
44 changed files with 717 additions and 481 deletions

138
internal/db/in_memory_db.go Normal file
View File

@@ -0,0 +1,138 @@
package db
import (
"errors"
"fmt"
"go-nkode/internal/models"
)
type InMemoryDb struct {
Customers map[models.CustomerId]models.Customer
Users map[models.UserId]models.User
userIdMap map[string]models.UserId
}
func NewInMemoryDb() InMemoryDb {
return InMemoryDb{
Customers: make(map[models.CustomerId]models.Customer),
Users: make(map[models.UserId]models.User),
userIdMap: make(map[string]models.UserId),
}
}
func (db *InMemoryDb) GetCustomer(id models.CustomerId) (*models.Customer, error) {
customer, exists := db.Customers[id]
if !exists {
return nil, errors.New(fmt.Sprintf("customer %s dne", customer.Id))
}
return &customer, nil
}
func (db *InMemoryDb) GetUser(username models.UserEmail, customerId models.CustomerId) (*models.User, error) {
key := userIdKey(customerId, username)
userId, exists := db.userIdMap[key]
if !exists {
return nil, errors.New(fmt.Sprintf("customer %s with username %s dne", customerId, username))
}
user, exists := db.Users[userId]
if !exists {
panic(fmt.Sprintf("userId %s with customerId %s and username %s with no user", userId, customerId, username))
}
return &user, nil
}
func (db *InMemoryDb) WriteNewCustomer(customer models.Customer) error {
_, exists := db.Customers[customer.Id]
if exists {
return errors.New(fmt.Sprintf("can write customer %s; already exists", customer.Id))
}
db.Customers[customer.Id] = customer
return nil
}
func (db *InMemoryDb) WriteNewUser(user models.User) error {
_, exists := db.Customers[user.CustomerId]
if !exists {
return errors.New(fmt.Sprintf("can't add user %s to customer %s: customer dne", user.Email, user.CustomerId))
}
userExists, _ := db.GetUser(user.Email, user.CustomerId)
if userExists != nil {
return errors.New(fmt.Sprintf("can't write new user %s, alread exists", user.Email))
}
key := userIdKey(user.CustomerId, user.Email)
db.userIdMap[key] = user.Id
db.Users[user.Id] = user
return nil
}
func (db *InMemoryDb) UpdateUserNKode(user models.User) error {
return errors.ErrUnsupported
}
func (db *InMemoryDb) UpdateUserInterface(userId models.UserId, ui models.UserInterface) error {
user, exists := db.Users[userId]
if !exists {
return errors.New(fmt.Sprintf("can't update user %s, dne", user.Id))
}
user.Interface = ui
db.Users[userId] = user
return nil
}
func (db *InMemoryDb) UpdateUserRefreshToken(userId models.UserId, refreshToken string) error {
return nil
}
func (db *InMemoryDb) Renew(id models.CustomerId) error {
customer, exists := db.Customers[id]
if !exists {
return errors.New(fmt.Sprintf("customer %s does not exist", id))
}
setXor, attrsXor, err := customer.RenewKeys()
if err != nil {
return err
}
db.Customers[id] = customer
for _, user := range db.Users {
if user.CustomerId == id {
err = user.RenewKeys(setXor, attrsXor)
if err != nil {
return err
}
db.Users[user.Id] = user
}
}
return nil
}
func (db *InMemoryDb) RefreshUserPasscode(user models.User, passocode []int, customerAttr models.CustomerAttributes) error {
err := user.RefreshPasscode(passocode, customerAttr)
if err != nil {
return err
}
db.Users[user.Id] = user
return nil
}
func (db *InMemoryDb) RandomSvgInterface(kp models.KeypadDimension) ([]string, error) {
return make([]string, kp.TotalAttrs()), nil
}
func (db *InMemoryDb) RandomSvgIdxInterface(kp models.KeypadDimension) (models.SvgIdInterface, error) {
svgs := make(models.SvgIdInterface, kp.TotalAttrs())
for idx := range svgs {
svgs[idx] = idx
}
return svgs, nil
}
func (db *InMemoryDb) GetSvgStringInterface(idxs models.SvgIdInterface) ([]string, error) {
return make([]string, len(idxs)), nil
}
func userIdKey(customerId models.CustomerId, username models.UserEmail) string {
key := fmt.Sprintf("%s:%s", customerId, username)
return key
}