Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
20 changes: 11 additions & 9 deletions core/docs/ApiClient-Design.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,22 @@
```
ApiClient (top-level facade)
├── Conversations → ConversationApiClient [→ core ConversationClient]
│ ├── Activities → ActivityClient
│ ├── Members → MemberClient
│ └── Reactions → ReactionClient [Experimental]
│ ├── Activities → [deprecated] ActivityClient
Comment thread
MehakBindra marked this conversation as resolved.
│ ├── Members → [deprecated] MemberClient
│ └── Reactions → [deprecated] ReactionClient
├── Users → UserTokenApiClient [token + sign-in; → core UserTokenClient]
├── Teams → TeamClient [BotHttpClient → serviceUrl/v3/teams/]
└── Meetings → MeetingClient [BotHttpClient → serviceUrl/v1/meetings/]
```

`ConversationApiClient` now exposes activity, member, and reaction methods directly (e.g. `CreateActivityAsync`, `GetMembersPagedAsync`, `AddReactionAsync`). The sub-client properties (`Activities`, `Members`, `Reactions`) are retained but marked `[Obsolete]` for backward compatibility.

| Sub-client | Backed by | Why |
|---|---|---|
| Conversations, Users | core `ConversationClient` / `UserTokenClient` | Single source of truth for URL construction, auth, agents-channel handling, agentic identity, headers, and logging |
| Teams, Meetings | `BotHttpClient` directly | No core client exists for these endpoints |

**Experimental APIs:** `ReactionClient` (`ExperimentalTeamsReactions`); `ActivityClient.CreateTargetedAsync` / `UpdateTargetedAsync` / `DeleteTargetedAsync` (`ExperimentalTeamsTargeted`, not supported in team channels).
**Experimental APIs:** `ConversationApiClient.CreateTargetedActivityAsync` / `UpdateTargetedActivityAsync` (`ExperimentalTeamsTargeted`, not supported in team channels).

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

^ also missing the reaction ones


## Construction & scoping

Expand All @@ -36,7 +38,7 @@ In handlers, use `ctx.Api`, which lazily scopes to `Activity.ServiceUrl`:
```csharp
botApp.OnMessage(async (ctx, ct) =>
{
var members = await ctx.Api.Conversations.Members.GetAsync(conversationId, ct);
var members = await ctx.Api.Conversations.GetMembersPagedAsync(conversationId, cancellationToken: ct);
Comment thread
MehakBindra marked this conversation as resolved.
var team = await ctx.Api.Teams.GetByIdAsync(teamId, ct);
});
```
Expand All @@ -54,10 +56,10 @@ Sub-clients are thin adapters: they bridge the Libraries-style `(conversationId,
```
core/src/Microsoft.Teams.Apps/Api/Clients/
├── ApiClient.cs Facade, DI entry point, ForServiceUrl factory
├── ConversationApiClient.cs Conversation facade → core ConversationClient
├── ActivityClient.cs Activity CRUD + targeted → core ConversationClient
├── MemberClient.cs Member operations → core ConversationClient
├── ReactionClient.cs Reaction operations → core ConversationClient [Experimental]
├── ConversationApiClient.cs Conversation facade → core ConversationClient (activities, members, reactions)
├── ActivityClient.cs [deprecated] Activity CRUD + targeted → core ConversationClient
├── MemberClient.cs [deprecated] Member operations → core ConversationClient
├── ReactionClient.cs [deprecated] Reaction operations → core ConversationClient
├── TeamClient.cs Team info → BotHttpClient (v3/teams/)
├── MeetingClient.cs Meeting info → BotHttpClient (v1/meetings/) + models
└── UserTokenApiClient.cs User token + sign-in → core UserTokenClient
Expand Down
4 changes: 2 additions & 2 deletions core/samples/TargetedMessages/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@
try
{
MessageActivity updated = new($"✏️ Updated at {DateTime.UtcNow:HH:mm:ss}");
await context.Api.Conversations.Activities.UpdateTargetedAsync(conversationId, messageId, updated, cancellationToken: cancellationToken);
await context.Api.Conversations.UpdateTargetedActivityAsync(conversationId, messageId, updated, cancellationToken: cancellationToken);
}
catch (Exception ex)
{
Expand Down Expand Up @@ -88,7 +88,7 @@
await Task.Delay(3000);
try
{
await context.Api.Conversations.Activities.DeleteTargetedAsync(conversationId, messageId, cancellationToken: cancellationToken);
await context.Api.Conversations.DeleteTargetedActivityAsync(conversationId, messageId, cancellationToken: cancellationToken);
}
catch (Exception ex)
{
Expand Down
10 changes: 5 additions & 5 deletions core/samples/TeamsBot/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,7 @@ [Visit Microsoft](https://www.microsoft.com)
.WithServiceUrl(context.Activity.ServiceUrl)
.Build();

await context.Api.Conversations.Activities.UpdateTargetedAsync(
await context.Api.Conversations.UpdateTargetedActivityAsync(
context.Activity.Conversation.Id!,
sendResponse!.Id!,
updated,
Expand All @@ -191,7 +191,7 @@ await context.Api.Conversations.Activities.UpdateTargetedAsync(
await Task.Delay(2000, cancellationToken);

// Delete the targeted message
await context.Api.Conversations.Activities.DeleteTargetedAsync(
await context.Api.Conversations.DeleteTargetedActivityAsync(
context.Activity.Conversation.Id!,
sendResponse.Id!,
cancellationToken: cancellationToken);
Expand All @@ -217,7 +217,7 @@ await context.Api.Conversations.Activities.DeleteTargetedAsync(
await Task.Delay(2000, cancellationToken);

// Add a waving hand reaction
await context.Api.Conversations.Reactions.AddAsync(
await context.Api.Conversations.AddReactionAsync(
context.Activity.Conversation.Id,
response!.Id!,
"1f44b_wavinghand-tone4",
Expand All @@ -227,7 +227,7 @@ await context.Api.Conversations.Reactions.AddAsync(
await Task.Delay(2000, cancellationToken);

// Add a beaming face reaction
await context.Api.Conversations.Reactions.AddAsync(
await context.Api.Conversations.AddReactionAsync(
context?.Activity?.Conversation?.Id!,
response.Id!,
"1f601_beamingfacewithsmilingeyes",
Expand All @@ -237,7 +237,7 @@ await context.Api.Conversations.Reactions.AddAsync(
await Task.Delay(2000, cancellationToken);
ArgumentNullException.ThrowIfNull(context);
// Remove the beaming face reaction
await context.Api.Conversations.Reactions.DeleteAsync(
await context.Api.Conversations.DeleteReactionAsync(
context?.Activity?.Conversation?.Id!,
response.Id!,
"1f601_beamingfacewithsmilingeyes",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ namespace Microsoft.Teams.Apps.Api.Clients;
/// Client for creating, updating, and deleting activities in a conversation.
/// Delegates to the core <see cref="CoreConversationClient"/>.
/// </summary>
[Obsolete("Use the activity methods on ConversationApiClient directly instead.")]
public class ActivityClient
{
private readonly CoreConversationClient _client;
Expand Down
Loading
Loading