refactor foundry lib structure; add transport classes for db,http,websocket; add action interface instead of multiple function that accepts action classes; add changing foundry status on websocket responses

This commit is contained in:
lbenedar
2026-04-09 18:29:41 +03:00
parent 468e027418
commit fb4e371348
28 changed files with 900 additions and 791 deletions

View File

@@ -0,0 +1,69 @@
package actions
import (
"encoding/json"
"gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry/transport"
"gitea.local.lab/Lbenedar/foundry_helper_service/internal/foundry/types"
)
const (
WsSessionType = "session"
WsProgressType = "progress"
WsUserActivityType = "userActivity"
WsShutdownType = "shutdown"
)
type WsActions interface {
Action(tr *transport.FoundryTransport, status *types.FoundryStatus) error
}
var WsMsgActions = map[string]func() WsActions{
"session": func() WsActions { return &WsSessionMsg{} },
"progress": func() WsActions { return &WsProgressMsg{} },
// "userActivity": WsUserActivityCursor{},
"shutdown": func() WsActions { return &WsShutdownMsg{} },
}
func GetWsMsgAction(dataType string) WsActions {
if factory, ok := WsMsgActions[dataType]; ok {
return factory()
}
return nil
}
func SplitToTypeAndData(dataJson []byte) (WsActions, error) {
var rawItems []json.RawMessage
err := json.Unmarshal(dataJson, &rawItems)
if err != nil {
return nil, err
}
var dataType string
err = json.Unmarshal(rawItems[0], &dataType)
if err != nil {
return nil, err
}
if dataType == WsUserActivityType {
return nil, nil
}
var data map[string]any
err = json.Unmarshal(rawItems[1], &data)
if err != nil {
return nil, err
}
actionDataPtr := GetWsMsgAction(dataType)
if actionDataPtr == nil {
return nil, ErrActionNotFound
}
err = FillStruct(data, actionDataPtr)
if err != nil {
return nil, err
}
return actionDataPtr, nil
}