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}