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}