package models import ( "context" "fmt" "github.com/jackc/pgx/v5/pgxpool" ) func GetOrCreateRepository(ctx context.Context, pool *pgxpool.Pool, owner, name string) (*Repository, error) { repo := &Repository{} err := pool.QueryRow(ctx, ` INSERT INTO repositories (owner, name) VALUES ($1, $2) ON CONFLICT (name) DO UPDATE SET updated_at = NOW() RETURNING id, name, owner, forgejo_url, created_at, updated_at `, owner, name).Scan(&repo.ID, &repo.Name, &repo.Owner, &repo.ForgejoURL, &repo.CreatedAt, &repo.UpdatedAt) if err != nil { return nil, fmt.Errorf("get or create repository: %w", err) } return repo, nil } func GetRepositoryByName(ctx context.Context, pool *pgxpool.Pool, name string) (*Repository, error) { repo := &Repository{} err := pool.QueryRow(ctx, ` SELECT id, name, owner, forgejo_url, created_at, updated_at FROM repositories WHERE name = $1 `, name).Scan(&repo.ID, &repo.Name, &repo.Owner, &repo.ForgejoURL, &repo.CreatedAt, &repo.UpdatedAt) if err != nil { return nil, fmt.Errorf("get repository by name: %w", err) } return repo, nil } func GetRepositoryByID(ctx context.Context, pool *pgxpool.Pool, id string) (*Repository, error) { repo := &Repository{} err := pool.QueryRow(ctx, ` SELECT id, name, owner, forgejo_url, created_at, updated_at FROM repositories WHERE id = $1 `, id).Scan(&repo.ID, &repo.Name, &repo.Owner, &repo.ForgejoURL, &repo.CreatedAt, &repo.UpdatedAt) if err != nil { return nil, fmt.Errorf("get repository by id: %w", err) } return repo, nil } func ListRepositories(ctx context.Context, pool *pgxpool.Pool) ([]Repository, error) { rows, err := pool.Query(ctx, ` SELECT id, name, owner, forgejo_url, created_at, updated_at FROM repositories ORDER BY name `) if err != nil { return nil, fmt.Errorf("listing repositories: %w", err) } defer rows.Close() var repos []Repository for rows.Next() { var r Repository if err := rows.Scan(&r.ID, &r.Name, &r.Owner, &r.ForgejoURL, &r.CreatedAt, &r.UpdatedAt); err != nil { return nil, fmt.Errorf("scanning repository: %w", err) } repos = append(repos, r) } return repos, nil }