cmd/weimar/image.go (view raw)
1package main
2
3import (
4 "fmt"
5 "strconv"
6
7 "github.com/mjensen/weimar/internal/config"
8 "github.com/mjensen/weimar/internal/db"
9 "github.com/mjensen/weimar/internal/storage"
10 "github.com/spf13/cobra"
11)
12
13var imageCmd = &cobra.Command{
14 Use: "image",
15 Short: "Manage images",
16}
17
18var imageDeleteCmd = &cobra.Command{
19 Use: "delete <id>",
20 Short: "Delete an image by ID",
21 Args: cobra.ExactArgs(1),
22 RunE: func(cmd *cobra.Command, args []string) error {
23 id, err := strconv.ParseInt(args[0], 10, 64)
24 if err != nil {
25 return fmt.Errorf("invalid image ID: %w", err)
26 }
27
28 cfg := config.FromViper()
29 database, err := db.Open(cfg.Database.Path)
30 if err != nil {
31 return fmt.Errorf("opening database: %w", err)
32 }
33 defer database.Close()
34
35 img, err := database.GetImageByID(cmd.Context(), id)
36 if err != nil {
37 return fmt.Errorf("looking up image: %w", err)
38 }
39
40 st, err := storage.New(cfg.Storage.Path)
41 if err != nil {
42 return fmt.Errorf("opening storage: %w", err)
43 }
44
45 // Delete thumbnail first if it exists.
46 if img.ThumbnailPath != nil {
47 if err := st.Delete(*img.ThumbnailPath); err != nil {
48 return fmt.Errorf("deleting thumbnail: %w", err)
49 }
50 }
51
52 // Delete original file.
53 if err := st.Delete(img.StoragePath); err != nil {
54 return fmt.Errorf("deleting file: %w", err)
55 }
56
57 // Delete database record.
58 if err := database.DeleteImage(cmd.Context(), id); err != nil {
59 return fmt.Errorf("deleting image record: %w", err)
60 }
61
62 fmt.Fprintf(cmd.OutOrStdout(), "deleted image %d: %s\n", img.ID, img.Filename)
63 return nil
64 },
65}
66
67func init() {
68 rootCmd.AddCommand(imageCmd)
69 imageCmd.AddCommand(imageDeleteCmd)
70}