mod_wui.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. // package mod_wui -- модуль WUI.
  2. package mod_wui
  3. import (
  4. "fmt"
  5. "net/http"
  6. "strings"
  7. "sync"
  8. "github.com/gofiber/fiber/v2/middleware/adaptor"
  9. "github.com/gofiber/fiber/v3"
  10. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/alias"
  12. mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers"
  13. mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
  14. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
  15. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmodule"
  16. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kserv_http"
  17. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui"
  18. mWt "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_types"
  19. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/http_api"
  20. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_module"
  21. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/page_monolit"
  22. )
  23. // ModuleWui -- модуль WUI.
  24. type ModuleWui struct {
  25. mKt.IKernelModule
  26. kCtx mKt.IKernelCtx
  27. wCtx mWt.IWuiCtx
  28. kServHttp mKt.IKernelServerHttp
  29. log mKt.ILogBuf
  30. }
  31. var (
  32. mod *ModuleWui
  33. block sync.Mutex
  34. )
  35. // GetModuleWui -- возвращает новый модуль WUI.
  36. func GetModuleWui() *mL0.Result[*ModuleWui] {
  37. block.Lock()
  38. defer block.Unlock()
  39. if mod != nil {
  40. return mL0.NewRes(mod)
  41. }
  42. modName := alias.NewAModuleName("wui")
  43. resMod := kmodule.NewKernelModule(modName)
  44. if resMod.IsErr() {
  45. err := fmt.Errorf("GetModuleWui(): mod='wui', in create kernel module, err=\n\t%w", resMod.Err())
  46. return mL0.NewErr[*ModuleWui](err)
  47. }
  48. resHttp := kserv_http.GetKernelServHttp()
  49. if resHttp.IsErr() {
  50. err := fmt.Errorf("GetModuleWui(): mod='wui', in get KernelServerHttp, err=\n\t%w", resHttp.Err())
  51. return mL0.NewErr[*ModuleWui](err)
  52. }
  53. resKernCtx := kctx.GetKernelCtx()
  54. if resKernCtx.IsErr() {
  55. err := fmt.Errorf("GetModuleWui(): mod='wui', in get KernelCtx, err=\n\t%w", resKernCtx.Err())
  56. return mL0.NewErr[*ModuleWui](err)
  57. }
  58. kCtx := resKernCtx.Val()
  59. resWuiCtx := wui.GetWuiCtx()
  60. if resWuiCtx.IsErr() {
  61. err := fmt.Errorf("GetModuleWui(): mod='wui', in get WuiCtx, err=\n\t%w", resWuiCtx.Err())
  62. return mL0.NewErr[*ModuleWui](err)
  63. }
  64. wuiCtx := resWuiCtx.Val()
  65. sf := &ModuleWui{
  66. kCtx: kCtx,
  67. wCtx: wuiCtx,
  68. IKernelModule: resMod.Val(),
  69. kServHttp: resHttp.Val(),
  70. }
  71. sf.log = sf.wCtx.Log()
  72. _ = page_monolit.GetPageMonolit()
  73. _ = page_module.GetPageModule()
  74. _ = http_api.NewHttpApi()
  75. optFiber := sf.kCtx.Get("fiberApp")
  76. if optFiber.IsNone() {
  77. err := fmt.Errorf("GetModuleWui(): mod='wui', not found fiberApp in kernel ctx")
  78. return mL0.NewErr[*ModuleWui](err)
  79. }
  80. fibApp := optFiber.Val().Val().(*fiber.App)
  81. fibApp.Post("/wui/click/:id", adaptor.HTTPHandlerFunc(sf.wuiClick)) // adaptor.HTTPHandlerFunc(greet)
  82. mod = sf
  83. return mL0.NewRes(sf)
  84. }
  85. // Run -- запускает модуль в работу.
  86. func (sf *ModuleWui) Run() {
  87. sf.log.Info("ModuleWui.Run(): module=%v, is run", sf.Name())
  88. sf.kServHttp.Run()
  89. }
  90. // Log -- возвращает буферный лог.
  91. func (sf *ModuleWui) Log() mKt.ILogBuf {
  92. return sf.log
  93. }
  94. // IsWork -- признак работы модуля.
  95. func (sf *ModuleWui) IsWork() bool {
  96. return sf.kCtx.Wg().IsWork()
  97. }
  98. // Получает событие из сети.
  99. func (sf *ModuleWui) wuiClick(resp http.ResponseWriter, req *http.Request) {
  100. url := req.RequestURI
  101. id := strings.TrimPrefix(url, "/wui/click/")
  102. widget0 := sf.wCtx.Get(id)
  103. if widget0 == nil {
  104. strOut := fmt.Sprintf("ModuleWui.wuiClick(): id(%v), widget not exists", id)
  105. sf.log.Err(strOut)
  106. _, _ = fmt.Fprint(resp, strOut)
  107. return
  108. }
  109. widget1, isOk := widget0.Val().(mWt.IWuiButton)
  110. if !isOk {
  111. strOut := fmt.Sprintf("ModuleWui.wuiClick(): widget(%T) not button", widget0.Val())
  112. sf.log.Err(strOut)
  113. _, _ = fmt.Fprint(resp, strOut)
  114. return
  115. }
  116. dict := map[string]string{}
  117. // headers := ctx.GetReqHeaders()
  118. for key, lstVal := range req.Header {
  119. if len(lstVal) >= 1 {
  120. dict[key] = lstVal[0]
  121. continue
  122. }
  123. }
  124. err := req.ParseForm()
  125. mKh.Hassert(err == nil, "ModuleWui.wuiClick(): in parse form, err=\n\t%v", err)
  126. // Получаем все form-значения
  127. // values := req.ParseForm()
  128. for key, lstVal := range req.Form {
  129. if len(lstVal) >= 1 {
  130. dict[key] = lstVal[0]
  131. continue
  132. }
  133. }
  134. strOut := widget1.Click(dict)
  135. _, _ = fmt.Fprint(resp, strOut)
  136. }