105 lines
2.3 KiB
Go
105 lines
2.3 KiB
Go
package user
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/pkg/storage"
|
|
"codeberg.org/mapleopentech/monorepo/native/desktop/maplefile/internal/domain/user"
|
|
)
|
|
|
|
const (
|
|
userKeyPrefix = "user:"
|
|
emailKeyIndex = "email_index:"
|
|
)
|
|
|
|
type repository struct {
|
|
storage storage.Storage
|
|
}
|
|
|
|
// ProvideRepository creates a new user repository
|
|
func ProvideRepository(storage storage.Storage) user.Repository {
|
|
return &repository{
|
|
storage: storage,
|
|
}
|
|
}
|
|
|
|
func (r *repository) Save(u *user.User) error {
|
|
data, err := json.Marshal(u)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to marshal user: %w", err)
|
|
}
|
|
|
|
// Save user by ID
|
|
userKey := userKeyPrefix + u.ID
|
|
if err := r.storage.Set(userKey, data); err != nil {
|
|
return fmt.Errorf("failed to save user: %w", err)
|
|
}
|
|
|
|
// Create email index
|
|
emailKey := emailKeyIndex + u.Email
|
|
if err := r.storage.Set(emailKey, []byte(u.ID)); err != nil {
|
|
return fmt.Errorf("failed to create email index: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *repository) GetByID(id string) (*user.User, error) {
|
|
key := userKeyPrefix + id
|
|
data, err := r.storage.Get(key)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to get user: %w", err)
|
|
}
|
|
|
|
var u user.User
|
|
if err := json.Unmarshal(data, &u); err != nil {
|
|
return nil, fmt.Errorf("failed to unmarshal user: %w", err)
|
|
}
|
|
|
|
return &u, nil
|
|
}
|
|
|
|
func (r *repository) GetByEmail(email string) (*user.User, error) {
|
|
// Get user ID from email index
|
|
emailKey := emailKeyIndex + email
|
|
idData, err := r.storage.Get(emailKey)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("user not found by email: %w", err)
|
|
}
|
|
|
|
userID := string(idData)
|
|
return r.GetByID(userID)
|
|
}
|
|
|
|
func (r *repository) Delete(id string) error {
|
|
// Get user first to remove email index
|
|
u, err := r.GetByID(id)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
// Delete email index
|
|
emailKey := emailKeyIndex + u.Email
|
|
if err := r.storage.Delete(emailKey); err != nil {
|
|
return fmt.Errorf("failed to delete email index: %w", err)
|
|
}
|
|
|
|
// Delete user
|
|
userKey := userKeyPrefix + id
|
|
if err := r.storage.Delete(userKey); err != nil {
|
|
return fmt.Errorf("failed to delete user: %w", err)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (r *repository) Exists(id string) (bool, error) {
|
|
key := userKeyPrefix + id
|
|
_, err := r.storage.Get(key)
|
|
if err != nil {
|
|
// Key doesn't exist
|
|
return false, nil
|
|
}
|
|
return true, nil
|
|
}
|