porter_app_event.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package gorm
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "strconv"
  7. "time"
  8. "github.com/google/uuid"
  9. "github.com/porter-dev/porter/internal/models"
  10. "github.com/porter-dev/porter/internal/repository"
  11. "github.com/porter-dev/porter/internal/repository/gorm/helpers"
  12. "gorm.io/gorm"
  13. )
  14. // PorterAppEventRepository uses gorm.DB for querying the database
  15. type PorterAppEventRepository struct {
  16. db *gorm.DB
  17. }
  18. // NewPorterAppEventRepository returns a PorterAppEventRepository which uses
  19. // gorm.DB for querying the database
  20. func NewPorterAppEventRepository(db *gorm.DB) repository.PorterAppEventRepository {
  21. return &PorterAppEventRepository{db}
  22. }
  23. func (repo *PorterAppEventRepository) ListEventsByPorterAppID(ctx context.Context, porterAppID uint, opts ...helpers.QueryOption) ([]*models.PorterAppEvent, helpers.PaginatedResult, error) {
  24. apps := []*models.PorterAppEvent{}
  25. paginatedResult := helpers.PaginatedResult{}
  26. id := strconv.Itoa(int(porterAppID))
  27. if id == "" {
  28. return nil, paginatedResult, errors.New("invalid porter app id supplied")
  29. }
  30. db := repo.db.Model(&models.PorterAppEvent{})
  31. resultDB := db.Where("porter_app_id = ?", id).Order("created_at DESC")
  32. resultDB = resultDB.Scopes(helpers.Paginate(db, &paginatedResult, opts...))
  33. if err := resultDB.Find(&apps).Error; err != nil {
  34. if !errors.Is(err, gorm.ErrRecordNotFound) {
  35. return nil, paginatedResult, err
  36. }
  37. }
  38. return apps, paginatedResult, nil
  39. }
  40. // ListEventsByPorterAppIDAndDeploymentTargetID returns a list of events for a given porter app id and deployment target id
  41. func (repo *PorterAppEventRepository) ListEventsByPorterAppIDAndDeploymentTargetID(ctx context.Context, porterAppID uint, deploymentTargetID uuid.UUID, opts ...helpers.QueryOption) ([]*models.PorterAppEvent, helpers.PaginatedResult, error) {
  42. apps := []*models.PorterAppEvent{}
  43. paginatedResult := helpers.PaginatedResult{}
  44. id := strconv.Itoa(int(porterAppID))
  45. if id == "" {
  46. return nil, paginatedResult, errors.New("invalid porter app id supplied")
  47. }
  48. if deploymentTargetID == uuid.Nil {
  49. return nil, paginatedResult, errors.New("invalid deployment target id supplied")
  50. }
  51. db := repo.db.Model(&models.PorterAppEvent{})
  52. resultDB := db.Where("porter_app_id = ? AND deployment_target_id = ?", id, deploymentTargetID).Order("created_at DESC")
  53. resultDB = resultDB.Scopes(helpers.Paginate(db, &paginatedResult, opts...))
  54. if err := resultDB.Find(&apps).Error; err != nil {
  55. if !errors.Is(err, gorm.ErrRecordNotFound) {
  56. return nil, paginatedResult, err
  57. }
  58. }
  59. return apps, paginatedResult, nil
  60. }
  61. func (repo *PorterAppEventRepository) CreateEvent(ctx context.Context, appEvent *models.PorterAppEvent) error {
  62. if appEvent.ID == uuid.Nil {
  63. appEvent.ID = uuid.New()
  64. }
  65. if appEvent.CreatedAt.IsZero() {
  66. appEvent.CreatedAt = time.Now().UTC()
  67. }
  68. if appEvent.UpdatedAt.IsZero() {
  69. appEvent.UpdatedAt = time.Now().UTC()
  70. }
  71. if appEvent.PorterAppID == 0 {
  72. return errors.New("invalid porter app id supplied to create event")
  73. }
  74. if err := repo.db.Create(appEvent).Error; err != nil {
  75. return err
  76. }
  77. return nil
  78. }
  79. // UpdateEvent will set all values in the database to the values of the passed in appEvent
  80. func (repo *PorterAppEventRepository) UpdateEvent(ctx context.Context, appEvent *models.PorterAppEvent) error {
  81. if appEvent.PorterAppID == 0 {
  82. return errors.New("invalid porter app id supplied to update event")
  83. }
  84. if appEvent.ID == uuid.Nil {
  85. return errors.New("invalid porter app event id supplied to update event")
  86. }
  87. if appEvent.UpdatedAt.IsZero() {
  88. appEvent.UpdatedAt = time.Now().UTC()
  89. }
  90. if err := repo.db.Model(appEvent).Updates(appEvent).Error; err != nil {
  91. return err
  92. }
  93. return nil
  94. }
  95. func (repo *PorterAppEventRepository) ReadEvent(ctx context.Context, id uuid.UUID) (models.PorterAppEvent, error) {
  96. appEvent := models.PorterAppEvent{}
  97. if id == uuid.Nil {
  98. return appEvent, errors.New("invalid porter app event id supplied")
  99. }
  100. strID := id.String()
  101. if err := repo.db.Where("id = ?", strID).First(&appEvent).Error; err != nil {
  102. return appEvent, err
  103. }
  104. return appEvent, nil
  105. }
  106. func (repo *PorterAppEventRepository) ReadDeployEventByRevision(ctx context.Context, porterAppID uint, revision float64) (models.PorterAppEvent, error) {
  107. appEvent := models.PorterAppEvent{}
  108. if porterAppID == 0 {
  109. return appEvent, errors.New("invalid porter app ID supplied")
  110. }
  111. // Convert porterAppID to string
  112. strAppID := strconv.Itoa(int(porterAppID))
  113. // Convert revision to JSON number string
  114. revJSON, err := json.Marshal(revision)
  115. if err != nil {
  116. return appEvent, errors.New("unable to marshal revision")
  117. }
  118. strRevision := string(revJSON)
  119. if err := repo.db.Where("porter_app_id = ? AND type = 'DEPLOY' AND metadata->>'revision' = ?", strAppID, strRevision).First(&appEvent).Error; err != nil {
  120. return appEvent, err
  121. }
  122. return appEvent, nil
  123. }
  124. // ReadDeployEventByAppRevisionID returns a deploy event for a given porter app id and app revision ID
  125. func (repo *PorterAppEventRepository) ReadDeployEventByAppRevisionID(ctx context.Context, porterAppID uint, appRevisionID string) (models.PorterAppEvent, error) {
  126. appEvent := models.PorterAppEvent{}
  127. if porterAppID == 0 {
  128. return appEvent, errors.New("invalid porter app ID supplied")
  129. }
  130. if appRevisionID == "" {
  131. return appEvent, errors.New("no app revision ID supplied")
  132. }
  133. // Convert porterAppID to string
  134. strAppID := strconv.Itoa(int(porterAppID))
  135. if err := repo.db.Where("porter_app_id = ? AND type = 'DEPLOY' AND metadata->>'app_revision_id' = ?", strAppID, appRevisionID).First(&appEvent).Error; err != nil {
  136. return appEvent, err
  137. }
  138. return appEvent, nil
  139. }