1package database23import (4 "context"56 "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)1112type repoStore struct{}1314var _ store.RepositoryStore = (*repoStore)(nil)1516// 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 }2930 query = tx.Rebind(query)31 _, err := tx.ExecContext(ctx, query, values...)32 return db.WrapError(err)33}3435// 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}4243// GetAllRepos implements store.RepositoryStore.44func (*repoStore) GetAllRepos(ctx context.Context, tx db.Handler) ([]models.Repo, error) {45 var repos []models.Repo46 query := tx.Rebind("SELECT * FROM repos;")47 err := tx.SelectContext(ctx, &repos, query)48 return repos, db.WrapError(err)49}5051// GetUserRepos implements store.RepositoryStore.52func (*repoStore) GetUserRepos(ctx context.Context, tx db.Handler, userID int64) ([]models.Repo, error) {53 var repos []models.Repo54 query := tx.Rebind("SELECT * FROM repos WHERE user_id = ?;")55 err := tx.SelectContext(ctx, &repos, query, userID)56 return repos, db.WrapError(err)57}5859// GetRepoByName implements store.RepositoryStore.60func (*repoStore) GetRepoByName(ctx context.Context, tx db.Handler, name string) (models.Repo, error) {61 var repo models.Repo62 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}6768// GetRepoDescriptionByName implements store.RepositoryStore.69func (*repoStore) GetRepoDescriptionByName(ctx context.Context, tx db.Handler, name string) (string, error) {70 var description string71 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}7677// GetRepoIsHiddenByName implements store.RepositoryStore.78func (*repoStore) GetRepoIsHiddenByName(ctx context.Context, tx db.Handler, name string) (bool, error) {79 var isHidden bool80 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}8586// GetRepoIsMirrorByName implements store.RepositoryStore.87func (*repoStore) GetRepoIsMirrorByName(ctx context.Context, tx db.Handler, name string) (bool, error) {88 var isMirror bool89 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}9495// GetRepoIsPrivateByName implements store.RepositoryStore.96func (*repoStore) GetRepoIsPrivateByName(ctx context.Context, tx db.Handler, name string) (bool, error) {97 var isPrivate bool98 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)102}103104// GetRepoProjectNameByName implements store.RepositoryStore.105func (*repoStore) GetRepoProjectNameByName(ctx context.Context, tx db.Handler, name string) (string, error) {106 var pname string107 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)111}112113// 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)119}120121// 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)127}128129// 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)135}136137// 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)144}145146// 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)152}