Browse Source

A lot of cleanup operations.

pull/311/head
Sebastian 7 years ago
parent
commit
b0f2951cac
  1. 5
      src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEventRepository.cs
  2. 13
      src/Squidex.Domain.Apps.Entities/Apps/Indexes/AppsByNameIndexGrain.cs
  3. 2
      src/Squidex.Domain.Apps.Entities/Backup/BackupReader.cs
  4. 2
      src/Squidex.Domain.Apps.Entities/Backup/BackupWriter.cs
  5. 2
      src/Squidex.Domain.Apps.Entities/Backup/IRestoreJob.cs
  6. 25
      src/Squidex.Domain.Apps.Entities/Backup/RestoreGrain.cs
  7. 2
      src/Squidex.Domain.Apps.Entities/Backup/State/RestoreStateJob.cs
  8. 11
      src/Squidex.Domain.Apps.Entities/Rules/BackupRules.cs
  9. 2
      src/Squidex.Domain.Apps.Entities/Rules/Repositories/IRuleEventRepository.cs
  10. 2
      src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreJobDto.cs
  11. 1
      src/Squidex/Areas/Api/Controllers/Backups/RestoreController.cs
  12. 6
      src/Squidex/app/features/apps/pages/restore-page.component.html
  13. 8
      src/Squidex/app/features/apps/pages/restore-page.component.scss
  14. 6
      src/Squidex/app/features/apps/pages/restore-page.component.ts

5
src/Squidex.Domain.Apps.Entities.MongoDb/Rules/MongoRuleEventRepository.cs

