store.go

 1package store
 2
 3import (
 4	"context"
 5
 6	"github.com/charmbracelet/soft-serve/server/access"
 7	"github.com/charmbracelet/soft-serve/server/db"
 8	"github.com/charmbracelet/soft-serve/server/db/models"
 9	"golang.org/x/crypto/ssh"
10)
11
12// SettingStore is an interface for managing settings.
13type SettingStore interface {
14	GetAnonAccess(ctx context.Context, tx *db.Tx) (access.AccessLevel, error)
15	SetAnonAccess(ctx context.Context, tx *db.Tx, level access.AccessLevel) error
16	GetAllowKeylessAccess(ctx context.Context, tx *db.Tx) (bool, error)
17	SetAllowKeylessAccess(ctx context.Context, tx *db.Tx, allow bool) error
18}
19
20// RepositoryStore is an interface for managing repositories.
21type RepositoryStore interface {
22	GetRepoByName(ctx context.Context, tx *db.Tx, name string) (models.Repo, error)
23	GetAllRepos(ctx context.Context, tx *db.Tx) ([]models.Repo, error)
24	CreateRepo(ctx context.Context, tx *db.Tx, name string, projectName string, description string, isPrivate bool, isHidden bool, isMirror bool) error
25	DeleteRepoByName(ctx context.Context, tx *db.Tx, name string) error
26	SetRepoNameByName(ctx context.Context, tx *db.Tx, name string, newName string) error
27
28	GetRepoProjectNameByName(ctx context.Context, tx *db.Tx, name string) (string, error)
29	SetRepoProjectNameByName(ctx context.Context, tx *db.Tx, name string, projectName string) error
30	GetRepoDescriptionByName(ctx context.Context, tx *db.Tx, name string) (string, error)
31	SetRepoDescriptionByName(ctx context.Context, tx *db.Tx, name string, description string) error
32	GetRepoIsPrivateByName(ctx context.Context, tx *db.Tx, name string) (bool, error)
33	SetRepoIsPrivateByName(ctx context.Context, tx *db.Tx, name string, isPrivate bool) error
34	GetRepoIsHiddenByName(ctx context.Context, tx *db.Tx, name string) (bool, error)
35	SetRepoIsHiddenByName(ctx context.Context, tx *db.Tx, name string, isHidden bool) error
36	GetRepoIsMirrorByName(ctx context.Context, tx *db.Tx, name string) (bool, error)
37}
38
39// UserStore is an interface for managing users.
40type UserStore interface {
41	FindUserByUsername(ctx context.Context, tx *db.Tx, username string) (models.User, error)
42	FindUserByPublicKey(ctx context.Context, tx *db.Tx, pk ssh.PublicKey) (models.User, error)
43	GetAllUsers(ctx context.Context, tx *db.Tx) ([]models.User, error)
44	CreateUser(ctx context.Context, tx *db.Tx, username string, isAdmin bool, pks []ssh.PublicKey) error
45	DeleteUserByUsername(ctx context.Context, tx *db.Tx, username string) error
46	SetUsernameByUsername(ctx context.Context, tx *db.Tx, username string, newUsername string) error
47	SetAdminByUsername(ctx context.Context, tx *db.Tx, username string, isAdmin bool) error
48	AddPublicKeyByUsername(ctx context.Context, tx *db.Tx, username string, pk ssh.PublicKey) error
49	RemovePublicKeyByUsername(ctx context.Context, tx *db.Tx, username string, pk ssh.PublicKey) error
50	ListPublicKeysByUserID(ctx context.Context, tx *db.Tx, id int64) ([]ssh.PublicKey, error)
51	ListPublicKeysByUsername(ctx context.Context, tx *db.Tx, username string) ([]ssh.PublicKey, error)
52}
53
54// CollaboratorStore is an interface for managing collaborators.
55type CollaboratorStore interface {
56	GetCollabByUsernameAndRepo(ctx context.Context, tx *db.Tx, username string, repo string) (models.Collab, error)
57	AddCollabByUsernameAndRepo(ctx context.Context, tx *db.Tx, username string, repo string) error
58	RemoveCollabByUsernameAndRepo(ctx context.Context, tx *db.Tx, username string, repo string) error
59	ListCollabsByRepo(ctx context.Context, tx *db.Tx, repo string) ([]models.Collab, error)
60	ListCollabsByRepoAsUsers(ctx context.Context, tx *db.Tx, repo string) ([]models.User, error)
61}
62
63// Store is an interface for managing repositories, users, and settings.
64type Store interface {
65	RepositoryStore
66	UserStore
67	CollaboratorStore
68	SettingStore
69}