1package sqlite
  2
  3import (
  4	"context"
  5
  6	"github.com/charmbracelet/soft-serve/git"
  7	"github.com/charmbracelet/soft-serve/server/backend"
  8	"github.com/jmoiron/sqlx"
  9)
 10
 11var _ backend.Repository = (*Repo)(nil)
 12
 13// Repo is a Git repository with metadata stored in a SQLite database.
 14type Repo struct {
 15	name string
 16	path string
 17	db   *sqlx.DB
 18}
 19
 20// Description returns the repository's description.
 21//
 22// It implements backend.Repository.
 23func (r *Repo) Description() string {
 24	var desc string
 25	if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
 26		return tx.Get(&desc, "SELECT description FROM repo WHERE name = ?", r.name)
 27	}); err != nil {
 28		return ""
 29	}
 30
 31	return desc
 32}
 33
 34// IsMirror returns whether the repository is a mirror.
 35//
 36// It implements backend.Repository.
 37func (r *Repo) IsMirror() bool {
 38	var mirror bool
 39	if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
 40		return tx.Get(&mirror, "SELECT mirror FROM repo WHERE name = ?", r.name)
 41	}); err != nil {
 42		return false
 43	}
 44
 45	return mirror
 46}
 47
 48// IsPrivate returns whether the repository is private.
 49//
 50// It implements backend.Repository.
 51func (r *Repo) IsPrivate() bool {
 52	var private bool
 53	if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
 54		return tx.Get(&private, "SELECT private FROM repo WHERE name = ?", r.name)
 55	}); err != nil {
 56		return false
 57	}
 58
 59	return private
 60}
 61
 62// Name returns the repository's name.
 63//
 64// It implements backend.Repository.
 65func (r *Repo) Name() string {
 66	return r.name
 67}
 68
 69// Open opens the repository.
 70//
 71// It implements backend.Repository.
 72func (r *Repo) Open() (*git.Repository, error) {
 73	return git.Open(r.path)
 74}
 75
 76// ProjectName returns the repository's project name.
 77//
 78// It implements backend.Repository.
 79func (r *Repo) ProjectName() string {
 80	var name string
 81	if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
 82		return tx.Get(&name, "SELECT project_name FROM repo WHERE name = ?", r.name)
 83	}); err != nil {
 84		return ""
 85	}
 86
 87	return name
 88}
 89
 90// IsHidden returns whether the repository is hidden.
 91//
 92// It implements backend.Repository.
 93func (r *Repo) IsHidden() bool {
 94	var hidden bool
 95	if err := wrapTx(r.db, context.Background(), func(tx *sqlx.Tx) error {
 96		return tx.Get(&hidden, "SELECT hidden FROM repo WHERE name = ?", r.name)
 97	}); err != nil {
 98		return false
 99	}
100
101	return hidden
102}