@ -65,6 +65,11 @@ namespace Squidex.Domain.Apps.Entities.MongoDb.Rules
return ruleEvent;
}
public Task RemoveAsync(Guid appId)
{
return Collection.DeleteManyAsync(x => x.AppId == appId);
}
public async Task<int> CountByAppAsync(Guid appId)
{
return (int)await Collection.CountDocumentsAsync(x => x.AppId == appId);

13
src/Squidex.Domain.Apps.Entities/Apps/Indexes/AppsByNameIndexGrain.cs

@ -83,12 +83,23 @@ namespace Squidex.Domain.Apps.Entities.Apps.Indexes
{
state.Apps[name] = appId;
reservedIds.Remove(appId);
reservedNames.Remove(name);
return persistence.WriteSnapshotAsync(state);
}
public Task RemoveAppAsync(Guid appId)
{
state.Apps.Remove(state.Apps.FirstOrDefault(x => x.Value == appId).Key ?? string.Empty);
var name = state.Apps.FirstOrDefault(x => x.Value == appId).Key;
if (!string.IsNullOrWhiteSpace(name))
{
state.Apps.Remove(name);
reservedIds.Remove(appId);
reservedNames.Remove(name);
}
return persistence.WriteSnapshotAsync(state);
}

2
src/Squidex.Domain.Apps.Entities/Backup/BackupReader.cs

@ -35,7 +35,7 @@ namespace Squidex.Domain.Apps.Entities.Backup
public BackupReader(Stream stream)
{
archive = new ZipArchive(stream, ZipArchiveMode.Read, true);
archive = new ZipArchive(stream, ZipArchiveMode.Read, false);
}
protected override void DisposeObject(bool disposing)

2
src/Squidex.Domain.Apps.Entities/Backup/BackupWriter.cs

@ -35,7 +35,7 @@ namespace Squidex.Domain.Apps.Entities.Backup
public BackupWriter(Stream stream)
{
archive = new ZipArchive(stream, ZipArchiveMode.Update, true);
archive = new ZipArchive(stream, ZipArchiveMode.Create, false);
}
protected override void DisposeObject(bool disposing)

2
src/Squidex.Domain.Apps.Entities/Backup/IRestoreJob.cs

@ -13,7 +13,7 @@ namespace Squidex.Domain.Apps.Entities.Backup
{
public interface IRestoreJob
{
Uri Uri { get; }
Uri Url { get; }
Instant Started { get; }

25
src/Squidex.Domain.Apps.Entities/Backup/RestoreGrain.cs

@ -122,7 +122,7 @@ namespace Squidex.Domain.Apps.Entities.Backup
Id = Guid.NewGuid(),
Started = clock.GetCurrentInstant(),
Status = JobStatus.Started,
Uri = url
Url = url
};
Process();
@ -151,7 +151,7 @@ namespace Squidex.Domain.Apps.Entities.Backup
.WriteProperty("action", "restore")
.WriteProperty("status", "started")
.WriteProperty("operationId", CurrentJob.Id.ToString())
.WriteProperty("url", CurrentJob.Uri.ToString()));
.WriteProperty("url", CurrentJob.Url.ToString()));
using (Profiler.Trace("Download"))
{
@ -195,7 +195,7 @@ namespace Squidex.Domain.Apps.Entities.Backup
w.WriteProperty("action", "restore");
w.WriteProperty("status", "completed");
w.WriteProperty("operationId", CurrentJob.Id.ToString());
w.WriteProperty("url", CurrentJob.Uri.ToString());
w.WriteProperty("url", CurrentJob.Url.ToString());
Profiler.Session?.Write(w);
});
@ -220,7 +220,7 @@ namespace Squidex.Domain.Apps.Entities.Backup
w.WriteProperty("action", "retore");
w.WriteProperty("status", "failed");
w.WriteProperty("operationId", CurrentJob.Id.ToString());
w.WriteProperty("url", CurrentJob.Uri.ToString());
w.WriteProperty("url", CurrentJob.Url.ToString());
Profiler.Session?.Write(w);
});
@ -253,13 +253,15 @@ namespace Squidex.Domain.Apps.Entities.Backup
{
Log("Downloading Backup");
await backupArchiveLocation.DownloadAsync(CurrentJob.Uri, CurrentJob.Id);
await backupArchiveLocation.DownloadAsync(CurrentJob.Url, CurrentJob.Id);
Log("Downloaded Backup");
}
private async Task ReadEventsAsync(BackupReader reader)
{
var isOwnerAdded = false;
await reader.ReadEventsAsync(async (storedEvent) =>
{
var @event = eventDataFormatter.Parse(storedEvent.Data);
@ -275,13 +277,24 @@ namespace Squidex.Domain.Apps.Entities.Backup
await CheckCleanupStatus();
}
else if (@event.Payload is AppContributorAssigned appContributorAssigned)
{
if (!isOwnerAdded)
{
isOwnerAdded = true;
appContributorAssigned.ContributorId = actor.Identifier;
}
}
foreach (var handler in handlers)
{
await handler.RestoreEventAsync(@event, CurrentJob.AppId, reader);
}
await eventStore.AppendAsync(Guid.NewGuid(), storedEvent.StreamName, new List<EventData> { storedEvent.Data });
var eventData = eventDataFormatter.ToEventData(@event, @event.Headers.CommitId());
await eventStore.AppendAsync(Guid.NewGuid(), storedEvent.StreamName, new List<EventData> { eventData });
Log($"Read {reader.ReadEvents} events and {reader.ReadAttachments} attachments.", true);
});

2
src/Squidex.Domain.Apps.Entities/Backup/State/RestoreStateJob.cs

@ -21,7 +21,7 @@ namespace Squidex.Domain.Apps.Entities.Backup.State
public Guid AppId { get; set; }
[JsonProperty]
public Uri Uri { get; set; }
public Uri Url { get; set; }
[JsonProperty]
public Instant Started { get; set; }

11
src/Squidex.Domain.Apps.Entities/Rules/BackupRules.cs

