1package cmd
2
3import (
4 "context"
5 "errors"
6 "fmt"
7 "io/fs"
8 "os"
9
10 "github.com/charmbracelet/soft-serve/pkg/backend"
11 "github.com/charmbracelet/soft-serve/pkg/config"
12 "github.com/charmbracelet/soft-serve/pkg/db"
13 "github.com/charmbracelet/soft-serve/pkg/hooks"
14 "github.com/charmbracelet/soft-serve/pkg/store"
15 "github.com/charmbracelet/soft-serve/pkg/store/database"
16 "github.com/spf13/cobra"
17)
18
19// InitBackendContext initializes the backend context.
20func InitBackendContext(cmd *cobra.Command, _ []string) error {
21 ctx := cmd.Context()
22 cfg := config.FromContext(ctx)
23 if _, err := os.Stat(cfg.DataPath); errors.Is(err, fs.ErrNotExist) {
24 if err := os.MkdirAll(cfg.DataPath, os.ModePerm); err != nil {
25 return fmt.Errorf("create data directory: %w", err)
26 }
27 }
28 dbx, err := db.Open(ctx, cfg.DB.Driver, cfg.DB.DataSource)
29 if err != nil {
30 return fmt.Errorf("open database: %w", err)
31 }
32
33 ctx = db.WithContext(ctx, dbx)
34 dbstore := database.New(ctx, dbx)
35 ctx = store.WithContext(ctx, dbstore)
36 be := backend.New(ctx, cfg, dbx, dbstore)
37 ctx = backend.WithContext(ctx, be)
38
39 cmd.SetContext(ctx)
40
41 return nil
42}
43
44// CloseDBContext closes the database context.
45func CloseDBContext(cmd *cobra.Command, _ []string) error {
46 ctx := cmd.Context()
47 dbx := db.FromContext(ctx)
48 if dbx != nil {
49 if err := dbx.Close(); err != nil {
50 return fmt.Errorf("close database: %w", err)
51 }
52 }
53
54 return nil
55}
56
57// InitializeHooks initializes the hooks.
58func InitializeHooks(ctx context.Context, cfg *config.Config, be *backend.Backend) error {
59 repos, err := be.Repositories(ctx)
60 if err != nil {
61 return err
62 }
63
64 for _, repo := range repos {
65 if err := hooks.GenerateHooks(ctx, cfg, repo.Name()); err != nil {
66 return err
67 }
68 }
69
70 return nil
71}