1package database
2
3import (
4 "context"
5
6 "github.com/charmbracelet/soft-serve/server/db"
7 "github.com/charmbracelet/soft-serve/server/db/models"
8 "github.com/charmbracelet/soft-serve/server/store"
9 "github.com/charmbracelet/soft-serve/server/utils"
10)
11
12type repoStore struct{}
13
14var _ store.RepositoryStore = (*repoStore)(nil)
15
16// CreateRepo implements store.RepositoryStore.
17func (*repoStore) CreateRepo(ctx context.Context, tx db.Handler, name string, projectName string, description string, isPrivate bool, isHidden bool, isMirror bool) error {
18 name = utils.SanitizeRepo(name)
19 query := tx.Rebind(`INSERT INTO repos (name, project_name, description, private, mirror, hidden, updated_at)
20 VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP);`)
21 _, err := tx.ExecContext(ctx, query,
22 name, projectName, description, isPrivate, isMirror, isHidden)
23 return db.WrapError(err)
24}
25
26// DeleteRepoByName implements store.RepositoryStore.
27func (*repoStore) DeleteRepoByName(ctx context.Context, tx db.Handler, name string) error {
28 name = utils.SanitizeRepo(name)
29 query := tx.Rebind("DELETE FROM repos WHERE name = ?;")
30 _, err := tx.ExecContext(ctx, query, name)
31 return db.WrapError(err)
32}
33
34// GetAllRepos implements store.RepositoryStore.
35func (*repoStore) GetAllRepos(ctx context.Context, tx db.Handler) ([]models.Repo, error) {
36 var repos []models.Repo
37 query := tx.Rebind("SELECT * FROM repos;")
38 err := tx.SelectContext(ctx, &repos, query)
39 return repos, db.WrapError(err)
40}
41
42// GetRepoByName implements store.RepositoryStore.
43func (*repoStore) GetRepoByName(ctx context.Context, tx db.Handler, name string) (models.Repo, error) {
44 var repo models.Repo
45 name = utils.SanitizeRepo(name)
46 query := tx.Rebind("SELECT * FROM repos WHERE name = ?;")
47 err := tx.GetContext(ctx, &repo, query, name)
48 return repo, db.WrapError(err)
49}
50
51// GetRepoDescriptionByName implements store.RepositoryStore.
52func (*repoStore) GetRepoDescriptionByName(ctx context.Context, tx db.Handler, name string) (string, error) {
53 var description string
54 name = utils.SanitizeRepo(name)
55 query := tx.Rebind("SELECT description FROM repos WHERE name = ?;")
56 err := tx.GetContext(ctx, &description, query, name)
57 return description, db.WrapError(err)
58}
59
60// GetRepoIsHiddenByName implements store.RepositoryStore.
61func (*repoStore) GetRepoIsHiddenByName(ctx context.Context, tx db.Handler, name string) (bool, error) {
62 var isHidden bool
63 name = utils.SanitizeRepo(name)
64 query := tx.Rebind("SELECT hidden FROM repos WHERE name = ?;")
65 err := tx.GetContext(ctx, &isHidden, query, name)
66 return isHidden, db.WrapError(err)
67}
68
69// GetRepoIsMirrorByName implements store.RepositoryStore.
70func (*repoStore) GetRepoIsMirrorByName(ctx context.Context, tx db.Handler, name string) (bool, error) {
71 var isMirror bool
72 name = utils.SanitizeRepo(name)
73 query := tx.Rebind("SELECT mirror FROM repos WHERE name = ?;")
74 err := tx.GetContext(ctx, &isMirror, query, name)
75 return isMirror, db.WrapError(err)
76}
77
78// GetRepoIsPrivateByName implements store.RepositoryStore.
79func (*repoStore) GetRepoIsPrivateByName(ctx context.Context, tx db.Handler, name string) (bool, error) {
80 var isPrivate bool
81 name = utils.SanitizeRepo(name)
82 query := tx.Rebind("SELECT private FROM repos WHERE name = ?;")
83 err := tx.GetContext(ctx, &isPrivate, query, name)
84 return isPrivate, db.WrapError(err)
85}
86
87// GetRepoProjectNameByName implements store.RepositoryStore.
88func (*repoStore) GetRepoProjectNameByName(ctx context.Context, tx db.Handler, name string) (string, error) {
89 var pname string
90 name = utils.SanitizeRepo(name)
91 query := tx.Rebind("SELECT project_name FROM repos WHERE name = ?;")
92 err := tx.GetContext(ctx, &pname, query, name)
93 return pname, db.WrapError(err)
94}
95
96// SetRepoDescriptionByName implements store.RepositoryStore.
97func (*repoStore) SetRepoDescriptionByName(ctx context.Context, tx db.Handler, name string, description string) error {
98 name = utils.SanitizeRepo(name)
99 query := tx.Rebind("UPDATE repos SET description = ? WHERE name = ?;")
100 _, err := tx.ExecContext(ctx, query, description, name)
101 return db.WrapError(err)
102}
103
104// SetRepoIsHiddenByName implements store.RepositoryStore.
105func (*repoStore) SetRepoIsHiddenByName(ctx context.Context, tx db.Handler, name string, isHidden bool) error {
106 name = utils.SanitizeRepo(name)
107 query := tx.Rebind("UPDATE repos SET hidden = ? WHERE name = ?;")
108 _, err := tx.ExecContext(ctx, query, isHidden, name)
109 return db.WrapError(err)
110}
111
112// SetRepoIsPrivateByName implements store.RepositoryStore.
113func (*repoStore) SetRepoIsPrivateByName(ctx context.Context, tx db.Handler, name string, isPrivate bool) error {
114 name = utils.SanitizeRepo(name)
115 query := tx.Rebind("UPDATE repos SET private = ? WHERE name = ?;")
116 _, err := tx.ExecContext(ctx, query, isPrivate, name)
117 return db.WrapError(err)
118}
119
120// SetRepoNameByName implements store.RepositoryStore.
121func (*repoStore) SetRepoNameByName(ctx context.Context, tx db.Handler, name string, newName string) error {
122 name = utils.SanitizeRepo(name)
123 newName = utils.SanitizeRepo(newName)
124 query := tx.Rebind("UPDATE repos SET name = ? WHERE name = ?;")
125 _, err := tx.ExecContext(ctx, query, newName, name)
126 return db.WrapError(err)
127}
128
129// SetRepoProjectNameByName implements store.RepositoryStore.
130func (*repoStore) SetRepoProjectNameByName(ctx context.Context, tx db.Handler, name string, projectName string) error {
131 name = utils.SanitizeRepo(name)
132 query := tx.Rebind("UPDATE repos SET project_name = ? WHERE name = ?;")
133 _, err := tx.ExecContext(ctx, query, projectName, name)
134 return db.WrapError(err)
135}