From 88a1c436d17ee533f0a53b14e18d15050e1fb4a6 Mon Sep 17 00:00:00 2001 From: Levi Zitting Date: Fri, 13 Feb 2026 20:23:42 -0600 Subject: [PATCH 1/2] chore: change meetup url --- pkg/meetupproxy/meetupproxyconfig/config.go | 2 +- pkg/meetupproxy/meetupproxyconfig/config_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/meetupproxy/meetupproxyconfig/config.go b/pkg/meetupproxy/meetupproxyconfig/config.go index 4536de0..c586d93 100644 --- a/pkg/meetupproxy/meetupproxyconfig/config.go +++ b/pkg/meetupproxy/meetupproxyconfig/config.go @@ -70,7 +70,7 @@ func NewConfig(ctx context.Context, awsConfigFactory appconfig.AwsConfigManager) func setDefaults(_ context.Context, v *viper.Viper) error { v.SetDefault(strings.ToLower(meetupAuthUrlKey), "https://secure.meetup.com/oauth2/access") - v.SetDefault(strings.ToLower(meetupApiUrlKey), "https://api.meetup.com/gql") + v.SetDefault(strings.ToLower(meetupApiUrlKey), "https://api.meetup.com/gql-ext") meetupPrivateKeyBase64 := v.Get(strings.ToLower(meetupPrivateKeyBase64Key)).(string) meetupPrivateKey, err := base64.StdEncoding.DecodeString(meetupPrivateKeyBase64) diff --git a/pkg/meetupproxy/meetupproxyconfig/config_test.go b/pkg/meetupproxy/meetupproxyconfig/config_test.go index b9c46cb..37ce184 100644 --- a/pkg/meetupproxy/meetupproxyconfig/config_test.go +++ b/pkg/meetupproxy/meetupproxyconfig/config_test.go @@ -32,7 +32,7 @@ func TestNewConfig(t *testing.T) { assert.Equal(t, "user123", cfg.MeetupUserID) assert.Equal(t, []byte("private_key"), cfg.MeetupPrivateKey) assert.Equal(t, "https://secure.meetup.com/oauth2/access", cfg.MeetupAuthURL) - assert.Equal(t, "https://api.meetup.com/gql", cfg.MeetupAPIURL) + assert.Equal(t, "https://api.meetup.com/gql-ext", cfg.MeetupAPIURL) }) t.Run("successful load from .env file", func(t *testing.T) { From 2c534cb8da51052f86379f2ad8b61af77d390868 Mon Sep 17 00:00:00 2001 From: Levi Zitting Date: Fri, 13 Feb 2026 20:24:23 -0600 Subject: [PATCH 2/2] fix: update meetup query and parsing to match new structure --- pkg/importer/meetup_repository.go | 28 +++++++++++++------------- pkg/importer/meetup_repository_test.go | 8 ++++---- pkg/shared/models/meetup.go | 21 +++++++++++++++++++ pkg/shared/models/meetup_test.go | 16 +++++++-------- 4 files changed, 47 insertions(+), 26 deletions(-) diff --git a/pkg/importer/meetup_repository.go b/pkg/importer/meetup_repository.go index 9733552..46e2a45 100644 --- a/pkg/importer/meetup_repository.go +++ b/pkg/importer/meetup_repository.go @@ -40,9 +40,9 @@ func NewGraphQLMeetupRepository( const getFutureEventsQuery = ` query ($urlname: String!, $itemsNum: Int!, $cursor: String) { - events: groupByUrlname(urlname: $urlname) { - unifiedEvents(input: { first: $itemsNum, after: $cursor }) { - count + groupByUrlname(urlname: $urlname) { + events(first: $itemsNum, after: $cursor, filter: { status: [ACTIVE] }) { + totalCount pageInfo { endCursor hasNextPage @@ -66,12 +66,12 @@ const getFutureEventsQuery = ` name urlname } - host { + eventHosts { name } - images { + featuredEventPhoto { + id baseUrl - preview } } } @@ -82,16 +82,16 @@ const getFutureEventsQuery = ` type MeetupFutureEventsResponse struct { Data struct { - Events struct { - UnifiedEvents struct { - Count int `json:"count"` - PageInfo struct { + GroupByUrlname struct { + Events struct { + TotalCount int `json:"totalCount"` + PageInfo struct { EndCursor string `json:"endCursor"` HasNextPage bool `json:"hasNextPage"` } `json:"pageInfo"` Edges []MeetupEdge `json:"edges"` - } `json:"unifiedEvents"` - } `json:"events"` + } `json:"events"` + } `json:"groupByUrlname"` } `json:"data"` } @@ -128,7 +128,7 @@ func (r *GraphQLMeetupRepository) GetEventsUntilDateForGroup( return nil, err } - for _, edge := range response.Data.Events.UnifiedEvents.Edges { + for _, edge := range response.Data.GroupByUrlname.Events.Edges { event := edge.Node events = append(events, event) @@ -141,7 +141,7 @@ func (r *GraphQLMeetupRepository) GetEventsUntilDateForGroup( break } - pageInfo := response.Data.Events.UnifiedEvents.PageInfo + pageInfo := response.Data.GroupByUrlname.Events.PageInfo if !pageInfo.HasNextPage { break diff --git a/pkg/importer/meetup_repository_test.go b/pkg/importer/meetup_repository_test.go index f77d8c9..4f57df1 100644 --- a/pkg/importer/meetup_repository_test.go +++ b/pkg/importer/meetup_repository_test.go @@ -136,9 +136,9 @@ func generateMeetupResponse( cursor string, ) *MeetupFutureEventsResponse { response := &MeetupFutureEventsResponse{} - response.Data.Events.UnifiedEvents.Count = len(events) - response.Data.Events.UnifiedEvents.PageInfo.EndCursor = cursor - response.Data.Events.UnifiedEvents.PageInfo.HasNextPage = cursor != "" + response.Data.GroupByUrlname.Events.TotalCount = len(events) + response.Data.GroupByUrlname.Events.PageInfo.EndCursor = cursor + response.Data.GroupByUrlname.Events.PageInfo.HasNextPage = cursor != "" edges := make([]MeetupEdge, 0, len(events)) @@ -146,6 +146,6 @@ func generateMeetupResponse( edges = append(edges, MeetupEdge{Node: event}) } - response.Data.Events.UnifiedEvents.Edges = edges + response.Data.GroupByUrlname.Events.Edges = edges return response } diff --git a/pkg/shared/models/meetup.go b/pkg/shared/models/meetup.go index 4b146bf..5c79019 100644 --- a/pkg/shared/models/meetup.go +++ b/pkg/shared/models/meetup.go @@ -41,6 +41,13 @@ func (e *MeetupEvent) UnmarshalJSON(data []byte) error { Name string `json:"name"` URLName string `json:"urlname"` } `json:"group"` + EventHosts []struct { + Name string `json:"name"` + } `json:"eventHosts"` + FeaturedPhoto *struct { + ID string `json:"id"` + BaseUrl string `json:"baseUrl"` + } `json:"featuredEventPhoto"` *Alias }{ Alias: (*Alias)(e), @@ -52,5 +59,19 @@ func (e *MeetupEvent) UnmarshalJSON(data []byte) error { e.GroupName = aux.Group.Name e.GroupID = aux.Group.URLName + + // Extract first event host name for backward compatibility + if len(aux.EventHosts) > 0 && aux.EventHosts[0].Name != "" { + e.Host = &MeetupHost{Name: aux.EventHosts[0].Name} + } + + // Map featuredEventPhoto to Images for backward compatibility + if aux.FeaturedPhoto != nil && aux.FeaturedPhoto.ID != "" { + imageURL := aux.FeaturedPhoto.BaseUrl + aux.FeaturedPhoto.ID + "/676x380.jpg" + e.Images = []MeetupImage{ + {BaseUrl: imageURL, Preview: imageURL}, + } + } + return nil } diff --git a/pkg/shared/models/meetup_test.go b/pkg/shared/models/meetup_test.go index 201e23b..8641f24 100644 --- a/pkg/shared/models/meetup_test.go +++ b/pkg/shared/models/meetup_test.go @@ -28,15 +28,15 @@ func TestMeetupEvent_UnmarshalJSON(t *testing.T) { "name": "Open SGF", "urlname": "open-sgf" }, - "host": { - "name": "Levi Zitting" - }, - "images": [ + "eventHosts": [ { - "baseUrl": "https://secure-content.meetupstatic.com/images/classic-events/", - "preview": null + "name": "Levi Zitting" } - ] + ], + "featuredEventPhoto": { + "id": "501234567", + "baseUrl": "https://secure-content.meetupstatic.com/images/classic-events/" + } }` var event MeetupEvent @@ -60,7 +60,7 @@ func TestMeetupEvent_UnmarshalJSON(t *testing.T) { assert.Len(t, event.Images, 1) assert.Equal( t, - "https://secure-content.meetupstatic.com/images/classic-events/", + "https://secure-content.meetupstatic.com/images/classic-events/501234567/676x380.jpg", event.Images[0].BaseUrl, ) }