59 lines
1.7 KiB
Go
59 lines
1.7 KiB
Go
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,
|
|
}
|
|
}
|