[meetup] Attach speaker profiles on Pro network events - #3
Merged
Merged
Conversation
Meetup Pro events carry a speaker profile, and NormalizedEvent already had a `speaker` that went nowhere. It now maps to CreateEventInput's speakerDetails: name and bioMarkdown to the API's required name and description, plus social links. speakerDetails is Pro-only and other groups reject it, so it is opt-in and resolved per group, matching how a network is configured in practice: `true` for every group, or a list of the urlnames that are in the network. GroupTarget carries the decision, so a multi-group run can send it to the Pro groups and omit it elsewhere in the same pass. A speaker with no bio is skipped rather than half-filled. The API requires a non-empty description, and an empty string would publish a hollow profile; the run logs a warning naming the reason instead. NormalizedSpeaker gains `socialUrls` as plain URLs to keep core platform-neutral, and @coopkit/meetup classifies them by host into Meetup's fixed service enum, with OTHER for personal sites. Host matching is anchored, so notlinkedin.com and linkedin.com.evil.test do not pass as LINKEDIN while de.linkedin.com does. Non-URLs are dropped, not guessed. The whole URL is kept as `identifier`. Meetup's field name suggests a bare handle, but the per-service shape is undocumented and a URL is unambiguous and lossless for every service including OTHER. photoId is left unsupported: it needs a prior photo upload, and the mutation for a speaker photo (as opposed to an event photo) is not something I could verify, so guessing at it had no place here. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
duxi90
force-pushed
the
feat/meetup-speaker-profiles
branch
from
August 18, 2026 09:30
9bdd756 to
5d668e4
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Depends on #2.
NormalizedEvent.speakernow reaches Meetup asspeakerDetails: name and bio, plussocial links classified into Meetup's service enum by URL host, with
OTHERforpersonal sites.
NormalizedSpeaker.socialUrlsis added to core as plain URLs — classification is@coopkit/meetup's job, so core stays platform-neutral.speakerDetails: true | string[]) and resolved ontoGroupTarget,so one multi-group run sends it to the Pro groups and omits it elsewhere. Groups
outside a Pro network reject the field.
requires a non-empty description and an empty one publishes a hollow profile.
photoIdis left unsupported: it needs a prior photo upload, and the mutation for aspeaker photo (as opposed to an event photo) is not something I could verify.
Motivation
Speaker profiles are the visible half of a Pro event, and
NormalizedEvent.speakeralready existed but went nowhere.
Testing
Tested locally. Full CI chain green, 108 tests — 23 new across
speaker.test.tsandpayload.test.ts, covering anchored host matching (notlinkedin.comandlinkedin.com.evil.testdo not pass asLINKEDIN,de.linkedin.comdoes), non-URLinputs, and the no-bio skip. A
--groups all --dry-runrun confirmsspeakerDetailsrides on the two configured Pro groups and is omitted for the third.
Checkup list