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 := builder.Update(cmd.Context())
71 if err != nil {
72 return err
73 }
74
75 fmt.Fprintln(cmd.OutOrStdout(), ui.Success.Render("Updated note: "+note.ID))
76
77 return nil
78}
79
80func applyUpdateName(cmd *cobra.Command, builder *lunatask.NoteUpdateBuilder) error {
81 name, _ := cmd.Flags().GetString("name")
82 if name == "" {
83 return nil
84 }
85
86 resolved, err := resolveName(name)
87 if err != nil {
88 return err
89 }
90
91 builder.WithName(resolved)
92
93 return nil
94}
95
96func applyUpdateNotebook(cmd *cobra.Command, builder *lunatask.NoteUpdateBuilder) error {
97 notebookKey, _ := cmd.Flags().GetString("notebook")
98 if notebookKey == "" {
99 return nil
100 }
101
102 cfg, err := config.Load()
103 if err != nil {
104 return err
105 }
106
107 notebook := cfg.NotebookByKey(notebookKey)
108 if notebook == nil {
109 return fmt.Errorf("%w: %s", ErrUnknownNotebook, notebookKey)
110 }
111
112 builder.InNotebook(notebook.ID)
113
114 return nil
115}
116
117func applyUpdateContent(cmd *cobra.Command, builder *lunatask.NoteUpdateBuilder) error {
118 content, _ := cmd.Flags().GetString("content")
119 if content == "" {
120 return nil
121 }
122
123 resolved, err := resolveContent(content)
124 if err != nil {
125 return err
126 }
127
128 builder.WithContent(resolved)
129
130 return nil
131}
132
133func applyUpdateDate(cmd *cobra.Command, builder *lunatask.NoteUpdateBuilder) error {
134 dateStr, _ := cmd.Flags().GetString("date")
135 if dateStr == "" {
136 return nil
137 }
138
139 date, err := dateutil.Parse(dateStr)
140 if err != nil {
141 return err
142 }
143
144 builder.OnDate(date)
145
146 return nil
147}