package client import ( "context" "errors" "fmt" "regexp" "strings" "queryorchestration/internal/database/repository" ) type CreateParams struct { Name string ID string } func (s *Service) Create(ctx context.Context, params CreateParams) (string, error) { err := s.normalizeCreate(¶ms) if err != nil { return "", err } err = s.cfg.GetDBQueries().CreateClient(ctx, &repository.CreateClientParams{ Name: params.Name, ID: params.ID, }) if err != nil { return "", err } return params.ID, nil } func (s *Service) normalizeCreate(params *CreateParams) error { err := normalizeName(¶ms.Name) if err != nil { return err } err = normalizeID(¶ms.ID) if err != nil { return err } return nil } const CLIENT_ID_REGEX = `[a-zA-Z0-9\_#-]+` func normalizeID(id *string) error { if id == nil { return nil } trim := strings.TrimSpace(*id) patternStr := fmt.Sprintf("^%s$", CLIENT_ID_REGEX) pattern := regexp.MustCompile(patternStr) if !pattern.MatchString(trim) { return errors.New("invalid external id") } *id = trim return nil }