114 lines
2.8 KiB
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
|
|
}
|