diff --git a/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs b/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs
index b7bd86d8e..65dd776eb 100644
--- a/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs
+++ b/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs
@@ -8,6 +8,7 @@
using System;
using System.IO;
using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Net.Http.Headers;
using Squidex.Domain.Apps.Entities.Assets;
@@ -47,7 +48,8 @@ namespace Squidex.Areas.Api.Controllers.Assets
///
/// Get the asset content.
///
- /// The id of the asset.
+ /// 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 optional version of the asset.
/// The target width of the asset, if it is an image.
@@ -59,17 +61,27 @@ namespace Squidex.Areas.Api.Controllers.Assets
/// 404 => Asset or app not found.
///
[HttpGet]
- [Route("assets/{id}/{*more}")]
+ [Route("assets/{app}/{idOrSlug}/{*more}")]
[ProducesResponseType(typeof(FileResult), 200)]
[ApiCosts(0.5)]
- public async Task GetAssetContent(Guid id, string more,
+ [AllowAnonymous]
+ public async Task GetAssetContentBySlug(string app, string idOrSlug, string more,
[FromQuery] long version = EtagVersion.Any,
[FromQuery] int? width = null,
[FromQuery] int? height = null,
[FromQuery] int? quality = null,
[FromQuery] string mode = null)
{
- var entity = await assetRepository.FindAssetAsync(id);
+ IAssetEntity entity;
+
+ if (Guid.TryParse(idOrSlug, out var guid))
+ {
+ entity = await assetRepository.FindAssetAsync(guid);
+ }
+ else
+ {
+ entity = await assetRepository.FindAssetBySlugAsync(App.Id, idOrSlug);
+ }
return DeliverAsset(entity, version, width, height, quality, mode);
}
@@ -77,8 +89,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
///
/// Get the asset content.
///
- /// The name of the app.
- /// The id or slug of the asset.
+ /// The id of the asset.
/// Optional suffix that can be used to seo-optimize the link to the image Has not effect.
/// The optional version of the asset.
/// The target width of the asset, if it is an image.
@@ -90,26 +101,17 @@ namespace Squidex.Areas.Api.Controllers.Assets
/// 404 => Asset or app not found.
///
[HttpGet]
- [Route("assets/{app}/{idOrSlug}/{*more}")]
+ [Route("assets/{id}/{*more}")]
[ProducesResponseType(typeof(FileResult), 200)]
[ApiCosts(0.5)]
- public async Task GetAssetContent(string app, string idOrSlug, string more,
+ public async Task GetAssetContent(Guid id, string more,
[FromQuery] long version = EtagVersion.Any,
[FromQuery] int? width = null,
[FromQuery] int? height = null,
[FromQuery] int? quality = null,
[FromQuery] string mode = null)
{
- IAssetEntity entity;
-
- if (Guid.TryParse(idOrSlug, out var guid))
- {
- entity = await assetRepository.FindAssetAsync(guid);
- }
- else
- {
- entity = await assetRepository.FindAssetBySlugAsync(App.Id, idOrSlug);
- }
+ var entity = await assetRepository.FindAssetAsync(id);
return DeliverAsset(entity, version, width, height, quality, mode);
}
diff --git a/src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs b/src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs
index 7c0546ae5..737c0c395 100644
--- a/src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs
+++ b/src/Squidex/Areas/Frontend/Middlewares/WebpackMiddleware.cs
@@ -25,28 +25,25 @@ namespace Squidex.Areas.Frontend.Middlewares
public async Task Invoke(HttpContext context)
{
- if (context.IsIndex())
+ if (context.IsIndex() && context.Response.StatusCode != 304)
{
- if (context.Response.StatusCode != 304)
+ using (var client = new HttpClient())
{
- using (var client = new HttpClient())
- {
- var result = await client.GetAsync(WebpackUrl);
+ var result = await client.GetAsync(WebpackUrl);
- context.Response.StatusCode = (int)result.StatusCode;
+ context.Response.StatusCode = (int)result.StatusCode;
- if (result.IsSuccessStatusCode)
- {
- var html = await result.Content.ReadAsStringAsync();
+ if (result.IsSuccessStatusCode)
+ {
+ var html = await result.Content.ReadAsStringAsync();
- html = AdjustBase(html, context.Request.PathBase);
+ html = AdjustBase(html, context.Request.PathBase);
- await context.Response.WriteHtmlAsync(html);
- }
+ await context.Response.WriteHtmlAsync(html);
}
}
}
- else if (context.IsHtmlPath())
+ else if (context.IsHtmlPath() && context.Response.StatusCode != 304)
{
var responseBuffer = new MemoryStream();
var responseBody = context.Response.Body;
diff --git a/src/Squidex/app/framework/state.ts b/src/Squidex/app/framework/state.ts
index dbb773df2..eb5827147 100644
--- a/src/Squidex/app/framework/state.ts
+++ b/src/Squidex/app/framework/state.ts
@@ -71,7 +71,9 @@ export class Form {
if (this.form.valid) {
const value = this.transformSubmit(fullValue(this.form));
- this.disable();
+ if (value) {
+ this.disable();
+ }
return value;
} else {
diff --git a/src/Squidex/app/shared/state/assets.forms.ts b/src/Squidex/app/shared/state/assets.forms.ts
index 7d711093a..115433fad 100644
--- a/src/Squidex/app/shared/state/assets.forms.ts
+++ b/src/Squidex/app/shared/state/assets.forms.ts
@@ -57,6 +57,7 @@ export class AnnotateAssetForm extends Form