Files
base/internal/application/auth/setup_profile.go
2026-04-10 18:25:21 +03:30

77 lines
1.8 KiB
Go

package auth
import (
"context"
"fmt"
"regexp"
"strings"
"time"
"github.com/google/uuid"
"base/internal/domain/profile"
"base/internal/dto"
)
var slugRe = regexp.MustCompile(`[^a-z0-9-]+`)
func (s *service) SetupProfile(ctx context.Context, userID uuid.UUID, req dto.SetupProfileRequest) error {
existingProfile, _ := s.profileRepo.FindByUserID(ctx, userID)
if existingProfile != nil {
return ErrProfileAlreadyExists
}
user, err := s.userRepo.FindByID(ctx, userID)
if err != nil || user == nil {
return ErrUserNotFound
}
handle := generateHandle(user.FirstName, user.LastName, userID)
if req.Handle != "" {
handle = req.Handle
}
other, _ := s.profileRepo.FindByHandle(ctx, handle)
if other != nil {
return ErrHandleAlreadyTaken
}
newProfile := &profile.Profile{
ID: uuid.New(),
UserID: &userID,
Handle: handle,
Hero: profile.Hero{
FirstName: user.FirstName,
LastName: user.LastName,
ShortDescription: req.ShortDescription,
},
Contact: profile.Contact{
Email: user.Email,
Phone: user.PhoneNumber,
},
PageSetting: profile.PageSetting{
VisibilityLevel: "public",
},
CreatedAt: time.Now(),
UpdatedAt: time.Now(),
}
newProfile.Hero.Role = &profile.Role{ID: req.RoleID}
if req.RoleLevel != "" && newProfile.Hero.Role != nil {
newProfile.Hero.Role.Level = req.RoleLevel
} else if req.RoleLevel != "" {
newProfile.Hero.Role = &profile.Role{Level: req.RoleLevel}
}
return s.profileRepo.Create(ctx, newProfile)
}
func generateHandle(firstName, lastName string, userID uuid.UUID) string {
slug := slugRe.ReplaceAllString(strings.ToLower(strings.TrimSpace(firstName+"-"+lastName)), "-")
slug = strings.Trim(slug, "-")
if slug == "" {
slug = "user"
}
return fmt.Sprintf("%s-%s", slug, userID.String()[:8])
}