123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- package dbstore
- import (
- "context"
- "fmt"
- "git.linuxforward.com/byop/byop-engine/models"
- "gorm.io/gorm"
- )
- // CreateBuildJob creates a new build job using GORM
- func (s *SQLiteStore) CreateBuildJob(ctx context.Context, job *models.BuildJob) error {
- result := s.db.WithContext(ctx).Create(job)
- if result.Error != nil {
- return fmt.Errorf("failed to create build job: %w", result.Error)
- }
- return nil
- }
- // GetBuildJobByID retrieves a build job by ID using GORM
- func (s *SQLiteStore) GetBuildJobByID(ctx context.Context, id uint) (*models.BuildJob, error) {
- var job models.BuildJob
- result := s.db.WithContext(ctx).First(&job, id)
- if result.Error != nil {
- if result.Error == gorm.ErrRecordNotFound {
- return nil, models.NewErrNotFound(fmt.Sprintf("build job with ID %d not found", id), result.Error)
- }
- return nil, fmt.Errorf("failed to get build job by ID: %w", result.Error)
- }
- return &job, nil
- }
- // UpdateBuildJob updates an existing build job using GORM
- func (s *SQLiteStore) UpdateBuildJob(ctx context.Context, job *models.BuildJob) error {
- result := s.db.WithContext(ctx).Save(job)
- if result.Error != nil {
- return fmt.Errorf("failed to update build job: %w", result.Error)
- }
- if result.RowsAffected == 0 {
- return models.NewErrNotFound(fmt.Sprintf("build job with ID %d not found for update", job.ID), nil)
- }
- return nil
- }
- // UpdateBuildJobStatus updates the status and error message of a build job using GORM
- func (s *SQLiteStore) UpdateBuildJobStatus(ctx context.Context, id uint, status models.BuildStatus, errorMessage string) error {
- result := s.db.WithContext(ctx).Model(&models.BuildJob{}).Where("id = ?", id).Updates(map[string]interface{}{
- "status": status,
- "error_message": errorMessage,
- })
- if result.Error != nil {
- return fmt.Errorf("failed to update build job status: %w", result.Error)
- }
- if result.RowsAffected == 0 {
- return models.NewErrNotFound(fmt.Sprintf("build job with ID %d not found for status update", id), nil)
- }
- return nil
- }
- // AppendBuildJobLog appends a log message to a build job using GORM
- func (s *SQLiteStore) AppendBuildJobLog(ctx context.Context, id uint, logMessage string) error {
- // Get current logs first
- var job models.BuildJob
- result := s.db.WithContext(ctx).Select("logs").First(&job, id)
- if result.Error != nil {
- if result.Error == gorm.ErrRecordNotFound {
- return models.NewErrNotFound(fmt.Sprintf("build job with ID %d not found", id), result.Error)
- }
- return fmt.Errorf("failed to get build job for log append: %w", result.Error)
- }
- // Append new log message
- newLogs := job.Logs + logMessage + "\n"
- result = s.db.WithContext(ctx).Model(&models.BuildJob{}).Where("id = ?", id).Update("logs", newLogs)
- if result.Error != nil {
- return fmt.Errorf("failed to append build job log: %w", result.Error)
- }
- return nil
- }
- // GetQueuedBuildJobs retrieves queued build jobs using GORM
- func (s *SQLiteStore) GetQueuedBuildJobs(ctx context.Context, limit int) ([]*models.BuildJob, error) {
- var jobs []*models.BuildJob
- result := s.db.WithContext(ctx).Where("status = ?", models.BuildStatusPending).Limit(limit).Find(&jobs)
- if result.Error != nil {
- return nil, fmt.Errorf("failed to get queued build jobs: %w", result.Error)
- }
- return jobs, nil
- }
- // GetBuildJobsByAppID retrieves build jobs for a specific app using GORM (with pagination)
- func (s *SQLiteStore) GetBuildJobsByAppID(ctx context.Context, appID uint, page, pageSize int) ([]*models.BuildJob, int64, error) {
- var jobs []*models.BuildJob
- var total int64
- // Count total records
- s.db.WithContext(ctx).Model(&models.BuildJob{}).Where("component_id IN (SELECT id FROM components WHERE user_id = (SELECT user_id FROM apps WHERE id = ?))", appID).Count(&total)
- // Get paginated results
- offset := (page - 1) * pageSize
- result := s.db.WithContext(ctx).Where("component_id IN (SELECT id FROM components WHERE user_id = (SELECT user_id FROM apps WHERE id = ?))", appID).
- Offset(offset).Limit(pageSize).Find(&jobs)
- if result.Error != nil {
- return nil, 0, fmt.Errorf("failed to get build jobs by app ID: %w", result.Error)
- }
- return jobs, total, nil
- }
|