Browse Source

Unified some cleaners.

pull/309/head
Sebastian 8 years ago
parent
commit
63fa6b8b02
  1. 8
      src/Squidex.Domain.Apps.Entities/AppGrainCleaner.cs
  2. 19
      src/Squidex.Domain.Apps.Entities/Backup/AppCleanerGrain.cs
  3. 13
      src/Squidex.Domain.Apps.Entities/Backup/BackupGrain.cs
  4. 4
      src/Squidex.Domain.Apps.Entities/Backup/EnqueueAppToCleanerMiddleware.cs
  5. 2
      src/Squidex.Domain.Apps.Entities/Backup/IAppCleanerGrain.cs
  6. 3
      src/Squidex.Domain.Apps.Entities/Backup/IBackupGrain.cs
  7. 17
      src/Squidex.Domain.Apps.Entities/ICleanableAppGrain.cs
  8. 2
      src/Squidex.Domain.Apps.Entities/ICleanableAppStorage.cs
  9. 5
      src/Squidex.Domain.Apps.Entities/Rules/Indexes/IRulesByAppIndex.cs
  10. 31
      src/Squidex.Domain.Apps.Entities/Rules/Indexes/RuleIndexCleaner.cs
  11. 5
      src/Squidex.Domain.Apps.Entities/Schemas/Indexes/ISchemasByAppIndex.cs
  12. 2
      src/Squidex.Domain.Apps.Entities/Tags/GrainTagService.cs
  13. 16
      src/Squidex/Config/Domain/EntitiesServices.cs
  14. 2
      src/Squidex/Config/Orleans/SiloWrapper.cs
  15. 14
      tests/Squidex.Domain.Apps.Entities.Tests/AppGrainCleanerTests.cs
  16. 4
      tests/Squidex.Domain.Apps.Entities.Tests/Backup/EnqueueAppToCleanerMiddlewareTests.cs
  17. 40
      tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemaIndexCleanerTests.cs

8
src/Squidex.Domain.Apps.Entities/Schemas/Indexes/SchemaIndexCleaner.cs → src/Squidex.Domain.Apps.Entities/AppGrainCleaner.cs

@ -10,13 +10,13 @@ using System.Threading.Tasks;
using Orleans; using Orleans;
using Squidex.Infrastructure; using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Entities.Schemas.Indexes namespace Squidex.Domain.Apps.Entities
{ {
public sealed class SchemaIndexCleaner : IAppStorage public sealed class AppGrainCleaner<T> : ICleanableAppStorage where T : ICleanableAppGrain
{ {
private readonly IGrainFactory grainFactory; private readonly IGrainFactory grainFactory;
public SchemaIndexCleaner(IGrainFactory grainFactory) public AppGrainCleaner(IGrainFactory grainFactory)
{ {
Guard.NotNull(grainFactory, nameof(grainFactory)); Guard.NotNull(grainFactory, nameof(grainFactory));
@ -25,7 +25,7 @@ namespace Squidex.Domain.Apps.Entities.Schemas.Indexes
public Task ClearAsync(Guid appId) public Task ClearAsync(Guid appId)
{ {
return grainFactory.GetGrain<ISchemasByAppIndex>(appId).ClearAsync(); return grainFactory.GetGrain<T>(appId).ClearAsync();
} }
} }
} }

19
src/Squidex.Domain.Apps.Entities/Backup/CleanerGrain.cs → src/Squidex.Domain.Apps.Entities/Backup/AppCleanerGrain.cs

@ -21,16 +21,17 @@ using Squidex.Infrastructure;
using Squidex.Infrastructure.EventSourcing; using Squidex.Infrastructure.EventSourcing;
using Squidex.Infrastructure.Orleans; using Squidex.Infrastructure.Orleans;
using Squidex.Infrastructure.States; using Squidex.Infrastructure.States;
using Squidex.Infrastructure.Tasks;
namespace Squidex.Domain.Apps.Entities.Backup namespace Squidex.Domain.Apps.Entities.Backup
{ {
[Reentrant] [Reentrant]
public sealed class CleanerGrain : GrainOfString, IRemindable, ICleanerGrain public sealed class AppCleanerGrain : GrainOfString, IRemindable, IAppCleanerGrain
{ {
private readonly IGrainFactory grainFactory; private readonly IGrainFactory grainFactory;
private readonly IStore<Guid> store; private readonly IStore<Guid> store;
private readonly IEventStore eventStore; private readonly IEventStore eventStore;
private readonly IEnumerable<IAppStorage> storages; private readonly IEnumerable<ICleanableAppStorage> storages;
private IPersistence<State> persistence; private IPersistence<State> persistence;
private bool isCleaning; private bool isCleaning;
private State state = new State(); private State state = new State();
@ -43,7 +44,7 @@ namespace Squidex.Domain.Apps.Entities.Backup
public HashSet<Guid> PendingApps { get; set; } = new HashSet<Guid>(); public HashSet<Guid> PendingApps { get; set; } = new HashSet<Guid>();
} }
public CleanerGrain(IGrainFactory grainFactory, IEventStore eventStore, IStore<Guid> store, IEnumerable<IAppStorage> storages) public AppCleanerGrain(IGrainFactory grainFactory, IEventStore eventStore, IStore<Guid> store, IEnumerable<ICleanableAppStorage> storages)
{ {
Guard.NotNull(grainFactory, nameof(grainFactory)); Guard.NotNull(grainFactory, nameof(grainFactory));
Guard.NotNull(store, nameof(store)); Guard.NotNull(store, nameof(store));
@ -60,9 +61,9 @@ namespace Squidex.Domain.Apps.Entities.Backup
public async override Task OnActivateAsync(string key) public async override Task OnActivateAsync(string key)
{ {
await RegisterOrUpdateReminder("Default", TimeSpan.Zero, TimeSpan.FromMinutes(10)); await RegisterOrUpdateReminder("Default", TimeSpan.Zero, TimeSpan.FromMinutes(2));
persistence = store.WithSnapshots<CleanerGrain, State, Guid>(Guid.Empty, s => persistence = store.WithSnapshots<AppCleanerGrain, State, Guid>(Guid.Empty, s =>
{ {
state = s; state = s;
}); });
@ -81,12 +82,16 @@ namespace Squidex.Domain.Apps.Entities.Backup
public Task ActivateAsync() public Task ActivateAsync()
{ {
return CleanAsync(); CleanAsync().Forget();
return TaskHelper.Done;
} }
public Task ReceiveReminder(string reminderName, TickStatus status) public Task ReceiveReminder(string reminderName, TickStatus status)
{ {
return CleanAsync(); CleanAsync().Forget();
return TaskHelper.Done;
} }
private async Task CleanAsync() private async Task CleanAsync()

13
src/Squidex.Domain.Apps.Entities/Backup/BackupGrain.cs

@ -84,6 +84,19 @@ namespace Squidex.Domain.Apps.Entities.Backup
await CleanupAsync(); await CleanupAsync();
} }
public async Task ClearAsync()
{
foreach (var job in state.Jobs)
{
await CleanupArchiveAsync(job);
await CleanupBackupAsync(job);
}
state = new BackupState();
await persistence.DeleteAsync();
}
private async Task ReadAsync() private async Task ReadAsync()
{ {
await persistence.ReadAsync(); await persistence.ReadAsync();

4
src/Squidex.Domain.Apps.Entities/Backup/EnqueueAppToCleanerMiddleware.cs

@ -17,13 +17,13 @@ namespace Squidex.Domain.Apps.Entities.Backup
{ {
public sealed class EnqueueAppToCleanerMiddleware : ICommandMiddleware public sealed class EnqueueAppToCleanerMiddleware : ICommandMiddleware
{ {
private readonly ICleanerGrain cleaner; private readonly IAppCleanerGrain cleaner;
public EnqueueAppToCleanerMiddleware(IGrainFactory grainFactory) public EnqueueAppToCleanerMiddleware(IGrainFactory grainFactory)
{ {
Guard.NotNull(grainFactory, nameof(grainFactory)); Guard.NotNull(grainFactory, nameof(grainFactory));
cleaner = grainFactory.GetGrain<ICleanerGrain>(SingleGrain.Id); cleaner = grainFactory.GetGrain<IAppCleanerGrain>(SingleGrain.Id);
} }
public async Task HandleAsync(CommandContext context, Func<Task> next) public async Task HandleAsync(CommandContext context, Func<Task> next)

2
src/Squidex.Domain.Apps.Entities/Backup/ICleanerGrain.cs → src/Squidex.Domain.Apps.Entities/Backup/IAppCleanerGrain.cs

@ -11,7 +11,7 @@ using Squidex.Infrastructure.Orleans;
namespace Squidex.Domain.Apps.Entities.Backup namespace Squidex.Domain.Apps.Entities.Backup
{ {
public interface ICleanerGrain : IBackgroundGrain public interface IAppCleanerGrain : IBackgroundGrain
{ {
Task EnqueueAppAsync(Guid appId); Task EnqueueAppAsync(Guid appId);
} }

3
src/Squidex.Domain.Apps.Entities/Backup/IBackupGrain.cs

@ -8,12 +8,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Orleans;
using Squidex.Infrastructure.Orleans; using Squidex.Infrastructure.Orleans;
namespace Squidex.Domain.Apps.Entities.Backup namespace Squidex.Domain.Apps.Entities.Backup
{ {
public interface IBackupGrain : IGrainWithGuidKey public interface IBackupGrain : ICleanableAppGrain
{ {
Task RunAsync(); Task RunAsync();

17
src/Squidex.Domain.Apps.Entities/ICleanableAppGrain.cs

@ -0,0 +1,17 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Threading.Tasks;
using Orleans;
namespace Squidex.Domain.Apps.Entities
{
public interface ICleanableAppGrain : IGrainWithGuidKey
{
Task ClearAsync();
}
}

2
src/Squidex.Domain.Apps.Entities/IAppStorage.cs → src/Squidex.Domain.Apps.Entities/ICleanableAppStorage.cs

@ -10,7 +10,7 @@ using System.Threading.Tasks;
namespace Squidex.Domain.Apps.Entities namespace Squidex.Domain.Apps.Entities
{ {
public interface IAppStorage public interface ICleanableAppStorage
{ {
Task ClearAsync(Guid appId); Task ClearAsync(Guid appId);
} }

5
src/Squidex.Domain.Apps.Entities/Rules/Indexes/IRulesByAppIndex.cs

@ -8,11 +8,10 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Orleans;
namespace Squidex.Domain.Apps.Entities.Rules namespace Squidex.Domain.Apps.Entities.Rules
{ {
public interface IRulesByAppIndex : IGrainWithGuidKey public interface IRulesByAppIndex : ICleanableAppGrain
{ {
Task AddRuleAsync(Guid ruleId); Task AddRuleAsync(Guid ruleId);
@ -20,8 +19,6 @@ namespace Squidex.Domain.Apps.Entities.Rules
Task RebuildAsync(HashSet<Guid> rules); Task RebuildAsync(HashSet<Guid> rules);
Task ClearAsync();
Task<List<Guid>> GetRuleIdsAsync(); Task<List<Guid>> GetRuleIdsAsync();
} }
} }

31
src/Squidex.Domain.Apps.Entities/Rules/Indexes/RuleIndexCleaner.cs

@ -1,31 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System;
using System.Threading.Tasks;
using Orleans;
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Entities.Rules.Indexes
{
public sealed class RuleIndexCleaner : IAppStorage
{
private readonly IGrainFactory grainFactory;
public RuleIndexCleaner(IGrainFactory grainFactory)
{
Guard.NotNull(grainFactory, nameof(grainFactory));
this.grainFactory = grainFactory;
}
public Task ClearAsync(Guid appId)
{
return grainFactory.GetGrain<IRulesByAppIndex>(appId).ClearAsync();
}
}
}

5
src/Squidex.Domain.Apps.Entities/Schemas/Indexes/ISchemasByAppIndex.cs

@ -8,18 +8,15 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Orleans;
namespace Squidex.Domain.Apps.Entities.Schemas namespace Squidex.Domain.Apps.Entities.Schemas
{ {
public interface ISchemasByAppIndex : IGrainWithGuidKey public interface ISchemasByAppIndex : ICleanableAppGrain
{ {
Task AddSchemaAsync(Guid schemaId, string name); Task AddSchemaAsync(Guid schemaId, string name);
Task RemoveSchemaAsync(Guid schemaId); Task RemoveSchemaAsync(Guid schemaId);
Task ClearAsync();
Task RebuildAsync(Dictionary<string, Guid> schemas); Task RebuildAsync(Dictionary<string, Guid> schemas);
Task<Guid> GetSchemaIdAsync(string name); Task<Guid> GetSchemaIdAsync(string name);

2
src/Squidex.Domain.Apps.Entities/Tags/GrainTagService.cs

@ -13,7 +13,7 @@ using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Entities.Tags namespace Squidex.Domain.Apps.Entities.Tags
{ {
public sealed class GrainTagService : ITagService, IAppStorage public sealed class GrainTagService : ITagService, ICleanableAppStorage
{ {
private readonly IGrainFactory grainFactory; private readonly IGrainFactory grainFactory;

16
src/Squidex/Config/Domain/EntitiesServices.cs

@ -52,8 +52,7 @@ namespace Squidex.Config.Domain
c.GetRequiredService<IOptions<MyUrlsOptions>>(), c.GetRequiredService<IOptions<MyUrlsOptions>>(),
c.GetRequiredService<IAssetStore>(), c.GetRequiredService<IAssetStore>(),
exposeSourceUrl)) exposeSourceUrl))
.As<IGraphQLUrlGenerator>() .As<IGraphQLUrlGenerator>().As<IRuleUrlGenerator>();
.As<IRuleUrlGenerator>();
services.AddSingletonAs<CachingGraphQLService>() services.AddSingletonAs<CachingGraphQLService>()
.As<IGraphQLService>(); .As<IGraphQLService>();
@ -86,7 +85,7 @@ namespace Squidex.Config.Domain
.AsSelf(); .AsSelf();
services.AddSingletonAs<GrainTagService>() services.AddSingletonAs<GrainTagService>()
.As<ITagService>().As<IAppStorage>(); .As<ITagService>().As<ICleanableAppStorage>();
services.AddSingletonAs<FileTypeTagGenerator>() services.AddSingletonAs<FileTypeTagGenerator>()
.As<ITagGenerator<CreateAsset>>(); .As<ITagGenerator<CreateAsset>>();
@ -94,11 +93,14 @@ namespace Squidex.Config.Domain
services.AddSingletonAs<ImageTagGenerator>() services.AddSingletonAs<ImageTagGenerator>()
.As<ITagGenerator<CreateAsset>>(); .As<ITagGenerator<CreateAsset>>();
services.AddSingletonAs<RuleIndexCleaner>() services.AddSingletonAs<AppGrainCleaner<IBackupGrain>>()
.As<IAppStorage>(); .As<ICleanableAppStorage>();
services.AddSingletonAs<SchemaIndexCleaner>() services.AddSingletonAs<AppGrainCleaner<IRulesByAppIndex>>()
.As<IAppStorage>(); .As<ICleanableAppStorage>();
services.AddSingletonAs<AppGrainCleaner<ISchemasByAppIndex>>()
.As<ICleanableAppStorage>();
services.AddSingletonAs<JintScriptEngine>() services.AddSingletonAs<JintScriptEngine>()
.As<IScriptEngine>(); .As<IScriptEngine>();

2
src/Squidex/Config/Orleans/SiloWrapper.cs

@ -15,6 +15,7 @@ using Orleans;
using Orleans.Configuration; using Orleans.Configuration;
using Orleans.Hosting; using Orleans.Hosting;
using Squidex.Config.Domain; using Squidex.Config.Domain;
using Squidex.Domain.Apps.Entities.Backup;
using Squidex.Domain.Apps.Entities.Contents; using Squidex.Domain.Apps.Entities.Contents;
using Squidex.Domain.Apps.Entities.Rules; using Squidex.Domain.Apps.Entities.Rules;
using Squidex.Infrastructure; using Squidex.Infrastructure;
@ -62,6 +63,7 @@ namespace Squidex.Config.Orleans
.EnableDirectClient() .EnableDirectClient()
.AddIncomingGrainCallFilter<LocalCacheFilter>() .AddIncomingGrainCallFilter<LocalCacheFilter>()
.AddStartupTask<Bootstrap<IContentSchedulerGrain>>() .AddStartupTask<Bootstrap<IContentSchedulerGrain>>()
.AddStartupTask<Bootstrap<IAppCleanerGrain>>()
.AddStartupTask<Bootstrap<IEventConsumerManagerGrain>>() .AddStartupTask<Bootstrap<IEventConsumerManagerGrain>>()
.AddStartupTask<Bootstrap<IRuleDequeuerGrain>>() .AddStartupTask<Bootstrap<IRuleDequeuerGrain>>()
.AddStartupTask((services, ct) => .AddStartupTask((services, ct) =>

14
tests/Squidex.Domain.Apps.Entities.Tests/Rules/Indexes/RuleIndexCleanerTests.cs → tests/Squidex.Domain.Apps.Entities.Tests/AppGrainCleanerTests.cs

@ -11,21 +11,21 @@ using FakeItEasy;
using Orleans; using Orleans;
using Xunit; using Xunit;
namespace Squidex.Domain.Apps.Entities.Rules.Indexes namespace Squidex.Domain.Apps.Entities
{ {
public class RuleIndexCleanerTests public class AppGrainCleanerTests
{ {
private readonly IGrainFactory grainFactory = A.Fake<IGrainFactory>(); private readonly IGrainFactory grainFactory = A.Fake<IGrainFactory>();
private readonly IRulesByAppIndex index = A.Fake<IRulesByAppIndex>(); private readonly ICleanableAppGrain index = A.Fake<ICleanableAppGrain>();
private readonly Guid appId = Guid.NewGuid(); private readonly Guid appId = Guid.NewGuid();
private readonly RuleIndexCleaner sut; private readonly AppGrainCleaner<ICleanableAppGrain> sut;
public RuleIndexCleanerTests() public AppGrainCleanerTests()
{ {
A.CallTo(() => grainFactory.GetGrain<IRulesByAppIndex>(appId, null)) A.CallTo(() => grainFactory.GetGrain<ICleanableAppGrain>(appId, null))
.Returns(index); .Returns(index);
sut = new RuleIndexCleaner(grainFactory); sut = new AppGrainCleaner<ICleanableAppGrain>(grainFactory);
} }
[Fact] [Fact]

4
tests/Squidex.Domain.Apps.Entities.Tests/Backup/EnqueueAppToCleanerMiddlewareTests.cs

@ -20,13 +20,13 @@ namespace Squidex.Domain.Apps.Entities.Backup
{ {
private readonly IGrainFactory grainFactory = A.Fake<IGrainFactory>(); private readonly IGrainFactory grainFactory = A.Fake<IGrainFactory>();
private readonly ICommandBus commandBus = A.Fake<ICommandBus>(); private readonly ICommandBus commandBus = A.Fake<ICommandBus>();
private readonly ICleanerGrain index = A.Fake<ICleanerGrain>(); private readonly IAppCleanerGrain index = A.Fake<IAppCleanerGrain>();
private readonly Guid appId = Guid.NewGuid(); private readonly Guid appId = Guid.NewGuid();
private readonly EnqueueAppToCleanerMiddleware sut; private readonly EnqueueAppToCleanerMiddleware sut;
public EnqueueAppToCleanerMiddlewareTests() public EnqueueAppToCleanerMiddlewareTests()
{ {
A.CallTo(() => grainFactory.GetGrain<ICleanerGrain>(SingleGrain.Id, null)) A.CallTo(() => grainFactory.GetGrain<IAppCleanerGrain>(SingleGrain.Id, null))
.Returns(index); .Returns(index);
sut = new EnqueueAppToCleanerMiddleware(grainFactory); sut = new EnqueueAppToCleanerMiddleware(grainFactory);

40
tests/Squidex.Domain.Apps.Entities.Tests/Schemas/Indexes/SchemaIndexCleanerTests.cs

@ -1,40 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System;
using System.Threading.Tasks;
using FakeItEasy;
using Orleans;
using Xunit;
namespace Squidex.Domain.Apps.Entities.Schemas.Indexes
{
public class SchemaIndexCleanerTests
{
private readonly IGrainFactory grainFactory = A.Fake<IGrainFactory>();
private readonly ISchemasByAppIndex index = A.Fake<ISchemasByAppIndex>();
private readonly Guid appId = Guid.NewGuid();
private readonly SchemaIndexCleaner sut;
public SchemaIndexCleanerTests()
{
A.CallTo(() => grainFactory.GetGrain<ISchemasByAppIndex>(appId, null))
.Returns(index);
sut = new SchemaIndexCleaner(grainFactory);
}
[Fact]
public async Task Should_forward_to_index()
{
await sut.ClearAsync(appId);
A.CallTo(() => index.ClearAsync())
.MustHaveHappened();
}
}
}
Loading…
Cancel
Save