-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRealmCreationHandler.cs
More file actions
37 lines (29 loc) · 1.48 KB
/
Copy pathRealmCreationHandler.cs
File metadata and controls
37 lines (29 loc) · 1.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
namespace HttpsRichardy.Federation.Application.Handlers.Realm;
public sealed class RealmCreationHandler(IRealmCollection collection, IClientCredentialsGenerator credentialsGenerator) :
IDispatchHandler<RealmCreationScheme, Result<RealmDetailsScheme>>
{
public async Task<Result<RealmDetailsScheme>> HandleAsync(
RealmCreationScheme parameters, CancellationToken cancellation = default)
{
var filters = RealmFilters.WithSpecifications()
.WithName(parameters.Name)
.Build();
var realms = await collection.GetRealmsAsync(filters, cancellation);
if (realms.Count > 0)
{
return Result<RealmDetailsScheme>.Failure(RealmErrors.RealmAlreadyExists);
}
var credentials = await credentialsGenerator.GenerateAsync(parameters.Name, cancellation: cancellation);
var realm = RealmMapper.AsRealm(parameters);
var masterFilters = RealmFilters.WithSpecifications()
.WithName("master")
.Build();
var matchingRealms = await collection.GetRealmsAsync(masterFilters, cancellation);
var defaultRealm = matchingRealms.FirstOrDefault()!;
realm.Permissions = defaultRealm.Permissions
.Where(permission => RealmPermissions.InitialPermissions.Contains(permission.Name))
.ToList();
await collection.InsertAsync(realm, cancellation: cancellation);
return Result<RealmDetailsScheme>.Success(RealmMapper.AsResponse(realm));
}
}