gogcli/internal/cmd/gmail_batch.go
2025-12-31 19:47:32 +01:00

106 lines
2.4 KiB
Go

package cmd
import (
"context"
"errors"
"os"
"google.golang.org/api/gmail/v1"
"github.com/steipete/gogcli/internal/outfmt"
"github.com/steipete/gogcli/internal/ui"
)
type GmailBatchCmd struct {
Delete GmailBatchDeleteCmd `cmd:"" name:"delete" help:"Permanently delete multiple messages"`
Modify GmailBatchModifyCmd `cmd:"" name:"modify" help:"Modify labels on multiple messages"`
}
type GmailBatchDeleteCmd struct {
MessageIDs []string `arg:"" name:"messageId" help:"Message IDs"`
}
func (c *GmailBatchDeleteCmd) Run(ctx context.Context, flags *RootFlags) error {
u := ui.FromContext(ctx)
account, err := requireAccount(flags)
if err != nil {
return err
}
svc, err := newGmailService(ctx, account)
if err != nil {
return err
}
err = svc.Users.Messages.BatchDelete("me", &gmail.BatchDeleteMessagesRequest{
Ids: c.MessageIDs,
}).Do()
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
return outfmt.WriteJSON(os.Stdout, map[string]any{
"deleted": c.MessageIDs,
"count": len(c.MessageIDs),
})
}
u.Out().Printf("Deleted %d messages", len(c.MessageIDs))
return nil
}
type GmailBatchModifyCmd struct {
MessageIDs []string `arg:"" name:"messageId" help:"Message IDs"`
Add string `name:"add" help:"Labels to add (comma-separated, name or ID)"`
Remove string `name:"remove" help:"Labels to remove (comma-separated, name or ID)"`
}
func (c *GmailBatchModifyCmd) Run(ctx context.Context, flags *RootFlags) error {
u := ui.FromContext(ctx)
account, err := requireAccount(flags)
if err != nil {
return err
}
addLabels := splitCSV(c.Add)
removeLabels := splitCSV(c.Remove)
if len(addLabels) == 0 && len(removeLabels) == 0 {
return errors.New("must specify --add and/or --remove")
}
svc, err := newGmailService(ctx, account)
if err != nil {
return err
}
idMap, err := fetchLabelNameToID(svc)
if err != nil {
return err
}
addIDs := resolveLabelIDs(addLabels, idMap)
removeIDs := resolveLabelIDs(removeLabels, idMap)
err = svc.Users.Messages.BatchModify("me", &gmail.BatchModifyMessagesRequest{
Ids: c.MessageIDs,
AddLabelIds: addIDs,
RemoveLabelIds: removeIDs,
}).Do()
if err != nil {
return err
}
if outfmt.IsJSON(ctx) {
return outfmt.WriteJSON(os.Stdout, map[string]any{
"modified": c.MessageIDs,
"count": len(c.MessageIDs),
"addedLabels": addIDs,
"removedLabels": removeIDs,
})
}
u.Out().Printf("Modified %d messages", len(c.MessageIDs))
return nil
}