1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: AGPL-3.0-or-later
4
5package person
6
7import (
8 "fmt"
9
10 "git.secluded.site/go-lunatask"
11 "git.secluded.site/lune/internal/client"
12 "git.secluded.site/lune/internal/completion"
13 "git.secluded.site/lune/internal/ui"
14 "git.secluded.site/lune/internal/validate"
15 "github.com/spf13/cobra"
16)
17
18// UpdateCmd updates a person. Exported for potential use by shortcuts.
19var UpdateCmd = &cobra.Command{
20 Use: "update ID",
21 Short: "Update a person",
22 Long: `Update an existing person in Lunatask.
23
24Accepts a UUID or lunatask:// deep link.
25Only specified flags are modified; other fields remain unchanged.`,
26 Args: cobra.ExactArgs(1),
27 RunE: runUpdate,
28}
29
30func init() {
31 UpdateCmd.Flags().String("first", "", "First name")
32 UpdateCmd.Flags().String("last", "", "Last name")
33 UpdateCmd.Flags().StringP("relationship", "r", "", "Relationship strength")
34
35 _ = UpdateCmd.RegisterFlagCompletionFunc("relationship", completion.Relationships)
36}
37
38func runUpdate(cmd *cobra.Command, args []string) error {
39 id, err := validate.Reference(args[0])
40 if err != nil {
41 return err
42 }
43
44 apiClient, err := client.New()
45 if err != nil {
46 return err
47 }
48
49 builder := apiClient.NewPersonUpdate(id)
50
51 applyUpdateNames(cmd, builder)
52
53 if err := applyUpdateRelationship(cmd, builder); err != nil {
54 return err
55 }
56
57 person, err := ui.Spin("Updating person…", func() (*lunatask.Person, error) {
58 return builder.Update(cmd.Context())
59 })
60 if err != nil {
61 return err
62 }
63
64 fmt.Fprintln(cmd.OutOrStdout(), ui.Success.Render("Updated person: "+person.ID))
65
66 return nil
67}
68
69func applyUpdateNames(cmd *cobra.Command, builder *lunatask.PersonUpdateBuilder) {
70 if first, _ := cmd.Flags().GetString("first"); first != "" {
71 builder.FirstName(first)
72 }
73
74 if last, _ := cmd.Flags().GetString("last"); last != "" {
75 builder.LastName(last)
76 }
77}
78
79func applyUpdateRelationship(cmd *cobra.Command, builder *lunatask.PersonUpdateBuilder) error {
80 rel, _ := cmd.Flags().GetString("relationship")
81 if rel == "" {
82 return nil
83 }
84
85 strength, err := validate.RelationshipStrength(rel)
86 if err != nil {
87 return err
88 }
89
90 builder.WithRelationshipStrength(strength)
91
92 return nil
93}