Repository navigation
Expand file tree
/
Copy pathKeySpace.cs
More file actions
58 lines (47 loc) · 3.19 KB
/
Copy pathKeySpace.cs
File metadata and controls
58 lines (47 loc) · 3.19 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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using KeyLoad.Storage;
namespace KeyLoad.Core;
/// <summary>Encodes canonical database keys without changing their persisted ordering or scope.</summary>
public static class KeySpace
{
private const string CatalogSpace = ResourceStorageKeys.CatalogFamily;
private const string PrincipalSpace = "principal";
private const string ApiKeySpace = "api-key";
private const string ScopedOutcomeSpace = "outcome";
private const string GlobalOutcomeScope = "global";
private const string UnknownOutcomeScope = "unknown";
private const string ScopedOutcomeLocatorSpace = "outcome-locator";
internal static byte[] ResourcePrefix(string tenant, string database) => KeyCodec.Encode(CatalogSpace, tenant, database);
/// <summary>Creates an owned key within one atomic partition.</summary>
/// <param name="space">Named feature key space.</param>
/// <param name="partition">Complete atomic partition identity.</param>
/// <param name="suffix">Feature-specific ordered key components.</param>
/// <returns>The canonical independent key buffer.</returns>
public static byte[] Partition(string space, PartitionRef partition, params ReadOnlySpan<KeyComponent> suffix)
{
ArgumentNullException.ThrowIfNull(partition) /* KLD0041: The BCL null guard accepts this existing reference through its object parameter without copying its contents. */;
return KeyCodec.Encode([space, partition.TenantId, partition.DatabaseId,
partition.TransactionDomainId, partition.PartitionKey], suffix);
}
/// <summary>Creates an owned resource-catalog key within a tenant and database.</summary>
/// <param name="tenant">Owning tenant identifier.</param>
/// <param name="database">Owning database identifier.</param>
/// <param name="resource">Resource identifier.</param>
/// <returns>The canonical independent catalog key.</returns>
public static byte[] Resource(string tenant, string database, string resource) => ResourceStorageKeys.Catalog(tenant, database, resource);
/// <summary>Creates an owned persisted-principal key.</summary>
/// <param name="principal">Principal identifier.</param>
/// <returns>The canonical independent principal key.</returns>
public static byte[] Principal(string principal) => KeyCodec.Encode(PrincipalSpace, principal);
/// <summary>Creates an owned API-credential key.</summary>
/// <param name="id">Credential identifier.</param>
/// <returns>The canonical independent credential key.</returns>
public static byte[] ApiKey(string id) => KeyCodec.Encode(ApiKeySpace, id);
internal static byte[] PartitionOutcome(PartitionRef partition, string principal, Guid id)
=> Partition(ScopedOutcomeSpace, partition, principal, id);
internal static byte[] GlobalOutcome(string principal, Guid id)
=> KeyCodec.Encode(ScopedOutcomeSpace, GlobalOutcomeScope, principal, id);
internal static byte[] UnknownOutcome(string principal, Guid id)
=> KeyCodec.Encode(ScopedOutcomeSpace, UnknownOutcomeScope, principal, id);
internal static byte[] OutcomeLocator(PartitionRef partition, string principal, Guid id)
=> Partition(ScopedOutcomeLocatorSpace, partition, principal, id);
}