From 96585093d1753463aaa989a2fc6f0fe076474907 Mon Sep 17 00:00:00 2001 From: "Kevin D. Wolf" Date: Tue, 25 Aug 2026 16:57:09 -0400 Subject: [PATCH 1/4] Add operational record contract --- .../Interfaces/IOperationalRecord.cs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/LagoVista.Core/Interfaces/IOperationalRecord.cs diff --git a/src/LagoVista.Core/Interfaces/IOperationalRecord.cs b/src/LagoVista.Core/Interfaces/IOperationalRecord.cs new file mode 100644 index 00000000..4a03ab40 --- /dev/null +++ b/src/LagoVista.Core/Interfaces/IOperationalRecord.cs @@ -0,0 +1,14 @@ +namespace LagoVista.Core.Interfaces +{ + /// + /// Minimal record contract for compact, mutable operational data. + /// Operational records represent the current working state used to run the platform + /// rather than immutable activity history or document-oriented application data. + /// + public interface IOperationalRecord + { + string Id { get; set; } + string OrganizationId { get; set; } + string Organization { get; set; } + } +} From f4745d02f0a16d7cd47f78da85900f053d15ce95 Mon Sep 17 00:00:00 2001 From: "Kevin D. Wolf" Date: Tue, 25 Aug 2026 16:57:19 -0400 Subject: [PATCH 2/4] Add operational record store contract --- .../Interfaces/IOperationalRecordStore.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/LagoVista.Core/Interfaces/IOperationalRecordStore.cs diff --git a/src/LagoVista.Core/Interfaces/IOperationalRecordStore.cs b/src/LagoVista.Core/Interfaces/IOperationalRecordStore.cs new file mode 100644 index 00000000..5b980e56 --- /dev/null +++ b/src/LagoVista.Core/Interfaces/IOperationalRecordStore.cs @@ -0,0 +1,20 @@ +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; + +namespace LagoVista.Core.Interfaces +{ + /// + /// Provider-neutral storage contract for compact, mutable operational records. + /// Implementations may use Cassandra or another backend suitable for high-cardinality + /// keyed state without exposing provider topology to callers. + /// + public interface IOperationalRecordStore + where TRecord : class, IOperationalRecord + { + Task GetAsync(string organizationId, string id, CancellationToken cancellationToken = default); + Task UpsertAsync(TRecord record, CancellationToken cancellationToken = default); + Task UpsertBatchAsync(IEnumerable records, CancellationToken cancellationToken = default); + Task DeleteAsync(string organizationId, string id, CancellationToken cancellationToken = default); + } +} From bfe557b4d8268e3eacce0adbeed225a02cb05959 Mon Sep 17 00:00:00 2001 From: "Kevin D. Wolf" Date: Tue, 25 Aug 2026 16:57:32 -0400 Subject: [PATCH 3/4] Add operational record key --- .../Interfaces/OperationalRecordKey.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 src/LagoVista.Core/Interfaces/OperationalRecordKey.cs diff --git a/src/LagoVista.Core/Interfaces/OperationalRecordKey.cs b/src/LagoVista.Core/Interfaces/OperationalRecordKey.cs new file mode 100644 index 00000000..a601feeb --- /dev/null +++ b/src/LagoVista.Core/Interfaces/OperationalRecordKey.cs @@ -0,0 +1,27 @@ +using System; +using System.Collections.Generic; + +namespace LagoVista.Core.Interfaces +{ + /// + /// Provider-neutral identity for an operational record. + /// Scope values describe the logical record boundary (for example repository or instance) + /// without exposing provider-specific partition, shard, table, or collection concepts. + /// + public sealed class OperationalRecordKey + { + public OperationalRecordKey(string organizationId, string id, IReadOnlyDictionary scope = null) + { + if (String.IsNullOrWhiteSpace(organizationId)) throw new ArgumentNullException(nameof(organizationId)); + if (String.IsNullOrWhiteSpace(id)) throw new ArgumentNullException(nameof(id)); + + OrganizationId = organizationId; + Id = id; + Scope = scope ?? new Dictionary(); + } + + public string OrganizationId { get; } + public string Id { get; } + public IReadOnlyDictionary Scope { get; } + } +} From 68134a2a8086442ff700d24e526da3c8c854876d Mon Sep 17 00:00:00 2001 From: "Kevin D. Wolf" Date: Tue, 25 Aug 2026 16:57:46 -0400 Subject: [PATCH 4/4] Use scoped operational record keys --- src/LagoVista.Core/Interfaces/IOperationalRecordStore.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/LagoVista.Core/Interfaces/IOperationalRecordStore.cs b/src/LagoVista.Core/Interfaces/IOperationalRecordStore.cs index 5b980e56..4d3c35fc 100644 --- a/src/LagoVista.Core/Interfaces/IOperationalRecordStore.cs +++ b/src/LagoVista.Core/Interfaces/IOperationalRecordStore.cs @@ -12,9 +12,9 @@ namespace LagoVista.Core.Interfaces public interface IOperationalRecordStore where TRecord : class, IOperationalRecord { - Task GetAsync(string organizationId, string id, CancellationToken cancellationToken = default); + Task GetAsync(OperationalRecordKey key, CancellationToken cancellationToken = default); Task UpsertAsync(TRecord record, CancellationToken cancellationToken = default); Task UpsertBatchAsync(IEnumerable records, CancellationToken cancellationToken = default); - Task DeleteAsync(string organizationId, string id, CancellationToken cancellationToken = default); + Task DeleteAsync(OperationalRecordKey key, CancellationToken cancellationToken = default); } }