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
 17// Noop is a backend that does nothing. It's used for testing.
 18type Noop struct {
 19	Port string
 20}
 21
 22// Admins implements backend.Backend
 23func (*Noop) Admins() ([]string, error) {
 24	return nil, nil
 25}
 26
 27// Collaborators implements backend.Backend
 28func (*Noop) Collaborators(repo string) ([]string, error) {
 29	return nil, nil
 30}
 31
 32// RemoveAdmin implements backend.Backend
 33func (*Noop) RemoveAdmin(pk ssh.PublicKey) error {
 34	return nil
 35}
 36
 37// RemoveCollaborator implements backend.Backend
 38func (*Noop) RemoveCollaborator(pk ssh.PublicKey, repo string) error {
 39	return nil
 40}
 41
 42// AccessLevel implements backend.AccessMethod
 43func (*Noop) AccessLevel(repo string, pk ssh.PublicKey) backend.AccessLevel {
 44	return backend.AdminAccess
 45}
 46
 47// AddAdmin implements backend.Backend
 48func (*Noop) AddAdmin(pk ssh.PublicKey, memo string) error {
 49	return ErrNotImpl
 50}
 51
 52// AddCollaborator implements backend.Backend
 53func (*Noop) AddCollaborator(pk ssh.PublicKey, memo string, repo string) error {
 54	return ErrNotImpl
 55}
 56
 57// AllowKeyless implements backend.Backend
 58func (*Noop) AllowKeyless() bool {
 59	return true
 60}
 61
 62// AnonAccess implements backend.Backend
 63func (*Noop) AnonAccess() backend.AccessLevel {
 64	return backend.AdminAccess
 65}
 66
 67// CreateRepository implements backend.Backend
 68func (*Noop) CreateRepository(name string, private bool) (backend.Repository, error) {
 69	temp, err := os.MkdirTemp("", "soft-serve")
 70	if err != nil {
 71		return nil, err
 72	}
 73
 74	rp := filepath.Join(temp, name)
 75	_, err = git.Init(rp, private)
 76	if err != nil {
 77		return nil, err
 78	}
 79
 80	return &repo{path: rp}, nil
 81}
 82
 83// DeleteRepository implements backend.Backend
 84func (*Noop) DeleteRepository(name string) error {
 85	return ErrNotImpl
 86}
 87
 88// Description implements backend.Backend
 89func (*Noop) Description(repo string) string {
 90	return ""
 91}
 92
 93// IsAdmin implements backend.Backend
 94func (*Noop) IsAdmin(pk ssh.PublicKey) bool {
 95	return true
 96}
 97
 98// IsCollaborator implements backend.Backend
 99func (*Noop) IsCollaborator(pk ssh.PublicKey, repo string) bool {
100	return true
101}
102
103// IsPrivate implements backend.Backend
104func (*Noop) IsPrivate(repo string) bool {
105	return false
106}
107
108// RenameRepository implements backend.Backend
109func (*Noop) RenameRepository(oldName string, newName string) error {
110	return ErrNotImpl
111}
112
113// Repositories implements backend.Backend
114func (*Noop) Repositories() ([]backend.Repository, error) {
115	return nil, ErrNotImpl
116}
117
118// Repository implements backend.Backend
119func (*Noop) Repository(repo string) (backend.Repository, error) {
120	return nil, ErrNotImpl
121}
122
123// SetAllowKeyless implements backend.Backend
124func (*Noop) SetAllowKeyless(allow bool) error {
125	return ErrNotImpl
126}
127
128// SetAnonAccess implements backend.Backend
129func (*Noop) SetAnonAccess(level backend.AccessLevel) error {
130	return ErrNotImpl
131}
132
133// SetDescription implements backend.Backend
134func (*Noop) SetDescription(repo string, desc string) error {
135	return ErrNotImpl
136}
137
138// SetPrivate implements backend.Backend
139func (*Noop) SetPrivate(repo string, priv bool) error {
140	return ErrNotImpl
141}