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