@ -11,6 +11,7 @@ using System.Threading.Tasks;
using Orleans;
using Squidex.Domain.Apps.Entities.Backup;
using Squidex.Domain.Apps.Entities.Rules.Indexes;
using Squidex.Domain.Apps.Entities.Rules.Repositories;
using Squidex.Domain.Apps.Entities.Rules.State;
using Squidex.Domain.Apps.Events.Rules;
using Squidex.Infrastructure;
@ -24,20 +25,24 @@ namespace Squidex.Domain.Apps.Entities.Rules
{
private readonly HashSet<Guid> ruleIds = new HashSet<Guid>();
private readonly IGrainFactory grainFactory;
private readonly IRuleEventRepository ruleEventRepository;
public override string Name { get; } = "Rules";
public BackupRules(IStore<Guid> store, IGrainFactory grainFactory)
public BackupRules(IStore<Guid> store, IGrainFactory grainFactory, IRuleEventRepository ruleEventRepository)
: base(store)
{
Guard.NotNull(grainFactory, nameof(grainFactory));
Guard.NotNull(ruleEventRepository, nameof(ruleEventRepository));
this.grainFactory = grainFactory;
this.ruleEventRepository = ruleEventRepository;
}
public override async Task RemoveAsync(Guid appId)
{
var index = grainFactory.GetGrain<IRulesByAppIndex>(appId);
await grainFactory.GetGrain<IRulesByAppIndex>(appId).ClearAsync();
var idsToRemove = await grainFactory.GetGrain<IRulesByAppIndex>(appId).GetRuleIdsAsync();
@ -46,7 +51,7 @@ namespace Squidex.Domain.Apps.Entities.Rules
await RemoveSnapshotAsync<RuleState>(ruleId);
}
await index.ClearAsync();
await ruleEventRepository.RemoveAsync(appId);
}
public override Task RestoreEventAsync(Envelope<IEvent> @event, Guid appId, BackupReader reader)

2
src/Squidex.Domain.Apps.Entities/Rules/Repositories/IRuleEventRepository.cs

@ -25,6 +25,8 @@ namespace Squidex.Domain.Apps.Entities.Rules.Repositories
Task QueryPendingAsync(Instant now, Func<IRuleEventEntity, Task> callback, CancellationToken ct = default(CancellationToken));
Task RemoveAsync(Guid appId);
Task<int> CountByAppAsync(Guid appId);
Task<IReadOnlyList<IRuleEventEntity>> QueryByAppAsync(Guid appId, int skip = 0, int take = 20);

2
src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreJobDto.cs

@ -20,7 +20,7 @@ namespace Squidex.Areas.Api.Controllers.Backups.Models
/// The uri to load from.
/// </summary>
[Required]
public Uri Uri { get; set; }
public Uri Url { get; set; }
/// <summary>
/// The status log.

1
src/Squidex/Areas/Api/Controllers/Backups/RestoreController.cs

@ -13,7 +13,6 @@ using Squidex.Areas.Api.Controllers.Backups.Models;
using Squidex.Domain.Apps.Entities.Backup;
using Squidex.Infrastructure.Commands;
using Squidex.Infrastructure.Security;
using Squidex.Infrastructure.Tasks;
using Squidex.Pipeline;
namespace Squidex.Areas.Api.Controllers.Backups

6
src/Squidex/app/features/apps/pages/restore-page.component.html

@ -20,6 +20,10 @@
<div class="col">
<h3>Last Restore Operation</h3>
</div>
<div class="col text-right restore-url">
{{job.url}}
</div>
</div>
</div>
<div class="card-body">
@ -27,7 +31,7 @@
{{row}}
</div>
</div>
<div class="card-footer">
<div class="card-footer text-muted">
<div class="row">
<div class="col">
Started: {{job.started | sqxISODate}}

8
src/Squidex/app/features/apps/pages/restore-page.component.scss

@ -22,6 +22,10 @@ h3 {
}
}
&-footer {
font-size: .9rem;
}
&-body {
font-family: monospace;
background: $color-border;
@ -56,4 +60,8 @@ h3 {
background: $color-theme-green;
}
}
&-url {
line-height: 30px;
}
}

6
src/Squidex/app/features/apps/pages/restore-page.component.ts

@ -43,9 +43,11 @@ export class RestorePageComponent implements OnDestroy, OnInit {
public ngOnInit() {
this.timerSubscription =
timer(0, 1000).pipe(switchMap(() => this.backupsService.getRestore()))
timer(0, 2000).pipe(switchMap(() => this.backupsService.getRestore()))
.subscribe(dto => {
this.restoreJob = dto;
if (dto !== null) {
this.restoreJob = dto;
}
});
}

Loading…
Cancel
Save