Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
1433b25
refactor(llc)!: route connectGuestUser through the generated client
VelikovPetar Sep 29, 2026
dbf9b2f
Merge branch 'v11' into refactor/flu-846_guest-openapi-migration
VelikovPetar Sep 29, 2026
8339e78
refactor(llc)!: route polls through the generated client
VelikovPetar Oct 1, 2026
040d62f
refactor(llc): address review findings on the polls migration
VelikovPetar Oct 1, 2026
a0b8fe7
Merge remote-tracking branch 'origin/v11' into HEAD
VelikovPetar Oct 1, 2026
fa51edc
Merge branch 'refactor/flu-846_guest-openapi-migration' into refactor…
VelikovPetar Oct 1, 2026
42e56df
refactor(llc): let the API reject poll updates with option ids missing
VelikovPetar Oct 1, 2026
ad777cd
refactor(llc): keep the v10 copyWith on Poll, PollOption and PollVote
VelikovPetar Oct 1, 2026
8bd2b40
docs(repo): correct the poll getters row in the v11 migration guide
VelikovPetar Oct 1, 2026
02ca612
docs(repo): keep v10 copyWith semantics in the openapi-migration rules
VelikovPetar Oct 2, 2026
8a5f068
refactor(llc): share the sort mapper and keep poll client tests in cl…
VelikovPetar Oct 2, 2026
ab5bdef
refactor(llc): apply review remarks on connectGuestUser and the user …
VelikovPetar Oct 2, 2026
9c43e73
Merge remote-tracking branch 'origin/v11' into refactor/flu-846_guest…
VelikovPetar Oct 2, 2026
0eb9266
Merge remote-tracking branch 'origin/refactor/flu-846_guest-openapi-m…
VelikovPetar Oct 2, 2026
4439cf3
refactor(llc): rename the internal guest envelope to CreateGuestUserR…
VelikovPetar Oct 2, 2026
0827c41
Merge remote-tracking branch 'origin/refactor/flu-846_guest-openapi-m…
VelikovPetar Oct 2, 2026
189cec5
Merge remote-tracking branch 'origin/v11' into claude/polls-openapi-m…
VelikovPetar Oct 3, 2026
0a6028d
Merge branch 'v11' into refactor/flu-882_polls_openapi_migration
VelikovPetar Oct 5, 2026
7b61488
feat(llc, persistence): map the generated channel and member responses
VelikovPetar Oct 5, 2026
2c1ef95
refactor(llc)!: route the partial channel and member updates through …
VelikovPetar Oct 5, 2026
2dea3a6
refactor(llc)!: rename enableSlowdown and disableSlowdown to enableSl…
VelikovPetar Oct 5, 2026
18bae3d
docs(llc): simplify the partial update and slow mode docs
VelikovPetar Oct 5, 2026
60f73d6
docs(llc): restore the extraData compatibility comments
VelikovPetar Oct 5, 2026
704e508
test(llc): stub the exact partial update requests
VelikovPetar Oct 5, 2026
4763624
Merge branch 'v11' into refactor/flu-882_polls_openapi_migration
VelikovPetar Oct 6, 2026
cf6bb80
Merge branch 'v11' into refactor/channel_response_mapper
VelikovPetar Oct 6, 2026
aa6fde8
Merge branch 'v11' into refactor/flu-882_polls_openapi_migration
VelikovPetar Oct 9, 2026
8abbc22
Merge branch 'v11' into refactor/channel_response_mapper
VelikovPetar Oct 9, 2026
881d3b9
refactor(llc): name the mappers and their files consistently
VelikovPetar Oct 9, 2026
bf016c0
refactor(llc): leave custom data named like a poll field out of the p…
VelikovPetar Oct 9, 2026
7ef7ca6
refactor(llc): tighten the poll docs, changelogs and tests
VelikovPetar Oct 13, 2026
5bcc383
fix(llc): keep the truncation and auto-translation fields through Cha…
VelikovPetar Oct 13, 2026
2954e63
docs(llc): drop the channel id and type roll call from the partial up…
VelikovPetar Oct 13, 2026
086657e
refactor(llc): switch the poll models to freezed's copyWith
VelikovPetar Oct 13, 2026
27b3ad3
refactor(llc): apply the polls review fixes and bump the cache schema
VelikovPetar Oct 13, 2026
867d5a4
style(llc): format the poll vote test
VelikovPetar Oct 13, 2026
d445345
refactor(llc)!: make poll custom data the wire's custom and rename it
VelikovPetar Oct 13, 2026
1f0246f
Merge branch 'refactor/flu-882_polls_openapi_migration' into refactor…
VelikovPetar Oct 14, 2026
6e4f7ed
refactor(llc, persistence)!: name channel and member custom data cust…
VelikovPetar Oct 14, 2026
92675e6
refactor(llc): apply the polls review suggestions
VelikovPetar Oct 14, 2026
846f27f
Merge branch 'refactor/flu-882_polls_openapi_migration' into refactor…
VelikovPetar Oct 15, 2026
ad42320
refactor(llc): apply the polls review fixes to channel partial updates
VelikovPetar Oct 15, 2026
7606534
Merge branch 'v11' into refactor/channel_response_mapper
VelikovPetar Oct 15, 2026
114b4ad
refactor(llc): address the review on the partial updates and custom data
VelikovPetar Oct 15, 2026
653838d
fix(llc): clear the auto-translation language in ChannelModel.merge a…
VelikovPetar Oct 15, 2026
bc1efef
refactor(llc)!: leave the channel and member fields out of toJson and…
VelikovPetar Oct 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 12 additions & 9 deletions .claude/skills/openapi-migration/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -187,10 +187,13 @@ a public signature.

