// 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" mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias" mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers" mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes" "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 { mKt.IKernelModule kCtx mKt.IKernelCtx wCtx mWt.IWuiCtx kServHttp mKt.IKernelServerHttp log mKt.ILogBuf } var ( mod *ModuleWui block sync.Mutex ) // GetModuleWui -- возвращает новый модуль WUI. func GetModuleWui() *mL0.Result[*ModuleWui] { block.Lock() defer block.Unlock() if mod != nil { return mL0.NewRes(mod) } modName := alias.NewAModuleName("wui") resMod := kmodule.NewKernelModule(modName) if resMod.IsErr() { err := fmt.Errorf("GetModuleWui(): mod='wui', in create kernel module, err=\n\t%w", resMod.Err()) return mL0.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 mL0.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 mL0.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 mL0.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 mL0.NewErr[*ModuleWui](err) } fibApp := optFiber.Val().Val().(*fiber.App) fibApp.Post("/wui/click/:id", adaptor.HTTPHandlerFunc(sf.wuiClick)) // adaptor.HTTPHandlerFunc(greet) mod = sf return mL0.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() mKt.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().(mWt.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() 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) }