1package noop
2
3import (
4 "fmt"
5 "os"
6 "path/filepath"
7
8 "github.com/charmbracelet/soft-serve/git"
9 "github.com/charmbracelet/soft-serve/server/backend"
10 "golang.org/x/crypto/ssh"
11)
12
13var ErrNotImpl = fmt.Errorf("not implemented")
14
15var _ backend.Backend = (*Noop)(nil)
16
17var _ backend.AccessMethod = (*Noop)(nil)
18
19// Noop is a backend that does nothing. It's used for testing.
20type Noop struct {
21 Port string
22}
23
24// Admins implements backend.Backend
25func (*Noop) Admins() ([]string, error) {
26 return nil, nil
27}
28
29// Collaborators implements backend.Backend
30func (*Noop) Collaborators(repo string) ([]string, error) {
31 return nil, nil
32}
33
34// RemoveAdmin implements backend.Backend
35func (*Noop) RemoveAdmin(pk ssh.PublicKey) error {
36 return nil
37}
38
39// RemoveCollaborator implements backend.Backend
40func (*Noop) RemoveCollaborator(pk ssh.PublicKey, repo string) error {
41 return nil
42}
43
44// AccessLevel implements backend.AccessMethod
45func (*Noop) AccessLevel(repo string, pk ssh.PublicKey) backend.AccessLevel {
46 return backend.AdminAccess
47}
48
49// AddAdmin implements backend.Backend
50func (*Noop) AddAdmin(pk ssh.PublicKey, memo string) error {
51 return ErrNotImpl
52}
53
54// AddCollaborator implements backend.Backend
55func (*Noop) AddCollaborator(pk ssh.PublicKey, memo string, repo string) error {
56 return ErrNotImpl
57}
58
59// AllowKeyless implements backend.Backend
60func (*Noop) AllowKeyless() bool {
61 return true
62}
63
64// AnonAccess implements backend.Backend
65func (*Noop) AnonAccess() backend.AccessLevel {
66 return backend.AdminAccess
67}
68
69// CreateRepository implements backend.Backend
70func (*Noop) CreateRepository(name string, private bool) (backend.Repository, error) {
71 temp, err := os.MkdirTemp("", "soft-serve")
72 if err != nil {
73 return nil, err
74 }
75
76 rp := filepath.Join(temp, name)
77 _, err = git.Init(rp, private)
78 if err != nil {
79 return nil, err
80 }
81
82 return &repo{path: rp}, nil
83}
84
85// DeleteRepository implements backend.Backend
86func (*Noop) DeleteRepository(name string) error {
87 return ErrNotImpl
88}
89
90// Description implements backend.Backend
91func (*Noop) Description(repo string) string {
92 return ""
93}
94
95// IsAdmin implements backend.Backend
96func (*Noop) IsAdmin(pk ssh.PublicKey) bool {
97 return true
98}
99
100// IsCollaborator implements backend.Backend
101func (*Noop) IsCollaborator(pk ssh.PublicKey, repo string) bool {
102 return true
103}
104
105// IsPrivate implements backend.Backend
106func (*Noop) IsPrivate(repo string) bool {
107 return false
108}
109
110// RenameRepository implements backend.Backend
111func (*Noop) RenameRepository(oldName string, newName string) error {
112 return ErrNotImpl
113}
114
115// Repositories implements backend.Backend
116func (*Noop) Repositories() ([]backend.Repository, error) {
117 return nil, ErrNotImpl
118}
119
120// Repository implements backend.Backend
121func (*Noop) Repository(repo string) (backend.Repository, error) {
122 return nil, ErrNotImpl
123}
124
125// ServerHost implements backend.Backend
126func (*Noop) ServerHost() string {
127 return "localhost"
128}
129
130// ServerName implements backend.Backend
131func (*Noop) ServerName() string {
132 return "Soft Serve"
133}
134
135// ServerPort implements backend.Backend
136func (n *Noop) ServerPort() string {
137 return n.Port
138}
139
140// SetAllowKeyless implements backend.Backend
141func (*Noop) SetAllowKeyless(allow bool) error {
142 return ErrNotImpl
143}
144
145// SetAnonAccess implements backend.Backend
146func (*Noop) SetAnonAccess(level backend.AccessLevel) error {
147 return ErrNotImpl
148}
149
150// SetDescription implements backend.Backend
151func (*Noop) SetDescription(repo string, desc string) error {
152 return ErrNotImpl
153}
154
155// SetPrivate implements backend.Backend
156func (*Noop) SetPrivate(repo string, priv bool) error {
157 return ErrNotImpl
158}
159
160// SetServerHost implements backend.Backend
161func (*Noop) SetServerHost(host string) error {
162 return ErrNotImpl
163}
164
165// SetServerName implements backend.Backend
166func (*Noop) SetServerName(name string) error {
167 return ErrNotImpl
168}
169
170// SetServerPort implements backend.Backend
171func (*Noop) SetServerPort(port string) error {
172 return ErrNotImpl
173}