// package mod_wui -- модуль WUI. package mod_wui import ( "fmt" "net/http" "strings" "sync" "github.com/gofiber/fiber/v2/middleware/adaptor" "github.com/gofiber/fiber/v3" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs" mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers" mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kspec" "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" mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types" "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 { mKs.IKernelModule kCtx mKs.IKernelCtx wCtx mWt.IWuiCtx kServHttp mKs.IKernelServerHttp log mKs.ILogBuf } var ( mod *ModuleWui block sync.Mutex ) // GetModuleWui -- возвращает новый модуль WUI. func GetModuleWui() *ModuleWui { block.Lock() defer block.Unlock() if mod != nil { return mod } modName := defs.NewModuleName("wui") sf := &ModuleWui{ kCtx: kctx.GetKernelCtx(), wCtx: wui.GetWuiCtx(), IKernelModule: kmodule.NewKernelModule(modName), kServHttp: kserv_http.GetKernelServHttp(), } sf.log = sf.wCtx.Log() _ = page_monolit.GetPageMonolit() _ = page_module.GetPageModule() _ = http_api.NewHttpApi() optFiber := sf.kCtx.Get("fiberApp") optFiber.Hassert("GetModuleWui(): mod='wui', not found fiberApp in kernel ctx") fibApp := optFiber.Some().Val().(*fiber.App) fibApp.Post("/wui/click/:id", adaptor.HTTPHandlerFunc(sf.wuiClick)) // adaptor.HTTPHandlerFunc(greet) mod = sf return 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() mKs.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/") optWidget := sf.wCtx.Get(id) if optWidget == nil { strOut := fmt.Sprintf("ModuleWui.wuiClick(): id(%v), widget not exists", id) sf.log.Err(strOut) _, _ = fmt.Fprint(resp, strOut) return } widget1, isOk := optWidget.Some().(mWt.IWuiButton) if !isOk { strOut := fmt.Sprintf("ModuleWui.wuiClick(): widget(%T) not button", optWidget.Some()) 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() mKh.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) }