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