Skip to content

Clarify JsonIgnore behavior for IsTargeted property in CoreActivity#349

Draft
Copilot wants to merge 7 commits intonext/corefrom
copilot/sub-pr-338
Draft

Clarify JsonIgnore behavior for IsTargeted property in CoreActivity#349
Copilot wants to merge 7 commits intonext/corefrom
copilot/sub-pr-338

Conversation

Copy link
Contributor

Copilot AI commented Feb 25, 2026

Addresses a review question about whether [JsonIgnore] on IsTargeted suppresses deserialization in addition to serialization.

Behavior

[JsonIgnore] with no condition defaults to JsonIgnoreCondition.Always — the property is excluded from both serialization and deserialization. This is intentional:

  • IsTargeted is not part of the BF Framework activity JSON schema; Teams never sends it in incoming webhook payloads
  • ConversationClient reads activity.IsTargeted before activity.ToJson() — the ?isTargetedActivity=true query parameter is appended to the URL, not the JSON body
  • For BF SDK compat (FromCompatActivity()), IsTargeted must be set manually after conversion — Microsoft.Bot.Schema.Activity has no equivalent concept
// IsTargeted controls the URL query param, not the JSON body
if (activity.IsTargeted)
    url += "?isTargetedActivity=true";

string body = activity.ToJson(); // isTargeted never appears here

The existing test IsTargeted_IsNotDeserializedFromJson explicitly validates this behavior.


💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.

rido-min and others added 7 commits February 17, 2026 10:47
Introduced a structured API facade (`TeamsBotApplication.Api`) for Teams operations, grouping functionality into Conversations, Users, Teams, Meetings, and Batch sub-APIs. Added new classes for each sub-API, with extensive XML documentation. Updated `TeamsBotApplication` to expose the new facade. Added integration tests for the API hierarchy and error handling. Cleaned up `.csproj` by removing unused RunSettings property. This refactor improves discoverability, organization, and developer experience for Teams API usage.
Added detailed tables to README.md mapping TeamsApi facade methods to their underlying REST endpoints. Documentation covers Conversations, Users (Token), Teams, Meetings, and Batch operations, including HTTP methods, endpoint paths, and relevant base URLs. Added notes on service URL usage and path parameter encoding.
Introduces ReactionsApi for programmatic message reactions in Teams bots, with AddAsync and DeleteAsync methods. ConversationClient now supports AddReactionAsync and DeleteReactionAsync. Expanded ReactionTypes with more documented types. Demonstrated usage in Program.cs by adding a "cake" reaction to "hello" messages.
Introduces IsTargeted property to CoreActivity for private messages, updates ConversationClient to append isTargetedActivity query string for send/update/delete, and extends CoreActivityBuilder for targeted recipient support. Adds a "tm" command to send private messages to all members. Updates and adds tests for IsTargeted logic and ensures it is not serialized. Also updates .gitignore for .claude/.
Removed checks for Recipient Id and Name in several tests in CoreActivityBuilderTests.cs and CoreActivityTests.cs to streamline test coverage. Other test logic remains unchanged.
EchoBot now sends a "Hello TM !" message using TeamsBotApplication's ConversationClient after echoing the user's input. The TeamsActivity is built with correct conversation, recipient, sender, and service URL details. Minor formatting adjustment made in Program.cs with no logic changes.
Copilot AI changed the title [WIP] Update JsonIgnore handling for Reactions and TargetedMessage Clarify JsonIgnore behavior for IsTargeted property in CoreActivity Feb 25, 2026
@rido-min
Copy link
Member

@singhk97 yes, the JsonIgnore is intentional, for the next phase of Targeted Messages we will move the IsTargeted field to the Recipient, and I was planning to make it serializable at that point, so it can be used in the compat layer

Base automatically changed from next/core-api-clients-tm to next/core-api-clients March 4, 2026 05:20
Base automatically changed from next/core-api-clients to next/core March 19, 2026 17:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants