admin.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "net/http"
  7. "sort"
  8. "syscall"
  9. "time"
  10. "github.com/jmoiron/sqlx/types"
  11. "github.com/labstack/echo"
  12. )
  13. type configScript struct {
  14. RootURL string `json:"rootURL"`
  15. FromEmail string `json:"fromEmail"`
  16. Messengers []string `json:"messengers"`
  17. MediaProvider string `json:"mediaProvider"`
  18. NeedsRestart bool `json:"needsRestart"`
  19. Update *AppUpdate `json:"update"`
  20. Langs []i18nLang `json:"langs"`
  21. EnablePublicSubPage bool `json:"enablePublicSubscriptionPage"`
  22. Lang json.RawMessage `json:"lang"`
  23. }
  24. // handleGetConfigScript returns general configuration as a Javascript
  25. // variable that can be included in an HTML page directly.
  26. func handleGetConfigScript(c echo.Context) error {
  27. var (
  28. app = c.Get("app").(*App)
  29. out = configScript{
  30. RootURL: app.constants.RootURL,
  31. FromEmail: app.constants.FromEmail,
  32. MediaProvider: app.constants.MediaProvider,
  33. EnablePublicSubPage: app.constants.EnablePublicSubPage,
  34. }
  35. )
  36. // Language list.
  37. langList, err := geti18nLangList(app.constants.Lang, app)
  38. if err != nil {
  39. return echo.NewHTTPError(http.StatusInternalServerError,
  40. fmt.Sprintf("Error loading language list: %v", err))
  41. }
  42. out.Langs = langList
  43. // Current language.
  44. out.Lang = json.RawMessage(app.i18n.JSON())
  45. // Sort messenger names with `email` always as the first item.
  46. var names []string
  47. for name := range app.messengers {
  48. if name == emailMsgr {
  49. continue
  50. }
  51. names = append(names, name)
  52. }
  53. sort.Strings(names)
  54. out.Messengers = append(out.Messengers, emailMsgr)
  55. out.Messengers = append(out.Messengers, names...)
  56. app.Lock()
  57. out.NeedsRestart = app.needsRestart
  58. out.Update = app.update
  59. app.Unlock()
  60. // Write the Javascript variable opening;
  61. b := bytes.Buffer{}
  62. b.Write([]byte(`var CONFIG = `))
  63. // Encode the config payload as JSON and write as the variable's value assignment.
  64. j := json.NewEncoder(&b)
  65. if err := j.Encode(out); err != nil {
  66. return echo.NewHTTPError(http.StatusInternalServerError,
  67. app.i18n.Ts("admin.errorMarshallingConfig", "error", err.Error()))
  68. }
  69. return c.Blob(http.StatusOK, "application/javascript; charset=utf-8", b.Bytes())
  70. }
  71. // handleGetDashboardCharts returns chart data points to render ont he dashboard.
  72. func handleGetDashboardCharts(c echo.Context) error {
  73. var (
  74. app = c.Get("app").(*App)
  75. out types.JSONText
  76. )
  77. if err := app.queries.GetDashboardCharts.Get(&out); err != nil {
  78. return echo.NewHTTPError(http.StatusInternalServerError,
  79. app.i18n.Ts("globals.messages.errorFetching", "name", "dashboard charts", "error", pqErrMsg(err)))
  80. }
  81. return c.JSON(http.StatusOK, okResp{out})
  82. }
  83. // handleGetDashboardCounts returns stats counts to show on the dashboard.
  84. func handleGetDashboardCounts(c echo.Context) error {
  85. var (
  86. app = c.Get("app").(*App)
  87. out types.JSONText
  88. )
  89. if err := app.queries.GetDashboardCounts.Get(&out); err != nil {
  90. return echo.NewHTTPError(http.StatusInternalServerError,
  91. app.i18n.Ts("globals.messages.errorFetching", "name", "dashboard stats", "error", pqErrMsg(err)))
  92. }
  93. return c.JSON(http.StatusOK, okResp{out})
  94. }
  95. // handleReloadApp restarts the app.
  96. func handleReloadApp(c echo.Context) error {
  97. app := c.Get("app").(*App)
  98. go func() {
  99. <-time.After(time.Millisecond * 500)
  100. app.sigChan <- syscall.SIGHUP
  101. }()
  102. return c.JSON(http.StatusOK, okResp{true})
  103. }