**Per type, decide:**

- **Which v10 type it maps to, and under what name.** The v10 name is the default, even where the generated one
differs (`OGAttachmentResponse` for `GetOGResponse`, `AppSettings` for `AppResponseFields`). It is not a
requirement: the user may ask for another name, and you may propose one that fits clearly better. Renaming a
v10 type is a break, so propose it with the reason and wait for approval.
- **Which v10 type it maps to, and under what name.** The spec's name is the default, unless it is awkward or
describes something else, and sibling calls share one scheme: `UpdateChannelPartialResponse` and
`UpdateMemberPartialResponse` replaced v10's `PartialUpdateChannelResponse` and `PartialUpdateMemberResponse`,
and `updateMemberPartial` replaced `partialMemberUpdate`. v10's name stays where the generated one does not fit
(`OGAttachmentResponse` for `GetOGResponse`, `AppSettings` for `AppResponseFields`), and names an earlier group
settled stand. Renaming a v10 type or method is a break: list it with the reason, wait for approval, and call it
out in the PR description.
- **Which fields it exposes.** v10's fields, with v10's defaults. A field only the generated type has
(`AppResponseFields.id`, the twelve extra fields on `GetOGResponse`) stays out; exposing it later is additive. A
field the spec marks optional is nullable by default, even if v10 typed it non-null; keeping it non-null needs a
Expand Down Expand Up @@ -251,7 +254,7 @@ packages/stream_chat/lib/src/

- **The role decides the folder.** An envelope goes in `response/` (`CreateUserGroupResponse`). A type the caller
passes in to shape a request goes in `request/`, whatever its name: `PartialUpdateUserRequest`, and also
`PaginationParams`, `ThreadOptions` and `MemberUpdatePayload`. Every other model stays in `models/`
`PaginationParams` and `ThreadOptions`. Every other model stays in `models/`
(`UserGroup`). No `request/` type exists yet: the first arrives when a group migrates one out of
`lib/src/core/api/requests.dart`.
- **Models and envelopes** are `@freezed` classes with a const constructor and `@override final` fields. Copy
Expand Down Expand Up @@ -344,10 +347,10 @@ Three data-shape traps while mapping:
- **The model's `custom` is the wire's `custom`, verbatim** (README rule 9). A migrated model names it `custom`
— `extraData` on one whose group has not run — and the mapper copies the generated map into it and sends it
back as `custom`; never filter either. A typed wire field our model lacks is added as a field, with
approval, or left out — never parked in `extraData` behind a getter, as `ChannelModel.hidden` and `User.name`
still are until groups 11 and 09 promote them. A v1 decoder splits flat JSON by a key list — `topLevelFields`
while the model still has JSON, a private list beside the converter once it does not — and a v1 writer leaves a
custom entry named like a key out so it cannot overwrite the key.
approval, or left out — never parked in `extraData` behind a getter, as `User.name` still is until group 09
promotes it. A v1 decoder splits flat JSON by a key list — `topLevelFields` while the model still has JSON, a
private list beside the converter once it does not — and a v1 writer leaves a custom entry named like a key out
so it cannot overwrite the key.
- **Units on anything that takes a `Duration`.** The wire carries a bare integer and the field name rarely says
in what. Read the Go payload type: `commonpayloads.DurationInMinutes` and `DurationMilliseconds` sit on sibling
endpoints in the same feature — `ban.timeout` and `mute.timeout` are minutes, `muteChannel.expiration` is
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ GetMessageResponse _makeSearchResult({
..channel = ChannelModel(
id: 'ch-$messageId',
type: 'messaging',
extraData: {'name': channelName},
custom: {'name': channelName},
);
return response;
}
Expand Down
4 changes: 2 additions & 2 deletions docs/docs_screenshots/test/src/mocks.dart
Original file line number Diff line number Diff line change
Expand Up @@ -155,8 +155,8 @@ void setupMockChannel({
when(() => channel.isMutedStream).thenAnswer((_) => Stream.value(false));
when(() => channel.isPinned).thenReturn(false);
when(() => channel.isPinnedStream).thenAnswer((_) => Stream.value(false));
when(() => channel.extraDataStream).thenAnswer((_) => Stream.value({'name': channelName}));
when(() => channel.extraData).thenReturn({'name': channelName});
when(() => channel.customStream).thenAnswer((_) => Stream.value({'name': channelName}));
when(() => channel.custom).thenReturn({'name': channelName});
when(() => channel.name).thenReturn(channelName);
when(() => channel.nameStream).thenAnswer((_) => Stream.value(channelName));
when(() => channel.image).thenReturn(null);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ Thread _makeThread({
channel: ChannelModel(
id: id,
type: 'messaging',
extraData: {'name': channelName},
custom: {'name': channelName},
),
parentMessage: parentMessage,
latestReplies: [latestReply],
Expand Down
Loading
Loading