77 lines
1.8 KiB
Go
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])
|
|
}
|