diff --git a/src/Nocr.TextMatcher.Api.Contracts/TextMatches/ITextSubscriptionsController.cs b/src/Nocr.TextMatcher.Api.Contracts/TextMatches/ITextSubscriptionsController.cs
index 3fa2563..a486eff 100644
--- a/src/Nocr.TextMatcher.Api.Contracts/TextMatches/ITextSubscriptionsController.cs
+++ b/src/Nocr.TextMatcher.Api.Contracts/TextMatches/ITextSubscriptionsController.cs
@@ -24,4 +24,7 @@ public interface ITextSubscriptionsController
[Patch(WebRoutes.TextSubscriptions.Disable)]
Task Disable([Path] long id, CancellationToken cancellationToken = default);
+
+ [Patch(WebRoutes.TextSubscriptions.DeactivateAllSubscriptionsById)]
+ Task DeactivateAllSubscriptionsById([Path] long userId, CancellationToken cancellationToken = default);
}
\ No newline at end of file
diff --git a/src/Nocr.TextMatcher.Api.Contracts/WebRoutes.cs b/src/Nocr.TextMatcher.Api.Contracts/WebRoutes.cs
index e49518d..b4ebc1b 100644
--- a/src/Nocr.TextMatcher.Api.Contracts/WebRoutes.cs
+++ b/src/Nocr.TextMatcher.Api.Contracts/WebRoutes.cs
@@ -13,6 +13,8 @@ public static class WebRoutes
public const string Activate = ById + "/" + "activate";
public const string Disable = ById + "/" + "disable";
+
+ public const string DeactivateAllSubscriptionsById = "deactivate-all-subscriptions/{userId}";
public const string ById = "{id}";
}
diff --git a/src/Nocr.TextMatcher.AppServices/Nocr.TextMatcher.AppServices.csproj b/src/Nocr.TextMatcher.AppServices/Nocr.TextMatcher.AppServices.csproj
index 1ffc738..830b4c4 100644
--- a/src/Nocr.TextMatcher.AppServices/Nocr.TextMatcher.AppServices.csproj
+++ b/src/Nocr.TextMatcher.AppServices/Nocr.TextMatcher.AppServices.csproj
@@ -7,6 +7,7 @@
+
diff --git a/src/Nocr.TextMatcher.AppServices/TextSubscriptions/Repositories/ITextSubscriptionRepository.cs b/src/Nocr.TextMatcher.AppServices/TextSubscriptions/Repositories/ITextSubscriptionRepository.cs
index cb74135..c5f54a7 100644
--- a/src/Nocr.TextMatcher.AppServices/TextSubscriptions/Repositories/ITextSubscriptionRepository.cs
+++ b/src/Nocr.TextMatcher.AppServices/TextSubscriptions/Repositories/ITextSubscriptionRepository.cs
@@ -13,4 +13,6 @@ public interface ITextSubscriptionRepository
Task GetById(long id, CancellationToken cancellationToken = default);
Task Update(TextSubscription subscription, CancellationToken cancellationToken = default);
+
+ Task DeactivateAllSubscriptionsById(long userId, CancellationToken cancellationToken = default);
}
\ No newline at end of file
diff --git a/src/Nocr.TextMatcher.AppServices/TextSubscriptions/Services/ITextSubscriptionsService.cs b/src/Nocr.TextMatcher.AppServices/TextSubscriptions/Services/ITextSubscriptionsService.cs
index 237d32b..5b14d94 100644
--- a/src/Nocr.TextMatcher.AppServices/TextSubscriptions/Services/ITextSubscriptionsService.cs
+++ b/src/Nocr.TextMatcher.AppServices/TextSubscriptions/Services/ITextSubscriptionsService.cs
@@ -19,4 +19,6 @@ public interface ITextSubscriptionsService
Task> Get(CancellationToken cancellationToken = default);
Task> GetByUserId(long userId, CancellationToken cancellationToken = default);
+
+ Task DeactivateAllSubscriptionsById(long userId, CancellationToken cancellationToken = default);
}
\ No newline at end of file
diff --git a/src/Nocr.TextMatcher.AppServices/TextSubscriptions/Services/TextSubscriptionsService.cs b/src/Nocr.TextMatcher.AppServices/TextSubscriptions/Services/TextSubscriptionsService.cs
index b58ae04..cd4e51f 100644
--- a/src/Nocr.TextMatcher.AppServices/TextSubscriptions/Services/TextSubscriptionsService.cs
+++ b/src/Nocr.TextMatcher.AppServices/TextSubscriptions/Services/TextSubscriptionsService.cs
@@ -1,3 +1,4 @@
+using Microsoft.Extensions.Logging;
using Nocr.TextMatcher.Api.Contracts.TextMatches.Dto;
using Nocr.TextMatcher.AppServices.TextSubscriptions.Repositories;
using Nocr.TextMatcher.Async.Api.Contracts;
@@ -12,13 +13,15 @@ public sealed class TextSubscriptionsService : ITextSubscriptionsService
private readonly IBus _bus;
private readonly ITextSubscriptionRepository _repository;
private readonly ICurrentDateProvider _dateProvider;
+ private readonly ILogger _logger;
public TextSubscriptionsService(IBus bus, ITextSubscriptionRepository repository,
- ICurrentDateProvider dateProvider)
+ ICurrentDateProvider dateProvider, ILogger logger)
{
_bus = bus ?? throw new ArgumentNullException(nameof(bus));
_repository = repository ?? throw new ArgumentNullException(nameof(repository));
_dateProvider = dateProvider ?? throw new ArgumentNullException(nameof(dateProvider));
+ _logger = logger ?? throw new ArgumentNullException(nameof(logger));
}
public async Task Create(long userId, string chatUsername, string template, TextSubscriptionRule rule,
@@ -91,6 +94,13 @@ public sealed class TextSubscriptionsService : ITextSubscriptionsService
return matches.Select(MapToTextMatchData).ToArray();
}
+ public async Task DeactivateAllSubscriptionsById(long userId, CancellationToken cancellationToken = default)
+ {
+ _logger.LogInformation("Deactivating all subscriptions for user {UserId}", userId);
+ await _repository.DeactivateAllSubscriptionsById(userId, cancellationToken);
+ _logger.LogInformation("Successfully deactivated all subscriptions for user {UserId}", userId);
+ }
+
private TextSubscriptionData MapToTextMatchData(TextSubscription textSubscription)
{
return new TextSubscriptionData
diff --git a/src/Nocr.TextMatcher.Host/Controllers/TextSubscriptionsController.cs b/src/Nocr.TextMatcher.Host/Controllers/TextSubscriptionsController.cs
index 9ec48d5..4dba908 100644
--- a/src/Nocr.TextMatcher.Host/Controllers/TextSubscriptionsController.cs
+++ b/src/Nocr.TextMatcher.Host/Controllers/TextSubscriptionsController.cs
@@ -54,4 +54,10 @@ public class TextSubscriptionsController : ControllerBase
{
return _textSubscriptionsService.Disable(id, cancellationToken);
}
+
+ [HttpPatch(WebRoutes.TextSubscriptions.DeactivateAllSubscriptionsById)]
+ public Task DeactivateAllSubscriptionsById([FromRoute] long userId, CancellationToken cancellationToken = default)
+ {
+ return _textSubscriptionsService.DeactivateAllSubscriptionsById(userId, cancellationToken);
+ }
}
\ No newline at end of file
diff --git a/src/Nocr.TextMatcher.Persistence/TextSubscriptions/TextSubscriptionRepository.cs b/src/Nocr.TextMatcher.Persistence/TextSubscriptions/TextSubscriptionRepository.cs
index 7d7f0fd..eaaf2bf 100644
--- a/src/Nocr.TextMatcher.Persistence/TextSubscriptions/TextSubscriptionRepository.cs
+++ b/src/Nocr.TextMatcher.Persistence/TextSubscriptions/TextSubscriptionRepository.cs
@@ -46,4 +46,11 @@ public sealed class TextSubscriptionRepository : ITextSubscriptionRepository
_db.TextSubscriptions.Update(subscription);
await _db.SaveChangesAsync(cancellationToken);
}
+
+ public async Task DeactivateAllSubscriptionsById(long userId, CancellationToken cancellationToken = default)
+ {
+ await _db.TextSubscriptions
+ .Where(x => x.UserId == userId && x.Active)
+ .ExecuteUpdateAsync(x => x.SetProperty(s => s.Active, false), cancellationToken);
+ }
}
\ No newline at end of file