소스 검색

feat: support remove single item from installation task

Yeuoly 9 달 전
부모
커밋
f339a21001
3개의 변경된 파일52개의 추가작업 그리고 2개의 파일을 삭제
  1. 10 0
      internal/server/controllers/plugins.go
  2. 1 0
      internal/server/http_server.go
  3. 41 2
      internal/service/install_plugin.go

+ 10 - 0
internal/server/controllers/plugins.go

@@ -101,6 +101,16 @@ func DeletePluginInstallationTask(c *gin.Context) {
 	})
 }
 
+func DeletePluginInstallationItemFromTask(c *gin.Context) {
+	BindRequest(c, func(request struct {
+		TenantID   string                                 `uri:"tenant_id" validate:"required"`
+		TaskID     string                                 `uri:"id" validate:"required"`
+		Identifier plugin_entities.PluginUniqueIdentifier `uri:"identifier" validate:"required,plugin_unique_identifier"`
+	}) {
+		c.JSON(http.StatusOK, service.DeletePluginInstallationItemFromTask(request.TenantID, request.TaskID, request.Identifier))
+	})
+}
+
 func FetchPluginManifest(c *gin.Context) {
 	BindRequest(c, func(request struct {
 		TenantID               string                                 `uri:"tenant_id" validate:"required"`

+ 1 - 0
internal/server/http_server.go

@@ -117,6 +117,7 @@ func (app *App) pluginManagementGroup(group *gin.RouterGroup, config *app.Config
 	group.POST("/install/identifiers", controllers.InstallPluginFromIdentifiers(config))
 	group.GET("/install/tasks/:id", controllers.FetchPluginInstallationTask)
 	group.POST("/install/tasks/:id/delete", controllers.DeletePluginInstallationTask)
+	group.POST("/install/tasks/:id/delete/:identifier", controllers.DeletePluginInstallationItemFromTask)
 	group.GET("/install/tasks", controllers.FetchPluginInstallationTasks)
 	group.GET("/fetch/manifest", controllers.FetchPluginManifest)
 	group.GET("/fetch/identifier", controllers.FetchPluginFromIdentifier)

+ 41 - 2
internal/service/install_plugin.go

@@ -1,7 +1,6 @@
 package service
 
 import (
-	"errors"
 	"fmt"
 	"os"
 
@@ -106,6 +105,11 @@ func InstallPluginFromIdentifiers(
 						db.Equal("id", task.ID),
 						db.WLock(), // write lock, multiple tasks can't update the same task
 					)
+
+					if err == db.ErrDatabaseNotFound {
+						return nil
+					}
+
 					if err != nil {
 						return err
 					}
@@ -120,7 +124,7 @@ func InstallPluginFromIdentifiers(
 					}
 
 					if plugin_status == nil {
-						return errors.New("plugin status not found")
+						return nil
 					}
 
 					modifier(task_pointer, plugin_status)
@@ -282,6 +286,41 @@ func DeletePluginInstallationTask(
 	return entities.NewSuccessResponse(true)
 }
 
+func DeletePluginInstallationItemFromTask(
+	tenant_id string,
+	task_id string,
+	identifier plugin_entities.PluginUniqueIdentifier,
+) *entities.Response {
+	item, err := db.GetOne[models.InstallTask](
+		db.Equal("task_id", task_id),
+		db.Equal("tenant_id", tenant_id),
+	)
+
+	if err != nil {
+		return entities.NewErrorResponse(-500, err.Error())
+	}
+
+	plugins := []models.InstallTaskPluginStatus{}
+	for _, plugin := range item.Plugins {
+		if plugin.PluginUniqueIdentifier != identifier {
+			plugins = append(plugins, plugin)
+		}
+	}
+
+	if len(plugins) == 0 {
+		err = db.Delete(&item)
+	} else {
+		item.Plugins = plugins
+		err = db.Update(&item)
+	}
+
+	if err != nil {
+		return entities.NewErrorResponse(-500, err.Error())
+	}
+
+	return entities.NewSuccessResponse(true)
+}
+
 func FetchPluginFromIdentifier(
 	plugin_unique_identifier plugin_entities.PluginUniqueIdentifier,
 ) *entities.Response {