package models import ( "context" "fmt" cairnapi "github.com/mattnite/cairn/internal/api" "gorm.io/gorm" ) func GetOrCreateRepository(ctx context.Context, db *gorm.DB, owner, name string) (*cairnapi.Repository, error) { repo := &Repository{Owner: owner, Name: name} if err := db.WithContext(ctx).Where("owner = ? AND name = ?", owner, name).FirstOrCreate(repo).Error; err != nil { return nil, fmt.Errorf("get or create repository: %w", err) } out := repositoryFromModel(*repo) return &out, nil } func GetRepositoryByName(ctx context.Context, db *gorm.DB, name string) (*cairnapi.Repository, error) { repo := &Repository{} if err := db.WithContext(ctx).Where("name = ?", name).First(repo).Error; err != nil { return nil, fmt.Errorf("get repository by name: %w", err) } out := repositoryFromModel(*repo) return &out, nil } func GetRepositoryByID(ctx context.Context, db *gorm.DB, id uint) (*cairnapi.Repository, error) { repo := &Repository{} if err := db.WithContext(ctx).First(repo, id).Error; err != nil { return nil, fmt.Errorf("get repository by id: %w", err) } out := repositoryFromModel(*repo) return &out, nil } func ListRepositories(ctx context.Context, db *gorm.DB) ([]cairnapi.Repository, error) { var dbRepos []Repository if err := db.WithContext(ctx).Order("name ASC").Find(&dbRepos).Error; err != nil { return nil, fmt.Errorf("listing repositories: %w", err) } out := make([]cairnapi.Repository, 0, len(dbRepos)) for _, m := range dbRepos { out = append(out, repositoryFromModel(m)) } return out, nil } func repositoryFromModel(m Repository) cairnapi.Repository { return cairnapi.Repository{ ID: m.ID, Name: m.Name, Owner: m.Owner, CreatedAt: m.CreatedAt, UpdatedAt: m.UpdatedAt, } }