page_monolit.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // package page_monolit -- страница показа монолита.
  2. package page_monolit
  3. import (
  4. _ "embed"
  5. "fmt"
  6. "strings"
  7. "github.com/gofiber/fiber/v3"
  8. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  9. mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/btn_modules"
  12. "gitp78su.ipnodns.ru/svi/kern/v4/lev3/mod_serv_http/btn_monolit"
  13. )
  14. // PageMonolit -- страница показа монолита.
  15. type PageMonolit struct {
  16. ctx mKt.IKernelCtx
  17. btnMonolit *btn_monolit.BtnMonolit
  18. btnModules *btn_modules.BtnModules
  19. }
  20. var page *PageMonolit
  21. // GetPageMonolit -- возвращает страницу монолита.
  22. func GetPageMonolit() *mL0.Result[*PageMonolit] {
  23. if page != nil {
  24. return mL0.NewRes(page)
  25. }
  26. resMon := btn_monolit.NewBtnMonolit()
  27. if resMon.IsErr() {
  28. err := fmt.Errorf("GetPageMonolit(): mod='monolit', err=\n\t%w", resMon.Err())
  29. return mL0.NewErr[*PageMonolit](err)
  30. }
  31. resMod := btn_modules.NewBtnModules()
  32. if resMod.IsErr() {
  33. err := fmt.Errorf("GetPageMonolit(): mod='monolit', err=\n\t%w", resMod.Err())
  34. return mL0.NewErr[*PageMonolit](err)
  35. }
  36. resKernCtx := kctx.GetKernelCtx()
  37. if resKernCtx.IsErr() {
  38. err := fmt.Errorf("GetPageMonolit(): mod='monolit', err=\n\t%w", resKernCtx.Err())
  39. return mL0.NewErr[*PageMonolit](err)
  40. }
  41. kCtx := resKernCtx.Val()
  42. sf := &PageMonolit{
  43. ctx: kCtx,
  44. btnMonolit: resMon.Val(),
  45. btnModules: resMod.Val(),
  46. }
  47. optFiber := kCtx.Get("fiberApp")
  48. if optFiber.IsNone() {
  49. err := fmt.Errorf("GetPageMonolit(): mod='monolit', not found fiberApp in kernel ctx")
  50. return mL0.NewErr[*PageMonolit](err)
  51. }
  52. fiberApp := optFiber.Val().Val().(*fiber.App)
  53. fiberApp.Get("/monolit", sf.getMonolit)
  54. fiberApp.Post("/monolit_state", sf.postMonolitState)
  55. fiberApp.Post("/monolit_ctx", sf.postMonolitCtx)
  56. fiberApp.Post("/monolit_log", sf.postMonolitLog)
  57. page = sf
  58. return mL0.NewRes(sf)
  59. }
  60. // Функция обратного вызова при клике на кнопку "Монолит".
  61. func (sf *PageMonolit) clickMonolit() string {
  62. return ""
  63. }
  64. //go:embed log_block.html
  65. var strLogBlock string
  66. // Возвращает страницу лога монолита.
  67. func (sf *PageMonolit) postMonolitLog(ctx fiber.Ctx) error {
  68. optMonolit := sf.ctx.Get("monolit")
  69. if optMonolit.IsNone() {
  70. err := fmt.Errorf("PageMonolit.postMonolitLog(): mod='monolit', not found monolit in kernel ctx")
  71. return err
  72. }
  73. mon := optMonolit.Val().Val().(mKt.IKernelMonolit)
  74. _log := mon.Log()
  75. strOut := ""
  76. for i := range 100 {
  77. msg := _log.Get(i).String()
  78. if strings.Contains(msg, "*no msg*") {
  79. continue
  80. }
  81. strOut += msg + "\n"
  82. }
  83. strOut = strings.ReplaceAll(strLogBlock, "{.log}", strOut)
  84. return ctx.SendString(strOut)
  85. }
  86. //go:embed ctx_row_val.html
  87. var strCtxRowVal string
  88. //go:embed ctx_row_block.html
  89. var strCtxRowBlock string
  90. // Возвращает блок контекста монолита.
  91. func (sf *PageMonolit) postMonolitCtx(ctx fiber.Ctx) error {
  92. resMon := sf.ctx.Get("monolit")
  93. if resMon.IsNone() {
  94. err := fmt.Errorf("PageMonolit.postMonolitCtx(): mod='monolit', not found monolit in kernel ctx")
  95. return err
  96. }
  97. mon := resMon.Val().Val().(mKt.IKernelMonolit)
  98. chLst := mon.Ctx().SortedList()
  99. strOut := ``
  100. for _, val := range chLst {
  101. strRow := strCtxRowVal
  102. strRow = strings.ReplaceAll(strRow, "{.key}", val.Key())
  103. strRow = strings.ReplaceAll(strRow, "{.value}", fmt.Sprint(val.Val()))
  104. type_ := fmt.Sprintf("%#T", val.Val())
  105. type_ = strings.ReplaceAll(type_, ".", ",<br>")
  106. strRow = strings.ReplaceAll(strRow, "{.type}", type_)
  107. strRow = strings.ReplaceAll(strRow, "{.createAt}", val.CreateAt().Get())
  108. strRow = strings.ReplaceAll(strRow, "{.updateAt}", val.UpdateAt().Get())
  109. strRow = strings.ReplaceAll(strRow, "{.comment}", val.Comment())
  110. strOut += strRow
  111. }
  112. strOut = strings.ReplaceAll(strCtxRowBlock, "{.ctx_block}", strOut)
  113. return ctx.SendString(strOut)
  114. }
  115. //go:embed monolit_state.html
  116. var strStateMonolit string
  117. // Показывает состояние монолита.
  118. func (sf *PageMonolit) postMonolitState(ctx fiber.Ctx) error {
  119. dictState := map[string]any{}
  120. optMonolit := sf.ctx.Get("monolit")
  121. if optMonolit.IsNone() {
  122. err := fmt.Errorf("PageMonolit.postMonolitState(): mod='monolit', not found monolit from kernel ctx")
  123. return err
  124. }
  125. ctxMon := optMonolit.Val()
  126. mon := ctxMon.Val().(mKt.IKernelMonolit)
  127. dictState["{.name}"] = mon.Name()
  128. dictState["{.createAt}"] = ctxMon.CreateAt()
  129. dictState["{.updateAt}"] = ctxMon.UpdateAt()
  130. dictState["{.comment}"] = ctxMon.Comment()
  131. strOut := strStateMonolit
  132. for key, val := range dictState {
  133. strOut = strings.ReplaceAll(strOut, key, fmt.Sprint(val))
  134. }
  135. return ctx.SendString(strOut)
  136. }
  137. //go:embed page_monolit.html
  138. var strPageMonolit string
  139. // Индексная страница монолита.
  140. func (sf *PageMonolit) getMonolit(ctx fiber.Ctx) error {
  141. ctx.Set("Content-type", "text/html; charset=utf8;\n\n")
  142. strOut := strings.ReplaceAll(strPageMonolit, "{.btn_monolit}", sf.btnMonolit.Html())
  143. strOut = strings.ReplaceAll(strOut, "{.btn_modules}", sf.btnModules.Html())
  144. return ctx.SendString(strOut)
  145. }