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