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) //nolint:wrapcheck
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) //nolint:wrapcheck
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) //nolint:wrapcheck
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) //nolint:wrapcheck
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) //nolint:wrapcheck
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) //nolint:wrapcheck
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) //nolint:wrapcheck
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) //nolint:wrapcheck
93}
94
95// GetRepoIsPrivateByName implements store.RepositoryStore.
96func (*repoStore) GetRepoIsPrivateByName(ctx context.Context, tx db.Handler, name string) (bool, error) {
97 var isPrivate bool
98 name = utils.SanitizeRepo(name)
99 query := tx.Rebind("SELECT private FROM repos WHERE name = ?;")
100 err := tx.GetContext(ctx, &isPrivate, query, name)
101 return isPrivate, db.WrapError(err) //nolint:wrapcheck
102}
103
104// GetRepoProjectNameByName implements store.RepositoryStore.
105func (*repoStore) GetRepoProjectNameByName(ctx context.Context, tx db.Handler, name string) (string, error) {
106 var pname string
107 name = utils.SanitizeRepo(name)
108 query := tx.Rebind("SELECT project_name FROM repos WHERE name = ?;")
109 err := tx.GetContext(ctx, &pname, query, name)
110 return pname, db.WrapError(err) //nolint:wrapcheck
111}
112
113// SetRepoDescriptionByName implements store.RepositoryStore.
114func (*repoStore) SetRepoDescriptionByName(ctx context.Context, tx db.Handler, name string, description string) error {
115 name = utils.SanitizeRepo(name)
116 query := tx.Rebind("UPDATE repos SET description = ? WHERE name = ?;")
117 _, err := tx.ExecContext(ctx, query, description, name)
118 return db.WrapError(err) //nolint:wrapcheck
119}
120
121// SetRepoIsHiddenByName implements store.RepositoryStore.
122func (*repoStore) SetRepoIsHiddenByName(ctx context.Context, tx db.Handler, name string, isHidden bool) error {
123 name = utils.SanitizeRepo(name)
124 query := tx.Rebind("UPDATE repos SET hidden = ? WHERE name = ?;")
125 _, err := tx.ExecContext(ctx, query, isHidden, name)
126 return db.WrapError(err) //nolint:wrapcheck
127}
128
129// SetRepoIsPrivateByName implements store.RepositoryStore.
130func (*repoStore) SetRepoIsPrivateByName(ctx context.Context, tx db.Handler, name string, isPrivate bool) error {
131 name = utils.SanitizeRepo(name)
132 query := tx.Rebind("UPDATE repos SET private = ? WHERE name = ?;")
133 _, err := tx.ExecContext(ctx, query, isPrivate, name)
134 return db.WrapError(err) //nolint:wrapcheck
135}
136
137// SetRepoNameByName implements store.RepositoryStore.
138func (*repoStore) SetRepoNameByName(ctx context.Context, tx db.Handler, name string, newName string) error {
139 name = utils.SanitizeRepo(name)
140 newName = utils.SanitizeRepo(newName)
141 query := tx.Rebind("UPDATE repos SET name = ? WHERE name = ?;")
142 _, err := tx.ExecContext(ctx, query, newName, name)
143 return db.WrapError(err) //nolint:wrapcheck
144}
145
146// SetRepoProjectNameByName implements store.RepositoryStore.
147func (*repoStore) SetRepoProjectNameByName(ctx context.Context, tx db.Handler, name string, projectName string) error {
148 name = utils.SanitizeRepo(name)
149 query := tx.Rebind("UPDATE repos SET project_name = ? WHERE name = ?;")
150 _, err := tx.ExecContext(ctx, query, projectName, name)
151 return db.WrapError(err) //nolint:wrapcheck
152}