package worker import ( "encoding/json" "fmt" "os" "path/filepath" "gorm.io/driver/sqlite" "gorm.io/gorm" ) type Logger interface { Write(line string) } type RootConfig struct { Data struct { Driver string `json:"driver"` Path string `json:"path"` } `json:"data"` Log struct { Path string `json:"log_root_path"` } `json:"log"` } type Function struct { ID uint `gorm:"primaryKey"` FunctionName string Version string Path string DeletedAt gorm.DeletedAt `gorm:"index"` } type FuncConfig struct { Name string `json:"name"` Version string `json:"version"` Entry string `json:"entry"` Runtime string `json:"runtime"` Log struct { Output string `json:"output"` } `json:"log"` } func LoadTreeConfig(root string) (*RootConfig, error) { cfgPath := filepath.Join(root, "config.json") b, err := os.ReadFile(cfgPath) if err != nil { return nil, err } var cfg RootConfig if err := json.Unmarshal(b, &cfg); err != nil { return nil, err } return &cfg, nil } func OpenDB(cfg *RootConfig, root string) (*gorm.DB, error) { switch cfg.Data.Driver { case "sqlite": dbPath := filepath.Join(root, cfg.Data.Path) db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{}) if err != nil { return nil, err } return db, nil default: return nil, fmt.Errorf("unsupported db driver: %s", cfg.Data.Driver) } } func FindFunction(db *gorm.DB, name, version string) (*Function, error) { var f Function if version == "latest" { err := db.Where("function_name = ? AND deleted_at IS NULL", name). Order("created_at DESC"). First(&f).Error if err != nil { return nil, err } } else { if err := db.Where("function_name = ? AND version = ? AND deleted_at IS NULL", name, version). First(&f).Error; err != nil { return nil, err } } return &f, nil } func LoadFunctionConfig(root, funcName, funcPath string) (*FuncConfig, error) { cfgFile := filepath.Join(root, funcName, funcPath, "config.json") b, err := os.ReadFile(cfgFile) if err != nil { return nil, err } var cfg FuncConfig if err := json.Unmarshal(b, &cfg); err != nil { return nil, err } return &cfg, nil }