diff --git a/src/ProjectReferences.Persisters.Primary.props b/src/ProjectReferences.Persisters.Primary.props index 255b45ed5c..0841fa81c2 100644 --- a/src/ProjectReferences.Persisters.Primary.props +++ b/src/ProjectReferences.Persisters.Primary.props @@ -2,6 +2,7 @@ + \ No newline at end of file diff --git a/src/ServiceControl.Persistence.Sql/.editorconfig b/src/ServiceControl.Persistence.Sql/.editorconfig new file mode 100644 index 0000000000..103f58ff80 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/.editorconfig @@ -0,0 +1,3 @@ +[*.cs] +dotnet_diagnostic.CA2007.severity = none +dotnet_diagnostic.IDE0060.severity = none diff --git a/src/ServiceControl.Persistence.Sql/NoOpArchiveMessages.cs b/src/ServiceControl.Persistence.Sql/NoOpArchiveMessages.cs new file mode 100644 index 0000000000..86bd5c2cec --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpArchiveMessages.cs @@ -0,0 +1,27 @@ +namespace ServiceControl.Persistence.Sql; + +using System.Collections.Generic; +using System.Threading.Tasks; +using ServiceControl.Persistence.Recoverability; +using ServiceControl.Recoverability; + +class NoOpArchiveMessages : IArchiveMessages +{ + public Task ArchiveAllInGroup(string groupId) => Task.CompletedTask; + + public Task UnarchiveAllInGroup(string groupId) => Task.CompletedTask; + + public bool IsOperationInProgressFor(string groupId, ArchiveType archiveType) => false; + + public bool IsArchiveInProgressFor(string groupId) => false; + + public void DismissArchiveOperation(string groupId, ArchiveType archiveType) + { + } + + public Task StartArchiving(string groupId, ArchiveType archiveType) => Task.CompletedTask; + + public Task StartUnarchiving(string groupId, ArchiveType archiveType) => Task.CompletedTask; + + public IEnumerable GetArchivalOperations() => []; +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpBodyStorage.cs b/src/ServiceControl.Persistence.Sql/NoOpBodyStorage.cs new file mode 100644 index 0000000000..a04adf2be3 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpBodyStorage.cs @@ -0,0 +1,10 @@ +namespace ServiceControl.Persistence.Sql; + +using System.Threading.Tasks; +using ServiceControl.Operations.BodyStorage; + +class NoOpBodyStorage : IBodyStorage +{ + public Task TryFetch(string bodyId) => + Task.FromResult(new MessageBodyStreamResult { HasResult = false }); +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpCustomChecksDataStore.cs b/src/ServiceControl.Persistence.Sql/NoOpCustomChecksDataStore.cs new file mode 100644 index 0000000000..64ed378310 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpCustomChecksDataStore.cs @@ -0,0 +1,22 @@ +namespace ServiceControl.Persistence.Sql; + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using ServiceControl.Contracts.CustomChecks; +using ServiceControl.CustomChecks; +using ServiceControl.Persistence; +using ServiceControl.Persistence.Infrastructure; + +class NoOpCustomChecksDataStore : ICustomChecksDataStore +{ + public Task UpdateCustomCheckStatus(CustomCheckDetail detail) => + Task.FromResult(CheckStateChange.Unchanged); + + public Task>> GetStats(PagingInfo paging, string status = null) => + Task.FromResult(new QueryResult>([], QueryStatsInfo.Zero)); + + public Task DeleteCustomCheck(Guid id) => Task.CompletedTask; + + public Task GetNumberOfFailedChecks() => Task.FromResult(0); +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpEndpointSettingsStore.cs b/src/ServiceControl.Persistence.Sql/NoOpEndpointSettingsStore.cs new file mode 100644 index 0000000000..7ed0c634bc --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpEndpointSettingsStore.cs @@ -0,0 +1,20 @@ +namespace ServiceControl.Persistence.Sql; + +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using ServiceControl.Operations; +using ServiceControl.Persistence; + +class NoOpEndpointSettingsStore : IEndpointSettingsStore +{ + public async IAsyncEnumerable GetAllEndpointSettings() + { + await Task.CompletedTask; + yield break; + } + + public Task UpdateEndpointSettings(EndpointSettings settings, CancellationToken token) => Task.CompletedTask; + + public Task Delete(string name, CancellationToken cancellationToken) => Task.CompletedTask; +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpErrorMessageDataStore.cs b/src/ServiceControl.Persistence.Sql/NoOpErrorMessageDataStore.cs new file mode 100644 index 0000000000..2672518630 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpErrorMessageDataStore.cs @@ -0,0 +1,161 @@ +namespace ServiceControl.Persistence.Sql; + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using ServiceControl.CompositeViews.Messages; +using ServiceControl.EventLog; +using ServiceControl.MessageFailures; +using ServiceControl.MessageFailures.Api; +using ServiceControl.Notifications; +using ServiceControl.Operations; +using ServiceControl.Persistence; +using ServiceControl.Persistence.Infrastructure; +using ServiceControl.Recoverability; + +class NoOpErrorMessageDataStore : IErrorMessageDataStore +{ + static readonly QueryResult> EmptyMessagesViewResult = + new([], QueryStatsInfo.Zero); + + static readonly QueryResult> EmptyFailedMessageViewResult = + new([], QueryStatsInfo.Zero); + + static readonly QueryResult> EmptyFailureGroupViewResult = + new([], QueryStatsInfo.Zero); + + static readonly QueryStatsInfo EmptyQueryStatsInfo = QueryStatsInfo.Zero; + + public Task>> GetAllMessages(PagingInfo pagingInfo, SortInfo sortInfo, + bool includeSystemMessages, DateTimeRange timeSentRange = null) => + Task.FromResult(EmptyMessagesViewResult); + + public Task>> GetAllMessagesForEndpoint(string endpointName, + PagingInfo pagingInfo, SortInfo sortInfo, bool includeSystemMessages, DateTimeRange timeSentRange = null) => + Task.FromResult(EmptyMessagesViewResult); + + public Task>> GetAllMessagesByConversation(string conversationId, + PagingInfo pagingInfo, SortInfo sortInfo, bool includeSystemMessages) => + Task.FromResult(EmptyMessagesViewResult); + + public Task>> GetAllMessagesForSearch(string searchTerms, PagingInfo pagingInfo, + SortInfo sortInfo, DateTimeRange timeSentRange = null) => + Task.FromResult(EmptyMessagesViewResult); + + public Task>> SearchEndpointMessages(string endpointName, string searchKeyword, + PagingInfo pagingInfo, SortInfo sortInfo, DateTimeRange timeSentRange = null) => + Task.FromResult(EmptyMessagesViewResult); + + public Task FailedMessageMarkAsArchived(string failedMessageId) => Task.CompletedTask; + + public Task FailedMessagesFetch(Guid[] ids) => Task.FromResult(Array.Empty()); + + public Task StoreFailedErrorImport(FailedErrorImport failure) => Task.CompletedTask; + + public Task CreateEditFailedMessageManager() => + Task.FromResult(new NoOpEditFailedMessagesManager()); + + public Task> GetFailureGroupView(string groupId, string status, string modified) => + Task.FromResult(new QueryResult(null, EmptyQueryStatsInfo)); + + public Task> GetFailureGroupsByClassifier(string classifier) => + Task.FromResult>([]); + + public Task>> ErrorGet(string status, string modified, string queueAddress, + PagingInfo pagingInfo, SortInfo sortInfo) => + Task.FromResult(EmptyFailedMessageViewResult); + + public Task ErrorsHead(string status, string modified, string queueAddress) => + Task.FromResult(EmptyQueryStatsInfo); + + public Task>> ErrorsByEndpointName(string status, string endpointName, + string modified, PagingInfo pagingInfo, SortInfo sortInfo) => + Task.FromResult(EmptyFailedMessageViewResult); + + public Task> ErrorsSummary() => + Task.FromResult>(new Dictionary()); + + public Task ErrorLastBy(string failedMessageId) => + Task.FromResult(null); + + public Task ErrorBy(string failedMessageId) => + Task.FromResult(null); + + public Task CreateNotificationsManager() => + Task.FromResult(new NoOpNotificationsManager()); + + public Task EditComment(string groupId, string comment) => Task.CompletedTask; + + public Task DeleteComment(string groupId) => Task.CompletedTask; + + public Task>> GetGroupErrors(string groupId, string status, string modified, + SortInfo sortInfo, PagingInfo pagingInfo) => + Task.FromResult(EmptyFailedMessageViewResult); + + public Task GetGroupErrorsCount(string groupId, string status, string modified) => + Task.FromResult(EmptyQueryStatsInfo); + + public Task>> GetGroup(string groupId, string status, string modified) => + Task.FromResult(EmptyFailureGroupViewResult); + + public Task MarkMessageAsResolved(string failedMessageId) => Task.FromResult(false); + + public Task ProcessPendingRetries(DateTime periodFrom, DateTime periodTo, string queueAddress, + Func processCallback) => Task.CompletedTask; + + public Task UnArchiveMessagesByRange(DateTime from, DateTime to) => + Task.FromResult(Array.Empty()); + + public Task UnArchiveMessages(IEnumerable failedMessageIds) => + Task.FromResult(Array.Empty()); + + public Task RevertRetry(string messageUniqueId) => Task.CompletedTask; + + public Task RemoveFailedMessageRetryDocument(string uniqueMessageId) => Task.CompletedTask; + + public Task GetRetryPendingMessages(DateTime from, DateTime to, string queueAddress) => + Task.FromResult(Array.Empty()); + + public Task FetchFromFailedMessage(string uniqueMessageId) => + Task.FromResult(null); + + public Task StoreEventLogItem(EventLogItem logItem) => Task.CompletedTask; + + public Task StoreFailedMessagesForTestsOnly(params FailedMessage[] failedMessages) => Task.CompletedTask; + + class NoOpEditFailedMessagesManager : IEditFailedMessagesManager + { + public void Dispose() + { + } + + public Task GetFailedMessage(string failedMessageId) => + Task.FromResult(null); + + public Task GetCurrentEditingRequestId(string failedMessageId) => + Task.FromResult(null); + + public Task SetCurrentEditingRequestId(string editingMessageId) => Task.CompletedTask; + + public Task SetFailedMessageAsResolved() => Task.CompletedTask; + + public Task UpdateFailedMessageBody(string uniqueMessageId, byte[] newBody) => Task.CompletedTask; + + public Task SaveChanges() => Task.CompletedTask; + } + + class NoOpNotificationsManager : INotificationsManager + { + public void Dispose() + { + } + + public Task LoadSettings(TimeSpan? cacheTimeout = null) => + Task.FromResult(null); + + public Task UpdateFailedMessageGroupDetails(string groupId, string title, FailedMessageStatus status) => + Task.CompletedTask; + + public Task SaveChanges() => Task.CompletedTask; + } +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpEventLogDataStore.cs b/src/ServiceControl.Persistence.Sql/NoOpEventLogDataStore.cs new file mode 100644 index 0000000000..6df1410891 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpEventLogDataStore.cs @@ -0,0 +1,15 @@ +namespace ServiceControl.Persistence.Sql; + +using System.Collections.Generic; +using System.Threading.Tasks; +using ServiceControl.EventLog; +using ServiceControl.Persistence; +using ServiceControl.Persistence.Infrastructure; + +class NoOpEventLogDataStore : IEventLogDataStore +{ + public Task Add(EventLogItem logItem) => Task.CompletedTask; + + public Task<(IList items, long total, string version)> GetEventLogItems(PagingInfo pagingInfo) => + Task.FromResult<(IList, long, string)>(([], 0, string.Empty)); +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpExternalIntegrationRequestsDataStore.cs b/src/ServiceControl.Persistence.Sql/NoOpExternalIntegrationRequestsDataStore.cs new file mode 100644 index 0000000000..805176e820 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpExternalIntegrationRequestsDataStore.cs @@ -0,0 +1,20 @@ +namespace ServiceControl.Persistence.Sql; + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using ServiceControl.ExternalIntegrations; +using ServiceControl.Persistence; + +class NoOpExternalIntegrationRequestsDataStore : IExternalIntegrationRequestsDataStore +{ + public void Subscribe(Func callback) + { + } + + public Task StoreDispatchRequest(IEnumerable dispatchRequests) => + Task.CompletedTask; + + public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask; +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpFailedErrorImportDataStore.cs b/src/ServiceControl.Persistence.Sql/NoOpFailedErrorImportDataStore.cs new file mode 100644 index 0000000000..0805c0cb88 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpFailedErrorImportDataStore.cs @@ -0,0 +1,16 @@ +namespace ServiceControl.Persistence.Sql; + +using System; +using System.Threading; +using System.Threading.Tasks; +using ServiceControl.MessageFailures; +using ServiceControl.Operations; +using ServiceControl.Persistence; + +class NoOpFailedErrorImportDataStore : IFailedErrorImportDataStore +{ + public Task ProcessFailedErrorImports(Func processMessage, + CancellationToken cancellationToken) => Task.CompletedTask; + + public Task QueryContainsFailedImports() => Task.FromResult(false); +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpFailedMessageViewIndexNotifications.cs b/src/ServiceControl.Persistence.Sql/NoOpFailedMessageViewIndexNotifications.cs new file mode 100644 index 0000000000..ce9e1ac448 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpFailedMessageViewIndexNotifications.cs @@ -0,0 +1,18 @@ +namespace ServiceControl.Persistence.Sql; + +using System; +using System.Threading.Tasks; +using ServiceControl.MessageFailures; +using ServiceControl.Persistence; + +class NoOpFailedMessageViewIndexNotifications : IFailedMessageViewIndexNotifications +{ + public IDisposable Subscribe(Func callback) => new NoOpDisposable(); + + class NoOpDisposable : IDisposable + { + public void Dispose() + { + } + } +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpGroupsDataStore.cs b/src/ServiceControl.Persistence.Sql/NoOpGroupsDataStore.cs new file mode 100644 index 0000000000..ba571f405b --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpGroupsDataStore.cs @@ -0,0 +1,15 @@ +namespace ServiceControl.Persistence.Sql; + +using System.Collections.Generic; +using System.Threading.Tasks; +using ServiceControl.Persistence; +using ServiceControl.Recoverability; + +class NoOpGroupsDataStore : IGroupsDataStore +{ + public Task> GetFailureGroupsByClassifier(string classifier, string classifierFilter) => + Task.FromResult>([]); + + public Task GetCurrentForwardingBatch() => + Task.FromResult(null); +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpMessageRedirectsDataStore.cs b/src/ServiceControl.Persistence.Sql/NoOpMessageRedirectsDataStore.cs new file mode 100644 index 0000000000..e7e890f062 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpMessageRedirectsDataStore.cs @@ -0,0 +1,12 @@ +namespace ServiceControl.Persistence.Sql; + +using System.Threading.Tasks; +using ServiceControl.Persistence.MessageRedirects; + +class NoOpMessageRedirectsDataStore : IMessageRedirectsDataStore +{ + public Task GetOrCreate() => + Task.FromResult(new MessageRedirectsCollection()); + + public Task Save(MessageRedirectsCollection redirects) => Task.CompletedTask; +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpMonitoringDataStore.cs b/src/ServiceControl.Persistence.Sql/NoOpMonitoringDataStore.cs new file mode 100644 index 0000000000..bce203aa56 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpMonitoringDataStore.cs @@ -0,0 +1,25 @@ +namespace ServiceControl.Persistence.Sql; + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using ServiceControl.Operations; +using ServiceControl.Persistence; + +class NoOpMonitoringDataStore : IMonitoringDataStore +{ + public Task CreateIfNotExists(EndpointDetails endpoint) => Task.CompletedTask; + + public Task CreateOrUpdate(EndpointDetails endpoint, IEndpointInstanceMonitoring endpointInstanceMonitoring) => + Task.CompletedTask; + + public Task UpdateEndpointMonitoring(EndpointDetails endpoint, bool isMonitored) => Task.CompletedTask; + + public Task WarmupMonitoringFromPersistence(IEndpointInstanceMonitoring endpointInstanceMonitoring) => + Task.CompletedTask; + + public Task Delete(Guid endpointId) => Task.CompletedTask; + + public Task> GetAllKnownEndpoints() => + Task.FromResult>([]); +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpQueueAddressStore.cs b/src/ServiceControl.Persistence.Sql/NoOpQueueAddressStore.cs new file mode 100644 index 0000000000..616b43910b --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpQueueAddressStore.cs @@ -0,0 +1,19 @@ +namespace ServiceControl.Persistence.Sql; + +using System.Collections.Generic; +using System.Threading.Tasks; +using ServiceControl.MessageFailures; +using ServiceControl.Persistence; +using ServiceControl.Persistence.Infrastructure; + +class NoOpQueueAddressStore : IQueueAddressStore +{ + static readonly QueryResult> EmptyResult = + new([], QueryStatsInfo.Zero); + + public Task>> GetAddresses(PagingInfo pagingInfo) => + Task.FromResult(EmptyResult); + + public Task>> GetAddressesBySearchTerm(string search, PagingInfo pagingInfo) => + Task.FromResult(EmptyResult); +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpRetryBatchesDataStore.cs b/src/ServiceControl.Persistence.Sql/NoOpRetryBatchesDataStore.cs new file mode 100644 index 0000000000..1d4a9e4cf5 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpRetryBatchesDataStore.cs @@ -0,0 +1,85 @@ +namespace ServiceControl.Persistence.Sql; + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using ServiceControl.MessageFailures; +using ServiceControl.Persistence; +using ServiceControl.Persistence.Infrastructure; +using ServiceControl.Persistence.MessageRedirects; +using ServiceControl.Recoverability; + +class NoOpRetryBatchesDataStore : IRetryBatchesDataStore +{ + public Task CreateRetryBatchesManager() => + Task.FromResult(new NoOpRetryBatchesManager()); + + public Task RecordFailedStagingAttempt(IReadOnlyCollection messages, + IReadOnlyDictionary failedMessageRetriesById, Exception e, int maxStagingAttempts, + string stagingId) => Task.CompletedTask; + + public Task IncrementAttemptCounter(FailedMessageRetry failedMessageRetry) => Task.CompletedTask; + + public Task DeleteFailedMessageRetry(string makeDocumentId) => Task.CompletedTask; + + class NoOpRetryBatchesManager : IRetryBatchesManager + { + public void Dispose() + { + } + + public Task GetBatch(string batchDocumentId) => + Task.FromResult(null); + + public Task>> GetBatches(string status, PagingInfo pagingInfo, + SortInfo sortInfo) => + Task.FromResult(new QueryResult>([], QueryStatsInfo.Zero)); + + public Task MarkBatchAsReadyForForwarding(string batchDocumentId) => Task.CompletedTask; + + public Task MarkMessageAsSuccessfullyForwarded(FailedMessageRetry messageRetryMetadata, string batchDocumentId) => + Task.CompletedTask; + + public Task MarkMessageAsPartOfBatch(string batchId, string uniqueMessageId, FailedMessageStatus status) => + Task.CompletedTask; + + public Task AbandonBatch(string batchDocumentId) => Task.CompletedTask; + + public void Delete(RetryBatch retryBatch) + { + } + + public void Delete(RetryBatchNowForwarding forwardingBatch) + { + } + + public Task GetFailedMessageRetries(IList stagingBatchFailureRetries) => + Task.FromResult(Array.Empty()); + + public void Evict(FailedMessageRetry failedMessageRetry) + { + } + + public Task GetFailedMessages(Dictionary.KeyCollection keys) => + Task.FromResult(Array.Empty()); + + public Task GetRetryBatchNowForwarding() => + Task.FromResult(null); + + public Task GetRetryBatch(string retryBatchId, CancellationToken cancellationToken) => + Task.FromResult(null); + + public Task GetStagingBatch() => + Task.FromResult(null); + + public Task Store(RetryBatchNowForwarding retryBatchNowForwarding) => Task.CompletedTask; + + public Task GetOrCreateMessageRedirectsCollection() => + Task.FromResult(new MessageRedirectsCollection()); + + public Task CancelExpiration(FailedMessage failedMessage) => Task.CompletedTask; + + public Task SaveChanges() => Task.CompletedTask; + } +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpRetryDocumentDataStore.cs b/src/ServiceControl.Persistence.Sql/NoOpRetryDocumentDataStore.cs new file mode 100644 index 0000000000..a9b4a07826 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpRetryDocumentDataStore.cs @@ -0,0 +1,41 @@ +namespace ServiceControl.Persistence.Sql; + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using ServiceControl.MessageFailures; +using ServiceControl.Persistence; +using ServiceControl.Persistence.Infrastructure; +using ServiceControl.Recoverability; + +class NoOpRetryDocumentDataStore : IRetryDocumentDataStore +{ + public Task StageRetryByUniqueMessageIds(string batchDocumentId, string[] messageIds) => Task.CompletedTask; + + public Task MoveBatchToStaging(string batchDocumentId) => Task.CompletedTask; + + public Task CreateBatchDocument(string retrySessionId, string requestId, RetryType retryType, + string[] failedMessageRetryIds, string originator, DateTime startTime, DateTime? last = null, + string batchName = null, string classifier = null) => + Task.FromResult(string.Empty); + + public Task>> QueryOrphanedBatches(string retrySessionId) => + Task.FromResult(new QueryResult>([], QueryStatsInfo.Zero)); + + public Task> QueryAvailableBatches() => + Task.FromResult>([]); + + public Task GetBatchesForAll(DateTime cutoff, Func callback) => Task.CompletedTask; + + public Task GetBatchesForEndpoint(DateTime cutoff, string endpoint, Func callback) => + Task.CompletedTask; + + public Task GetBatchesForFailedQueueAddress(DateTime cutoff, string failedQueueAddresspoint, + FailedMessageStatus status, Func callback) => Task.CompletedTask; + + public Task GetBatchesForFailureGroup(string groupId, string groupTitle, string groupType, DateTime cutoff, + Func callback) => Task.CompletedTask; + + public Task QueryFailureGroupViewOnGroupId(string groupId) => + Task.FromResult(null); +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpRetryHistoryDataStore.cs b/src/ServiceControl.Persistence.Sql/NoOpRetryHistoryDataStore.cs new file mode 100644 index 0000000000..0a1ed9240c --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpRetryHistoryDataStore.cs @@ -0,0 +1,18 @@ +namespace ServiceControl.Persistence.Sql; + +using System; +using System.Threading.Tasks; +using ServiceControl.Persistence; +using ServiceControl.Recoverability; + +class NoOpRetryHistoryDataStore : IRetryHistoryDataStore +{ + public Task GetRetryHistory() => + Task.FromResult(null); + + public Task RecordRetryOperationCompleted(string requestId, RetryType retryType, DateTime startTime, + DateTime completionTime, string originator, string classifier, bool messageFailed, + int numberOfMessagesProcessed, DateTime lastProcessed, int retryHistoryDepth) => Task.CompletedTask; + + public Task AcknowledgeRetryGroup(string groupId) => Task.FromResult(false); +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpServiceControlSubscriptionStorage.cs b/src/ServiceControl.Persistence.Sql/NoOpServiceControlSubscriptionStorage.cs new file mode 100644 index 0000000000..d398810881 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpServiceControlSubscriptionStorage.cs @@ -0,0 +1,25 @@ +namespace ServiceControl.Persistence.Sql; + +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using NServiceBus; +using NServiceBus.Extensibility; +using NServiceBus.Unicast.Subscriptions; +using NServiceBus.Unicast.Subscriptions.MessageDrivenSubscriptions; +using ServiceControl.Persistence; + +class NoOpServiceControlSubscriptionStorage : IServiceControlSubscriptionStorage +{ + public Task Initialize() => Task.CompletedTask; + + public Task Subscribe(Subscriber subscriber, MessageType messageType, ContextBag context, + CancellationToken cancellationToken) => Task.CompletedTask; + + public Task Unsubscribe(Subscriber subscriber, MessageType messageType, ContextBag context, + CancellationToken cancellationToken) => Task.CompletedTask; + + public Task> GetSubscriberAddressesForMessage(IEnumerable messageTypes, + ContextBag context, CancellationToken cancellationToken) => + Task.FromResult>([]); +} diff --git a/src/ServiceControl.Persistence.Sql/NoOpTrialLicenseDataProvider.cs b/src/ServiceControl.Persistence.Sql/NoOpTrialLicenseDataProvider.cs new file mode 100644 index 0000000000..ff80950278 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/NoOpTrialLicenseDataProvider.cs @@ -0,0 +1,16 @@ +namespace ServiceControl.Persistence.Sql; + +using System; +using System.Threading; +using System.Threading.Tasks; + +class NoOpTrialLicenseDataProvider : ITrialLicenseDataProvider +{ + static readonly DateOnly FutureDate = new DateOnly(2099, 12, 31); + + public Task GetTrialEndDate(CancellationToken cancellationToken) => + Task.FromResult(FutureDate); + + public Task StoreTrialEndDate(DateOnly trialEndDate, CancellationToken cancellationToken) => + Task.CompletedTask; +} diff --git a/src/ServiceControl.Persistence.Sql/ServiceControl.Persistence.Sql.csproj b/src/ServiceControl.Persistence.Sql/ServiceControl.Persistence.Sql.csproj new file mode 100644 index 0000000000..f509649fe9 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/ServiceControl.Persistence.Sql.csproj @@ -0,0 +1,20 @@ + + + + net8.0 + true + true + + + + + + + + + + + + + + diff --git a/src/ServiceControl.Persistence.Sql/SqlPersistence.cs b/src/ServiceControl.Persistence.Sql/SqlPersistence.cs new file mode 100644 index 0000000000..89572b4198 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/SqlPersistence.cs @@ -0,0 +1,40 @@ +namespace ServiceControl.Persistence.Sql; + +using Microsoft.Extensions.DependencyInjection; +using NServiceBus.Unicast.Subscriptions.MessageDrivenSubscriptions; +using ServiceControl.Operations.BodyStorage; +using ServiceControl.Persistence; +using ServiceControl.Persistence.MessageRedirects; +using ServiceControl.Persistence.Recoverability; + +class SqlPersistence : IPersistence +{ + public void AddPersistence(IServiceCollection services) + { + services.AddSingleton(); + services.AddSingleton(p => p.GetRequiredService()); + + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + services.AddSingleton(); + } + + public void AddInstaller(IServiceCollection services) + { + } +} diff --git a/src/ServiceControl.Persistence.Sql/persistence.manifest b/src/ServiceControl.Persistence.Sql/persistence.manifest new file mode 100644 index 0000000000..0b3210f7c4 --- /dev/null +++ b/src/ServiceControl.Persistence.Sql/persistence.manifest @@ -0,0 +1,7 @@ +{ + "Name": "Sql", + "DisplayName": "Sql", + "Description": "Sql ServiceControl persister", + "AssemblyName": "ServiceControl.Persistence.Sql", + "TypeName": "ServiceControl.Persistence.Sql.RavenPersistenceConfiguration, ServiceControl.Persistence.Sql" +} diff --git a/src/ServiceControl.sln b/src/ServiceControl.sln index fa8d9a30e6..b8a8f676c0 100644 --- a/src/ServiceControl.sln +++ b/src/ServiceControl.sln @@ -1,3 +1,4 @@ + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.0.31815.197 @@ -187,6 +188,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceControl.Hosting", "S EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SetupProcessFake", "SetupProcessFake\SetupProcessFake.csproj", "{5837F789-69B9-44BE-B114-3A2880F06CAB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServiceControl.Persistence.Sql", "ServiceControl.Persistence.Sql\ServiceControl.Persistence.Sql.csproj", "{07D7A850-3164-4C27-BE22-FD8A97C06EF3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1025,6 +1028,18 @@ Global {5837F789-69B9-44BE-B114-3A2880F06CAB}.Release|x64.Build.0 = Release|Any CPU {5837F789-69B9-44BE-B114-3A2880F06CAB}.Release|x86.ActiveCfg = Release|Any CPU {5837F789-69B9-44BE-B114-3A2880F06CAB}.Release|x86.Build.0 = Release|Any CPU + {07D7A850-3164-4C27-BE22-FD8A97C06EF3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {07D7A850-3164-4C27-BE22-FD8A97C06EF3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {07D7A850-3164-4C27-BE22-FD8A97C06EF3}.Debug|x64.ActiveCfg = Debug|Any CPU + {07D7A850-3164-4C27-BE22-FD8A97C06EF3}.Debug|x64.Build.0 = Debug|Any CPU + {07D7A850-3164-4C27-BE22-FD8A97C06EF3}.Debug|x86.ActiveCfg = Debug|Any CPU + {07D7A850-3164-4C27-BE22-FD8A97C06EF3}.Debug|x86.Build.0 = Debug|Any CPU + {07D7A850-3164-4C27-BE22-FD8A97C06EF3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {07D7A850-3164-4C27-BE22-FD8A97C06EF3}.Release|Any CPU.Build.0 = Release|Any CPU + {07D7A850-3164-4C27-BE22-FD8A97C06EF3}.Release|x64.ActiveCfg = Release|Any CPU + {07D7A850-3164-4C27-BE22-FD8A97C06EF3}.Release|x64.Build.0 = Release|Any CPU + {07D7A850-3164-4C27-BE22-FD8A97C06EF3}.Release|x86.ActiveCfg = Release|Any CPU + {07D7A850-3164-4C27-BE22-FD8A97C06EF3}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1110,6 +1125,7 @@ Global {18DBEEF5-42EE-4C1D-A05B-87B21C067D53} = {E0E45F22-35E3-4AD8-B09E-EFEA5A2F18EE} {481032A1-1106-4C6C-B75E-512F2FB08882} = {9AF9D3C7-E859-451B-BA4D-B954D289213A} {5837F789-69B9-44BE-B114-3A2880F06CAB} = {927A078A-E271-4878-A153-86D71AE510E2} + {07D7A850-3164-4C27-BE22-FD8A97C06EF3} = {9B52418E-BF18-4D25-BE17-4B56D3FB1154} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {3B9E5B72-F580-465A-A22C-2D2148AF4EB4}