68 lines
2.1 KiB
Go
68 lines
2.1 KiB
Go
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
|
|
}
|