repo.go

  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}