summaryrefslogtreecommitdiff
path: root/internal/commands/add_client.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/commands/add_client.go')
-rw-r--r--internal/commands/add_client.go60
1 files changed, 13 insertions, 47 deletions
diff --git a/internal/commands/add_client.go b/internal/commands/add_client.go
index e35eba9..98aec3d 100644
--- a/internal/commands/add_client.go
+++ b/internal/commands/add_client.go
@@ -1,13 +1,10 @@
package commands
import (
- "database/sql"
"fmt"
- "regexp"
- "strings"
+ "punchcard/internal/actions"
"punchcard/internal/context"
- "punchcard/internal/queries"
"github.com/spf13/cobra"
)
@@ -19,33 +16,27 @@ func NewAddClientCmd() *cobra.Command {
Long: "Add a new client to the database. Name can include email in format 'Name <email@domain.com>'",
Args: cobra.RangeArgs(1, 2),
RunE: func(cmd *cobra.Command, args []string) error {
- name, email := parseNameAndEmail(args)
+ name := args[0]
+ var email string
+ if len(args) > 1 {
+ email = args[1]
+ }
billableRateFloat, _ := cmd.Flags().GetFloat64("hourly-rate")
- billableRate := int64(billableRateFloat * 100)
+ var billableRate *float64
+ if billableRateFloat > 0 {
+ billableRate = &billableRateFloat
+ }
q := context.GetDB(cmd.Context())
if q == nil {
return fmt.Errorf("database not available in context")
}
- var emailParam sql.NullString
- if email != "" {
- emailParam = sql.NullString{String: email, Valid: true}
- }
-
- var billableRateParam sql.NullInt64
- if billableRate > 0 {
- billableRateParam = sql.NullInt64{Int64: billableRate, Valid: true}
- }
-
- client, err := q.CreateClient(cmd.Context(), queries.CreateClientParams{
- Name: name,
- Email: emailParam,
- BillableRate: billableRateParam,
- })
+ a := actions.New(q)
+ client, err := a.CreateClient(cmd.Context(), name, email, billableRate)
if err != nil {
- return fmt.Errorf("failed to create client: %w", err)
+ return err
}
output := fmt.Sprintf("Created client: %s", client.Name)
@@ -63,28 +54,3 @@ func NewAddClientCmd() *cobra.Command {
return cmd
}
-
-func parseNameAndEmail(args []string) (string, string) {
- nameArg := args[0]
- var emailArg string
- if len(args) > 1 {
- emailArg = args[1]
- }
-
- if emailArg != "" {
- if matches := emailAndNameRegex.FindStringSubmatch(emailArg); matches != nil {
- emailArg = strings.TrimSpace(matches[2])
- }
- }
-
- if matches := emailAndNameRegex.FindStringSubmatch(nameArg); matches != nil {
- nameArg = strings.TrimSpace(matches[1])
- if emailArg == "" {
- emailArg = strings.TrimSpace(matches[2])
- }
- }
-
- return nameArg, emailArg
-}
-
-var emailAndNameRegex = regexp.MustCompile(`^(.+?)<([^>]+@[^>]+)>$`)