// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Orleans; using Squidex.Areas.Api.Controllers.Backups.Models; using Squidex.Domain.Apps.Entities.Backup; using Squidex.Infrastructure; using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Tasks; using Squidex.Shared; using Squidex.Web; namespace Squidex.Areas.Api.Controllers.Backups { /// /// Manages backups for apps. /// [ApiExplorerSettings(GroupName = nameof(Backups))] public class BackupsController : ApiController { private readonly IGrainFactory grainFactory; public BackupsController(ICommandBus commandBus, IGrainFactory grainFactory) : base(commandBus) { this.grainFactory = grainFactory; } /// /// Get all backup jobs. /// /// The name of the app. /// /// 200 => Backups returned. /// 404 => App not found. /// [HttpGet] [Route("apps/{app}/backups/")] [ProducesResponseType(typeof(List), 200)] [ApiPermission(Permissions.AppBackupsRead)] [ApiCosts(0)] public async Task GetJobs(string app) { var backupGrain = grainFactory.GetGrain(AppId); var jobs = await backupGrain.GetStateAsync(); var response = jobs.Value.ToArray(BackupJobDto.FromBackup); return Ok(response); } /// /// Start a new backup. /// /// The name of the app. /// /// 204 => Backup started. /// 404 => App not found. /// [HttpPost] [Route("apps/{app}/backups/")] [ProducesResponseType(typeof(List), 200)] [ApiPermission(Permissions.AppBackupsCreate)] [ApiCosts(0)] public IActionResult PostBackup(string app) { var backupGrain = grainFactory.GetGrain(AppId); backupGrain.RunAsync().Forget(); return NoContent(); } /// /// Delete a backup. /// /// The name of the app. /// The id of the backup to delete. /// /// 204 => Backup started. /// 404 => Backup or app not found. /// [HttpDelete] [Route("apps/{app}/backups/{id}")] [ProducesResponseType(typeof(List), 200)] [ApiPermission(Permissions.AppBackupsDelete)] [ApiCosts(0)] public async Task DeleteBackup(string app, Guid id) { var backupGrain = grainFactory.GetGrain(AppId); await backupGrain.DeleteAsync(id); return NoContent(); } } }