admin.go 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package main
  2. import (
  3. "fmt"
  4. "net/http"
  5. "sort"
  6. "syscall"
  7. "time"
  8. "github.com/jmoiron/sqlx/types"
  9. "github.com/labstack/echo"
  10. )
  11. type serverConfig struct {
  12. Messengers []string `json:"messengers"`
  13. Langs []i18nLang `json:"langs"`
  14. Lang string `json:"lang"`
  15. Update *AppUpdate `json:"update"`
  16. NeedsRestart bool `json:"needs_restart"`
  17. Version string `json:"version"`
  18. }
  19. // handleGetServerConfig returns general server config.
  20. func handleGetServerConfig(c echo.Context) error {
  21. var (
  22. app = c.Get("app").(*App)
  23. out = serverConfig{}
  24. )
  25. // Language list.
  26. langList, err := getI18nLangList(app.constants.Lang, app)
  27. if err != nil {
  28. return echo.NewHTTPError(http.StatusInternalServerError,
  29. fmt.Sprintf("Error loading language list: %v", err))
  30. }
  31. out.Langs = langList
  32. out.Lang = app.constants.Lang
  33. // Sort messenger names with `email` always as the first item.
  34. var names []string
  35. for name := range app.messengers {
  36. if name == emailMsgr {
  37. continue
  38. }
  39. names = append(names, name)
  40. }
  41. sort.Strings(names)
  42. out.Messengers = append(out.Messengers, emailMsgr)
  43. out.Messengers = append(out.Messengers, names...)
  44. app.Lock()
  45. out.NeedsRestart = app.needsRestart
  46. out.Update = app.update
  47. app.Unlock()
  48. out.Version = versionString
  49. return c.JSON(http.StatusOK, okResp{out})
  50. }
  51. // handleGetDashboardCharts returns chart data points to render ont he dashboard.
  52. func handleGetDashboardCharts(c echo.Context) error {
  53. var (
  54. app = c.Get("app").(*App)
  55. out types.JSONText
  56. )
  57. if err := app.queries.GetDashboardCharts.Get(&out); err != nil {
  58. return echo.NewHTTPError(http.StatusInternalServerError,
  59. app.i18n.Ts("globals.messages.errorFetching", "name", "dashboard charts", "error", pqErrMsg(err)))
  60. }
  61. return c.JSON(http.StatusOK, okResp{out})
  62. }
  63. // handleGetDashboardCounts returns stats counts to show on the dashboard.
  64. func handleGetDashboardCounts(c echo.Context) error {
  65. var (
  66. app = c.Get("app").(*App)
  67. out types.JSONText
  68. )
  69. if err := app.queries.GetDashboardCounts.Get(&out); err != nil {
  70. return echo.NewHTTPError(http.StatusInternalServerError,
  71. app.i18n.Ts("globals.messages.errorFetching", "name", "dashboard stats", "error", pqErrMsg(err)))
  72. }
  73. return c.JSON(http.StatusOK, okResp{out})
  74. }
  75. // handleReloadApp restarts the app.
  76. func handleReloadApp(c echo.Context) error {
  77. app := c.Get("app").(*App)
  78. go func() {
  79. <-time.After(time.Millisecond * 500)
  80. app.sigChan <- syscall.SIGHUP
  81. }()
  82. return c.JSON(http.StatusOK, okResp{true})
  83. }