mirror of
https://github.com/knadh/listmonk.git
synced 2025-01-26 16:17:49 +08:00
2235d30063
In addition to generating HTML forms for selected public lists, the form page now shows a URL (/subscription/form) that can be publicly shared to solicit subscriptions. The page lists all public lists in the database. This page can be disabled on the Settings UI.
120 lines
3.4 KiB
Go
120 lines
3.4 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"sort"
|
|
"syscall"
|
|
"time"
|
|
|
|
"github.com/jmoiron/sqlx/types"
|
|
"github.com/labstack/echo"
|
|
)
|
|
|
|
type configScript struct {
|
|
RootURL string `json:"rootURL"`
|
|
FromEmail string `json:"fromEmail"`
|
|
Messengers []string `json:"messengers"`
|
|
MediaProvider string `json:"mediaProvider"`
|
|
NeedsRestart bool `json:"needsRestart"`
|
|
Update *AppUpdate `json:"update"`
|
|
Langs []i18nLang `json:"langs"`
|
|
EnablePublicSubPage bool `json:"enablePublicSubscriptionPage"`
|
|
Lang json.RawMessage `json:"lang"`
|
|
}
|
|
|
|
// handleGetConfigScript returns general configuration as a Javascript
|
|
// variable that can be included in an HTML page directly.
|
|
func handleGetConfigScript(c echo.Context) error {
|
|
var (
|
|
app = c.Get("app").(*App)
|
|
out = configScript{
|
|
RootURL: app.constants.RootURL,
|
|
FromEmail: app.constants.FromEmail,
|
|
MediaProvider: app.constants.MediaProvider,
|
|
EnablePublicSubPage: app.constants.EnablePublicSubPage,
|
|
}
|
|
)
|
|
|
|
// Language list.
|
|
langList, err := geti18nLangList(app.constants.Lang, app)
|
|
if err != nil {
|
|
return echo.NewHTTPError(http.StatusInternalServerError,
|
|
fmt.Sprintf("Error loading language list: %v", err))
|
|
}
|
|
out.Langs = langList
|
|
|
|
// Current language.
|
|
out.Lang = json.RawMessage(app.i18n.JSON())
|
|
|
|
// Sort messenger names with `email` always as the first item.
|
|
var names []string
|
|
for name := range app.messengers {
|
|
if name == emailMsgr {
|
|
continue
|
|
}
|
|
names = append(names, name)
|
|
}
|
|
sort.Strings(names)
|
|
out.Messengers = append(out.Messengers, emailMsgr)
|
|
out.Messengers = append(out.Messengers, names...)
|
|
|
|
app.Lock()
|
|
out.NeedsRestart = app.needsRestart
|
|
out.Update = app.update
|
|
app.Unlock()
|
|
|
|
// Write the Javascript variable opening;
|
|
b := bytes.Buffer{}
|
|
b.Write([]byte(`var CONFIG = `))
|
|
|
|
// Encode the config payload as JSON and write as the variable's value assignment.
|
|
j := json.NewEncoder(&b)
|
|
if err := j.Encode(out); err != nil {
|
|
return echo.NewHTTPError(http.StatusInternalServerError,
|
|
app.i18n.Ts("admin.errorMarshallingConfig", "error", err.Error()))
|
|
}
|
|
return c.Blob(http.StatusOK, "application/javascript; charset=utf-8", b.Bytes())
|
|
}
|
|
|
|
// handleGetDashboardCharts returns chart data points to render ont he dashboard.
|
|
func handleGetDashboardCharts(c echo.Context) error {
|
|
var (
|
|
app = c.Get("app").(*App)
|
|
out types.JSONText
|
|
)
|
|
|
|
if err := app.queries.GetDashboardCharts.Get(&out); err != nil {
|
|
return echo.NewHTTPError(http.StatusInternalServerError,
|
|
app.i18n.Ts("globals.messages.errorFetching", "name", "dashboard charts", "error", pqErrMsg(err)))
|
|
}
|
|
|
|
return c.JSON(http.StatusOK, okResp{out})
|
|
}
|
|
|
|
// handleGetDashboardCounts returns stats counts to show on the dashboard.
|
|
func handleGetDashboardCounts(c echo.Context) error {
|
|
var (
|
|
app = c.Get("app").(*App)
|
|
out types.JSONText
|
|
)
|
|
|
|
if err := app.queries.GetDashboardCounts.Get(&out); err != nil {
|
|
return echo.NewHTTPError(http.StatusInternalServerError,
|
|
app.i18n.Ts("globals.messages.errorFetching", "name", "dashboard stats", "error", pqErrMsg(err)))
|
|
}
|
|
|
|
return c.JSON(http.StatusOK, okResp{out})
|
|
}
|
|
|
|
// handleReloadApp restarts the app.
|
|
func handleReloadApp(c echo.Context) error {
|
|
app := c.Get("app").(*App)
|
|
go func() {
|
|
<-time.After(time.Millisecond * 500)
|
|
app.sigChan <- syscall.SIGHUP
|
|
}()
|
|
return c.JSON(http.StatusOK, okResp{true})
|
|
}
|