File tree Expand file tree Collapse file tree
Applications/Backend/Source
HttpsRichardy.Federation.Application
HttpsRichardy.Federation.Domain Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff 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 ; } = [ ] ;
Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff 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."
You can’t perform that action at this time.
0 commit comments