ExportCampaignAnalytics streams campaign analytics (views or link clicks) as a CSV file.
(c echo.Context)
| 88 | |
| 89 | // ExportCampaignAnalytics streams campaign analytics (views or link clicks) as a CSV file. |
| 90 | func (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, |
nothing calls this directly
no test coverage detected