From 47094b8e6401e87f4f4df2c01cc94939141b1f2e Mon Sep 17 00:00:00 2001 From: Marvin Zhang Date: Wed, 1 Jan 2025 22:37:44 +0800 Subject: [PATCH] refactor: update setting routes and enhance dependency management - Changed route parameter from ':id' to ':key' in settings-related routes for better clarity and consistency. - Updated GetSetting, PostSetting, and PutSetting functions to use the new ':key' parameter. - Introduced IsAutoInstallEnabled method in DependencyInstallerService to check auto-installation status. - Enhanced the task runner to check if auto installation is enabled before proceeding with dependency installation. - Improved initialization of settings data in the system service, ensuring proper insertion of initial settings. --- core/controllers/router.go | 6 +-- core/controllers/setting.go | 6 +-- .../dependency_installer_service.go | 1 + core/system/service.go | 48 +++++++++++-------- core/task/handler/runner.go | 8 ++++ 5 files changed, 44 insertions(+), 25 deletions(-) diff --git a/core/controllers/router.go b/core/controllers/router.go index ce4bf778e..78da20d4c 100644 --- a/core/controllers/router.go +++ b/core/controllers/router.go @@ -339,17 +339,17 @@ func InitRoutes(app *gin.Engine) (err error) { RegisterActions(groups.AuthGroup, "/settings", []Action{ { Method: http.MethodGet, - Path: "/:id", + Path: "/:key", HandlerFunc: GetSetting, }, { Method: http.MethodPost, - Path: "/:id", + Path: "/:key", HandlerFunc: PostSetting, }, { Method: http.MethodPut, - Path: "/:id", + Path: "/:key", HandlerFunc: PutSetting, }, }) diff --git a/core/controllers/setting.go b/core/controllers/setting.go index 03b4b8bf5..de691ecb4 100644 --- a/core/controllers/setting.go +++ b/core/controllers/setting.go @@ -11,7 +11,7 @@ import ( func GetSetting(c *gin.Context) { // key - key := c.Param("id") + key := c.Param("key") // setting s, err := service.NewModelService[models.Setting]().GetOne(bson.M{"key": key}, nil) @@ -29,7 +29,7 @@ func GetSetting(c *gin.Context) { func PostSetting(c *gin.Context) { // key - key := c.Param("id") + key := c.Param("key") // settings var s models.Setting @@ -59,7 +59,7 @@ func PostSetting(c *gin.Context) { func PutSetting(c *gin.Context) { // key - key := c.Param("id") + key := c.Param("key") // settings var s models.Setting diff --git a/core/interfaces/dependency_installer_service.go b/core/interfaces/dependency_installer_service.go index 4e8660465..faa832b5a 100644 --- a/core/interfaces/dependency_installer_service.go +++ b/core/interfaces/dependency_installer_service.go @@ -6,5 +6,6 @@ import ( ) type DependencyInstallerService interface { + IsAutoInstallEnabled() (enabled bool) GetInstallDependencyRequirementsCmdBySpiderId(id primitive.ObjectID) (cmd *exec.Cmd, err error) } diff --git a/core/system/service.go b/core/system/service.go index 24a496121..5d9edf759 100644 --- a/core/system/service.go +++ b/core/system/service.go @@ -1,13 +1,18 @@ package system import ( + "errors" + "github.com/crawlab-team/crawlab/core/interfaces" "github.com/crawlab-team/crawlab/core/models/models" "github.com/crawlab-team/crawlab/core/models/service" + "github.com/crawlab-team/crawlab/core/utils" "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" "sync" ) type Service struct { + interfaces.Logger } func (svc *Service) Init() (err error) { @@ -20,36 +25,41 @@ func (svc *Service) Init() (err error) { } func (svc *Service) initData() (err error) { - total, err := service.NewModelService[models.Setting]().Count(bson.M{ - "key": "site_title", - }) - if err != nil { - return err - } - if total > 0 { - return nil - } - - // data to initialize - settings := []models.Setting{ + // initial settings data + initData := []models.Setting{ { - Key: "site_title", + Key: "dependency", Value: bson.M{ - "customize_site_title": false, - "site_title": "", + "auto_install": true, }, }, } - _, err = service.NewModelService[models.Setting]().InsertMany(settings) - if err != nil { - return err + + for _, setting := range initData { + _, err := service.NewModelService[models.Setting]().GetOne(bson.M{"key": setting.Key}, nil) + if err != nil { + if !errors.Is(err, mongo.ErrNoDocuments) { + svc.Errorf("error getting setting: %v", err) + continue + } + + // not found, insert + _, err := service.NewModelService[models.Setting]().InsertOne(setting) + if err != nil { + svc.Errorf("error inserting setting: %v", err) + continue + } + } } + return nil } func newSystemService() *Service { // service - svc := &Service{} + svc := &Service{ + Logger: utils.NewLogger("SystemService"), + } if err := svc.Init(); err != nil { panic(err) diff --git a/core/task/handler/runner.go b/core/task/handler/runner.go index bcb64933d..f0e5a9e42 100644 --- a/core/task/handler/runner.go +++ b/core/task/handler/runner.go @@ -1044,12 +1044,20 @@ func (r *Runner) installDependenciesIfAvailable() (err error) { return nil } + // Get dependency installer service depSvc := dependency.GetDependencyInstallerRegistryService() if depSvc == nil { r.Warnf("dependency installer service not available") return nil } + // Check if auto install is enabled + if !depSvc.IsAutoInstallEnabled() { + r.Debug("auto dependency installation is disabled") + return nil + } + + // Get install command cmd, err := depSvc.GetInstallDependencyRequirementsCmdBySpiderId(r.s.Id) if err != nil { return err