1package database
2
3import (
4 "context"
5
6 "github.com/charmbracelet/soft-serve/pkg/db"
7 "github.com/charmbracelet/soft-serve/pkg/db/models"
8 "github.com/charmbracelet/soft-serve/pkg/store"
9 "github.com/charmbracelet/soft-serve/pkg/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, userID int64, projectName string, description string, isPrivate bool, isHidden bool, isMirror bool) error {
18 name = utils.SanitizeRepo(name)
19 values := []interface{}{
20 name, projectName, description, isPrivate, isMirror, isHidden,
21 }
22 query := `INSERT INTO repos (name, project_name, description, private, mirror, hidden, updated_at)
23 VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP);`
24 if userID > 0 {
25 query = `INSERT INTO repos (name, project_name, description, private, mirror, hidden, updated_at, user_id)
26 VALUES (?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP, ?);`
27 values = append(values, userID)
28 }
29
30 query = tx.Rebind(query)
31 _, err := tx.ExecContext(ctx, query, values...)
32 return db.WrapError(err)
33}
34
35// DeleteRepoByName implements store.RepositoryStore.
36func (*repoStore) DeleteRepoByName(ctx context.Context, tx db.Handler, name string) error {
37 name = utils.SanitizeRepo(name)
38 query := tx.Rebind("DELETE FROM repos WHERE name = ?;")
39 _, err := tx.ExecContext(ctx, query, name)
40 return db.WrapError(err)
41}
42
43// GetAllRepos implements store.RepositoryStore.
44func (*repoStore) GetAllRepos(ctx context.Context, tx db.Handler) ([]models.Repo, error) {
45 var repos []models.Repo
46 query := tx.Rebind("SELECT * FROM repos;")
47 err := tx.SelectContext(ctx, &repos, query)
48 return repos, db.WrapError(err)
49}
50
51// GetUserRepos implements store.RepositoryStore.
52func (*repoStore) GetUserRepos(ctx context.Context, tx db.Handler, userID int64) ([]models.Repo, error) {
53 var repos []models.Repo
54 query := tx.Rebind("SELECT * FROM repos WHERE user_id = ?;")
55 err := tx.SelectContext(ctx, &repos, query, userID)
56 return repos, db.WrapError(err)
57}
58
59// GetRepoByName implements store.RepositoryStore.
60func (*repoStore) GetRepoByName(ctx context.Context, tx db.Handler, name string) (models.Repo, error) {
61 var repo models.Repo
62 name = utils.SanitizeRepo(name)
63 query := tx.Rebind("SELECT * FROM repos WHERE name = ?;")
64 err := tx.GetContext(ctx, &repo, query, name)
65 return repo, db.WrapError(err)
66}
67
68// GetRepoDescriptionByName implements store.RepositoryStore.
69func (*repoStore) GetRepoDescriptionByName(ctx context.Context, tx db.Handler, name string) (string, error) {
70 var description string
71 name = utils.SanitizeRepo(name)
72 query := tx.Rebind("SELECT description FROM repos WHERE name = ?;")
73 err := tx.GetContext(ctx, &description, query, name)
74 return description, db.WrapError(err)
75}
76
77// GetRepoIsHiddenByName implements store.RepositoryStore.
78func (*repoStore) GetRepoIsHiddenByName(ctx context.Context, tx db.Handler, name string) (bool, error) {
79 var isHidden bool
80 name = utils.SanitizeRepo(name)
81 query := tx.Rebind("SELECT hidden FROM repos WHERE name = ?;")
82 err := tx.GetContext(ctx, &isHidden, query, name)
83 return isHidden, db.WrapError(err)
84}
85
86// GetRepoIsMirrorByName implements store.RepositoryStore.
87func (*repoStore) GetRepoIsMirrorByName(ctx context.Context, tx db.Handler, name string) (bool, error) {
88 var isMirror bool
89 name = utils.SanitizeRepo(name)
90 query := tx.Rebind("SELECT mirror FROM repos WHERE name = ?;")
91 err := tx.GetContext(ctx, &isMirror, query, name)
92 return isMirror, db.WrapError(err)
93}
94
95// SetRepoIsMirrorByName implements store.RepositoryStore.
96func (*repoStore) SetRepoIsMirrorByName(ctx context.Context, tx db.Handler, name string, isMirror bool) error {
97 name = utils.SanitizeRepo(name)
98 query := tx.Rebind("UPDATE repos SET mirror = ? WHERE name = ?;")
99 _, err := tx.ExecContext(ctx, query, isMirror, name)
100 return db.WrapError(err)
101}
102
103// GetRepoIsPrivateByName implements store.RepositoryStore.
104func (*repoStore) GetRepoIsPrivateByName(ctx context.Context, tx db.Handler, name string) (bool, error) {
105 var isPrivate bool
106 name = utils.SanitizeRepo(name)
107 query := tx.Rebind("SELECT private FROM repos WHERE name = ?;")
108 err := tx.GetContext(ctx, &isPrivate, query, name)
109 return isPrivate, db.WrapError(err)
110}
111
112// GetRepoProjectNameByName implements store.RepositoryStore.
113func (*repoStore) GetRepoProjectNameByName(ctx context.Context, tx db.Handler, name string) (string, error) {
114 var pname string
115 name = utils.SanitizeRepo(name)
116 query := tx.Rebind("SELECT project_name FROM repos WHERE name = ?;")
117 err := tx.GetContext(ctx, &pname, query, name)
118 return pname, db.WrapError(err)
119}
120
121// SetRepoDescriptionByName implements store.RepositoryStore.
122func (*repoStore) SetRepoDescriptionByName(ctx context.Context, tx db.Handler, name string, description string) error {
123 name = utils.SanitizeRepo(name)
124 query := tx.Rebind("UPDATE repos SET description = ? WHERE name = ?;")
125 _, err := tx.ExecContext(ctx, query, description, name)
126 return db.WrapError(err)
127}
128
129// SetRepoIsHiddenByName implements store.RepositoryStore.
130func (*repoStore) SetRepoIsHiddenByName(ctx context.Context, tx db.Handler, name string, isHidden bool) error {
131 name = utils.SanitizeRepo(name)
132 query := tx.Rebind("UPDATE repos SET hidden = ? WHERE name = ?;")
133 _, err := tx.ExecContext(ctx, query, isHidden, name)
134 return db.WrapError(err)
135}
136
137// SetRepoIsPrivateByName implements store.RepositoryStore.
138func (*repoStore) SetRepoIsPrivateByName(ctx context.Context, tx db.Handler, name string, isPrivate bool) error {
139 name = utils.SanitizeRepo(name)
140 query := tx.Rebind("UPDATE repos SET private = ? WHERE name = ?;")
141 _, err := tx.ExecContext(ctx, query, isPrivate, name)
142 return db.WrapError(err)
143}
144
145// SetRepoNameByName implements store.RepositoryStore.
146func (*repoStore) SetRepoNameByName(ctx context.Context, tx db.Handler, name string, newName string) error {
147 name = utils.SanitizeRepo(name)
148 newName = utils.SanitizeRepo(newName)
149 query := tx.Rebind("UPDATE repos SET name = ? WHERE name = ?;")
150 _, err := tx.ExecContext(ctx, query, newName, name)
151 return db.WrapError(err)
152}
153
154// SetRepoProjectNameByName implements store.RepositoryStore.
155func (*repoStore) SetRepoProjectNameByName(ctx context.Context, tx db.Handler, name string, projectName string) error {
156 name = utils.SanitizeRepo(name)
157 query := tx.Rebind("UPDATE repos SET project_name = ? WHERE name = ?;")
158 _, err := tx.ExecContext(ctx, query, projectName, name)
159 return db.WrapError(err)
160}