settings.go

 1package cmd
 2
 3import (
 4	"fmt"
 5	"strconv"
 6
 7	"github.com/charmbracelet/soft-serve/pkg/access"
 8	"github.com/charmbracelet/soft-serve/pkg/backend"
 9	"github.com/spf13/cobra"
10)
11
12// SettingsCommand returns a command that manages server settings.
13func SettingsCommand() *cobra.Command {
14	cmd := &cobra.Command{
15		Use:   "settings",
16		Short: "Manage server settings",
17	}
18
19	cmd.AddCommand(
20		&cobra.Command{
21			Use:               "allow-keyless [true|false]",
22			Short:             "Set or get allow keyless access to repositories",
23			Args:              cobra.RangeArgs(0, 1),
24			PersistentPreRunE: checkIfAdmin,
25			RunE: func(cmd *cobra.Command, args []string) error {
26				ctx := cmd.Context()
27				be := backend.FromContext(ctx)
28				switch len(args) {
29				case 0:
30					cmd.Println(be.AllowKeyless(ctx))
31				case 1:
32					v, _ := strconv.ParseBool(args[0])
33					if err := be.SetAllowKeyless(ctx, v); err != nil {
34						return err //nolint:wrapcheck
35					}
36				}
37
38				return nil
39			},
40		},
41	)
42
43	als := []string{access.NoAccess.String(), access.ReadOnlyAccess.String(), access.ReadWriteAccess.String(), access.AdminAccess.String()}
44	cmd.AddCommand(
45		&cobra.Command{
46			Use:               "anon-access [ACCESS_LEVEL]",
47			Short:             "Set or get the default access level for anonymous users",
48			Args:              cobra.RangeArgs(0, 1),
49			ValidArgs:         als,
50			PersistentPreRunE: checkIfAdmin,
51			RunE: func(cmd *cobra.Command, args []string) error {
52				ctx := cmd.Context()
53				be := backend.FromContext(ctx)
54				switch len(args) {
55				case 0:
56					cmd.Println(be.AnonAccess(ctx))
57				case 1:
58					al := access.ParseAccessLevel(args[0])
59					if al < 0 {
60						return fmt.Errorf("invalid access level: %s. Please choose one of the following: %s", args[0], als)
61					}
62					if err := be.SetAnonAccess(ctx, al); err != nil {
63						return err //nolint:wrapcheck
64					}
65				}
66
67				return nil
68			},
69		},
70	)
71
72	return cmd
73}