diff --git a/src/Squidex.Domain.Apps.Core.Model/Freezable.cs b/src/Squidex.Domain.Apps.Core.Model/Freezable.cs index 26bfddb5e..9fc282430 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Freezable.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Freezable.cs @@ -27,7 +27,7 @@ namespace Squidex.Domain.Apps.Core } } - public void Freeze() + public virtual void Freeze() { isFrozen = true; } diff --git a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTrigger.cs b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTrigger.cs index b390fba25..147cbbee4 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTrigger.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTrigger.cs @@ -19,5 +19,18 @@ namespace Squidex.Domain.Apps.Core.Rules.Triggers { return visitor.Visit(this); } + + public override void Freeze() + { + base.Freeze(); + + if (Schemas != null) + { + foreach (var schema in Schemas) + { + schema.Freeze(); + } + } + } } } diff --git a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerSchema.cs b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerSchema.cs index f5e0bf7ea..33d073f5a 100644 --- a/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerSchema.cs +++ b/src/Squidex.Domain.Apps.Core.Model/Rules/Triggers/ContentChangedTriggerSchema.cs @@ -9,7 +9,7 @@ using System; namespace Squidex.Domain.Apps.Core.Rules.Triggers { - public sealed class ContentChangedTriggerSchema + public sealed class ContentChangedTriggerSchema : Freezable { public Guid SchemaId { get; set; } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ContentOperationContext.cs b/src/Squidex.Domain.Apps.Entities/Contents/ContentOperationContext.cs index c0bccc485..c6a8c72b3 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/ContentOperationContext.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/ContentOperationContext.cs @@ -8,7 +8,6 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Text; using System.Threading.Tasks; using Squidex.Domain.Apps.Core.EnrichContent; using Squidex.Domain.Apps.Core.Scripting; diff --git a/src/Squidex/Areas/Api/Controllers/Apps/AppClientsController.cs b/src/Squidex/Areas/Api/Controllers/Apps/AppClientsController.cs index 3606495dd..bd9b70cc3 100644 --- a/src/Squidex/Areas/Api/Controllers/Apps/AppClientsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Apps/AppClientsController.cs @@ -8,7 +8,6 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Primitives; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Apps.Models; using Squidex.Domain.Apps.Core.Apps; @@ -53,7 +52,7 @@ namespace Squidex.Areas.Api.Controllers.Apps { var response = App.Clients.Select(x => SimpleMapper.Map(x.Value, new ClientDto { Id = x.Key })).ToList(); - Response.Headers["ETag"] = new StringValues(App.Version.ToString()); + Response.Headers["ETag"] = App.Version.ToString(); return Ok(response); } diff --git a/src/Squidex/Areas/Api/Controllers/Apps/AppContributorsController.cs b/src/Squidex/Areas/Api/Controllers/Apps/AppContributorsController.cs index db305d370..aa8cd6ac7 100644 --- a/src/Squidex/Areas/Api/Controllers/Apps/AppContributorsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Apps/AppContributorsController.cs @@ -8,7 +8,6 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Primitives; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Apps.Models; using Squidex.Domain.Apps.Entities.Apps.Commands; @@ -55,7 +54,7 @@ namespace Squidex.Areas.Api.Controllers.Apps var response = new ContributorsDto { Contributors = contributors, MaxContributors = appPlansProvider.GetPlanForApp(App).MaxContributors }; - Response.Headers["ETag"] = new StringValues(App.Version.ToString()); + Response.Headers["ETag"] = App.Version.ToString(); return Ok(response); } diff --git a/src/Squidex/Areas/Api/Controllers/Apps/AppLanguagesController.cs b/src/Squidex/Areas/Api/Controllers/Apps/AppLanguagesController.cs index 55bdac37e..53dff0972 100644 --- a/src/Squidex/Areas/Api/Controllers/Apps/AppLanguagesController.cs +++ b/src/Squidex/Areas/Api/Controllers/Apps/AppLanguagesController.cs @@ -10,7 +10,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Primitives; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Apps.Models; using Squidex.Domain.Apps.Core.Apps; @@ -60,7 +59,7 @@ namespace Squidex.Areas.Api.Controllers.Apps Fallback = x.LanguageFallbacks.ToList() })).OrderByDescending(x => x.IsMaster).ThenBy(x => x.Iso2Code).ToList(); - Response.Headers["ETag"] = new StringValues(App.Version.ToString()); + Response.Headers["ETag"] = App.Version.ToString(); return Ok(response); } diff --git a/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs b/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs index 1f11f7100..f0e4c4d03 100644 --- a/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs +++ b/src/Squidex/Areas/Api/Controllers/Assets/AssetContentController.cs @@ -62,24 +62,24 @@ namespace Squidex.Areas.Api.Controllers.Assets [ApiCosts(0.5)] public async Task GetAssetContent(string app, Guid id, [FromQuery] int version = -1, [FromQuery] int? width = null, [FromQuery] int? height = null, [FromQuery] string mode = null) { - var asset = await assetRepository.FindAssetAsync(id); + var entity = await assetRepository.FindAssetAsync(id); - if (asset == null || asset.FileVersion < version || width == 0 || height == 0) + if (entity == null || entity.FileVersion < version || width == 0 || height == 0) { return NotFound(); } - var assetId = asset.Id.ToString(); + var assetId = entity.Id.ToString(); - return new FileCallbackResult(asset.MimeType, asset.FileName, async bodyStream => + return new FileCallbackResult(entity.MimeType, entity.FileName, async bodyStream => { - if (asset.IsImage && (width.HasValue || height.HasValue)) + if (entity.IsImage && (width.HasValue || height.HasValue)) { var assetSuffix = $"{width}_{height}_{mode}"; try { - await assetStorage.DownloadAsync(assetId, asset.FileVersion, assetSuffix, bodyStream); + await assetStorage.DownloadAsync(assetId, entity.FileVersion, assetSuffix, bodyStream); } catch (AssetNotFoundException) { @@ -87,13 +87,13 @@ namespace Squidex.Areas.Api.Controllers.Assets { using (var destinationStream = GetTempStream()) { - await assetStorage.DownloadAsync(assetId, asset.FileVersion, null, sourceStream); + await assetStorage.DownloadAsync(assetId, entity.FileVersion, null, sourceStream); sourceStream.Position = 0; await assetThumbnailGenerator.CreateThumbnailAsync(sourceStream, destinationStream, width, height, mode); destinationStream.Position = 0; - await assetStorage.UploadAsync(assetId, asset.FileVersion, assetSuffix, destinationStream); + await assetStorage.UploadAsync(assetId, entity.FileVersion, assetSuffix, destinationStream); destinationStream.Position = 0; await destinationStream.CopyToAsync(bodyStream); @@ -103,7 +103,7 @@ namespace Squidex.Areas.Api.Controllers.Assets } else { - await assetStorage.DownloadAsync(assetId, asset.FileVersion, null, bodyStream); + await assetStorage.DownloadAsync(assetId, entity.FileVersion, null, bodyStream); } }); } diff --git a/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs b/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs index 1c1737086..1fb894850 100644 --- a/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs @@ -12,7 +12,6 @@ using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Options; -using Microsoft.Extensions.Primitives; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Assets.Models; using Squidex.Domain.Apps.Entities.Apps.Services; @@ -104,6 +103,8 @@ namespace Squidex.Areas.Api.Controllers.Assets Items = assets.Select(x => SimpleMapper.Map(x, new AssetDto { FileType = x.FileName.FileType() })).ToArray() }; + Response.Headers["Surrogate-Key"] = string.Join(" ", response.Items.Select(x => x.Id)); + return Ok(response); } @@ -132,7 +133,8 @@ namespace Squidex.Areas.Api.Controllers.Assets var response = SimpleMapper.Map(entity, new AssetDto { FileType = entity.FileName.FileType() }); - Response.Headers["ETag"] = new StringValues(entity.Version.ToString()); + Response.Headers["ETag"] = entity.Version.ToString(); + Response.Headers["Surrogate-Key"] = entity.Id.ToString(); return Ok(response); } diff --git a/src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs b/src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs index fb8c80634..b334abd7c 100644 --- a/src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs +++ b/src/Squidex/Areas/Api/Controllers/Content/ContentsController.cs @@ -10,7 +10,6 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Primitives; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Contents.Models; using Squidex.Domain.Apps.Core.Contents; @@ -106,6 +105,8 @@ namespace Squidex.Areas.Api.Controllers.Contents }).ToArray() }; + Response.Headers["Surrogate-Key"] = string.Join(" ", response.Items.Select(x => x.Id)); + return Ok(response); } @@ -115,18 +116,19 @@ namespace Squidex.Areas.Api.Controllers.Contents [ApiCosts(1)] public async Task GetContent(string name, Guid id) { - var content = await contentQuery.FindContentAsync(App, name, User, id); + var (schema, entity) = await contentQuery.FindContentAsync(App, name, User, id); - var response = SimpleMapper.Map(content.Content, new ContentDto()); + var response = SimpleMapper.Map(entity, new ContentDto()); - if (content.Content.Data != null) + if (entity.Data != null) { var isFrontendClient = User.IsFrontendClient(); - response.Data = content.Content.Data.ToApiModel(content.Schema.SchemaDef, App.LanguagesConfig, !isFrontendClient); + response.Data = entity.Data.ToApiModel(schema.SchemaDef, App.LanguagesConfig, !isFrontendClient); } - Response.Headers["ETag"] = new StringValues(content.Content.Version.ToString()); + Response.Headers["ETag"] = entity.Version.ToString(); + Response.Headers["Surrogate-Key"] = entity.Id.ToString(); return Ok(response); } @@ -148,7 +150,7 @@ namespace Squidex.Areas.Api.Controllers.Contents response.Data = content.Content.Data.ToApiModel(content.Schema.SchemaDef, App.LanguagesConfig, !isFrontendClient); } - Response.Headers["ETag"] = new StringValues(version.ToString()); + Response.Headers["ETag"] = version.ToString(); return Ok(response.Data); } diff --git a/src/Squidex/Areas/Api/Controllers/Plans/AppPlansController.cs b/src/Squidex/Areas/Api/Controllers/Plans/AppPlansController.cs index 72e23b3cb..b0d406c9b 100644 --- a/src/Squidex/Areas/Api/Controllers/Plans/AppPlansController.cs +++ b/src/Squidex/Areas/Api/Controllers/Plans/AppPlansController.cs @@ -8,7 +8,6 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Primitives; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Plans.Models; using Squidex.Domain.Apps.Entities.Apps.Commands; @@ -65,7 +64,7 @@ namespace Squidex.Areas.Api.Controllers.Plans HasPortal = appPlansBillingManager.HasPortal }; - Response.Headers["ETag"] = new StringValues(App.Version.ToString()); + Response.Headers["ETag"] = App.Version.ToString(); return Ok(response); } diff --git a/src/Squidex/Areas/Api/Controllers/Rules/Models/Actions/AlgoliaActionDto.cs b/src/Squidex/Areas/Api/Controllers/Rules/Models/Actions/AlgoliaActionDto.cs index 38c9b1d67..e561386c9 100644 --- a/src/Squidex/Areas/Api/Controllers/Rules/Models/Actions/AlgoliaActionDto.cs +++ b/src/Squidex/Areas/Api/Controllers/Rules/Models/Actions/AlgoliaActionDto.cs @@ -5,7 +5,6 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== -using System; using System.ComponentModel.DataAnnotations; using NJsonSchema.Annotations; using Squidex.Domain.Apps.Core.Rules; diff --git a/src/Squidex/Areas/Api/Controllers/Schemas/SchemasController.cs b/src/Squidex/Areas/Api/Controllers/Schemas/SchemasController.cs index 5181db196..7118cc2a3 100644 --- a/src/Squidex/Areas/Api/Controllers/Schemas/SchemasController.cs +++ b/src/Squidex/Areas/Api/Controllers/Schemas/SchemasController.cs @@ -9,7 +9,6 @@ using System; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Primitives; using NSwag.Annotations; using Squidex.Areas.Api.Controllers.Schemas.Models; using Squidex.Areas.Api.Controllers.Schemas.Models.Converters; @@ -96,7 +95,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas var response = entity.ToDetailsModel(); - Response.Headers["ETag"] = new StringValues(entity.Version.ToString()); + Response.Headers["ETag"] = entity.Version.ToString(); return Ok(response); } diff --git a/src/Squidex/Config/Domain/StoreServices.cs b/src/Squidex/Config/Domain/StoreServices.cs index 44ac3fe22..f9b849af6 100644 --- a/src/Squidex/Config/Domain/StoreServices.cs +++ b/src/Squidex/Config/Domain/StoreServices.cs @@ -16,7 +16,6 @@ using Newtonsoft.Json; using Squidex.Domain.Apps.Entities; using Squidex.Domain.Apps.Entities.Apps.Repositories; using Squidex.Domain.Apps.Entities.Apps.State; -using Squidex.Domain.Apps.Entities.Assets.Edm; using Squidex.Domain.Apps.Entities.Assets.Repositories; using Squidex.Domain.Apps.Entities.Assets.State; using Squidex.Domain.Apps.Entities.Contents.Repositories; diff --git a/src/Squidex/Pipeline/CommandMiddlewares/ETagCommandMiddleware.cs b/src/Squidex/Pipeline/CommandMiddlewares/ETagCommandMiddleware.cs index 15960c0d2..25cbebe80 100644 --- a/src/Squidex/Pipeline/CommandMiddlewares/ETagCommandMiddleware.cs +++ b/src/Squidex/Pipeline/CommandMiddlewares/ETagCommandMiddleware.cs @@ -9,7 +9,6 @@ using System; using System.Globalization; using System.Threading.Tasks; using Microsoft.AspNetCore.Http; -using Microsoft.Extensions.Primitives; using Squidex.Infrastructure; using Squidex.Infrastructure.Commands; @@ -42,7 +41,7 @@ namespace Squidex.Pipeline.CommandMiddlewares if (context.Result() is EntitySavedResult result) { - httpContextAccessor.HttpContext.Response.Headers["ETag"] = new StringValues(result.Version.ToString()); + httpContextAccessor.HttpContext.Response.Headers["ETag"] = result.Version.ToString(); } } } diff --git a/src/Squidex/WebStartup.cs b/src/Squidex/WebStartup.cs index b2338e0ec..7632fba3a 100644 --- a/src/Squidex/WebStartup.cs +++ b/src/Squidex/WebStartup.cs @@ -6,7 +6,6 @@ // ========================================================================== using System; -using Ben.Diagnostics; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration;