add function handling (basic)

This commit is contained in:
2025-11-30 15:28:30 +02:00
parent c1e5fc90ee
commit 6aae5f9fb0
10 changed files with 215 additions and 2 deletions

82
internal/worker/handle.go Normal file
View File

@@ -0,0 +1,82 @@
package worker
import (
"encoding/json"
"fmt"
"os"
"path/filepath"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
)
type RootConfig struct {
Data struct {
Driver string `json:"driver"`
Path string `json:"path"`
} `json:"data"`
}
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"`
}
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 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
}

25
internal/worker/run.go Normal file
View File

@@ -0,0 +1,25 @@
package worker
import (
"bytes"
"fmt"
"os/exec"
)
func RunFunction(path string, fc *FuncConfig, input []byte) ([]byte, error) {
if fc.Runtime != "exec" {
return nil, fmt.Errorf("unsupported runtime: %s", fc.Runtime)
}
cmd := exec.Command(path)
cmd.Stdin = bytes.NewReader(input)
var out bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &out
if err := cmd.Run(); err != nil {
return nil, fmt.Errorf("failed: %w\noutput: %s", err, out.String())
}
return out.Bytes(), nil
}