Skip to content

Commit 3fada7f

Browse files
feature(#20): this commit introduces support for assigning audiences to customers
1 parent 92cfbe7 commit 3fada7f

5 files changed

Lines changed: 55 additions & 0 deletions

File tree

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
namespace HttpsRichardy.Federation.Application.Handlers.Client;
2+
3+
public sealed class AssignAudienceClientHandler(IClientCollection clientCollection) :
4+
IDispatchHandler<AssignClientAudienceScheme, Result<IReadOnlyCollection<string>>>
5+
{
6+
public async Task<Result<IReadOnlyCollection<string>>> HandleAsync(
7+
AssignClientAudienceScheme parameters, CancellationToken cancellation = default)
8+
{
9+
var filters = ClientFilters.WithSpecifications()
10+
.WithIdentifier(parameters.Id)
11+
.Build();
12+
13+
var clients = await clientCollection.GetClientsAsync(filters, cancellation);
14+
var client = clients.FirstOrDefault();
15+
16+
if (client is null)
17+
{
18+
return Result<IReadOnlyCollection<string>>.Failure(ClientErrors.ClientDoesNotExist);
19+
}
20+
21+
var audience = new Audience(parameters.Value);
22+
if (client.Audiences.Any(current => current.Value == audience.Value))
23+
{
24+
return Result<IReadOnlyCollection<string>>.Failure(ClientErrors.ClientAlreadyHasAudience);
25+
}
26+
27+
client.Audiences.Add(audience);
28+
29+
await clientCollection.UpdateAsync(client, cancellation);
30+
31+
return Result<IReadOnlyCollection<string>>.Success([.. client.Audiences.Select(current => current.Value)]);
32+
}
33+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
namespace HttpsRichardy.Federation.Application.Payloads.Client;
2+
3+
public sealed record AssignClientAudienceScheme :
4+
IDispatchable<Result<IReadOnlyCollection<string>>>
5+
{
6+
[JsonIgnore]
7+
public string Id { get; init; } = default!;
8+
public string Value { get; init; } = default!;
9+
}

Applications/Backend/Source/HttpsRichardy.Federation.Domain/Aggregates/Client.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public sealed class Client : Aggregate
88
public string RealmId { get; set; } = default!;
99
public string ClientId { get; set; } = default!;
1010

11+
public ICollection<Audience> Audiences { get; set; } = [];
1112
public ICollection<Grant> Flows { get; set; } = [];
1213
public ICollection<RedirectUri> RedirectUris { get; set; } = [];
1314
public ICollection<Permission> Permissions { get; set; } = [];
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace HttpsRichardy.Federation.Domain.Concepts;
2+
3+
public sealed record Audience(string Value) :
4+
IValueObject<Audience>
5+
{
6+
public string Value { get; init; } = Value;
7+
}

Applications/Backend/Source/HttpsRichardy.Federation.Domain/Errors/ClientErrors.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ public static class ClientErrors
1212
Description: "The client already has the specified permission assigned."
1313
);
1414

15+
public static readonly Error ClientAlreadyHasAudience = new(
16+
Code: "#ERROR-F4E2A",
17+
Description: "The client already has the specified audience assigned."
18+
);
19+
1520
public static readonly Error PermissionNotAssigned = new(
1621
Code: "#ERROR-C2FB0",
1722
Description: "The client does not have the specified permission assigned."

0 commit comments

Comments
 (0)