diff --git a/src/Squidex/Areas/Api/Controllers/Backups/BackupsContentController.cs b/src/Squidex/Areas/Api/Controllers/Backups/BackupsContentController.cs
new file mode 100644
index 000000000..b30d59f88
--- /dev/null
+++ b/src/Squidex/Areas/Api/Controllers/Backups/BackupsContentController.cs
@@ -0,0 +1,55 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschraenkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using System;
+using Microsoft.AspNetCore.Mvc;
+using NSwag.Annotations;
+using Squidex.Infrastructure.Assets;
+using Squidex.Infrastructure.Commands;
+using Squidex.Pipeline;
+
+namespace Squidex.Areas.Api.Controllers.Backups
+{
+ ///
+ /// Manages backups for app.
+ ///
+ [ApiAuthorize]
+ [ApiExceptionFilter]
+ [AppApi]
+ [SwaggerTag(nameof(Backups))]
+ public class BackupsContentController : ApiController
+ {
+ private readonly IAssetStore assetStore;
+
+ public BackupsContentController(ICommandBus commandBus, IAssetStore assetStore)
+ : base(commandBus)
+ {
+ this.assetStore = assetStore;
+ }
+
+ ///
+ /// Get the backup content.
+ ///
+ /// The name of the app.
+ /// The id of the asset.
+ ///
+ /// 200 => Backup found and content returned.
+ /// 404 => Backup or app not found.
+ ///
+ [HttpGet]
+ [Route("apps/{app}/backups/{id}")]
+ [ProducesResponseType(200)]
+ [ApiCosts(0)]
+ public IActionResult GetBackupContent(string app, Guid id)
+ {
+ return new FileCallbackResult("application/zip", "Backup.zip", bodyStream =>
+ {
+ return assetStore.DownloadAsync(id.ToString(), 0, null, bodyStream);
+ });
+ }
+ }
+}
diff --git a/src/Squidex/Areas/Api/Controllers/Backup/BackupController.cs b/src/Squidex/Areas/Api/Controllers/Backups/BackupsController.cs
similarity index 73%
rename from src/Squidex/Areas/Api/Controllers/Backup/BackupController.cs
rename to src/Squidex/Areas/Api/Controllers/Backups/BackupsController.cs
index f4991ceec..4ee26d183 100644
--- a/src/Squidex/Areas/Api/Controllers/Backup/BackupController.cs
+++ b/src/Squidex/Areas/Api/Controllers/Backups/BackupsController.cs
@@ -12,15 +12,14 @@ using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using NSwag.Annotations;
using Orleans;
-using Squidex.Areas.Api.Controllers.Backup.Models;
+using Squidex.Areas.Api.Controllers.Backups.Models;
using Squidex.Domain.Apps.Entities.Backup;
-using Squidex.Infrastructure.Assets;
using Squidex.Infrastructure.Commands;
using Squidex.Infrastructure.Reflection;
using Squidex.Infrastructure.Tasks;
using Squidex.Pipeline;
-namespace Squidex.Areas.Api.Controllers.Backup
+namespace Squidex.Areas.Api.Controllers.Backups
{
///
/// Manages backups for app.
@@ -29,17 +28,15 @@ namespace Squidex.Areas.Api.Controllers.Backup
[ApiExceptionFilter]
[AppApi]
[MustBeAppOwner]
- [SwaggerTag(nameof(Backup))]
- public class BackupController : ApiController
+ [SwaggerTag(nameof(Backups))]
+ public class BackupsController : ApiController
{
private readonly IGrainFactory grainFactory;
- private readonly IAssetStore assetStore;
- public BackupController(ICommandBus commandBus, IGrainFactory grainFactory, IAssetStore assetStore)
+ public BackupsController(ICommandBus commandBus, IGrainFactory grainFactory)
: base(commandBus)
{
this.grainFactory = grainFactory;
- this.assetStore = assetStore;
}
///
@@ -84,24 +81,6 @@ namespace Squidex.Areas.Api.Controllers.Backup
return NoContent();
}
- ///
- /// Get the backup content.
- ///
- /// The name of the app.
- /// The id of the asset.
- ///
- /// 200 => Backup found and content returned.
- /// 404 => Backup or app not found.
- ///
- [HttpGet]
- [Route("apps/{app}/backups/{id}")]
- [ProducesResponseType(200)]
- [ApiCosts(0.5)]
- public IActionResult GetBackupContent(string app, Guid id)
- {
- return new FileCallbackResult("application/zip", "Backup.zip", bodyStream => assetStore.DownloadAsync(id.ToString(), 0, null, bodyStream));
- }
-
///
/// Delete a backup.
///
diff --git a/src/Squidex/Areas/Api/Controllers/Backup/Models/BackupJobDto.cs b/src/Squidex/Areas/Api/Controllers/Backups/Models/BackupJobDto.cs
similarity index 68%
rename from src/Squidex/Areas/Api/Controllers/Backup/Models/BackupJobDto.cs
rename to src/Squidex/Areas/Api/Controllers/Backups/Models/BackupJobDto.cs
index a7dd12f07..87ca7fefc 100644
--- a/src/Squidex/Areas/Api/Controllers/Backup/Models/BackupJobDto.cs
+++ b/src/Squidex/Areas/Api/Controllers/Backups/Models/BackupJobDto.cs
@@ -6,33 +6,40 @@
// ==========================================================================
using System;
-using System.ComponentModel.DataAnnotations;
using NodaTime;
-namespace Squidex.Areas.Api.Controllers.Backup.Models
+namespace Squidex.Areas.Api.Controllers.Backups.Models
{
public sealed class BackupJobDto
{
///
/// The id of the backup job.
///
- [Required]
public Guid Id { get; set; }
///
/// The time when the job has been started.
///
- [Required]
public Instant Started { get; set; }
///
/// The time when the job has been stopped.
///
- public Instant? Stopped { get; }
+ public Instant? Stopped { get; set; }
+
+ ///
+ /// The number of handled events.
+ ///
+ public int HandledEvents { get; set; }
+
+ ///
+ /// The number of handled assets.
+ ///
+ public int HandledAssets { get; set; }
///
/// Indicates if the job has failed.
///
- public bool Failed { get; }
+ public bool IsFailed { get; set; }
}
}
diff --git a/src/Squidex/app/features/settings/pages/backups/backups-page.component.html b/src/Squidex/app/features/settings/pages/backups/backups-page.component.html
index fdeb85a57..766a8807c 100644
--- a/src/Squidex/app/features/settings/pages/backups/backups-page.component.html
+++ b/src/Squidex/app/features/settings/pages/backups/backups-page.component.html
@@ -1,10 +1,10 @@
-
+