11package main
22
33import (
4- "encoding/json"
54 "fmt"
6- "io"
75 "log"
86 "net/http"
9- "net/url"
107 "os"
8+
9+ mastodonhandler "github.com/pojntfx/felicitas.pojtinger.com/api/mastodon"
10+ "github.com/vanlug/vanlug.github.io/pkg/handlers"
1111)
1212
1313const defaultLumaAPIBase = "https://api.luma.com/calendar/get-items"
1414
15- type LumaEvent struct {
16- Name string `json:"name"`
17- StartAt string `json:"start_at"`
18- URL string `json:"url"`
19- CoverURL string `json:"cover_url"`
20- GeoAddr * struct {
21- Address string `json:"address"`
22- ShortAddress string `json:"short_address"`
23- } `json:"geo_address_info"`
24- }
25-
26- type LumaEntry struct {
27- Event LumaEvent `json:"event"`
28- }
29-
30- type LumaResponse struct {
31- Entries []LumaEntry `json:"entries"`
32- }
33-
34- type EventItem struct {
35- Name string `json:"name"`
36- StartAt string `json:"start_at"`
37- URL string `json:"url"`
38- Location string `json:"location"`
39- CoverURL string `json:"cover_url"`
40- }
41-
42- type Output struct {
43- Entries []EventItem `json:"entries"`
44- }
45-
46- func NextEventHandler (apiBase string ) http.HandlerFunc {
47- return func (w http.ResponseWriter , r * http.Request ) {
48- cal := r .URL .Query ().Get ("calendar" )
49- if cal == "" {
50- w .Write ([]byte ("missing calendar query parameter" ))
51-
52- panic ("missing calendar query parameter" )
53- }
54-
55- u := apiBase + "?" + url.Values {
56- "calendar_api_id" : {cal },
57- "period" : {"future" },
58- "pagination_limit" : {"1" },
59- }.Encode ()
60-
61- resp , err := http .Get (u )
62- if err != nil {
63- panic (err )
64- }
65- defer resp .Body .Close ()
66-
67- body , err := io .ReadAll (resp .Body )
68- if err != nil {
69- panic (err )
70- }
71-
72- var lr LumaResponse
73- if err := json .Unmarshal (body , & lr ); err != nil {
74- panic (err )
75- }
76-
77- output := Output {}
78-
79- if len (lr .Entries ) > 0 {
80- evt := lr .Entries [0 ].Event
81-
82- loc := ""
83- if evt .GeoAddr != nil {
84- loc = evt .GeoAddr .Address
85- if loc == "" {
86- loc = evt .GeoAddr .ShortAddress
87- }
88- }
89-
90- output .Entries = []EventItem {{
91- Name : evt .Name ,
92- StartAt : evt .StartAt ,
93- URL : evt .URL ,
94- Location : loc ,
95- CoverURL : evt .CoverURL ,
96- }}
97- }
98-
99- j , err := json .Marshal (output )
100- if err != nil {
101- panic (err )
102- }
103-
104- fmt .Fprintf (w , "%v" , string (j ))
105- }
106- }
107-
108- func EventsHandler (apiBase string ) http.HandlerFunc {
109- return func (w http.ResponseWriter , r * http.Request ) {
110- cal := r .URL .Query ().Get ("calendar" )
111- if cal == "" {
112- w .Write ([]byte ("missing calendar query parameter" ))
113-
114- panic ("missing calendar query parameter" )
115- }
116-
117- u := apiBase + "?" + url.Values {
118- "calendar_api_id" : {cal },
119- "period" : {"future" },
120- "pagination_limit" : {"20" },
121- }.Encode ()
122-
123- resp , err := http .Get (u )
124- if err != nil {
125- panic (err )
126- }
127- defer resp .Body .Close ()
128-
129- body , err := io .ReadAll (resp .Body )
130- if err != nil {
131- panic (err )
132- }
133-
134- var lr LumaResponse
135- if err := json .Unmarshal (body , & lr ); err != nil {
136- panic (err )
137- }
138-
139- output := Output {}
140-
141- for _ , entry := range lr .Entries {
142- evt := entry .Event
143-
144- loc := ""
145- if evt .GeoAddr != nil {
146- loc = evt .GeoAddr .Address
147- if loc == "" {
148- loc = evt .GeoAddr .ShortAddress
149- }
150- }
151-
152- output .Entries = append (output .Entries , EventItem {
153- Name : evt .Name ,
154- StartAt : evt .StartAt ,
155- URL : evt .URL ,
156- Location : loc ,
157- CoverURL : evt .CoverURL ,
158- })
159- }
160-
161- j , err := json .Marshal (output )
162- if err != nil {
163- panic (err )
164- }
165-
166- fmt .Fprintf (w , "%v" , string (j ))
167- }
168- }
169-
17015func Handler (w http.ResponseWriter , r * http.Request ) {
171- NextEventHandler (defaultLumaAPIBase ). ServeHTTP ( w , r )
16+ handlers . NextEventHandler (w , r , defaultLumaAPIBase )
17217}
17318
17419func main () {
@@ -187,6 +32,14 @@ func main() {
18732 apiBase = defaultLumaAPIBase
18833 }
18934
35+ mastodonServer := os .Getenv ("MASTODON_SERVER" )
36+ if mastodonServer == "" {
37+ mastodonServer = "https://thecanadian.social"
38+ }
39+ mastodonClientID := os .Getenv ("MASTODON_CLIENT_ID" )
40+ mastodonClientSecret := os .Getenv ("MASTODON_CLIENT_SECRET" )
41+ mastodonAccessToken := os .Getenv ("MASTODON_ACCESS_TOKEN" )
42+
19043 cors := func (next http.HandlerFunc ) http.HandlerFunc {
19144 return func (w http.ResponseWriter , r * http.Request ) {
19245 w .Header ().Set ("Access-Control-Allow-Origin" , origin )
@@ -204,11 +57,52 @@ func main() {
20457 }
20558 }
20659
207- http .HandleFunc ("/next-event" , cors (NextEventHandler (apiBase )))
208- http .HandleFunc ("/events" , cors (EventsHandler (apiBase )))
60+ mux := http .NewServeMux ()
61+
62+ mux .HandleFunc ("/next-event" , cors (func (w http.ResponseWriter , r * http.Request ) {
63+ defer func () {
64+ if err := recover (); err != nil {
65+ log .Println ("Error occured in next-event API:" , err )
66+
67+ http .Error (w , "Error occured in next-event API" , http .StatusInternalServerError )
68+
69+ return
70+ }
71+ }()
72+
73+ handlers .NextEventHandler (w , r , apiBase )
74+ }))
75+
76+ mux .HandleFunc ("/events" , cors (func (w http.ResponseWriter , r * http.Request ) {
77+ defer func () {
78+ if err := recover (); err != nil {
79+ log .Println ("Error occured in events API:" , err )
80+
81+ http .Error (w , "Error occured in events API" , http .StatusInternalServerError )
82+
83+ return
84+ }
85+ }()
86+
87+ handlers .EventsHandler (w , r , apiBase )
88+ }))
89+
90+ mux .HandleFunc ("/mastodon" , cors (func (w http.ResponseWriter , r * http.Request ) {
91+ defer func () {
92+ if err := recover (); err != nil {
93+ log .Println ("Error occured in Mastodon API:" , err )
94+
95+ http .Error (w , "Error occured in Mastodon API" , http .StatusInternalServerError )
96+
97+ return
98+ }
99+ }()
100+
101+ mastodonhandler .MastodonFeedHandler (w , r , mastodonServer , mastodonClientID , mastodonClientSecret , mastodonAccessToken )
102+ }))
209103
210104 log .Printf ("listening on :%s" , port )
211- if err := http .ListenAndServe (fmt .Sprintf (":%s" , port ), nil ); err != nil {
105+ if err := http .ListenAndServe (fmt .Sprintf (":%s" , port ), mux ); err != nil {
212106 log .Fatal (err )
213107 }
214108}
0 commit comments