diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs
index fb2f3128a..f8089380b 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs
@@ -61,7 +61,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
/// The name of the app.
/// The id or slug of the asset.
/// Optional suffix that can be used to seo-optimize the link to the image Has not effect.
- /// The query string parameters.
+ /// The request parameters.
///
/// 200 => Asset found and content or (resized) image returned.
/// 404 => Asset or app not found.
@@ -72,7 +72,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
[ApiPermission]
[ApiCosts(0.5)]
[AllowAnonymous]
- public async Task GetAssetContentBySlug(string app, string idOrSlug, [FromQuery] AssetContentQueryDto queries, string? more = null)
+ public async Task GetAssetContentBySlug(string app, string idOrSlug, AssetContentQueryDto request, string? more = null)
{
var requestContext = Context.Clone(b => b.WithoutAssetEnrichment());
@@ -83,14 +83,14 @@ namespace Squidex.Areas.Api.Controllers.Assets
asset = await assetQuery.FindBySlugAsync(requestContext, idOrSlug);
}
- return await DeliverAssetAsync(requestContext, asset, queries);
+ return await DeliverAssetAsync(requestContext, asset, request);
}
///
/// Get the asset content.
///
/// The id of the asset.
- /// The query string parameters.
+ /// The request parameters.
///
/// 200 => Asset found and content or (resized) image returned.
/// 404 => Asset or app not found.
@@ -102,18 +102,18 @@ namespace Squidex.Areas.Api.Controllers.Assets
[ApiCosts(0.5)]
[AllowAnonymous]
[Obsolete("Use overload with app name")]
- public async Task GetAssetContent(DomainId id, [FromQuery] AssetContentQueryDto queries)
+ public async Task GetAssetContent(DomainId id, AssetContentQueryDto request)
{
var requestContext = Context.Clone(b => b.WithoutAssetEnrichment());
var asset = await assetQuery.FindGlobalAsync(requestContext, id);
- return await DeliverAssetAsync(requestContext, asset, queries);
+ return await DeliverAssetAsync(requestContext, asset, request);
}
- private async Task DeliverAssetAsync(Context context, IAssetEntity? asset, AssetContentQueryDto queries)
+ private async Task DeliverAssetAsync(Context context, IAssetEntity? asset, AssetContentQueryDto request)
{
- queries ??= new AssetContentQueryDto();
+ request ??= new AssetContentQueryDto();
if (asset == null)
{
@@ -127,16 +127,16 @@ namespace Squidex.Areas.Api.Controllers.Assets
return StatusCode(403);
}
- if (asset != null && queries.Version > EtagVersion.Any && asset.Version != queries.Version)
+ if (asset != null && request.Version > EtagVersion.Any && asset.Version != request.Version)
{
if (context.App != null)
{
- asset = await assetQuery.FindAsync(context, asset.Id, queries.Version);
+ asset = await assetQuery.FindAsync(context, asset.Id, request.Version);
}
else
{
// Fallback for old endpoint. Does not set the surrogate key.
- asset = await assetLoader.GetAsync(asset.AppId.Id, asset.Id, queries.Version);
+ asset = await assetLoader.GetAsync(asset.AppId.Id, asset.Id, request.Version);
}
}
@@ -145,15 +145,15 @@ namespace Squidex.Areas.Api.Controllers.Assets
return NotFound();
}
- var resizeOptions = queries.ToResizeOptions(asset);
+ var resizeOptions = request.ToResizeOptions(asset);
FileCallback callback;
Response.Headers[HeaderNames.ETag] = asset.FileVersion.ToString();
- if (queries.CacheDuration > 0)
+ if (request.CacheDuration > 0)
{
- Response.Headers[HeaderNames.CacheControl] = $"public,max-age={queries.CacheDuration}";
+ Response.Headers[HeaderNames.CacheControl] = $"public,max-age={request.CacheDuration}";
}
var contentLength = (long?)null;
@@ -164,7 +164,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
{
var resizedAsset = $"{asset.AppId.Id}_{asset.Id}_{asset.FileVersion}_{resizeOptions}";
- if (queries.ForceResize)
+ if (request.ForceResize)
{
await ResizeAsync(asset, bodyStream, resizedAsset, resizeOptions, true, ct);
}
@@ -198,7 +198,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
FileDownloadName = asset.FileName,
FileSize = contentLength,
LastModified = asset.LastModified.ToDateTimeOffset(),
- SendInline = queries.Download != 1
+ SendInline = request.Download != 1
};
}
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetFoldersController.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetFoldersController.cs
index d2946bd01..b477f991a 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetFoldersController.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetFoldersController.cs
@@ -68,7 +68,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
}
///
- /// Upload a new asset.
+ /// Create an asset folder.
///
/// The name of the app.
/// The asset folder object that needs to be added to the App.
@@ -79,7 +79,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
///
[HttpPost]
[Route("apps/{app}/assets/folders", Order = -1)]
- [ProducesResponseType(typeof(AssetDto), 201)]
+ [ProducesResponseType(typeof(AssetFolderDto), 201)]
[AssetRequestSizeLimit]
[ApiPermissionOrAnonymous(Permissions.AppAssetsUpdate)]
[ApiCosts(1)]
@@ -93,7 +93,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
}
///
- /// Updates the asset folder.
+ /// Update an asset folder.
///
/// The name of the app.
/// The id of the asset folder.
@@ -105,7 +105,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
///
[HttpPut]
[Route("apps/{app}/assets/folders/{id}/", Order = -1)]
- [ProducesResponseType(typeof(AssetDto), StatusCodes.Status200OK)]
+ [ProducesResponseType(typeof(AssetFolderDto), StatusCodes.Status200OK)]
[AssetRequestSizeLimit]
[ApiPermissionOrAnonymous(Permissions.AppAssetsUpdate)]
[ApiCosts(1)]
@@ -119,7 +119,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
}
///
- /// Moves the asset folder.
+ /// Move an asset folder.
///
/// The name of the app.
/// The id of the asset folder.
@@ -131,7 +131,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
///
[HttpPut]
[Route("apps/{app}/assets/folders/{id}/parent", Order = -1)]
- [ProducesResponseType(typeof(AssetDto), StatusCodes.Status200OK)]
+ [ProducesResponseType(typeof(AssetFolderDto), StatusCodes.Status200OK)]
[AssetRequestSizeLimit]
[ApiPermissionOrAnonymous(Permissions.AppAssetsUpdate)]
[ApiCosts(1)]
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs
index eb0385bd4..13f9e978d 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs
@@ -172,10 +172,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
/// Upload a new asset.
///
/// The name of the app.
- /// The optional parent folder id.
- /// The file to upload.
- /// The optional custom asset id.
- /// True to duplicate the asset, event if the file has been uploaded.
+ /// The request parameters.
///
/// 201 => Asset created.
/// 400 => Asset request not valid.
@@ -191,16 +188,9 @@ namespace Squidex.Areas.Api.Controllers.Assets
[AssetRequestSizeLimit]
[ApiPermissionOrAnonymous(Permissions.AppAssetsCreate)]
[ApiCosts(1)]
- public async Task PostAsset(string app, [FromQuery] DomainId parentId, IFormFile file, [FromQuery] DomainId? id = null, [FromQuery] bool duplicate = false)
+ public async Task PostAsset(string app, CreateAssetDto request)
{
- var assetFile = await CheckAssetFileAsync(file);
-
- var command = new CreateAsset { File = assetFile, ParentId = parentId, Duplicate = duplicate };
-
- if (id != null && id.Value != default && !string.IsNullOrWhiteSpace(id.Value.ToString()))
- {
- command.AssetId = id.Value;
- }
+ var command = request.ToCommand(await CheckAssetFileAsync(request.File));
var response = await InvokeCommandAsync(command);
@@ -238,9 +228,8 @@ namespace Squidex.Areas.Api.Controllers.Assets
/// Upsert an asset.
///
/// The name of the app.
- /// The optional parent folder id.
- /// The file to upload.
/// The optional custom asset id.
+ /// The request parameters.
///
/// 200 => Asset created or updated.
/// 400 => Asset request not valid.
@@ -256,11 +245,9 @@ namespace Squidex.Areas.Api.Controllers.Assets
[AssetRequestSizeLimit]
[ApiPermissionOrAnonymous(Permissions.AppAssetsCreate)]
[ApiCosts(1)]
- public async Task PostUpsertAsset(string app, DomainId id, [FromQuery] DomainId? parentId, IFormFile file)
+ public async Task PostUpsertAsset(string app, DomainId id, UpsertAssetDto request)
{
- var assetFile = await CheckAssetFileAsync(file);
-
- var command = new UpsertAsset { File = assetFile, ParentId = parentId, AssetId = id };
+ var command = request.ToCommand(id, await CheckAssetFileAsync(request.File));
var response = await InvokeCommandAsync(command);
@@ -289,9 +276,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
[ApiCosts(1)]
public async Task PutAssetContent(string app, DomainId id, IFormFile file)
{
- var assetFile = await CheckAssetFileAsync(file);
-
- var command = new UpdateAsset { File = assetFile, AssetId = id };
+ var command = new UpdateAsset { File = await CheckAssetFileAsync(file), AssetId = id };
var response = await InvokeCommandAsync(command);
@@ -299,7 +284,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
}
///
- /// Updates the asset.
+ /// Update an asset.
///
/// The name of the app.
/// The id of the asset.
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/CreateAssetDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/CreateAssetDto.cs
new file mode 100644
index 000000000..987dff51a
--- /dev/null
+++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/CreateAssetDto.cs
@@ -0,0 +1,60 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschraenkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Squidex.Assets;
+using Squidex.Domain.Apps.Entities.Assets.Commands;
+using Squidex.Infrastructure;
+using Squidex.Infrastructure.Reflection;
+
+namespace Squidex.Areas.Api.Controllers.Assets.Models
+{
+ public sealed class CreateAssetDto
+ {
+ ///
+ /// The file to upload.
+ ///
+ public IFormFile File { get; set; }
+
+ ///
+ /// The optional parent folder id.
+ ///
+ [FromQuery]
+ public DomainId ParentId { get; set; }
+
+ ///
+ /// The optional path to the parent folder.
+ ///
+ [FromQuery]
+ public string? ParentPath { get; set; }
+
+ ///
+ /// The optional custom asset id.
+ ///
+ [FromQuery]
+ public DomainId? Id { get; set; }
+
+ ///
+ /// True to duplicate the asset, event if the file has been uploaded.
+ ///
+ [FromQuery]
+ public bool Duplicate { get; set; }
+
+ public CreateAsset ToCommand(AssetFile file)
+ {
+ var command = SimpleMapper.Map(this, new CreateAsset { File = file });
+
+ if (Id != null && Id.Value != default && !string.IsNullOrWhiteSpace(Id.Value.ToString()))
+ {
+ command.AssetId = Id.Value;
+ }
+
+ return command;
+ }
+ }
+}
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/UpsertAssetDto.cs b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/UpsertAssetDto.cs
new file mode 100644
index 000000000..b737bb04a
--- /dev/null
+++ b/backend/src/Squidex/Areas/Api/Controllers/Assets/Models/UpsertAssetDto.cs
@@ -0,0 +1,47 @@
+// ==========================================================================
+// Squidex Headless CMS
+// ==========================================================================
+// Copyright (c) Squidex UG (haftungsbeschraenkt)
+// All rights reserved. Licensed under the MIT license.
+// ==========================================================================
+
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Squidex.Assets;
+using Squidex.Domain.Apps.Entities.Assets.Commands;
+using Squidex.Infrastructure;
+using Squidex.Infrastructure.Reflection;
+
+namespace Squidex.Areas.Api.Controllers.Assets.Models
+{
+ public sealed class UpsertAssetDto
+ {
+ ///
+ /// The file to upload.
+ ///
+ public IFormFile File { get; set; }
+
+ ///
+ /// The optional parent folder id.
+ ///
+ [FromQuery]
+ public DomainId ParentId { get; set; }
+
+ ///
+ /// The optional path to the parent folder.
+ ///
+ [FromQuery]
+ public string? ParentPath { get; set; }
+
+ ///
+ /// True to duplicate the asset, event if the file has been uploaded.
+ ///
+ [FromQuery]
+ public bool Duplicate { get; set; }
+
+ public UpsertAsset ToCommand(DomainId id, AssetFile file)
+ {
+ return SimpleMapper.Map(this, new UpsertAsset { File = file, AssetId = id });
+ }
+ }
+}
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Comments/CommentsController.cs b/backend/src/Squidex/Areas/Api/Controllers/Comments/CommentsController.cs
index f3f71616b..7cf6909a3 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Comments/CommentsController.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Comments/CommentsController.cs
@@ -93,7 +93,7 @@ namespace Squidex.Areas.Api.Controllers.Comments
}
///
- /// Updates the comment.
+ /// Update a comment.
///
/// The name of the app.
/// The id of the comments.
@@ -118,7 +118,7 @@ namespace Squidex.Areas.Api.Controllers.Comments
}
///
- /// Deletes the comment.
+ /// Delete a comment.
///
/// The name of the app.
/// The id of the comments.
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Comments/Notifications/UserNotificationsController.cs b/backend/src/Squidex/Areas/Api/Controllers/Comments/Notifications/UserNotificationsController.cs
index 6244c397b..d91202abb 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Comments/Notifications/UserNotificationsController.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Comments/Notifications/UserNotificationsController.cs
@@ -67,7 +67,7 @@ namespace Squidex.Areas.Api.Controllers.Comments.Notifications
}
///
- /// Deletes the notification.
+ /// Delete a notification.
///
/// The user id.
/// The id of the comment.
diff --git a/backend/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs b/backend/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs
index 33cceda86..59e3c5e0e 100644
--- a/backend/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs
+++ b/backend/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs
@@ -107,7 +107,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas
}
///
- /// Reorders the fields.
+ /// Reorder all fields.
///
/// The name of the app.
/// The name of the schema.
@@ -132,7 +132,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas
}
///
- /// Reorders the nested fields.
+ /// Reorder all nested fields.
///
/// The name of the app.
/// The name of the schema.