all repos — weimar @ a213da87e3a6d37de1c358472e176aaf8835b995

Unnamed repository; edit this file 'description' to name the repository.

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}