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// 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}102103// GetRepoIsPrivateByName implements store.RepositoryStore.104func (*repoStore) GetRepoIsPrivateByName(ctx context.Context, tx db.Handler, name string) (bool, error) {105 var isPrivate bool106 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}111112// GetRepoProjectNameByName implements store.RepositoryStore.113func (*repoStore) GetRepoProjectNameByName(ctx context.Context, tx db.Handler, name string) (string, error) {114 var pname string115 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}120121// 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}128129// 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}136137// 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}144145// 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}153154// 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}