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}