// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using Microsoft.AspNetCore.Mvc; using Squidex.Areas.Api.Controllers.Backups.Models; using Squidex.Domain.Apps.Entities.Backup; using Squidex.Infrastructure; using Squidex.Infrastructure.Commands; using Squidex.Infrastructure.Security; 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 IBackupService backupService; public BackupsController(ICommandBus commandBus, IBackupService backupService) : base(commandBus) { this.backupService = backupService; } /// /// Get all backup jobs. /// /// The name of the app. /// /// 200 => Backups returned. /// 404 => App not found. /// [HttpGet] [Route("apps/{app}/backups/")] [ProducesResponseType(typeof(BackupJobsDto), StatusCodes.Status200OK)] [ApiPermissionOrAnonymous(Permissions.AppBackupsRead)] [ApiCosts(0)] public async Task GetBackups(string app) { var jobs = await backupService.GetBackupsAsync(AppId, HttpContext.RequestAborted); var response = BackupJobsDto.FromDomain(jobs, Resources); return Ok(response); } /// /// Start a new backup. /// /// The name of the app. /// /// 204 => Backup started. /// 400 => Backup contingent reached. /// 404 => App not found. /// [HttpPost] [Route("apps/{app}/backups/")] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] [ApiPermissionOrAnonymous(Permissions.AppBackupsCreate)] [ApiCosts(0)] public IActionResult PostBackup(string app) { backupService.StartBackupAsync(App.Id, User.Token()!).Forget(); return NoContent(); } /// /// Delete a backup. /// /// The name of the app. /// The id of the backup to delete. /// /// 204 => Backup deleted. /// 404 => Backup or app not found. /// [HttpDelete] [Route("apps/{app}/backups/{id}")] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] [ApiPermissionOrAnonymous(Permissions.AppBackupsDelete)] [ApiCosts(0)] public async Task DeleteBackup(string app, DomainId id) { await backupService.DeleteBackupAsync(AppId, id, HttpContext.RequestAborted); return NoContent(); } } }