MCPcopy
hub / github.com/knadh/listmonk / ExportCampaignAnalytics

Method ExportCampaignAnalytics

cmd/maintenance.go:90–160  ·  view source on GitHub ↗

ExportCampaignAnalytics streams campaign analytics (views or link clicks) as a CSV file.

(c echo.Context)

Source from the content-addressed store, hash-verified

88
89// ExportCampaignAnalytics streams campaign analytics (views or link clicks) as a CSV file.
90func (a *App) ExportCampaignAnalytics(c echo.Context) error {
91 since, err := time.Parse(time.RFC3339, c.QueryParam("since"))
92 if err != nil {
93 return echo.NewHTTPError(http.StatusBadRequest, a.i18n.T("globals.messages.invalidData"))
94 }
95
96 typ := c.Param("type")
97 if typ != "views" && typ != "clicks" {
98 return echo.NewHTTPError(http.StatusBadRequest, a.i18n.T("globals.messages.invalidData"))
99 }
100
101 var (
102 hdr = c.Response().Header()
103 wr = csv.NewWriter(c.Response())
104 )
105 hdr.Set(echo.HeaderContentType, "text/csv")
106 hdr.Set(echo.HeaderContentDisposition, "attachment; filename=campaign_"+typ+".csv")
107 hdr.Set("Cache-Control", "no-cache")
108
109 switch typ {
110 case "views":
111 wr.Write([]string{"campaign_id", "campaign_uuid", "campaign_name", "subscriber_id", "subscriber_uuid", "email", "subscriber_name", "created_at"})
112 next := a.core.ExportCampaignViews(since, a.cfg.DBBatchSize)
113 for {
114 rows, err := next()
115 if err != nil {
116 return err
117 }
118 if len(rows) == 0 {
119 break
120 }
121 for _, r := range rows {
122 if err := wr.Write([]string{
123 strconv.Itoa(r.CampaignID), r.CampaignUUID, r.CampaignName,
124 strconv.Itoa(r.SubscriberID), r.SubscriberUUID, r.Email, r.SubscriberName,
125 r.CreatedAt.Format(time.RFC3339),
126 }); err != nil {
127 a.log.Printf("error streaming CSV: %v", err)
128 return nil
129 }
130 }
131 wr.Flush()
132 }
133
134 case "clicks":
135 wr.Write([]string{"campaign_id", "campaign_uuid", "campaign_name", "subscriber_id", "subscriber_uuid", "email", "subscriber_name", "url", "created_at"})
136 next := a.core.ExportCampaignLinkClicks(since, a.cfg.DBBatchSize)
137 for {
138 rows, err := next()
139 if err != nil {
140 return err
141 }
142 if len(rows) == 0 {
143 break
144 }
145 for _, r := range rows {
146 if err := wr.Write([]string{
147 strconv.Itoa(r.CampaignID), r.CampaignUUID, r.CampaignName,

Callers

nothing calls this directly

Calls 5

TMethod · 0.80
ExportCampaignViewsMethod · 0.80
FlushMethod · 0.65
WriteMethod · 0.45

Tested by

no test coverage detected