page_monolit.go 4.7 KB

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