@@ -2,6 +2,7 @@ package website
22
33import (
44 "context"
5+ "encoding/csv"
56 "fmt"
67 "math/rand"
78 "net/http"
@@ -81,6 +82,7 @@ func TicketsAdminEvent(c *RequestContext) ResponseData {
8182 TicketsEvent TicketsAdminEventTemplateData
8283 ReserveActionUrl string
8384 ScannerUrl string
85+ CSVUrl string
8486 }
8587 urlSlug := c .PathParams ["urlslug" ]
8688
@@ -114,6 +116,7 @@ func TicketsAdminEvent(c *RequestContext) ResponseData {
114116 },
115117 ReserveActionUrl : hmnurl .BuildTicketsAdminReserve (event .UrlSlug ),
116118 ScannerUrl : hmnurl .BuildTicketsAdminScan (event .UrlSlug ),
119+ CSVUrl : hmnurl .BuildTicketsAdminEventCSVDownload (event .UrlSlug ),
117120 }
118121
119122 var res ResponseData
@@ -176,6 +179,42 @@ func TicketsAdminEventSubmit(c *RequestContext) ResponseData {
176179 return c .Redirect (hmnurl .BuildTicketsAdminEvent (eventUrlSlug ), http .StatusSeeOther )
177180}
178181
182+ func TicketsAdminEventCSVDownload (c * RequestContext ) ResponseData {
183+ urlSlug := c .PathParams ["urlslug" ]
184+ event , found := hmndata .FindTicketEventBySlug (urlSlug )
185+ if ! found {
186+ return FourOhFour (c )
187+ }
188+
189+ rawTickets , err := hmndata .FetchTickets (c , c .Conn , & event )
190+ if err != nil {
191+ return c .ErrorResponse (http .StatusInternalServerError , oops .New (err , "failed to fetch tickets" ))
192+ }
193+ var tickets []templates.Ticket
194+ for _ , t := range rawTickets {
195+ tickets = append (tickets , templates .TicketToTemplate (& t ))
196+ }
197+
198+ var res ResponseData
199+ res .Header ().Set ("Content-Type" , "text/csv" )
200+ res .Header ().Set ("Content-Disposition" , `attachment; filename="tickets.csv"` )
201+ w := csv .NewWriter (& res )
202+ w .Write ([]string {"name" , "email" , "username" , "discord_username" , "purchase_date" , "notes" , "accommodations" })
203+ for _ , ticket := range tickets {
204+ w .Write ([]string {
205+ ticket .OwnerName ,
206+ ticket .OwnerEmail ,
207+ ticket .OwnerUsername ,
208+ ticket .OwnerDiscordUsername ,
209+ ticket .PurchaseDate .String (),
210+ ticket .Notes ,
211+ ticket .Accommodations ,
212+ })
213+ }
214+ w .Flush ()
215+ return res
216+ }
217+
179218func TicketsAdminReserve (c * RequestContext ) ResponseData {
180219 err := c .Req .ParseForm ()
181220 if err != nil {
0 commit comments