Initial commit: Open sourcing all of the Maple Open Technologies code.
This commit is contained in:
commit
755d54a99d
2010 changed files with 448675 additions and 0 deletions
105
native/desktop/maplefile/internal/repo/user/repository.go
Normal file
105
native/desktop/maplefile/internal/repo/user/repository.go
Normal file
|
|
@ -0,0 +1,105 @@
|
|||
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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue