monorepo/cloud/maplefile-backend/internal/repo/user/helpers.go

114 lines
2.8 KiB
Go

package user
import (
"encoding/json"
"fmt"
"hash/fnv"
"strings"
dom "codeberg.org/mapleopentech/monorepo/cloud/maplefile-backend/internal/domain/user"
)
// Serialization helpers
func (r *userStorerImpl) serializeProfileData(data *dom.UserProfileData) (string, error) {
if data == nil {
return "", nil
}
bytes, err := json.Marshal(data)
if err != nil {
return "", err
}
return string(bytes), nil
}
func (r *userStorerImpl) serializeSecurityData(data *dom.UserSecurityData) (string, error) {
if data == nil {
return "", nil
}
bytes, err := json.Marshal(data)
if err != nil {
return "", err
}
return string(bytes), nil
}
func (r *userStorerImpl) serializeMetadata(data *dom.UserMetadata) (string, error) {
if data == nil {
return "", nil
}
bytes, err := json.Marshal(data)
if err != nil {
return "", err
}
return string(bytes), nil
}
// Deserialization helper
func (r *userStorerImpl) deserializeUserData(profileJSON, securityJSON, metadataJSON string, user *dom.User) error {
// Deserialize profile data
if profileJSON != "" {
var profileData dom.UserProfileData
if err := json.Unmarshal([]byte(profileJSON), &profileData); err != nil {
return fmt.Errorf("failed to unmarshal profile data: %w", err)
}
user.ProfileData = &profileData
}
// Deserialize security data
if securityJSON != "" {
var securityData dom.UserSecurityData
if err := json.Unmarshal([]byte(securityJSON), &securityData); err != nil {
return fmt.Errorf("failed to unmarshal security data: %w", err)
}
user.SecurityData = &securityData
}
// Deserialize metadata
if metadataJSON != "" {
var metadata dom.UserMetadata
if err := json.Unmarshal([]byte(metadataJSON), &metadata); err != nil {
return fmt.Errorf("failed to unmarshal metadata: %w", err)
}
user.Metadata = &metadata
}
return nil
}
// Search helpers
func (r *userStorerImpl) generateSearchTerms(user *dom.User) []string {
terms := make([]string, 0)
// Add lowercase versions of searchable fields
if user.Email != "" {
terms = append(terms, strings.ToLower(user.Email))
// Also add email prefix for partial matching
parts := strings.Split(user.Email, "@")
if len(parts) > 0 {
terms = append(terms, strings.ToLower(parts[0]))
}
}
if user.Name != "" {
terms = append(terms, strings.ToLower(user.Name))
// Add individual words from name
words := strings.Fields(strings.ToLower(user.Name))
terms = append(terms, words...)
}
if user.FirstName != "" {
terms = append(terms, strings.ToLower(user.FirstName))
}
if user.LastName != "" {
terms = append(terms, strings.ToLower(user.LastName))
}
return terms
}
func (r *userStorerImpl) calculateSearchBucket(term string) int {
h := fnv.New32a()
h.Write([]byte(term))
return int(h.Sum32() % 100) // Distribute across 100 buckets
}