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

199 lines
6.1 KiB
Go

// codeberg.org/mapleopentech/monorepo/cloud/maplefile-backend/internal/repo/user/get.go
package user
import (
"context"
"fmt"
"time"
"github.com/gocql/gocql"
"go.uber.org/zap"
dom_user "codeberg.org/mapleopentech/monorepo/cloud/maplefile-backend/internal/domain/user"
"codeberg.org/mapleopentech/monorepo/cloud/maplefile-backend/pkg/validation"
)
func (impl userStorerImpl) GetByID(ctx context.Context, id gocql.UUID) (*dom_user.User, error) {
var (
email, firstName, lastName, name, lexicalName string
role, status int8
timezone string
createdAt, modifiedAt time.Time
profileData, securityData, metadata string
)
query := `
SELECT email, first_name, last_name, name, lexical_name,
role, status, timezone, created_at, modified_at,
profile_data, security_data, metadata
FROM users_by_id
WHERE id = ?`
err := impl.session.Query(query, id).WithContext(ctx).Scan(
&email, &firstName, &lastName, &name, &lexicalName,
&role, &status, &timezone, &createdAt, &modifiedAt,
&profileData, &securityData, &metadata,
)
if err == gocql.ErrNotFound {
return nil, nil
}
if err != nil {
impl.logger.Error("Failed to get user by ID",
zap.String("user_id", id.String()),
zap.Error(err))
return nil, fmt.Errorf("failed to get user by ID: %w", err)
}
// Construct the user object
user := &dom_user.User{
ID: id,
Email: email,
FirstName: firstName,
LastName: lastName,
Name: name,
LexicalName: lexicalName,
Role: role,
Status: status,
Timezone: timezone,
CreatedAt: createdAt,
ModifiedAt: modifiedAt,
}
// Deserialize JSON fields
if err := impl.deserializeUserData(profileData, securityData, metadata, user); err != nil {
impl.logger.Error("Failed to deserialize user data",
zap.String("user_id", id.String()),
zap.Error(err))
return nil, fmt.Errorf("failed to deserialize user data: %w", err)
}
return user, nil
}
func (impl userStorerImpl) GetByEmail(ctx context.Context, email string) (*dom_user.User, error) {
var (
id gocql.UUID
emailResult string
firstName, lastName, name, lexicalName string
role, status int8
timezone string
createdAt, modifiedAt time.Time
profileData, securityData, metadata string
)
query := `
SELECT id, email, first_name, last_name, name, lexical_name,
role, status, timezone, created_at, modified_at,
profile_data, security_data, metadata
FROM users_by_email
WHERE email = ?`
err := impl.session.Query(query, email).WithContext(ctx).Scan(
&id, &emailResult, &firstName, &lastName, &name, &lexicalName, // 🔧 FIXED: Use emailResult variable
&role, &status, &timezone, &createdAt, &modifiedAt,
&profileData, &securityData, &metadata,
)
if err == gocql.ErrNotFound {
return nil, nil
}
if err != nil {
impl.logger.Error("Failed to get user by Email",
zap.String("user_email", validation.MaskEmail(email)),
zap.Error(err))
return nil, fmt.Errorf("failed to get user by email: %w", err)
}
// Construct the user object
user := &dom_user.User{
ID: id,
Email: emailResult,
FirstName: firstName,
LastName: lastName,
Name: name,
LexicalName: lexicalName,
Role: role,
Status: status,
Timezone: timezone,
CreatedAt: createdAt,
ModifiedAt: modifiedAt,
}
// Deserialize JSON fields
if err := impl.deserializeUserData(profileData, securityData, metadata, user); err != nil {
impl.logger.Error("Failed to deserialize user data",
zap.String("user_id", id.String()),
zap.Error(err))
return nil, fmt.Errorf("failed to deserialize user data: %w", err)
}
return user, nil
}
func (impl userStorerImpl) GetByVerificationCode(ctx context.Context, verificationCode string) (*dom_user.User, error) {
var (
id gocql.UUID
email string
firstName, lastName, name, lexicalName string
role, status int8
timezone string
createdAt, modifiedAt time.Time
profileData, securityData, metadata string
)
// Query the users_by_verification_code table
query := `
SELECT id, email, first_name, last_name, name, lexical_name,
role, status, timezone, created_at, modified_at,
profile_data, security_data, metadata
FROM users_by_verification_code
WHERE verification_code = ?`
err := impl.session.Query(query, verificationCode).WithContext(ctx).Scan(
&id, &email, &firstName, &lastName, &name, &lexicalName,
&role, &status, &timezone, &createdAt, &modifiedAt,
&profileData, &securityData, &metadata,
)
if err == gocql.ErrNotFound {
impl.logger.Debug("User not found by verification code",
zap.String("verification_code", verificationCode))
return nil, nil
}
if err != nil {
impl.logger.Error("Failed to get user by verification code",
zap.String("verification_code", verificationCode),
zap.Error(err))
return nil, fmt.Errorf("failed to get user by verification code: %w", err)
}
// Construct the user object
user := &dom_user.User{
ID: id,
Email: email,
FirstName: firstName,
LastName: lastName,
Name: name,
LexicalName: lexicalName,
Role: role,
Status: status,
Timezone: timezone,
CreatedAt: createdAt,
ModifiedAt: modifiedAt,
}
// Deserialize JSON fields
if err := impl.deserializeUserData(profileData, securityData, metadata, user); err != nil {
impl.logger.Error("Failed to deserialize user data",
zap.String("user_id", id.String()),
zap.Error(err))
return nil, fmt.Errorf("failed to deserialize user data: %w", err)
}
impl.logger.Debug("User found by verification code",
zap.String("user_id", id.String()),
zap.String("email", validation.MaskEmail(email)))
return user, nil
}