ソースを参照

correct updating logic.

Ivan Galakhov 4 年 前
コミット
325bcc21fa

+ 6 - 1
internal/models/event.go

@@ -1,6 +1,9 @@
 package models
 
-import "gorm.io/gorm"
+import (
+	"gorm.io/gorm"
+	"time"
+)
 
 type EventStatus int64
 
@@ -34,6 +37,7 @@ type SubEventExternal struct {
 	Index   int64       `json:"index"`
 	Status  EventStatus `json:"status"`
 	Info    string      `json:"info"`
+	Time    time.Time   `json:"time""`
 }
 
 func (event *SubEvent) Externalize() SubEventExternal {
@@ -43,5 +47,6 @@ func (event *SubEvent) Externalize() SubEventExternal {
 		Index:   event.Index,
 		Status:  event.Status,
 		Info:    event.Info,
+		Time:    event.UpdatedAt,
 	}
 }

+ 3 - 0
internal/repository/event.go

@@ -6,4 +6,7 @@ type EventRepository interface {
 	CreateEventContainer(am *models.EventContainer) (*models.EventContainer, error)
 	CreateSubEvent(am *models.SubEvent) (*models.SubEvent, error)
 	ReadEventsByContainerID(id uint) ([]*models.SubEvent, error)
+	ReadEventContainer(id uint) (*models.EventContainer, error)
+	ReadSubEvent(id uint) (*models.SubEvent, error)
+	AppendEvent(container *models.EventContainer, event *models.SubEvent) error
 }

+ 48 - 1
internal/repository/gorm/event.go

@@ -1,6 +1,7 @@
 package gorm
 
 import (
+	"fmt"
 	"github.com/porter-dev/porter/internal/models"
 	"github.com/porter-dev/porter/internal/repository"
 	"gorm.io/gorm"
@@ -33,8 +34,54 @@ func (repo EventRepository) CreateSubEvent(am *models.SubEvent) (*models.SubEven
 
 func (repo EventRepository) ReadEventsByContainerID(id uint) ([]*models.SubEvent, error) {
 	var events []*models.SubEvent
-	if err := repo.db.Where("container_id = ?", id).Find(&events).Error; err != nil {
+	if err := repo.db.Where("event_container_id = ?", id).Find(&events).Error; err != nil {
 		return nil, err
 	}
 	return events, nil
 }
+
+func (repo EventRepository) ReadEventContainer(id uint) (*models.EventContainer, error) {
+	container := &models.EventContainer{}
+	if err := repo.db.Where("id = ?", id).First(&container).Error; err != nil {
+		return nil, err
+	}
+	return container, nil
+}
+
+func (repo EventRepository) ReadSubEvent(id uint) (*models.SubEvent, error) {
+	event := &models.SubEvent{}
+	if err := repo.db.Where("id = ?", id).First(&event).Error; err != nil {
+		return nil, err
+	}
+	return event, nil
+}
+
+// AppendEvent will check if subevent with same (id, index) already exists
+// if yes, overrite it, otherwise make a new subevent
+func (repo EventRepository) AppendEvent(container *models.EventContainer, event *models.SubEvent) error {
+	subevent := &models.SubEvent{}
+
+	fmt.Println("doing query....")
+
+	if err := repo.db.Where("event_container_id = ? AND event_id = ? AND index = ?",
+		container.ID,
+		event.EventID,
+		event.Index).First(&subevent).Error; err != nil {
+		if err == gorm.ErrRecordNotFound {
+			fmt.Println("need to make a new one!")
+			if err := repo.db.Create(event).Error; err != nil {
+				return err
+			}
+			return nil
+		} else {
+			return err
+		}
+	}
+
+	fmt.Println("need to update old one")
+	subevent.Info = event.Info
+	subevent.Status = event.Status
+	subevent.Name = event.Name
+
+	return repo.db.Save(event).Error
+}

+ 39 - 0
server/api/release_handler.go

@@ -1696,7 +1696,46 @@ func (app *App) HandleUpdateReleaseSteps(w http.ResponseWriter, r *http.Request)
 
 	if release.EventContainer == 0 {
 		// create new event container
+		container, err := app.Repo.Event.CreateEventContainer(&models.EventContainer{ReleaseID: release.ID})
+		if err != nil {
+			app.handleErrorDataWrite(err, w)
+			return
+		}
+
+		release.EventContainer = container.ID
+
+		release, err = app.Repo.Release.UpdateRelease(release)
+
+		if err != nil {
+			app.handleErrorInternal(err, w)
+			return
+		}
+
 	}
+
+	fmt.Println(release.EventContainer)
+
+	container, err := app.Repo.Event.ReadEventContainer(release.EventContainer)
+
+	if err != nil {
+		fmt.Println("ERRRORRRR")
+		app.handleErrorInternal(err, w)
+		return
+	}
+
+	fmt.Println(container)
+
+	if err := app.Repo.Event.AppendEvent(container, &models.SubEvent{
+		EventContainerID: container.ID,
+		EventID:          form.Event.ID,
+		Name:             form.Event.Name,
+		Index:            form.Event.Index,
+		Status:           form.Event.Status,
+		Info:             form.Event.Info,
+	}); err != nil {
+		app.handleErrorInternal(err, w)
+	}
+
 }
 
 // ------------------------ Release handler helper functions ------------------------ //