1// SPDX-FileCopyrightText: Amolith <amolith@secluded.site>
2//
3// SPDX-License-Identifier: AGPL-3.0-or-later
4
5package note
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/config"
14 "git.secluded.site/lune/internal/dateutil"
15 "git.secluded.site/lune/internal/ui"
16 "git.secluded.site/lune/internal/validate"
17 "github.com/spf13/cobra"
18)
19
20// UpdateCmd updates a note. Exported for potential use by shortcuts.
21var UpdateCmd = &cobra.Command{
22 Use: "update ID",
23 Short: "Update a note",
24 Long: `Update an existing note in Lunatask.
25
26Accepts a UUID or lunatask:// deep link.
27Only specified flags are modified; other fields remain unchanged.`,
28 Args: cobra.ExactArgs(1),
29 RunE: runUpdate,
30}
31
32func init() {
33 UpdateCmd.Flags().String("name", "", "New note name")
34 UpdateCmd.Flags().StringP("notebook", "b", "", "Move to notebook key")
35 UpdateCmd.Flags().StringP("content", "c", "", "Note content (use - for stdin)")
36 UpdateCmd.Flags().StringP("date", "d", "", "Note date (natural language)")
37
38 _ = UpdateCmd.RegisterFlagCompletionFunc("notebook", completion.Notebooks)
39}
40
41func runUpdate(cmd *cobra.Command, args []string) error {
42 id, err := validate.Reference(args[0])
43 if err != nil {
44 return err
45 }
46
47 apiClient, err := client.New()
48 if err != nil {
49 return err
50 }
51
52 builder := apiClient.NewNoteUpdate(id)
53
54 if err := applyUpdateName(cmd, builder); err != nil {
55 return err
56 }
57
58 if err := applyUpdateNotebook(cmd, builder); err != nil {
59 return err
60 }
61
62 if err := applyUpdateContent(cmd, builder); err != nil {
63 return err
64 }
65
66 if err := applyUpdateDate(cmd, builder); err != nil {
67 return err
68 }
69
70 note, err := ui.Spin("Updating note…", func() (*lunatask.Note, error) {
71 return builder.Update(cmd.Context())
72 })
73 if err != nil {
74 return err
75 }
76
77 fmt.Fprintln(cmd.OutOrStdout(), ui.Success.Render("Updated note: "+note.ID))
78
79 return nil
80}
81
82func applyUpdateName(cmd *cobra.Command, builder *lunatask.NoteUpdateBuilder) error {
83 name, _ := cmd.Flags().GetString("name")
84 if name == "" {
85 return nil
86 }
87
88 resolved, err := resolveName(name)
89 if err != nil {
90 return err
91 }
92
93 builder.WithName(resolved)
94
95 return nil
96}
97
98func applyUpdateNotebook(cmd *cobra.Command, builder *lunatask.NoteUpdateBuilder) error {
99 notebookKey, _ := cmd.Flags().GetString("notebook")
100 if notebookKey == "" {
101 return nil
102 }
103
104 cfg, err := config.Load()
105 if err != nil {
106 return err
107 }
108
109 notebook := cfg.NotebookByKey(notebookKey)
110 if notebook == nil {
111 return fmt.Errorf("%w: %s", ErrUnknownNotebook, notebookKey)
112 }
113
114 builder.InNotebook(notebook.ID)
115
116 return nil
117}
118
119func applyUpdateContent(cmd *cobra.Command, builder *lunatask.NoteUpdateBuilder) error {
120 content, _ := cmd.Flags().GetString("content")
121 if content == "" {
122 return nil
123 }
124
125 resolved, err := resolveContent(content)
126 if err != nil {
127 return err
128 }
129
130 builder.WithContent(resolved)
131
132 return nil
133}
134
135func applyUpdateDate(cmd *cobra.Command, builder *lunatask.NoteUpdateBuilder) error {
136 dateStr, _ := cmd.Flags().GetString("date")
137 if dateStr == "" {
138 return nil
139 }
140
141 date, err := dateutil.Parse(dateStr)
142 if err != nil {
143 return err
144 }
145
146 builder.OnDate(date)
147
148 return nil
149}