page_monolit.go 4.5 KB

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