stack.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. package gorm
  2. import (
  3. "github.com/porter-dev/porter/internal/models"
  4. "github.com/porter-dev/porter/internal/repository"
  5. "gorm.io/gorm"
  6. )
  7. // StackRepository uses gorm.DB for querying the database
  8. type StackRepository struct {
  9. db *gorm.DB
  10. }
  11. // NewStackRepository returns a StackRepository which uses
  12. // gorm.DB for querying the database
  13. func NewStackRepository(db *gorm.DB) repository.StackRepository {
  14. return &StackRepository{db}
  15. }
  16. // CreateStack creates a new stack
  17. func (repo *StackRepository) CreateStack(stack *models.Stack) (*models.Stack, error) {
  18. if err := repo.db.Create(stack).Error; err != nil {
  19. return nil, err
  20. }
  21. return stack, nil
  22. }
  23. // ReadStack gets a stack specified by its string id
  24. func (repo *StackRepository) ListStacks(projectID, clusterID uint, namespace string) ([]*models.Stack, error) {
  25. stacks := make([]*models.Stack, 0)
  26. if err := repo.db.Debug().
  27. Preload("Revisions", func(db *gorm.DB) *gorm.DB {
  28. return db.Debug().Order("stack_revisions.revision_number DESC").Limit(1)
  29. }).
  30. Preload("Revisions.Resources").
  31. Preload("Revisions.SourceConfigs").
  32. Where("stacks.project_id = ? AND stacks.cluster_id = ? AND stacks.namespace = ?", projectID, clusterID, namespace).Find(&stacks).Error; err != nil {
  33. return nil, err
  34. }
  35. return stacks, nil
  36. }
  37. // ReadStack gets a stack specified by its string id
  38. func (repo *StackRepository) ReadStackByStringID(projectID uint, stackID string) (*models.Stack, error) {
  39. stack := &models.Stack{}
  40. if err := repo.db.
  41. Preload("Revisions", func(db *gorm.DB) *gorm.DB {
  42. return db.Order("stack_revisions.revision_number DESC").Limit(100)
  43. }).
  44. Preload("Revisions.Resources").
  45. Preload("Revisions.SourceConfigs").
  46. Where("stacks.project_id = ? AND stacks.uid = ?", projectID, stackID).First(&stack).Error; err != nil {
  47. return nil, err
  48. }
  49. return stack, nil
  50. }
  51. // DeleteStack creates a new stack
  52. func (repo *StackRepository) DeleteStack(stack *models.Stack) (*models.Stack, error) {
  53. if err := repo.db.Delete(stack).Error; err != nil {
  54. return nil, err
  55. }
  56. return stack, nil
  57. }
  58. func (repo *StackRepository) UpdateStackRevision(revision *models.StackRevision) (*models.StackRevision, error) {
  59. if err := repo.db.Save(revision).Error; err != nil {
  60. return nil, err
  61. }
  62. return revision, nil
  63. }
  64. func (repo *StackRepository) ReadStackRevision(stackRevisionID uint) (*models.StackRevision, error) {
  65. revision := &models.StackRevision{}
  66. if err := repo.db.Preload("Resources").Preload("SourceConfigs").Where("id = ?", stackRevisionID).First(&revision).Error; err != nil {
  67. return nil, err
  68. }
  69. return revision, nil
  70. }
  71. func (repo *StackRepository) ReadStackRevisionByNumber(stackID uint, revisionNumber uint) (*models.StackRevision, error) {
  72. revision := &models.StackRevision{}
  73. if err := repo.db.Preload("Resources").Preload("SourceConfigs").Where("stack_id = ? AND revision_number = ?", stackID, revisionNumber).First(&revision).Error; err != nil {
  74. return nil, err
  75. }
  76. return revision, nil
  77. }
  78. func (repo *StackRepository) AppendNewRevision(revision *models.StackRevision) (*models.StackRevision, error) {
  79. stack := &models.Stack{}
  80. if err := repo.db.Where("id = ?", revision.StackID).First(&stack).Error; err != nil {
  81. return nil, err
  82. }
  83. assoc := repo.db.Model(&stack).Association("Revisions")
  84. if assoc.Error != nil {
  85. return nil, assoc.Error
  86. }
  87. if err := assoc.Append(revision); err != nil {
  88. return nil, err
  89. }
  90. return revision, nil
  91. }
  92. func (repo *StackRepository) ReadStackResource(resourceID uint) (*models.StackResource, error) {
  93. resource := &models.StackResource{}
  94. if err := repo.db.Where("id = ?", resourceID).First(&resource).Error; err != nil {
  95. return nil, err
  96. }
  97. return resource, nil
  98. }
  99. func (repo *StackRepository) UpdateStackResource(resource *models.StackResource) (*models.StackResource, error) {
  100. if err := repo.db.Save(resource).Error; err != nil {
  101. return nil, err
  102. }
  103. return resource, nil
  104. }