// package mod_wui -- модуль WUI package mod_wui import ( "fmt" "net/http" "strings" "sync" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/adaptor" . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers" . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes" . "gitp78su.ipnodns.ru/svi/kern/v4/lev1/result" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http" "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui" . "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wtypes" "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/http_api" "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_module" "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_monolit" ) // ModuleWui -- модуль WUI type ModuleWui struct { IKernelModule kCtx IKernelCtx wCtx IWuiCtx kServHttp IKernelServerHttp log ILogBuf } var ( mod *ModuleWui block sync.Mutex ) // GetModuleWui -- возвращает новый модуль WUI func GetModuleWui() IResult[*ModuleWui] { block.Lock() defer block.Unlock() if mod != nil { return NewRes(mod) } resMod := kmodule.NewKernelModule("wui") if resMod.IsErr() { err := fmt.Errorf("GetModuleWui(): mod='wui', in create kernel module, err=\n\t%w", resMod.Err()) return NewErr[*ModuleWui](err) } resHttp := kserv_http.GetKernelServHttp() if resHttp.IsErr() { err := fmt.Errorf("GetModuleWui(): mod='wui', in get KernelServerHttp, err=\n\t%w", resHttp.Err()) return NewErr[*ModuleWui](err) } resKernCtx := kctx.GetKernelCtx() if resKernCtx.IsErr() { err := fmt.Errorf("GetModuleWui(): mod='wui', in get KernelCtx, err=\n\t%w", resKernCtx.Err()) return NewErr[*ModuleWui](err) } kCtx := resKernCtx.Val() resWuiCtx := wui.GetWuiCtx() if resWuiCtx.IsErr() { err := fmt.Errorf("GetModuleWui(): mod='wui', in get WuiCtx, err=\n\t%w", resWuiCtx.Err()) return NewErr[*ModuleWui](err) } wuiCtx := resWuiCtx.Val() sf := &ModuleWui{ kCtx: kCtx, wCtx: wuiCtx, IKernelModule: resMod.Val(), kServHttp: resHttp.Val(), } sf.log = sf.wCtx.Log() _ = page_monolit.GetPageMonolit() _ = page_module.GetPageModule() _ = http_api.NewHttpApi() optFiber := sf.kCtx.Get("fiberApp") if optFiber.IsNone() { err := fmt.Errorf("GetModuleWui(): mod='wui', not found fiberApp in kernel ctx") return NewErr[*ModuleWui](err) } fibApp := optFiber.Val().Val().(*fiber.App) fibApp.Post("/wui/click/:id", adaptor.HTTPHandlerFunc(sf.wuiClick)) // adaptor.HTTPHandlerFunc(greet) mod = sf return NewRes(sf) } // Run -- запускает модуль в работу func (sf *ModuleWui) Run() { sf.log.Info("ModuleWui.Run(): module=%v, is run", sf.Name()) sf.kServHttp.Run() } // Log -- возвращает буферный лог func (sf *ModuleWui) Log() ILogBuf { return sf.log } // IsWork -- признак работы модуля func (sf *ModuleWui) IsWork() bool { return sf.kCtx.Wg().IsWork() } // Получает событие из сети func (sf *ModuleWui) wuiClick(resp http.ResponseWriter, req *http.Request) { url := req.RequestURI id := strings.TrimPrefix(url, "/wui/click/") widget0 := sf.wCtx.Get(id) if widget0 == nil { strOut := fmt.Sprintf("ModuleWui.wuiClick(): id(%v), widget not exists", id) sf.log.Err(strOut) fmt.Fprint(resp, strOut) return } widget1, isOk := widget0.Val().(IWuiButton) if !isOk { strOut := fmt.Sprintf("ModuleWui.wuiClick(): widget(%T) not button", widget0.Val()) sf.log.Err(strOut) fmt.Fprint(resp, strOut) return } dict := map[string]string{} // headers := ctx.GetReqHeaders() for key, lstVal := range req.Header { if len(lstVal) >= 1 { dict[key] = lstVal[0] continue } } err := req.ParseForm() Hassert(err == nil, "ModuleWui.wuiClick(): in parse form, err=\n\t%v", err) // Получаем все form-значения // values := req.ParseForm() for key, lstVal := range req.Form { if len(lstVal) >= 1 { dict[key] = lstVal[0] continue } } strOut := widget1.Click(dict) fmt.Fprint(resp, strOut) }