app.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package dbstore
  2. import (
  3. "fmt"
  4. "git.linuxforward.com/byop/byop-engine/dbmanager"
  5. "git.linuxforward.com/byop/byop-engine/models"
  6. "gorm.io/gorm"
  7. )
  8. // AppStore handles database operations for deployment apps
  9. type AppStore struct {
  10. db *gorm.DB
  11. }
  12. // NewAppStore creates a new AppStore
  13. func NewAppStore(dbManager dbmanager.DbManager) *AppStore {
  14. return &AppStore{
  15. db: dbManager.GetDB(),
  16. }
  17. }
  18. // Create creates a new app
  19. func (as *AppStore) Create(app *models.App) error {
  20. // GORM will handle ID auto-increment and created_at/updated_at automatically
  21. return as.db.Create(app).Error
  22. }
  23. // GetByID retrieves an app by ID
  24. func (as *AppStore) GetByID(id int64) (*models.App, error) {
  25. var app models.App
  26. result := as.db.
  27. Where("rowid = ?", id). // Use SQLite's rowid explicitly
  28. First(&app)
  29. if result.Error != nil {
  30. if result.Error == gorm.ErrRecordNotFound {
  31. return nil, nil // No app found
  32. }
  33. return nil, fmt.Errorf("failed to get app: %w", result.Error)
  34. }
  35. return &app, nil
  36. }
  37. // Update updates an existing app
  38. func (as *AppStore) Update(app *models.App) error {
  39. return as.db.Save(app).Error
  40. }
  41. // Delete deletes an app by ID
  42. func (as *AppStore) Delete(id int64) error {
  43. return as.db.Delete(&models.App{}, "id = ?", id).Error
  44. }
  45. // List retrieves all apps with optional filtering
  46. func (as *AppStore) List(filter map[string]interface{}) ([]*models.App, error) {
  47. var apps []*models.App
  48. // Build query from filters
  49. query := as.db
  50. if filter != nil {
  51. for key, value := range filter {
  52. query = query.Where(key+" = ?", value)
  53. }
  54. }
  55. // Execute query
  56. if err := query.Find(&apps).Error; err != nil {
  57. return nil, fmt.Errorf("failed to list apps: %w", err)
  58. }
  59. return apps, nil
  60. }
  61. // GetAppWithDeployments retrieves an app by ID with associated deployments
  62. func (as *AppStore) GetAppWithDeployments(id int64) (*models.App, error) {
  63. var app models.App
  64. result := as.db.Preload("Deployments").First(&app, "id = ?", id)
  65. if result.Error != nil {
  66. if result.Error == gorm.ErrRecordNotFound {
  67. return nil, nil // No app found
  68. }
  69. return nil, fmt.Errorf("failed to get app: %w", result.Error)
  70. }
  71. return &app, nil
  72. }
  73. // GetByVersion retrieves an app by name and version
  74. func (as *AppStore) GetByVersion(name string, version string) (*models.App, error) {
  75. var app models.App
  76. result := as.db.Where("name = ? AND version = ?", name, version).First(&app)
  77. if result.Error != nil {
  78. if result.Error == gorm.ErrRecordNotFound {
  79. return nil, nil // No app found
  80. }
  81. return nil, fmt.Errorf("failed to get app: %w", result.Error)
  82. }
  83. return &app, nil
  84. }