Browse Source

Gallery (#855)

* Remove app templates.

* Refactoring and new service.

* Many fixes.

* Added missing files.
pull/857/head
Sebastian Stehle 4 years ago
committed by GitHub
parent
commit
a72d238e30
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 48
      backend/extensions/Squidex.Extensions/Samples/Middleware/TemplateInstance.cs
  2. 63
      backend/extensions/Squidex.Extensions/Samples/Middleware/TemplateMiddleware.cs
  3. 25
      backend/extensions/Squidex.Extensions/Samples/Middleware/TemplatePlugin.cs
  4. 3
      backend/i18n/frontend_en.json
  5. 3
      backend/i18n/frontend_it.json
  6. 3
      backend/i18n/frontend_nl.json
  7. 3
      backend/i18n/frontend_zh.json
  8. 3
      backend/i18n/source/frontend_en.json
  9. 2
      backend/src/Squidex.Domain.Apps.Entities/Apps/AlwaysCreateClientCommandMiddleware.cs
  10. 144
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ArrayFieldBuilder.cs
  11. 20
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/AssetFieldBuilder.cs
  12. 20
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/BooleanFieldBuilder.cs
  13. 20
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ComponentFieldBuilder.cs
  14. 20
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ComponentsFieldBuilder.cs
  15. 20
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/DateTimeFieldBuilder.cs
  16. 97
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/FieldBuilder.cs
  17. 20
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/JsonFieldBuilder.cs
  18. 20
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/NumberFieldBuilder.cs
  19. 20
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ReferencesFieldBuilder.cs
  20. 203
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/SchemaBuilder.cs
  21. 20
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/StringFieldBuilder.cs
  22. 20
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/TagsFieldBuilder.cs
  23. 20
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/UIFieldBuilder.cs
  24. 127
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlog.cs
  25. 269
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateProfile.cs
  26. 29
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/DefaultScripts.cs
  27. 7
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Template.cs
  28. 49
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplateCommandMiddleware.cs
  29. 69
      backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplatesClient.cs
  30. 14
      backend/src/Squidex.Web/Resource.cs
  31. 2
      backend/src/Squidex/Areas/Api/Controllers/Apps/AppAssetsController.cs
  32. 2
      backend/src/Squidex/Areas/Api/Controllers/Apps/AppLanguagesController.cs
  33. 2
      backend/src/Squidex/Areas/Api/Controllers/Apps/AppRolesController.cs
  34. 2
      backend/src/Squidex/Areas/Api/Controllers/Apps/AppSettingsController.cs
  35. 6
      backend/src/Squidex/Areas/Api/Controllers/Apps/AppsController.cs
  36. 2
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppDto.cs
  37. 2
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguageDto.cs
  38. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguagesDto.cs
  39. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppSettingsDto.cs
  40. 2
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AssetScriptsDto.cs
  41. 2
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorDto.cs
  42. 2
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorsDto.cs
  43. 5
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateAppDto.cs
  44. 6
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/EditorDto.cs
  45. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternDto.cs
  46. 2
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RoleDto.cs
  47. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RolesDto.cs
  48. 4
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowDto.cs
  49. 14
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowStepDto.cs
  50. 6
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowTransitionDto.cs
  51. 2
      backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowsDto.cs
  52. 4
      backend/src/Squidex/Areas/Api/Controllers/Assets/AssetFoldersController.cs
  53. 12
      backend/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs
  54. 44
      backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetDto.cs
  55. 18
      backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFolderDto.cs
  56. 18
      backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFoldersDto.cs
  57. 20
      backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetsDto.cs
  58. 2
      backend/src/Squidex/Areas/Api/Controllers/Backups/BackupsController.cs
  59. 2
      backend/src/Squidex/Areas/Api/Controllers/Backups/Models/BackupJobDto.cs
  60. 4
      backend/src/Squidex/Areas/Api/Controllers/Backups/Models/BackupJobsDto.cs
  61. 2
      backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreJobDto.cs
  62. 2
      backend/src/Squidex/Areas/Api/Controllers/Backups/RestoreController.cs
  63. 2
      backend/src/Squidex/Areas/Api/Controllers/BulkResultDto.cs
  64. 4
      backend/src/Squidex/Areas/Api/Controllers/Comments/CommentsController.cs
  65. 8
      backend/src/Squidex/Areas/Api/Controllers/Comments/Models/CommentDto.cs
  66. 14
      backend/src/Squidex/Areas/Api/Controllers/Comments/Models/CommentsDto.cs
  67. 2
      backend/src/Squidex/Areas/Api/Controllers/Comments/Notifications/UserNotificationsController.cs
  68. 10
      backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs
  69. 4
      backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentDto.cs
  70. 4
      backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsDto.cs
  71. 6
      backend/src/Squidex/Areas/Api/Controllers/Contents/Models/StatusInfoDto.cs
  72. 8
      backend/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs
  73. 2
      backend/src/Squidex/Areas/Api/Controllers/EventConsumers/Models/EventConsumerDto.cs
  74. 4
      backend/src/Squidex/Areas/Api/Controllers/EventConsumers/Models/EventConsumersDto.cs
  75. 2
      backend/src/Squidex/Areas/Api/Controllers/History/HistoryController.cs
  76. 6
      backend/src/Squidex/Areas/Api/Controllers/History/Models/HistoryEventDto.cs
  77. 6
      backend/src/Squidex/Areas/Api/Controllers/LanguageDto.cs
  78. 2
      backend/src/Squidex/Areas/Api/Controllers/Languages/LanguagesController.cs
  79. 2
      backend/src/Squidex/Areas/Api/Controllers/Plans/AppPlansController.cs
  80. 8
      backend/src/Squidex/Areas/Api/Controllers/Plans/Models/AppPlansDto.cs
  81. 6
      backend/src/Squidex/Areas/Api/Controllers/Plans/Models/PlanDto.cs
  82. 2
      backend/src/Squidex/Areas/Api/Controllers/Rules/Models/Converters/RuleTriggerDtoFactory.cs
  83. 2
      backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleDto.cs
  84. 2
      backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleElementDto.cs
  85. 2
      backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleEventDto.cs
  86. 4
      backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleEventsDto.cs
  87. 2
      backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RulesDto.cs
  88. 2
      backend/src/Squidex/Areas/Api/Controllers/Rules/Models/SimulatedRuleEventDto.cs
  89. 4
      backend/src/Squidex/Areas/Api/Controllers/Rules/Models/SimulatedRuleEventsDto.cs
  90. 6
      backend/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedRuleTriggerSchemaDto.cs
  91. 8
      backend/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs
  92. 6
      backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldDto.cs
  93. 2
      backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldRuleDto.cs
  94. 6
      backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaDto.cs
  95. 4
      backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemasDto.cs
  96. 2
      backend/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs
  97. 6
      backend/src/Squidex/Areas/Api/Controllers/Schemas/SchemasController.cs
  98. 14
      backend/src/Squidex/Areas/Api/Controllers/Search/Models/SearchResultDto.cs
  99. 2
      backend/src/Squidex/Areas/Api/Controllers/Search/SearchController.cs
  100. 4
      backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/CallsUsageDtoDto.cs

48
backend/extensions/Squidex.Extensions/Samples/Middleware/TemplateInstance.cs

@ -1,48 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Apps.Templates;
using Squidex.Domain.Apps.Entities.Apps.Templates.Builders;
namespace Squidex.Extensions.Samples.Middleware
{
public class TemplateInstance : ITemplate
{
public string Name { get; } = "custom2";
public Task RunAsync(PublishTemplate publish)
{
var schema =
SchemaBuilder.Create("Blogs")
.AddString("Title", f => f
.Properties(p => p with
{
MaxLength = 100
})
.Required())
.AddString("Slug", f => f
.Properties(p => p with
{
MaxLength = 100
})
.Required()
.Disabled())
.AddString("Text", f => f
.Properties(p => p with
{
Editor = StringFieldEditor.RichText,
MaxLength = 1000,
MinLength = 200
})
.Required())
.Build();
return publish(schema);
}
}
}

63
backend/extensions/Squidex.Extensions/Samples/Middleware/TemplateMiddleware.cs

@ -1,63 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities;
using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Domain.Apps.Entities.Apps.Templates.Builders;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Commands;
namespace Squidex.Extensions.Samples.Middleware
{
public sealed class TemplateMiddleware : ICustomCommandMiddleware
{
public async Task HandleAsync(CommandContext context, NextDelegate next)
{
await next(context);
if (context.Command is CreateApp createApp && context.IsCompleted && createApp.Template == "custom")
{
var appId = NamedId.Of(createApp.AppId, createApp.Name);
var publish = new Func<IAppCommand, Task>(command =>
{
command.AppId = appId;
return context.CommandBus.PublishAsync(command);
});
var schema =
SchemaBuilder.Create("Pages")
.AddString("Title", f => f
.Properties(p => p with
{
MaxLength = 100
})
.Required())
.AddString("Slug", f => f
.Properties(p => p with
{
MaxLength = 100
})
.Required()
.Disabled())
.AddString("Text", f => f
.Properties(p => p with
{
Editor = StringFieldEditor.RichText,
MaxLength = 1000,
MinLength = 200
})
.Required())
.Build();
await publish(schema);
}
}
}
}

25
backend/extensions/Squidex.Extensions/Samples/Middleware/TemplatePlugin.cs

@ -1,25 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Squidex.Domain.Apps.Entities.Apps.Templates;
using Squidex.Infrastructure.Commands;
using Squidex.Infrastructure.Plugins;
namespace Squidex.Extensions.Samples.Middleware
{
public sealed class TemplatePlugin : IPlugin
{
public void ConfigureServices(IServiceCollection services, IConfiguration config)
{
services.AddSingleton<ICustomCommandMiddleware, TemplateMiddleware>();
services.AddSingleton<ITemplate, TemplateInstance>();
}
}
}

3
backend/i18n/frontend_en.json

@ -380,6 +380,7 @@
"common.tagAddSchema": ", to add schema",
"common.tags": "Tags",
"common.tagsAll": "All tags",
"common.templates": "Templates",
"common.time": "Time",
"common.to": "To",
"common.update": "Update",
@ -979,6 +980,8 @@
"start.loginHint": "The login button will open a new popup. Once you are logged in successful we will redirect you to the Squidex management portal.",
"start.madeBy": "Proudly made by",
"start.madeByCopyright": "Sebastian Stehle and Contributors, 2016-2021",
"templates.cliHint": "Download the CLI at https://github.com/squidex/squidex-samples to use the templates.",
"templates.reloaded": "Templates reloaded.",
"tour.joinForum": "Join our Forum",
"tour.joinGithub": "Join us on Github",
"tour.skip": "Skip Tour",

3
backend/i18n/frontend_it.json

@ -380,6 +380,7 @@
"common.tagAddSchema": ", aggiungi schema",
"common.tags": "Tag",
"common.tagsAll": "Tutti i tag",
"common.templates": "Templates",
"common.time": "Ora",
"common.to": "To",
"common.update": "Aggiorna",
@ -979,6 +980,8 @@
"start.loginHint": "Il pulsante per accedere aprirà un popup. Una volta effettuato l'accesso sarai indirizzato al portale per la gestione di Squidex.",
"start.madeBy": "Realizzato con orgoglio da",
"start.madeByCopyright": "Sebastian Stehle e Collaboratori, 2016-2020",
"templates.cliHint": "Download the CLI at https://github.com/squidex/squidex-samples to use the templates.",
"templates.reloaded": "Templates reloaded.",
"tour.joinForum": "Unisciti al nostro Forum",
"tour.joinGithub": "Unisciti a Github",
"tour.skip": "Salta il Tour",

3
backend/i18n/frontend_nl.json

@ -380,6 +380,7 @@
"common.tagAddSchema": ", om schema toe te voegen",
"common.tags": "Tags",
"common.tagsAll": "Alle tags",
"common.templates": "Templates",
"common.time": "Tijd",
"common.to": "Naar",
"common.update": "Update",
@ -979,6 +980,8 @@
"start.loginHint": "De login-knop opent een nieuwe pop-up. Zodra je succesvol bent ingelogd, zullen we je doorverwijzen naar het Squidex beheerportaal.",
"start.madeBy": "Met trots gemaakt door",
"start.madeByCopyright": "Sebastian Stehle en medewerkers, 2016-2020",
"templates.cliHint": "Download the CLI at https://github.com/squidex/squidex-samples to use the templates.",
"templates.reloaded": "Templates reloaded.",
"tour.joinForum": "Word lid van ons forum",
"tour.joinGithub": "Bezoek ons ​​op Github",
"tour.skip": "Tour overslaan",

3
backend/i18n/frontend_zh.json

@ -380,6 +380,7 @@
"common.tagAddSchema": ", 添加Schemas",
"common.tags": "标签",
"common.tagsAll": "所有标签",
"common.templates": "Templates",
"common.time": "时间",
"common.to": "To",
"common.update": "更新",
@ -979,6 +980,8 @@
"start.loginHint": "登录按钮将打开一个新的弹出窗口。一旦您登录成功,我们会将您重定向到 Squidex 管理门户。",
"start.madeBy": "自豪地制作",
"start.madeByCopyright": "Sebastian Stehle 和贡献者,2016-2021",
"templates.cliHint": "Download the CLI at https://github.com/squidex/squidex-samples to use the templates.",
"templates.reloaded": "Templates reloaded.",
"tour.joinForum": "加入我们的论坛",
"tour.joinGithub": "加入我们的 Github",
"tour.skip": "跳过游览",

3
backend/i18n/source/frontend_en.json

@ -380,6 +380,7 @@
"common.tagAddSchema": ", to add schema",
"common.tags": "Tags",
"common.tagsAll": "All tags",
"common.templates": "Templates",
"common.time": "Time",
"common.to": "To",
"common.update": "Update",
@ -979,6 +980,8 @@
"start.loginHint": "The login button will open a new popup. Once you are logged in successful we will redirect you to the Squidex management portal.",
"start.madeBy": "Proudly made by",
"start.madeByCopyright": "Sebastian Stehle and Contributors, 2016-2021",
"templates.cliHint": "Download the CLI at https://github.com/squidex/squidex-samples to use the templates.",
"templates.reloaded": "Templates reloaded.",
"tour.joinForum": "Join our Forum",
"tour.joinGithub": "Join us on Github",
"tour.skip": "Skip Tour",

2
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/AlwaysCreateClientCommandMiddleware.cs → backend/src/Squidex.Domain.Apps.Entities/Apps/AlwaysCreateClientCommandMiddleware.cs

@ -9,7 +9,7 @@ using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Commands;
namespace Squidex.Domain.Apps.Entities.Apps.Templates
namespace Squidex.Domain.Apps.Entities.Apps
{
public sealed class AlwaysCreateClientCommandMiddleware : ICommandMiddleware
{

144
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ArrayFieldBuilder.cs

@ -1,144 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
using Squidex.Text;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public sealed class ArrayFieldBuilder : FieldBuilder<ArrayFieldBuilder, ArrayFieldProperties>
{
private UpsertSchemaField TypedField
{
get => (UpsertSchemaField)Field;
}
public ArrayFieldBuilder(UpsertSchemaField field, ArrayFieldProperties properties, CreateSchema schema)
: base(field, properties, schema)
{
}
public ArrayFieldBuilder AddAssets(string name, Action<AssetFieldBuilder> configure)
{
var (field, properties) = AddField<AssetsFieldProperties>(name);
configure(new AssetFieldBuilder(field, properties, Schema));
return this;
}
public ArrayFieldBuilder AddBoolean(string name, Action<BooleanFieldBuilder> configure)
{
var (field, properties) = AddField<BooleanFieldProperties>(name);
configure(new BooleanFieldBuilder(field, properties, Schema));
return this;
}
public ArrayFieldBuilder AddDateTime(string name, Action<DateTimeFieldBuilder> configure)
{
var (field, properties) = AddField<DateTimeFieldProperties>(name);
configure(new DateTimeFieldBuilder(field, properties, Schema));
return this;
}
public ArrayFieldBuilder AddComponent(string name, Action<ComponentFieldBuilder> configure)
{
var (field, properties) = AddField<ComponentFieldProperties>(name);
configure(new ComponentFieldBuilder(field, properties, Schema));
return this;
}
public ArrayFieldBuilder AddComponents(string name, Action<ComponentsFieldBuilder> configure)
{
var (field, properties) = AddField<ComponentsFieldProperties>(name);
configure(new ComponentsFieldBuilder(field, properties, Schema));
return this;
}
public ArrayFieldBuilder AddJson(string name, Action<JsonFieldBuilder> configure)
{
var (field, properties) = AddField<JsonFieldProperties>(name);
configure(new JsonFieldBuilder(field, properties, Schema));
return this;
}
public ArrayFieldBuilder AddNumber(string name, Action<NumberFieldBuilder> configure)
{
var (field, properties) = AddField<NumberFieldProperties>(name);
configure(new NumberFieldBuilder(field, properties, Schema));
return this;
}
public ArrayFieldBuilder AddReferences(string name, Action<ReferencesFieldBuilder> configure)
{
var (field, properties) = AddField<ReferencesFieldProperties>(name);
configure(new ReferencesFieldBuilder(field, properties, Schema));
return this;
}
public ArrayFieldBuilder AddString(string name, Action<StringFieldBuilder> configure)
{
var (field, properties) = AddField<StringFieldProperties>(name);
configure(new StringFieldBuilder(field, properties, Schema));
return this;
}
public ArrayFieldBuilder AddTags(string name, Action<TagsFieldBuilder> configure)
{
var (field, properties) = AddField<TagsFieldProperties>(name);
configure(new TagsFieldBuilder(field, properties, Schema));
return this;
}
public ArrayFieldBuilder AddUI(string name, Action<UIFieldBuilder> configure)
{
var (field, properties) = AddField<UIFieldProperties>(name);
configure(new UIFieldBuilder(field, properties, Schema));
return this;
}
private (UpsertSchemaNestedField, T) AddField<T>(string name) where T : FieldProperties, new()
{
var properties = new T
{
Label = name
};
var nestedField = new UpsertSchemaNestedField
{
Name = name.ToCamelCase(),
Properties = properties
};
TypedField.Nested ??= Array.Empty<UpsertSchemaNestedField>();
TypedField.Nested = TypedField.Nested.Union(new[] { nestedField }).ToArray();
return (nestedField, properties);
}
}
}

20
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/AssetFieldBuilder.cs

@ -1,20 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public sealed class AssetFieldBuilder : FieldBuilder<AssetFieldBuilder, AssetsFieldProperties>
{
public AssetFieldBuilder(UpsertSchemaFieldBase field, AssetsFieldProperties properties, CreateSchema schema)
: base(field, properties, schema)
{
}
}
}

20
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/BooleanFieldBuilder.cs

@ -1,20 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public sealed class BooleanFieldBuilder : FieldBuilder<BooleanFieldBuilder, BooleanFieldProperties>
{
public BooleanFieldBuilder(UpsertSchemaFieldBase field, BooleanFieldProperties properties, CreateSchema schema)
: base(field, properties, schema)
{
}
}
}

20
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ComponentFieldBuilder.cs

@ -1,20 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public sealed class ComponentFieldBuilder : FieldBuilder<ComponentFieldBuilder, ComponentFieldProperties>
{
public ComponentFieldBuilder(UpsertSchemaFieldBase field, ComponentFieldProperties properties, CreateSchema schema)
: base(field, properties, schema)
{
}
}
}

20
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ComponentsFieldBuilder.cs

@ -1,20 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public sealed class ComponentsFieldBuilder : FieldBuilder<ComponentsFieldBuilder, ComponentsFieldProperties>
{
public ComponentsFieldBuilder(UpsertSchemaFieldBase field, ComponentsFieldProperties properties, CreateSchema schema)
: base(field, properties, schema)
{
}
}
}

20
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/DateTimeFieldBuilder.cs

@ -1,20 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public sealed class DateTimeFieldBuilder : FieldBuilder<DateTimeFieldBuilder, DateTimeFieldProperties>
{
public DateTimeFieldBuilder(UpsertSchemaFieldBase field, DateTimeFieldProperties properties, CreateSchema schema)
: base(field, properties, schema)
{
}
}
}

97
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/FieldBuilder.cs

@ -1,97 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public abstract class FieldBuilder
{
protected UpsertSchemaFieldBase Field { get; init; }
protected CreateSchema Schema { get; init; }
}
public abstract class FieldBuilder<T, TProperties> : FieldBuilder where T : FieldBuilder where TProperties : FieldProperties
{
private TProperties properties;
protected FieldBuilder(UpsertSchemaFieldBase field, TProperties properties, CreateSchema schema)
{
this.properties = properties;
Field = field;
Schema = schema;
}
public T Localizable()
{
if (Field is UpsertSchemaField localizableField)
{
localizableField.Partitioning = Partitioning.Language.Key;
}
return (T)(object)this;
}
public T Disabled(bool isDisabled = true)
{
Field.IsDisabled = isDisabled;
return (T)(object)this;
}
public T Hidden(bool isHidden = true)
{
Field.IsHidden = isHidden;
return (T)(object)this;
}
public T Label(string? label)
{
return Properties(x => x with { Label = label });
}
public T Hints(string? hints)
{
return Properties(x => x with { Hints = hints });
}
public T Required(bool isRequired = true)
{
return Properties(x => x with { IsRequired = isRequired });
}
public T Properties(Func<TProperties, TProperties> updater)
{
properties = updater(properties);
Field.Properties = properties;
return (T)(object)this;
}
public T ShowInList()
{
Schema.FieldsInLists ??= new FieldNames();
Schema.FieldsInLists.Add(Field.Name);
return (T)(object)this;
}
public T ShowInReferences()
{
Schema.FieldsInReferences ??= new FieldNames();
Schema.FieldsInReferences.Add(Field.Name);
return (T)(object)this;
}
}
}

20
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/JsonFieldBuilder.cs

@ -1,20 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public sealed class JsonFieldBuilder : FieldBuilder<JsonFieldBuilder, JsonFieldProperties>
{
public JsonFieldBuilder(UpsertSchemaFieldBase field, JsonFieldProperties properties, CreateSchema schema)
: base(field, properties, schema)
{
}
}
}

20
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/NumberFieldBuilder.cs

@ -1,20 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public sealed class NumberFieldBuilder : FieldBuilder<NumberFieldBuilder, NumberFieldProperties>
{
public NumberFieldBuilder(UpsertSchemaFieldBase field, NumberFieldProperties properties, CreateSchema schema)
: base(field, properties, schema)
{
}
}
}

20
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/ReferencesFieldBuilder.cs

@ -1,20 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public sealed class ReferencesFieldBuilder : FieldBuilder<ReferencesFieldBuilder, ReferencesFieldProperties>
{
public ReferencesFieldBuilder(UpsertSchemaFieldBase field, ReferencesFieldProperties properties, CreateSchema schema)
: base(field, properties, schema)
{
}
}
}

203
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/SchemaBuilder.cs

@ -1,203 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
using Squidex.Text;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public sealed class SchemaBuilder
{
private readonly CreateSchema command;
public SchemaBuilder(CreateSchema command)
{
this.command = command;
}
public static SchemaBuilder Create(string name)
{
var schemaName = name.ToKebabCase();
return new SchemaBuilder(new CreateSchema
{
Name = schemaName
}).Published().WithLabel(name);
}
public SchemaBuilder WithLabel(string? label)
{
if (command.Properties == null)
{
command.Properties = new SchemaProperties { Label = label };
}
else
{
command.Properties = command.Properties with { Label = label };
}
return this;
}
public SchemaBuilder WithScripts(SchemaScripts scripts)
{
command.Scripts = scripts;
return this;
}
public SchemaBuilder Published()
{
command.IsPublished = true;
return this;
}
public SchemaBuilder Singleton()
{
command.Type = SchemaType.Singleton;
return this;
}
public SchemaBuilder AddArray(string name, Action<ArrayFieldBuilder> configure)
{
var (field, properties) = AddField<ArrayFieldProperties>(name);
configure(new ArrayFieldBuilder(field, properties, command));
return this;
}
public SchemaBuilder AddAssets(string name, Action<AssetFieldBuilder> configure)
{
var (field, properties) = AddField<AssetsFieldProperties>(name);
configure(new AssetFieldBuilder(field, properties, command));
return this;
}
public SchemaBuilder AddBoolean(string name, Action<BooleanFieldBuilder> configure)
{
var (field, properties) = AddField<BooleanFieldProperties>(name);
configure(new BooleanFieldBuilder(field, properties, command));
return this;
}
public SchemaBuilder AddComponent(string name, Action<ComponentFieldBuilder> configure)
{
var (field, properties) = AddField<ComponentFieldProperties>(name);
configure(new ComponentFieldBuilder(field, properties, command));
return this;
}
public SchemaBuilder AddComponents(string name, Action<ComponentsFieldBuilder> configure)
{
var (field, properties) = AddField<ComponentsFieldProperties>(name);
configure(new ComponentsFieldBuilder(field, properties, command));
return this;
}
public SchemaBuilder AddDateTime(string name, Action<DateTimeFieldBuilder> configure)
{
var (field, properties) = AddField<DateTimeFieldProperties>(name);
configure(new DateTimeFieldBuilder(field, properties, command));
return this;
}
public SchemaBuilder AddJson(string name, Action<JsonFieldBuilder> configure)
{
var (field, properties) = AddField<JsonFieldProperties>(name);
configure(new JsonFieldBuilder(field, properties, command));
return this;
}
public SchemaBuilder AddNumber(string name, Action<NumberFieldBuilder> configure)
{
var (field, properties) = AddField<NumberFieldProperties>(name);
configure(new NumberFieldBuilder(field, properties, command));
return this;
}
public SchemaBuilder AddReferences(string name, Action<ReferencesFieldBuilder> configure)
{
var (field, properties) = AddField<ReferencesFieldProperties>(name);
configure(new ReferencesFieldBuilder(field, properties, command));
return this;
}
public SchemaBuilder AddString(string name, Action<StringFieldBuilder> configure)
{
var (field, properties) = AddField<StringFieldProperties>(name);
configure(new StringFieldBuilder(field, properties, command));
return this;
}
public SchemaBuilder AddTags(string name, Action<TagsFieldBuilder> configure)
{
var (field, properties) = AddField<TagsFieldProperties>(name);
configure(new TagsFieldBuilder(field, properties, command));
return this;
}
public SchemaBuilder AddUI(string name, Action<UIFieldBuilder> configure)
{
var (field, properties) = AddField<UIFieldProperties>(name);
configure(new UIFieldBuilder(field, properties, command));
return this;
}
private (UpsertSchemaField, T) AddField<T>(string name) where T : FieldProperties, new()
{
var properties = new T { Label = name };
var field = new UpsertSchemaField
{
Name = name.ToCamelCase(),
Properties = properties,
};
if (command.Fields == null)
{
command.Fields = new[] { field };
}
else
{
command.Fields = command.Fields.Union(Enumerable.Repeat(field, 1)).ToArray();
}
return (field, properties);
}
public CreateSchema Build()
{
return command;
}
}
}

20
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/StringFieldBuilder.cs

@ -1,20 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public sealed class StringFieldBuilder : FieldBuilder<StringFieldBuilder, StringFieldProperties>
{
public StringFieldBuilder(UpsertSchemaFieldBase field, StringFieldProperties properties, CreateSchema schema)
: base(field, properties, schema)
{
}
}
}

20
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/TagsFieldBuilder.cs

@ -1,20 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public sealed class TagsFieldBuilder : FieldBuilder<TagsFieldBuilder, TagsFieldProperties>
{
public TagsFieldBuilder(UpsertSchemaFieldBase field, TagsFieldProperties properties, CreateSchema schema)
: base(field, properties, schema)
{
}
}
}

20
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Builders/UIFieldBuilder.cs

@ -1,20 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Schemas.Commands;
namespace Squidex.Domain.Apps.Entities.Apps.Templates.Builders
{
public sealed class UIFieldBuilder : FieldBuilder<UIFieldBuilder, UIFieldProperties>
{
public UIFieldBuilder(UpsertSchemaFieldBase field, UIFieldProperties properties, CreateSchema schema)
: base(field, properties, schema)
{
}
}
}

127
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateBlog.cs

@ -1,127 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Apps.Templates.Builders;
using Squidex.Domain.Apps.Entities.Contents.Commands;
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Entities.Apps.Templates
{
public sealed class CreateBlog : ITemplate
{
public string Name { get; } = "blog";
public Task RunAsync(PublishTemplate publish)
{
return Task.WhenAll(
CreatePagesAsync(publish),
CreatePostsAsync(publish));
}
private static async Task CreatePostsAsync(PublishTemplate publish)
{
var postsId = await CreatePostsSchemaAsync(publish);
await publish(new CreateContent
{
SchemaId = postsId,
Data =
new ContentData()
.AddField("title",
new ContentFieldData()
.AddInvariant("My first post with Squidex"))
.AddField("text",
new ContentFieldData()
.AddInvariant("Just created a blog with Squidex. I love it!")),
Status = Status.Published
});
}
private static async Task CreatePagesAsync(PublishTemplate publish)
{
var pagesId = await CreatePagesSchemaAsync(publish);
await publish(new CreateContent
{
SchemaId = pagesId,
Data =
new ContentData()
.AddField("title",
new ContentFieldData()
.AddInvariant("About Me"))
.AddField("text",
new ContentFieldData()
.AddInvariant("I love Squidex and SciFi!")),
Status = Status.Published
});
}
private static async Task<NamedId<DomainId>> CreatePostsSchemaAsync(PublishTemplate publish)
{
var schema =
SchemaBuilder.Create("Posts")
.AddString("Title", f => f
.Properties(p => p with
{
MaxLength = 100
})
.Required()
.ShowInList()
.Hints("The title of the post."))
.AddString("Text", f => f
.Properties(p => p with
{
Editor = StringFieldEditor.RichText
})
.Required()
.Hints("The text of the post."))
.AddString("Slug", f => f
.Disabled()
.Label("Slug (Autogenerated)")
.Hints("Autogenerated slug that can be used to identity the post."))
.WithScripts(DefaultScripts.GenerateSlug)
.Build();
await publish(schema);
return NamedId.Of(schema.SchemaId, schema.Name);
}
private static async Task<NamedId<DomainId>> CreatePagesSchemaAsync(PublishTemplate publish)
{
var schema =
SchemaBuilder.Create("Pages")
.AddString("Title", f => f
.Properties(p => p with
{
MaxLength = 100
})
.Required()
.ShowInList()
.Hints("The title of the page."))
.AddString("Text", f => f
.Properties(p => p with
{
Editor = StringFieldEditor.RichText
})
.Required()
.Hints("The text of the page."))
.AddString("Slug", f => f
.Disabled()
.Label("Slug (Autogenerated)")
.Hints("Autogenerated slug that can be used to identity the page."))
.WithScripts(DefaultScripts.GenerateSlug)
.Build();
await publish(schema);
return NamedId.Of(schema.SchemaId, schema.Name);
}
}
}

269
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/CreateProfile.cs

@ -1,269 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Assets;
using Squidex.Domain.Apps.Core.Contents;
using Squidex.Domain.Apps.Core.Schemas;
using Squidex.Domain.Apps.Entities.Apps.Templates.Builders;
using Squidex.Domain.Apps.Entities.Contents.Commands;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Collections;
namespace Squidex.Domain.Apps.Entities.Apps.Templates
{
public sealed class CreateProfile : ITemplate
{
public string Name { get; } = "profile";
public Task RunAsync(PublishTemplate publish)
{
return Task.WhenAll(
CreateBasicsAsync(publish),
CreateEducationSchemaAsync(publish),
CreateExperienceSchemaAsync(publish),
CreateProjectsSchemaAsync(publish),
CreatePublicationsSchemaAsync(publish),
CreateSkillsSchemaAsync(publish));
}
private static async Task CreateBasicsAsync(PublishTemplate publish)
{
var postsId = await CreateBasicsSchemaAsync(publish);
await publish(new UpdateContent
{
ContentId = postsId.Id,
Data =
new ContentData()
.AddField("firstName",
new ContentFieldData()
.AddInvariant("John"))
.AddField("lastName",
new ContentFieldData()
.AddInvariant("Doe"))
.AddField("profession",
new ContentFieldData()
.AddInvariant("Software Developer")),
SchemaId = postsId
});
}
private static async Task<NamedId<DomainId>> CreateBasicsSchemaAsync(PublishTemplate publish)
{
var command =
SchemaBuilder.Create("Basics")
.Singleton()
.AddString("First Name", f => f
.Required()
.ShowInList()
.Hints("Your first name."))
.AddString("Last Name", f => f
.Required()
.ShowInList()
.Hints("Your last name."))
.AddAssets("Image", f => f
.Properties(p => p with
{
ExpectedType = AssetType.Image,
MaxItems = 1,
MinItems = 1
})
.Hints("Your profile image."))
.AddString("Profession", f => f
.Properties(p => p with
{
Editor = StringFieldEditor.TextArea
})
.Required()
.Hints("Describe your profession."))
.AddString("Summary", f => f
.Properties(p => p with
{
Editor = StringFieldEditor.TextArea
})
.Hints("Write a short summary about yourself."))
.AddString("Legal Terms", f => f
.Properties(p => p with
{
Editor = StringFieldEditor.TextArea
})
.Hints("The terms to fulfill legal requirements."))
.AddString("Github Link", f => f
.Hints("An optional link to your Github account."))
.AddString("Blog Link", f => f
.Hints("An optional link to your Blog."))
.AddString("Twitter Link", f => f
.Hints("An optional link to your Twitter account."))
.AddString("LinkedIn Link", f => f
.Hints("An optional link to your LinkedIn account."))
.AddString("Email Address", f => f
.Hints("An optional email address to contact you."))
.Build();
await publish(command);
return NamedId.Of(command.SchemaId, command.Name);
}
private static async Task<NamedId<DomainId>> CreateProjectsSchemaAsync(PublishTemplate publish)
{
var schema =
SchemaBuilder.Create("Projects")
.AddString("Name", f => f
.Required()
.ShowInList()
.Hints("The name of your project."))
.AddString("Description", f => f
.Properties(p => p with
{
Editor = StringFieldEditor.TextArea
})
.Required()
.Hints("Describe your project."))
.AddAssets("Image", f => f
.Properties(p => p with
{
ExpectedType = AssetType.Image,
MaxItems = 1,
MinItems = 1
})
.Required()
.Hints("An image or screenshot for your project."))
.AddString("Label", f => f
.Properties(p => p with { Editor = StringFieldEditor.TextArea })
.Hints("An optional label to categorize your project, e.g. 'Open Source'."))
.AddString("Link", f => f
.Hints("An optional link to your project."))
.AddNumber("Year", f => f
.Hints("The year, when you realized the project, used for sorting only."))
.Build();
await publish(schema);
return NamedId.Of(schema.SchemaId, schema.Name);
}
private static async Task<NamedId<DomainId>> CreateExperienceSchemaAsync(PublishTemplate publish)
{
var schema =
SchemaBuilder.Create("Experience")
.AddString("Position", f => f
.Required()
.ShowInList()
.Hints("Your position in this job."))
.AddString("Company", f => f
.Required()
.ShowInList()
.Hints("The company or organization you worked for."))
.AddAssets("Logo", f => f
.Properties(p => p with
{
ExpectedType = AssetType.Image,
MaxItems = 1,
MinItems = 1
})
.Hints("The logo of the company or organization you worked for."))
.AddDateTime("From", f => f
.Required()
.Hints("The start date."))
.AddDateTime("To", f => f
.Hints("The end date, keep empty if you still work there."))
.Build();
await publish(schema);
return NamedId.Of(schema.SchemaId, schema.Name);
}
private static async Task<NamedId<DomainId>> CreateEducationSchemaAsync(PublishTemplate publish)
{
var schema =
SchemaBuilder.Create("Education")
.AddString("Degree", f => f
.Required()
.ShowInList()
.Hints("The degree you got or achieved."))
.AddString("School", f => f
.Required()
.ShowInList()
.Hints("The school or university."))
.AddAssets("Logo", f => f
.Properties(p => p with
{
ExpectedType = AssetType.Image,
MaxItems = 1,
MinItems = 1
})
.Hints("The logo of the school or university."))
.AddDateTime("From", f => f
.Required()
.Hints("The start date."))
.AddDateTime("To", f => f
.Hints("The end date, keep empty if you still study there."))
.Build();
await publish(schema);
return NamedId.Of(schema.SchemaId, schema.Name);
}
private static async Task<NamedId<DomainId>> CreatePublicationsSchemaAsync(PublishTemplate publish)
{
var command =
SchemaBuilder.Create("Publications")
.AddString("Name", f => f
.Required()
.ShowInList()
.Hints("The name or title of your publication."))
.AddAssets("Cover", f => f
.Properties(p => p with
{
ExpectedType = AssetType.Image,
MaxItems = 1,
MinItems = 1
})
.Hints("The cover of your publication."))
.AddString("Description", f => f
.Hints("Describe the content of your publication."))
.AddString("Link", f => f
.Hints("Optional link to your publication."))
.Build();
await publish(command);
return NamedId.Of(command.SchemaId, command.Name);
}
private static async Task<NamedId<DomainId>> CreateSkillsSchemaAsync(PublishTemplate publish)
{
var command =
SchemaBuilder.Create("Skills")
.AddString("Name", f => f
.Required()
.ShowInList()
.Hints("The name of the skill."))
.AddString("Experience", f => f
.Properties(p => p with
{
AllowedValues = ReadonlyList.Create(
"Beginner",
"Advanced",
"Professional",
"Expert"),
Editor = StringFieldEditor.Dropdown,
})
.Required()
.ShowInList()
.Hints("The level of experience."))
.Build();
await publish(command);
return NamedId.Of(command.SchemaId, command.Name);
}
}
}

29
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/DefaultScripts.cs

@ -1,29 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Core.Schemas;
namespace Squidex.Domain.Apps.Entities.Apps.Templates
{
public static class DefaultScripts
{
private const string ScriptToGenerateSlug = @"
var data = ctx.data;
if (data.title && data.title.iv) {
data.slug = { iv: slugify(data.title.iv) };
replace(data);
}";
public static readonly SchemaScripts GenerateSlug = new SchemaScripts
{
Create = ScriptToGenerateSlug,
Update = ScriptToGenerateSlug
};
}
}

7
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/ITemplate.cs → backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/Template.cs

@ -5,12 +5,11 @@
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
#pragma warning disable SA1313 // Parameter names should begin with lower-case letter
namespace Squidex.Domain.Apps.Entities.Apps.Templates
{
public interface ITemplate
public sealed record Template(string Name, string Title, string Description)
{
string Name { get; }
Task RunAsync(PublishTemplate publish);
}
}

49
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplateCommandMiddleware.cs

@ -1,49 +0,0 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Commands;
#pragma warning disable MA0048 // File name must match type name
namespace Squidex.Domain.Apps.Entities.Apps.Templates
{
public delegate Task PublishTemplate(IAppCommand command);
public sealed class TemplateCommandMiddleware : ICommandMiddleware
{
private readonly Dictionary<string, ITemplate> templates;
public TemplateCommandMiddleware(IEnumerable<ITemplate> templates)
{
this.templates = templates.ToDictionary(x => x.Name, StringComparer.OrdinalIgnoreCase);
}
public async Task HandleAsync(CommandContext context, NextDelegate next)
{
if (context.IsCompleted && context.Command is CreateApp createApp && !string.IsNullOrWhiteSpace(createApp.Template))
{
if (templates.TryGetValue(createApp.Template, out var template))
{
var appId = NamedId.Of(createApp.AppId, createApp.Name);
var publish = new PublishTemplate(command =>
{
command.AppId = appId;
return context.CommandBus.PublishAsync(command);
});
await template.RunAsync(publish);
}
}
await next(context);
}
}
}

69
backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplatesClient.cs

@ -0,0 +1,69 @@
// ==========================================================================
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex UG (haftungsbeschraenkt)
// All rights reserved. Licensed under the MIT license.
// ==========================================================================
using System.Net;
using System.Text.RegularExpressions;
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Entities.Apps.Templates
{
public sealed class TemplatesClient
{
private const string DetailUrl = "https://raw.githubusercontent.com/Squidex/templates/main";
private const string OverviewUrl = "https://raw.githubusercontent.com/Squidex/templates/main/README.md";
private static readonly Regex Regex = new Regex("\\* \\[(?<Title>.*)\\]\\((?<Name>.*)\\/README\\.md\\): (?<Description>.*)", RegexOptions.Compiled | RegexOptions.ExplicitCapture);
private readonly IHttpClientFactory httpClientFactory;
public TemplatesClient(IHttpClientFactory httpClientFactory)
{
this.httpClientFactory = httpClientFactory;
}
public async Task<List<Template>> GetTemplatesAsync(
CancellationToken ct = default)
{
using (var httpClient = httpClientFactory.CreateClient())
{
var url = OverviewUrl;
var text = await httpClient.GetStringAsync(url, ct);
var result = new List<Template>();
foreach (Match match in Regex.Matches(text))
{
result.Add(new Template(
match.Groups["Name"].Value,
match.Groups["Title"].Value,
match.Groups["Description"].Value));
}
return result;
}
}
public async Task<string?> GetDetailAsync(string name,
CancellationToken ct = default)
{
Guard.NotNullOrEmpty(name);
using (var httpClient = httpClientFactory.CreateClient())
{
var url = $"{DetailUrl}/{name}/README.md";
var response = await httpClient.GetAsync(url, ct);
if (response.StatusCode == HttpStatusCode.NotFound)
{
return null;
}
return await response.Content.ReadAsStringAsync(ct);
}
}
}
}

14
backend/src/Squidex.Web/Resource.cs

@ -19,37 +19,37 @@ namespace Squidex.Web
[JsonProperty("_links")]
public Dictionary<string, ResourceLink> Links { get; } = new Dictionary<string, ResourceLink>();
public void AddSelfLink(string href)
protected void AddSelfLink(string href)
{
AddGetLink("self", href);
}
public void AddGetLink(string rel, string href, string? metadata = null)
protected void AddGetLink(string rel, string href, string? metadata = null)
{
AddLink(rel, "GET", href, metadata);
}
public void AddPatchLink(string rel, string href, string? metadata = null)
protected void AddPatchLink(string rel, string href, string? metadata = null)
{
AddLink(rel, "PATCH", href, metadata);
}
public void AddPostLink(string rel, string href, string? metadata = null)
protected void AddPostLink(string rel, string href, string? metadata = null)
{
AddLink(rel, "POST", href, metadata);
}
public void AddPutLink(string rel, string href, string? metadata = null)
protected void AddPutLink(string rel, string href, string? metadata = null)
{
AddLink(rel, "PUT", href, metadata);
}
public void AddDeleteLink(string rel, string href, string? metadata = null)
protected void AddDeleteLink(string rel, string href, string? metadata = null)
{
AddLink(rel, "DELETE", href, metadata);
}
public void AddLink(string rel, string method, string href, string? metadata = null)
protected void AddLink(string rel, string method, string href, string? metadata = null)
{
Guard.NotNullOrEmpty(rel);
Guard.NotNullOrEmpty(href);

2
backend/src/Squidex/Areas/Api/Controllers/Apps/AppAssetsController.cs

@ -82,7 +82,7 @@ namespace Squidex.Areas.Api.Controllers.Apps
private AssetScriptsDto GetResponse(IAppEntity result)
{
return AssetScriptsDto.FromApp(result, Resources);
return AssetScriptsDto.FromDomain(result, Resources);
}
}
}

2
backend/src/Squidex/Areas/Api/Controllers/Apps/AppLanguagesController.cs

@ -138,7 +138,7 @@ namespace Squidex.Areas.Api.Controllers.Apps
private AppLanguagesDto GetResponse(IAppEntity result)
{
return AppLanguagesDto.FromApp(result, Resources);
return AppLanguagesDto.FromDomain(result, Resources);
}
private static Language ParseLanguage(string language)

2
backend/src/Squidex/Areas/Api/Controllers/Apps/AppRolesController.cs

@ -168,7 +168,7 @@ namespace Squidex.Areas.Api.Controllers.Apps
private RolesDto GetResponse(IAppEntity result)
{
return RolesDto.FromApp(result, Resources);
return RolesDto.FromDomain(result, Resources);
}
}
}

2
backend/src/Squidex/Areas/Api/Controllers/Apps/AppSettingsController.cs

@ -82,7 +82,7 @@ namespace Squidex.Areas.Api.Controllers.Apps
private AppSettingsDto GetResponse(IAppEntity result)
{
return AppSettingsDto.FromApp(result, Resources);
return AppSettingsDto.FromDomain(result, Resources);
}
}
}

6
backend/src/Squidex/Areas/Api/Controllers/Apps/AppsController.cs

@ -60,7 +60,7 @@ namespace Squidex.Areas.Api.Controllers.Apps
{
var isFrontend = HttpContext.User.IsInClient(DefaultClients.Frontend);
return apps.OrderBy(x => x.Name).Select(a => AppDto.FromApp(a, userOrClientId, isFrontend, Resources)).ToArray();
return apps.OrderBy(x => x.Name).Select(a => AppDto.FromDomain(a, userOrClientId, isFrontend, Resources)).ToArray();
});
Response.Headers[HeaderNames.ETag] = apps.ToEtag();
@ -89,7 +89,7 @@ namespace Squidex.Areas.Api.Controllers.Apps
var isFrontend = HttpContext.User.IsInClient(DefaultClients.Frontend);
return AppDto.FromApp(App, userOrClientId, isFrontend, Resources);
return AppDto.FromDomain(App, userOrClientId, isFrontend, Resources);
});
Response.Headers[HeaderNames.ETag] = App.ToEtag();
@ -213,7 +213,7 @@ namespace Squidex.Areas.Api.Controllers.Apps
var isFrontend = HttpContext.User.IsInClient(DefaultClients.Frontend);
return AppDto.FromApp(x, userOrClientId, isFrontend, Resources);
return AppDto.FromDomain(x, userOrClientId, isFrontend, Resources);
});
}

2
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppDto.cs

@ -92,7 +92,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
[LocalizedRequired]
public JsonObject RoleProperties { get; set; } = EmptyObject;
public static AppDto FromApp(IAppEntity app, string userId, bool isFrontend, Resources resources)
public static AppDto FromDomain(IAppEntity app, string userId, bool isFrontend, Resources resources)
{
var result = SimpleMapper.Map(app, new AppDto());

2
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguageDto.cs

@ -43,7 +43,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// </summary>
public bool IsOptional { get; set; }
public static AppLanguageDto FromLanguage(Language language, LanguageConfig config, LanguagesConfig languages)
public static AppLanguageDto FromDomain(Language language, LanguageConfig config, LanguagesConfig languages)
{
var result = new AppLanguageDto
{

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppLanguagesDto.cs

@ -19,14 +19,14 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
[LocalizedRequired]
public AppLanguageDto[] Items { get; set; }
public static AppLanguagesDto FromApp(IAppEntity app, Resources resources)
public static AppLanguagesDto FromDomain(IAppEntity app, Resources resources)
{
var config = app.Languages;
var result = new AppLanguagesDto
{
Items = config.Languages
.Select(x => AppLanguageDto.FromLanguage(x.Key, x.Value, config))
.Select(x => AppLanguageDto.FromDomain(x.Key, x.Value, config))
.Select(x => x.CreateLinks(resources, app))
.OrderByDescending(x => x.IsMaster).ThenBy(x => x.Iso2Code)
.ToArray()

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AppSettingsDto.cs

@ -40,13 +40,13 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// </summary>
public long Version { get; set; }
public static AppSettingsDto FromApp(IAppEntity app, Resources resources)
public static AppSettingsDto FromDomain(IAppEntity app, Resources resources)
{
var settings = app.Settings;
var result = new AppSettingsDto
{
Editors = settings.Editors.Select(EditorDto.FromEditor).ToArray(),
Editors = settings.Editors.Select(EditorDto.FromDomain).ToArray(),
HideDateTimeModeButton = settings.HideDateTimeModeButton,
HideScheduler = settings.HideScheduler,
Patterns = settings.Patterns.Select(PatternDto.FromPattern).ToArray(),

2
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/AssetScriptsDto.cs

@ -43,7 +43,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// </summary>
public long Version { get; set; }
public static AssetScriptsDto FromApp(IAppEntity app, Resources resources)
public static AssetScriptsDto FromDomain(IAppEntity app, Resources resources)
{
var result = SimpleMapper.Map(app.AssetScripts, new AssetScriptsDto());

2
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorDto.cs

@ -38,7 +38,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// </summary>
public string? Role { get; set; }
public static ContributorDto FromIdAndRole(string id, string role)
public static ContributorDto FromDomain(string id, string role)
{
var result = new ContributorDto { ContributorId = id, Role = role };

2
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/ContributorsDto.cs

@ -40,7 +40,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
var result = new ContributorsDto
{
Items = app.Contributors
.Select(x => ContributorDto.FromIdAndRole(x.Key, x.Value))
.Select(x => ContributorDto.FromDomain(x.Key, x.Value))
.Select(x => x.CreateUser(users))
.Select(x => x.CreateLinks(resources))
.OrderBy(x => x.ContributorName)

5
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/CreateAppDto.cs

@ -20,11 +20,6 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
[LocalizedRegularExpression("^[a-z0-9]+(\\-[a-z0-9]+)*$")]
public string Name { get; set; }
/// <summary>
/// Initialize the app with the inbuilt template.
/// </summary>
public string? Template { get; set; }
public CreateApp ToCommand()
{
return SimpleMapper.Map(this, new CreateApp());

6
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/EditorDto.cs

@ -25,9 +25,11 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
[LocalizedRequired]
public string Url { get; set; }
public static EditorDto FromEditor(Editor editor)
public static EditorDto FromDomain(Editor editor)
{
return SimpleMapper.Map(editor, new EditorDto());
var result = SimpleMapper.Map(editor, new EditorDto());
return result;
}
public Editor ToEditor()

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/PatternDto.cs

@ -32,7 +32,9 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
public static PatternDto FromPattern(Pattern pattern)
{
return SimpleMapper.Map(pattern, new PatternDto());
var result = SimpleMapper.Map(pattern, new PatternDto());
return result;
}
public Pattern ToPattern()

2
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RoleDto.cs

@ -48,7 +48,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
[LocalizedRequired]
public JsonObject Properties { get; set; }
public static RoleDto FromRole(Role role, IAppEntity app)
public static RoleDto FromDomain(Role role, IAppEntity app)
{
var result = new RoleDto
{

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/RolesDto.cs

@ -19,13 +19,13 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
[LocalizedRequired]
public RoleDto[] Items { get; set; }
public static RolesDto FromApp(IAppEntity app, Resources resources)
public static RolesDto FromDomain(IAppEntity app, Resources resources)
{
var result = new RolesDto
{
Items =
app.Roles.All
.Select(x => RoleDto.FromRole(x, app))
.Select(x => RoleDto.FromDomain(x, app))
.Select(x => x.CreateLinks(resources))
.OrderBy(x => x.Name)
.ToArray()

4
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowDto.cs

@ -42,13 +42,13 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// </summary>
public Status Initial { get; set; }
public static WorkflowDto FromWorkflow(DomainId id, Workflow workflow)
public static WorkflowDto FromDomain(DomainId id, Workflow workflow)
{
var result = SimpleMapper.Map(workflow, new WorkflowDto
{
Steps = workflow.Steps.ToDictionary(
x => x.Key,
x => WorkflowStepDto.FromWorkflowStep(x.Value)),
x => WorkflowStepDto.FromDomain(x.Value)),
Id = id
});

14
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowStepDto.cs

@ -41,23 +41,23 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// </summary>
public string[]? NoUpdateRoles { get; set; }
public static WorkflowStepDto FromWorkflowStep(WorkflowStep step)
public static WorkflowStepDto FromDomain(WorkflowStep step)
{
var response = SimpleMapper.Map(step, new WorkflowStepDto
var result = SimpleMapper.Map(step, new WorkflowStepDto
{
Transitions = step.Transitions.ToDictionary(
y => y.Key,
y => WorkflowTransitionDto.FromWorkflowTransition(y.Value))
y => WorkflowTransitionDto.FromDomain(y.Value))
});
if (step.NoUpdate != null)
{
response.NoUpdate = true;
response.NoUpdateExpression = step.NoUpdate.Expression;
response.NoUpdateRoles = step.NoUpdate.Roles?.ToArray();
result.NoUpdate = true;
result.NoUpdateExpression = step.NoUpdate.Expression;
result.NoUpdateRoles = step.NoUpdate.Roles?.ToArray();
}
return response;
return result;
}
public WorkflowStep ToWorkflowStep()

6
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowTransitionDto.cs

@ -21,9 +21,11 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
/// </summary>
public string[]? Roles { get; set; }
public static WorkflowTransitionDto FromWorkflowTransition(WorkflowTransition transition)
public static WorkflowTransitionDto FromDomain(WorkflowTransition transition)
{
return new WorkflowTransitionDto { Expression = transition.Expression, Roles = transition.Roles?.ToArray() };
var result = new WorkflowTransitionDto { Expression = transition.Expression, Roles = transition.Roles?.ToArray() };
return result;
}
public WorkflowTransition ToWorkflowTransition()

2
backend/src/Squidex/Areas/Api/Controllers/Apps/Models/WorkflowsDto.cs

@ -32,7 +32,7 @@ namespace Squidex.Areas.Api.Controllers.Apps.Models
{
Items =
app.Workflows
.Select(x => WorkflowDto.FromWorkflow(x.Key, x.Value))
.Select(x => WorkflowDto.FromDomain(x.Key, x.Value))
.Select(x => x.CreateLinks(resources))
.ToArray()
};

4
backend/src/Squidex/Areas/Api/Controllers/Assets/AssetFoldersController.cs

@ -59,7 +59,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
var response = Deferred.Response(() =>
{
return AssetFoldersDto.FromAssets(folders, path, Resources);
return AssetFoldersDto.FromDomain(folders, path, Resources);
});
Response.Headers[HeaderNames.ETag] = folders.ToEtag();
@ -168,7 +168,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
{
var context = await CommandBus.PublishAsync(command);
return AssetFolderDto.FromAssetFolder(context.Result<IAssetFolderEntity>(), Resources);
return AssetFolderDto.FromDomain(context.Result<IAssetFolderEntity>(), Resources);
}
private Task<IReadOnlyList<IAssetFolderEntity>> GetAssetPathAsync(DomainId parentId, AssetFolderScope scope)

12
backend/src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs

@ -126,7 +126,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
var response = Deferred.Response(() =>
{
return AssetsDto.FromAssets(assets, Resources);
return AssetsDto.FromDomain(assets, Resources);
});
return Ok(response);
@ -155,7 +155,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
var response = Deferred.Response(() =>
{
return AssetsDto.FromAssets(assets, Resources);
return AssetsDto.FromDomain(assets, Resources);
});
return Ok(response);
@ -186,7 +186,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
var response = Deferred.Response(() =>
{
return AssetDto.FromAsset(asset, Resources);
return AssetDto.FromDomain(asset, Resources);
});
return Ok(response);
@ -280,7 +280,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
var context = await CommandBus.PublishAsync(command);
var result = context.Result<BulkUpdateResult>();
var response = result.Select(x => BulkResultDto.FromBulkResult(x, HttpContext)).ToArray();
var response = result.Select(x => BulkResultDto.FromDomain(x, HttpContext)).ToArray();
return Ok(response);
}
@ -452,11 +452,11 @@ namespace Squidex.Areas.Api.Controllers.Assets
if (context.PlainResult is AssetDuplicate created)
{
return AssetDto.FromAsset(created.Asset, Resources, true);
return AssetDto.FromDomain(created.Asset, Resources, true);
}
else
{
return AssetDto.FromAsset(context.Result<IEnrichedAssetEntity>(), Resources);
return AssetDto.FromDomain(context.Result<IEnrichedAssetEntity>(), Resources);
}
}

44
backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetDto.cs

@ -160,68 +160,68 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
get => Metadata.GetPixelHeight();
}
public static AssetDto FromAsset(IEnrichedAssetEntity asset, Resources resources, bool isDuplicate = false)
public static AssetDto FromDomain(IEnrichedAssetEntity asset, Resources resources, bool isDuplicate = false)
{
var response = SimpleMapper.Map(asset, new AssetDto());
var result = SimpleMapper.Map(asset, new AssetDto());
response.Tags = asset.TagNames;
response.FileType = asset.FileName.FileType();
result.Tags = asset.TagNames;
if (isDuplicate)
{
response.Meta = new AssetMeta
result.Meta = new AssetMeta
{
IsDuplicate = "true"
};
}
return CreateLinks(response, resources);
result.FileType = asset.FileName.FileType();
return result.CreateLinks(resources);
}
private static AssetDto CreateLinks(AssetDto response, Resources resources)
private AssetDto CreateLinks(Resources resources)
{
var app = resources.App;
var values = new { app, id = response.Id };
var values = new { app, id = Id };
response.AddSelfLink(resources.Url<AssetsController>(x => nameof(x.GetAsset), values));
AddSelfLink(resources.Url<AssetsController>(x => nameof(x.GetAsset), values));
if (resources.CanUpdateAsset)
{
response.AddPutLink("update", resources.Url<AssetsController>(x => nameof(x.PutAsset), values));
AddPutLink("update", resources.Url<AssetsController>(x => nameof(x.PutAsset), values));
response.AddPutLink("move", resources.Url<AssetsController>(x => nameof(x.PutAssetParent), values));
AddPutLink("move", resources.Url<AssetsController>(x => nameof(x.PutAssetParent), values));
}
if (resources.CanUploadAsset)
{
response.AddPutLink("upload", resources.Url<AssetsController>(x => nameof(x.PutAssetContent), values));
AddPutLink("upload", resources.Url<AssetsController>(x => nameof(x.PutAssetContent), values));
}
if (resources.CanDeleteAsset)
{
response.AddDeleteLink("delete", resources.Url<AssetsController>(x => nameof(x.DeleteAsset), values));
AddDeleteLink("delete", resources.Url<AssetsController>(x => nameof(x.DeleteAsset), values));
}
if (!string.IsNullOrWhiteSpace(response.Slug))
if (!string.IsNullOrWhiteSpace(Slug))
{
var idValues = new { app, idOrSlug = response.Id, more = response.Slug };
var idValues = new { app, idOrSlug = Id, more = Slug };
response.AddGetLink("content", resources.Url<AssetContentController>(x => nameof(x.GetAssetContentBySlug), idValues));
AddGetLink("content", resources.Url<AssetContentController>(x => nameof(x.GetAssetContentBySlug), idValues));
var slugValues = new { app, idOrSlug = response.Slug };
var slugValues = new { app, idOrSlug = Slug };
response.AddGetLink("content/slug", resources.Url<AssetContentController>(x => nameof(x.GetAssetContentBySlug), slugValues));
AddGetLink("content/slug", resources.Url<AssetContentController>(x => nameof(x.GetAssetContentBySlug), slugValues));
}
else
{
var idValues = new { app, idOrSlug = response.Id };
var idValues = new { app, idOrSlug = Id };
response.AddGetLink("content", resources.Url<AssetContentController>(x => nameof(x.GetAssetContentBySlug), idValues));
AddGetLink("content", resources.Url<AssetContentController>(x => nameof(x.GetAssetContentBySlug), idValues));
}
return response;
return this;
}
}
}

18
backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFolderDto.cs

@ -36,30 +36,30 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
/// </summary>
public long Version { get; set; }
public static AssetFolderDto FromAssetFolder(IAssetFolderEntity asset, Resources resources)
public static AssetFolderDto FromDomain(IAssetFolderEntity asset, Resources resources)
{
var response = SimpleMapper.Map(asset, new AssetFolderDto());
var result = SimpleMapper.Map(asset, new AssetFolderDto());
return CreateLinks(response, resources);
return result.CreateLinks(resources);
}
private static AssetFolderDto CreateLinks(AssetFolderDto response, Resources resources)
private AssetFolderDto CreateLinks(Resources resources)
{
var values = new { app = resources.App, id = response.Id };
var values = new { app = resources.App, id = Id };
if (resources.CanUpdateAsset)
{
response.AddPutLink("update", resources.Url<AssetFoldersController>(x => nameof(x.PutAssetFolder), values));
AddPutLink("update", resources.Url<AssetFoldersController>(x => nameof(x.PutAssetFolder), values));
response.AddPutLink("move", resources.Url<AssetFoldersController>(x => nameof(x.PutAssetFolderParent), values));
AddPutLink("move", resources.Url<AssetFoldersController>(x => nameof(x.PutAssetFolderParent), values));
}
if (resources.CanUpdateAsset)
{
response.AddDeleteLink("delete", resources.Url<AssetFoldersController>(x => nameof(x.DeleteAssetFolder), values));
AddDeleteLink("delete", resources.Url<AssetFoldersController>(x => nameof(x.DeleteAssetFolder), values));
}
return response;
return this;
}
}
}

18
backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetFoldersDto.cs

@ -31,31 +31,31 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
[LocalizedRequired]
public AssetFolderDto[] Path { get; set; }
public static AssetFoldersDto FromAssets(IResultList<IAssetFolderEntity> assetFolders, IEnumerable<IAssetFolderEntity> path, Resources resources)
public static AssetFoldersDto FromDomain(IResultList<IAssetFolderEntity> assetFolders, IEnumerable<IAssetFolderEntity> path, Resources resources)
{
var response = new AssetFoldersDto
var result = new AssetFoldersDto
{
Total = assetFolders.Total,
Items = assetFolders.Select(x => AssetFolderDto.FromAssetFolder(x, resources)).ToArray()
Items = assetFolders.Select(x => AssetFolderDto.FromDomain(x, resources)).ToArray()
};
response.Path = path.Select(x => AssetFolderDto.FromAssetFolder(x, resources)).ToArray();
result.Path = path.Select(x => AssetFolderDto.FromDomain(x, resources)).ToArray();
return CreateLinks(response, resources);
return result.CreateLinks(resources);
}
private static AssetFoldersDto CreateLinks(AssetFoldersDto response, Resources resources)
private AssetFoldersDto CreateLinks(Resources resources)
{
var values = new { app = resources.App };
response.AddSelfLink(resources.Url<AssetFoldersController>(x => nameof(x.GetAssetFolders), values));
AddSelfLink(resources.Url<AssetFoldersController>(x => nameof(x.GetAssetFolders), values));
if (resources.CanUpdateAsset)
{
response.AddPostLink("create", resources.Url<AssetFoldersController>(x => nameof(x.PostAssetFolder), values));
AddPostLink("create", resources.Url<AssetFoldersController>(x => nameof(x.PostAssetFolder), values));
}
return response;
return this;
}
}
}

20
backend/src/Squidex/Areas/Api/Controllers/Assets/Models/AssetsDto.cs

@ -25,38 +25,38 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
[LocalizedRequired]
public AssetDto[] Items { get; set; }
public static AssetsDto FromAssets(IResultList<IEnrichedAssetEntity> assets, Resources resources)
public static AssetsDto FromDomain(IResultList<IEnrichedAssetEntity> assets, Resources resources)
{
var response = new AssetsDto
var result = new AssetsDto
{
Total = assets.Total,
Items = assets.Select(x => AssetDto.FromAsset(x, resources)).ToArray()
Items = assets.Select(x => AssetDto.FromDomain(x, resources)).ToArray()
};
return CreateLinks(response, resources);
return result.CreateLinks(resources);
}
private static AssetsDto CreateLinks(AssetsDto response, Resources resources)
private AssetsDto CreateLinks(Resources resources)
{
var values = new { app = resources.App };
response.AddSelfLink(resources.Url<AssetsController>(x => nameof(x.GetAssets), values));
AddSelfLink(resources.Url<AssetsController>(x => nameof(x.GetAssets), values));
if (resources.CanCreateAsset)
{
response.AddPostLink("create", resources.Url<AssetsController>(x => nameof(x.PostAsset), values));
AddPostLink("create", resources.Url<AssetsController>(x => nameof(x.PostAsset), values));
}
if (resources.CanUpdateAsset)
{
var tagValue = new { values.app, name = "tag" };
response.AddPutLink("tags/rename", resources.Url<AssetsController>(x => nameof(x.PutTag), tagValue));
AddPutLink("tags/rename", resources.Url<AssetsController>(x => nameof(x.PutTag), tagValue));
}
response.AddGetLink("tags", resources.Url<AssetsController>(x => nameof(x.GetTags), values));
AddGetLink("tags", resources.Url<AssetsController>(x => nameof(x.GetTags), values));
return response;
return this;
}
}
}

2
backend/src/Squidex/Areas/Api/Controllers/Backups/BackupsController.cs

@ -48,7 +48,7 @@ namespace Squidex.Areas.Api.Controllers.Backups
{
var jobs = await backupService.GetBackupsAsync(AppId, HttpContext.RequestAborted);
var response = BackupJobsDto.FromBackups(jobs, Resources);
var response = BackupJobsDto.FromDomain(jobs, Resources);
return Ok(response);
}

2
backend/src/Squidex/Areas/Api/Controllers/Backups/Models/BackupJobDto.cs

@ -45,7 +45,7 @@ namespace Squidex.Areas.Api.Controllers.Backups.Models
/// </summary>
public JobStatus Status { get; set; }
public static BackupJobDto FromBackup(IBackupJob backup, Resources resources)
public static BackupJobDto FromDomain(IBackupJob backup, Resources resources)
{
var result = SimpleMapper.Map(backup, new BackupJobDto());

4
backend/src/Squidex/Areas/Api/Controllers/Backups/Models/BackupJobsDto.cs

@ -19,11 +19,11 @@ namespace Squidex.Areas.Api.Controllers.Backups.Models
[LocalizedRequired]
public BackupJobDto[] Items { get; set; }
public static BackupJobsDto FromBackups(IEnumerable<IBackupJob> backups, Resources resources)
public static BackupJobsDto FromDomain(IEnumerable<IBackupJob> backups, Resources resources)
{
var result = new BackupJobsDto
{
Items = backups.Select(x => BackupJobDto.FromBackup(x, resources)).ToArray()
Items = backups.Select(x => BackupJobDto.FromDomain(x, resources)).ToArray()
};
return result.CreateLinks(resources);

2
backend/src/Squidex/Areas/Api/Controllers/Backups/Models/RestoreJobDto.cs

@ -41,7 +41,7 @@ namespace Squidex.Areas.Api.Controllers.Backups.Models
/// </summary>
public JobStatus Status { get; set; }
public static RestoreJobDto FromJob(IRestoreJob job)
public static RestoreJobDto FromDomain(IRestoreJob job)
{
return SimpleMapper.Map(job, new RestoreJobDto());
}

2
backend/src/Squidex/Areas/Api/Controllers/Backups/RestoreController.cs

@ -49,7 +49,7 @@ namespace Squidex.Areas.Api.Controllers.Backups
return NotFound();
}
var response = RestoreJobDto.FromJob(job);
var response = RestoreJobDto.FromDomain(job);
return Ok(response);
}

2
backend/src/Squidex/Areas/Api/Controllers/BulkResultDto.cs

@ -35,7 +35,7 @@ namespace Squidex.Areas.Api.Controllers
[Obsolete("Use 'id' field now.")]
public DomainId? ContentId => Id;
public static BulkResultDto FromBulkResult(BulkUpdateResultItem result, HttpContext httpContext)
public static BulkResultDto FromDomain(BulkUpdateResultItem result, HttpContext httpContext)
{
var error = result.Exception?.ToErrorDto(httpContext).Error;

4
backend/src/Squidex/Areas/Api/Controllers/Comments/CommentsController.cs

@ -83,7 +83,7 @@ namespace Squidex.Areas.Api.Controllers.Comments
var response = Deferred.Response(() =>
{
return CommentsDto.FromResult(result);
return CommentsDto.FromDomain(result);
});
Response.Headers[HeaderNames.ETag] = result.Version.ToString(CultureInfo.InvariantCulture);
@ -113,7 +113,7 @@ namespace Squidex.Areas.Api.Controllers.Comments
await CommandBus.PublishAsync(command);
var response = CommentDto.FromCommand(command);
var response = CommentDto.FromDomain(command);
return CreatedAtAction(nameof(GetComments), new { app, commentsId }, response);
}

8
backend/src/Squidex/Areas/Api/Controllers/Comments/Models/CommentDto.cs

@ -44,12 +44,14 @@ namespace Squidex.Areas.Api.Controllers.Comments.Models
/// </summary>
public Uri? Url { get; set; }
public static CommentDto FromComment(Comment comment)
public static CommentDto FromDomain(Comment comment)
{
return SimpleMapper.Map(comment, new CommentDto());
var result = SimpleMapper.Map(comment, new CommentDto());
return result;
}
public static CommentDto FromCommand(CreateComment command)
public static CommentDto FromDomain(CreateComment command)
{
var time = SystemClock.Instance.GetCurrentInstant();

14
backend/src/Squidex/Areas/Api/Controllers/Comments/Models/CommentsDto.cs

@ -32,15 +32,17 @@ namespace Squidex.Areas.Api.Controllers.Comments.Models
/// </summary>
public long Version { get; set; }
public static CommentsDto FromResult(CommentsResult result)
public static CommentsDto FromDomain(CommentsResult comments)
{
return new CommentsDto
var result = new CommentsDto
{
CreatedComments = result.CreatedComments.Select(CommentDto.FromComment).ToArray(),
UpdatedComments = result.UpdatedComments.Select(CommentDto.FromComment).ToArray(),
DeletedComments = result.DeletedComments,
Version = result.Version
CreatedComments = comments.CreatedComments.Select(CommentDto.FromDomain).ToArray(),
UpdatedComments = comments.UpdatedComments.Select(CommentDto.FromDomain).ToArray(),
DeletedComments = comments.DeletedComments,
Version = comments.Version
};
return result;
}
}
}

2
backend/src/Squidex/Areas/Api/Controllers/Comments/Notifications/UserNotificationsController.cs

@ -57,7 +57,7 @@ namespace Squidex.Areas.Api.Controllers.Comments.Notifications
var response = Deferred.Response(() =>
{
return CommentsDto.FromResult(result);
return CommentsDto.FromDomain(result);
});
Response.Headers[HeaderNames.ETag] = result.Version.ToString(CultureInfo.InvariantCulture);

10
backend/src/Squidex/Areas/Api/Controllers/Contents/ContentsController.cs

@ -209,7 +209,7 @@ namespace Squidex.Areas.Api.Controllers.Contents
var response = Deferred.Response(() =>
{
return ContentDto.FromContent(content, Resources);
return ContentDto.FromDomain(content, Resources);
});
return Ok(response);
@ -331,7 +331,7 @@ namespace Squidex.Areas.Api.Controllers.Contents
return NotFound();
}
var response = ContentDto.FromContent(content, Resources);
var response = ContentDto.FromDomain(content, Resources);
return Ok(response.Data);
}
@ -391,7 +391,7 @@ namespace Squidex.Areas.Api.Controllers.Contents
var context = await CommandBus.PublishAsync(command);
var result = context.Result<BulkUpdateResult>();
var response = result.Select(x => BulkResultDto.FromBulkResult(x, HttpContext)).ToArray();
var response = result.Select(x => BulkResultDto.FromDomain(x, HttpContext)).ToArray();
return Ok(response);
}
@ -422,7 +422,7 @@ namespace Squidex.Areas.Api.Controllers.Contents
var context = await CommandBus.PublishAsync(command);
var result = context.Result<BulkUpdateResult>();
var response = result.Select(x => BulkResultDto.FromBulkResult(x, HttpContext)).ToArray();
var response = result.Select(x => BulkResultDto.FromDomain(x, HttpContext)).ToArray();
return Ok(response);
}
@ -658,7 +658,7 @@ namespace Squidex.Areas.Api.Controllers.Contents
var context = await CommandBus.PublishAsync(command);
var result = context.Result<IEnrichedContentEntity>();
var response = ContentDto.FromContent(result, Resources);
var response = ContentDto.FromDomain(result, Resources);
return response;
}

4
backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentDto.cs

@ -117,7 +117,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
/// </summary>
public long Version { get; set; }
public static ContentDto FromContent(IEnrichedContentEntity content, Resources resources)
public static ContentDto FromDomain(IEnrichedContentEntity content, Resources resources)
{
var response = SimpleMapper.Map(content, new ContentDto
{
@ -136,7 +136,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
if (content.ReferenceFields != null)
{
response.ReferenceFields = content.ReferenceFields.Select(FieldDto.FromField).ToArray();
response.ReferenceFields = content.ReferenceFields.Select(FieldDto.FromDomain).ToArray();
}
if (content.ScheduleJob != null)

4
backend/src/Squidex/Areas/Api/Controllers/Contents/Models/ContentsDto.cs

@ -38,7 +38,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
var result = new ContentsDto
{
Total = contents.Total,
Items = contents.Select(x => ContentDto.FromContent(x, resources)).ToArray()
Items = contents.Select(x => ContentDto.FromDomain(x, resources)).ToArray()
};
if (schema != null)
@ -55,7 +55,7 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
{
var allStatuses = await workflow.GetAllAsync(schema);
Statuses = allStatuses.Select(StatusInfoDto.FromStatusInfo).ToArray();
Statuses = allStatuses.Select(StatusInfoDto.FromDomain).ToArray();
}
private async Task CreateLinksAsync(Resources resources, IContentWorkflow workflow, ISchemaEntity schema)

6
backend/src/Squidex/Areas/Api/Controllers/Contents/Models/StatusInfoDto.cs

@ -24,9 +24,11 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models
[LocalizedRequired]
public string Color { get; set; }
public static StatusInfoDto FromStatusInfo(StatusInfo statusInfo)
public static StatusInfoDto FromDomain(StatusInfo statusInfo)
{
return new StatusInfoDto { Status = statusInfo.Status, Color = statusInfo.Color };
var result = new StatusInfoDto { Status = statusInfo.Status, Color = statusInfo.Color };
return result;
}
}
}

8
backend/src/Squidex/Areas/Api/Controllers/EventConsumers/EventConsumersController.cs

@ -34,7 +34,7 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers
{
var eventConsumers = await GetGrain().GetConsumersAsync();
var response = EventConsumersDto.FromResults(eventConsumers.Value, Resources);
var response = EventConsumersDto.FromDomain(eventConsumers.Value, Resources);
return Ok(response);
}
@ -47,7 +47,7 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers
{
var eventConsumer = await GetGrain().StartAsync(consumerName);
var response = EventConsumerDto.FromEventConsumerInfo(eventConsumer, Resources);
var response = EventConsumerDto.FromDomain(eventConsumer, Resources);
return Ok(response);
}
@ -60,7 +60,7 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers
{
var eventConsumer = await GetGrain().StopAsync(consumerName);
var response = EventConsumerDto.FromEventConsumerInfo(eventConsumer, Resources);
var response = EventConsumerDto.FromDomain(eventConsumer, Resources);
return Ok(response);
}
@ -73,7 +73,7 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers
{
var eventConsumer = await GetGrain().ResetAsync(consumerName);
var response = EventConsumerDto.FromEventConsumerInfo(eventConsumer, Resources);
var response = EventConsumerDto.FromDomain(eventConsumer, Resources);
return Ok(response);
}

2
backend/src/Squidex/Areas/Api/Controllers/EventConsumers/Models/EventConsumerDto.cs

@ -25,7 +25,7 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers.Models
public string? Position { get; set; }
public static EventConsumerDto FromEventConsumerInfo(EventConsumerInfo eventConsumerInfo, Resources resources)
public static EventConsumerDto FromDomain(EventConsumerInfo eventConsumerInfo, Resources resources)
{
var result = SimpleMapper.Map(eventConsumerInfo, new EventConsumerDto());

4
backend/src/Squidex/Areas/Api/Controllers/EventConsumers/Models/EventConsumersDto.cs

@ -17,11 +17,11 @@ namespace Squidex.Areas.Api.Controllers.EventConsumers.Models
/// </summary>
public EventConsumerDto[] Items { get; set; }
public static EventConsumersDto FromResults(IEnumerable<EventConsumerInfo> items, Resources resources)
public static EventConsumersDto FromDomain(IEnumerable<EventConsumerInfo> items, Resources resources)
{
var result = new EventConsumersDto
{
Items = items.Select(x => EventConsumerDto.FromEventConsumerInfo(x, resources)).ToArray()
Items = items.Select(x => EventConsumerDto.FromDomain(x, resources)).ToArray()
};
return result.CreateLinks(resources);

2
backend/src/Squidex/Areas/Api/Controllers/History/HistoryController.cs

@ -46,7 +46,7 @@ namespace Squidex.Areas.Api.Controllers.History
{
var events = await historyService.QueryByChannelAsync(AppId, channel, 100, HttpContext.RequestAborted);
var response = events.Select(HistoryEventDto.FromHistoryEvent).Where(x => x.Message != null).ToArray();
var response = events.Select(HistoryEventDto.FromDomain).Where(x => x.Message != null).ToArray();
return Ok(response);
}

6
backend/src/Squidex/Areas/Api/Controllers/History/Models/HistoryEventDto.cs

@ -48,9 +48,11 @@ namespace Squidex.Areas.Api.Controllers.History.Models
/// </summary>
public long Version { get; set; }
public static HistoryEventDto FromHistoryEvent(ParsedHistoryEvent historyEvent)
public static HistoryEventDto FromDomain(ParsedHistoryEvent historyEvent)
{
return SimpleMapper.Map(historyEvent, new HistoryEventDto { EventId = historyEvent.Id });
var result = SimpleMapper.Map(historyEvent, new HistoryEventDto { EventId = historyEvent.Id });
return result;
}
}
}

6
backend/src/Squidex/Areas/Api/Controllers/LanguageDto.cs

@ -31,9 +31,11 @@ namespace Squidex.Areas.Api.Controllers
[LocalizedRequired]
public string NativeName { get; set; }
public static LanguageDto FromLanguage(Language language)
public static LanguageDto FromDomain(Language language)
{
return SimpleMapper.Map(language, new LanguageDto());
var result = SimpleMapper.Map(language, new LanguageDto());
return result;
}
}
}

2
backend/src/Squidex/Areas/Api/Controllers/Languages/LanguagesController.cs

@ -41,7 +41,7 @@ namespace Squidex.Areas.Api.Controllers.Languages
{
var response = Deferred.Response(() =>
{
return Language.AllLanguages.Select(LanguageDto.FromLanguage).ToArray();
return Language.AllLanguages.Select(LanguageDto.FromDomain).ToArray();
});
Response.Headers[HeaderNames.ETag] = "1";

2
backend/src/Squidex/Areas/Api/Controllers/Plans/AppPlansController.cs

@ -52,7 +52,7 @@ namespace Squidex.Areas.Api.Controllers.Plans
var response = Deferred.Response(() =>
{
return AppPlansDto.FromApp(App, appPlansProvider, hasPortal);
return AppPlansDto.FromDomain(App, appPlansProvider, hasPortal);
});
Response.Headers[HeaderNames.ETag] = App.ToEtag();

8
backend/src/Squidex/Areas/Api/Controllers/Plans/Models/AppPlansDto.cs

@ -34,19 +34,19 @@ namespace Squidex.Areas.Api.Controllers.Plans.Models
/// </summary>
public bool HasPortal { get; set; }
public static AppPlansDto FromApp(IAppEntity app, IAppPlansProvider plans, bool hasPortal)
public static AppPlansDto FromDomain(IAppEntity app, IAppPlansProvider plans, bool hasPortal)
{
var (_, planId) = plans.GetPlanForApp(app);
var response = new AppPlansDto
var result = new AppPlansDto
{
CurrentPlanId = planId,
Plans = plans.GetAvailablePlans().Select(PlanDto.FromPlan).ToArray(),
Plans = plans.GetAvailablePlans().Select(PlanDto.FromDomain).ToArray(),
PlanOwner = app.Plan?.Owner.Identifier,
HasPortal = hasPortal
};
return response;
return result;
}
}
}

6
backend/src/Squidex/Areas/Api/Controllers/Plans/Models/PlanDto.cs

@ -71,9 +71,11 @@ namespace Squidex.Areas.Api.Controllers.Plans.Models
/// </summary>
public int MaxContributors { get; set; }
public static PlanDto FromPlan(IAppLimitsPlan plan)
public static PlanDto FromDomain(IAppLimitsPlan plan)
{
return SimpleMapper.Map(plan, new PlanDto());
var result = SimpleMapper.Map(plan, new PlanDto());
return result;
}
}
}

2
backend/src/Squidex/Areas/Api/Controllers/Rules/Models/Converters/RuleTriggerDtoFactory.cs

@ -52,7 +52,7 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models.Converters
public RuleTriggerDto Visit(ContentChangedTriggerV2 trigger)
{
var schemas = trigger.Schemas?.Select(ContentChangedRuleTriggerSchemaDto.FromTrigger).ToArray();
var schemas = trigger.Schemas?.Select(ContentChangedRuleTriggerSchemaDto.FromDomain).ToArray();
return new ContentChangedRuleTriggerDto { Schemas = schemas, HandleAll = trigger.HandleAll };
}

2
backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleDto.cs

@ -90,7 +90,7 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
/// </summary>
public Instant? LastExecuted { get; set; }
public static RuleDto FromRule(IEnrichedRuleEntity rule, bool canRun, IRuleRunnerService ruleRunnerService, Resources resources)
public static RuleDto FromDomain(IEnrichedRuleEntity rule, bool canRun, IRuleRunnerService ruleRunnerService, Resources resources)
{
var result = new RuleDto();

2
backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleElementDto.cs

@ -51,7 +51,7 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
[LocalizedRequired]
public RuleElementPropertyDto[] Properties { get; set; }
public static RuleElementDto FromDefinition(RuleActionDefinition definition)
public static RuleElementDto FromDomain(RuleActionDefinition definition)
{
var result = SimpleMapper.Map(definition, new RuleElementDto());

2
backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleEventDto.cs

@ -64,7 +64,7 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
/// </summary>
public RuleJobResult JobResult { get; set; }
public static RuleEventDto FromRuleEvent(IRuleEventEntity ruleEvent, Resources resources)
public static RuleEventDto FromDomain(IRuleEventEntity ruleEvent, Resources resources)
{
var result = new RuleEventDto();

4
backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RuleEventsDto.cs

@ -25,12 +25,12 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
/// </summary>
public long Total { get; set; }
public static RuleEventsDto FromRuleEvents(IResultList<IRuleEventEntity> ruleEvents, Resources resources, DomainId? ruleId)
public static RuleEventsDto FromDomain(IResultList<IRuleEventEntity> ruleEvents, Resources resources, DomainId? ruleId)
{
var result = new RuleEventsDto
{
Total = ruleEvents.Total,
Items = ruleEvents.Select(x => RuleEventDto.FromRuleEvent(x, resources)).ToArray()
Items = ruleEvents.Select(x => RuleEventDto.FromDomain(x, resources)).ToArray()
};
return result.CreateLinks(resources, ruleId);

2
backend/src/Squidex/Areas/Api/Controllers/Rules/Models/RulesDto.cs

@ -32,7 +32,7 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
var result = new RulesDto
{
Items = items.Select(x => RuleDto.FromRule(x, runningRuleId == null, ruleRunnerService, resources)).ToArray()
Items = items.Select(x => RuleDto.FromDomain(x, runningRuleId == null, ruleRunnerService, resources)).ToArray()
};
result.RunningRuleId = runningRuleId;

2
backend/src/Squidex/Areas/Api/Controllers/Rules/Models/SimulatedRuleEventDto.cs

@ -52,7 +52,7 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
[Required]
public List<SkipReason> SkipReasons { get; set; }
public static SimulatedRuleEventDto FromSimulatedRuleEvent(SimulatedRuleEvent ruleEvent)
public static SimulatedRuleEventDto FromDomain(SimulatedRuleEvent ruleEvent)
{
var result = SimpleMapper.Map(ruleEvent, new SimulatedRuleEventDto
{

4
backend/src/Squidex/Areas/Api/Controllers/Rules/Models/SimulatedRuleEventsDto.cs

@ -24,12 +24,12 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models
/// </summary>
public long Total { get; set; }
public static SimulatedRuleEventsDto FromSimulatedRuleEvents(IList<SimulatedRuleEvent> events)
public static SimulatedRuleEventsDto FromDomain(IList<SimulatedRuleEvent> events)
{
var result = new SimulatedRuleEventsDto
{
Total = events.Count,
Items = events.Select(SimulatedRuleEventDto.FromSimulatedRuleEvent).ToArray()
Items = events.Select(SimulatedRuleEventDto.FromDomain).ToArray()
};
return result;

6
backend/src/Squidex/Areas/Api/Controllers/Rules/Models/Triggers/ContentChangedRuleTriggerSchemaDto.cs

@ -28,9 +28,11 @@ namespace Squidex.Areas.Api.Controllers.Rules.Models.Triggers
return SimpleMapper.Map(this, new ContentChangedTriggerSchemaV2());
}
public static ContentChangedRuleTriggerSchemaDto FromTrigger(ContentChangedTriggerSchemaV2 trigger)
public static ContentChangedRuleTriggerSchemaDto FromDomain(ContentChangedTriggerSchemaV2 trigger)
{
return SimpleMapper.Map(trigger, new ContentChangedRuleTriggerSchemaDto());
var result = SimpleMapper.Map(trigger, new ContentChangedRuleTriggerSchemaDto());
return result;
}
}
}

8
backend/src/Squidex/Areas/Api/Controllers/Rules/RulesController.cs

@ -70,7 +70,7 @@ namespace Squidex.Areas.Api.Controllers.Rules
var response = Deferred.Response(() =>
{
return ruleRegistry.Actions.ToDictionary(x => x.Key, x => RuleElementDto.FromDefinition(x.Value));
return ruleRegistry.Actions.ToDictionary(x => x.Key, x => RuleElementDto.FromDomain(x.Value));
});
Response.Headers[HeaderNames.ETag] = etag;
@ -305,7 +305,7 @@ namespace Squidex.Areas.Api.Controllers.Rules
var simulation = await ruleRunnerService.SimulateAsync(rule, HttpContext.RequestAborted);
var response = SimulatedRuleEventsDto.FromSimulatedRuleEvents(simulation);
var response = SimulatedRuleEventsDto.FromDomain(simulation);
return Ok(response);
}
@ -350,7 +350,7 @@ namespace Squidex.Areas.Api.Controllers.Rules
{
var ruleEvents = await ruleEventsRepository.QueryByAppAsync(AppId, ruleId, skip, take, HttpContext.RequestAborted);
var response = RuleEventsDto.FromRuleEvents(ruleEvents, Resources, ruleId);
var response = RuleEventsDto.FromDomain(ruleEvents, Resources, ruleId);
return Ok(response);
}
@ -476,7 +476,7 @@ namespace Squidex.Areas.Api.Controllers.Rules
var runningRuleId = await ruleRunnerService.GetRunningRuleIdAsync(Context.App.Id, HttpContext.RequestAborted);
var result = context.Result<IEnrichedRuleEntity>();
var response = RuleDto.FromRule(result, runningRuleId == null, ruleRunnerService, Resources);
var response = RuleDto.FromDomain(result, runningRuleId == null, ruleRunnerService, Resources);
return response;
}

6
backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldDto.cs

@ -59,7 +59,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
/// </summary>
public List<NestedFieldDto>? Nested { get; set; }
public static NestedFieldDto FromField(NestedField field)
public static NestedFieldDto FromDomain(NestedField field)
{
var properties = FieldPropertiesDtoFactory.Create(field.RawProperties);
@ -74,7 +74,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
return result;
}
public static FieldDto FromField(RootField field)
public static FieldDto FromDomain(RootField field)
{
var properties = FieldPropertiesDtoFactory.Create(field.RawProperties);
@ -93,7 +93,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
foreach (var nestedField in arrayField.Fields)
{
result.Nested.Add(FromField(nestedField));
result.Nested.Add(FromDomain(nestedField));
}
}

2
backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/FieldRuleDto.cs

@ -31,7 +31,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
/// </summary>
public string? Condition { get; set; }
public static FieldRuleDto FromFieldRule(FieldRule fieldRule)
public static FieldRuleDto FromDomain(FieldRule fieldRule)
{
return SimpleMapper.Map(fieldRule, new FieldRuleDto());
}

6
backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemaDto.cs

@ -123,7 +123,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
[LocalizedRequired]
public List<FieldDto> Fields { get; set; }
public static SchemaDto FromSchema(ISchemaEntity schema, Resources resources)
public static SchemaDto FromDomain(ISchemaEntity schema, Resources resources)
{
var result = new SchemaDto();
@ -132,13 +132,13 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
SimpleMapper.Map(schema.SchemaDef.Scripts, result.Scripts);
SimpleMapper.Map(schema.SchemaDef.Properties, result.Properties);
result.FieldRules = schema.SchemaDef.FieldRules.Select(FieldRuleDto.FromFieldRule).ToList();
result.FieldRules = schema.SchemaDef.FieldRules.Select(FieldRuleDto.FromDomain).ToList();
result.Fields = new List<FieldDto>();
foreach (var field in schema.SchemaDef.Fields)
{
result.Fields.Add(FieldDto.FromField(field));
result.Fields.Add(FieldDto.FromDomain(field));
}
result.CreateLinks(resources);

4
backend/src/Squidex/Areas/Api/Controllers/Schemas/Models/SchemasDto.cs

@ -17,11 +17,11 @@ namespace Squidex.Areas.Api.Controllers.Schemas.Models
/// </summary>
public SchemaDto[] Items { get; set; }
public static SchemasDto FromSchemas(IList<ISchemaEntity> schemas, Resources resources)
public static SchemasDto FromDomain(IList<ISchemaEntity> schemas, Resources resources)
{
var result = new SchemasDto
{
Items = schemas.Select(x => SchemaDto.FromSchema(x, resources)).ToArray()
Items = schemas.Select(x => SchemaDto.FromDomain(x, resources)).ToArray()
};
return result.CreateLinks(resources);

2
backend/src/Squidex/Areas/Api/Controllers/Schemas/SchemaFieldsController.cs

@ -549,7 +549,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas
var context = await CommandBus.PublishAsync(command);
var result = context.Result<ISchemaEntity>();
var response = SchemaDto.FromSchema(result, Resources);
var response = SchemaDto.FromDomain(result, Resources);
return response;
}

6
backend/src/Squidex/Areas/Api/Controllers/Schemas/SchemasController.cs

@ -56,7 +56,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas
var response = Deferred.Response(() =>
{
return SchemasDto.FromSchemas(schemas, Resources);
return SchemasDto.FromDomain(schemas, Resources);
});
Response.Headers[HeaderNames.ETag] = schemas.ToEtag();
@ -82,7 +82,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas
{
var response = Deferred.Response(() =>
{
return SchemaDto.FromSchema(Schema, Resources);
return SchemaDto.FromDomain(Schema, Resources);
});
Response.Headers[HeaderNames.ETag] = Schema.ToEtag();
@ -396,7 +396,7 @@ namespace Squidex.Areas.Api.Controllers.Schemas
var context = await CommandBus.PublishAsync(command);
var result = context.Result<ISchemaEntity>();
var response = SchemaDto.FromSchema(result, Resources);
var response = SchemaDto.FromDomain(result, Resources);
return response;
}

14
backend/src/Squidex/Areas/Api/Controllers/Search/Models/SearchResultDto.cs

@ -31,20 +31,18 @@ namespace Squidex.Areas.Api.Controllers.Search.Models
/// </summary>
public string? Label { get; set; }
public static SearchResultDto FromSearchResult(SearchResult searchResult)
public static SearchResultDto FromDomain(SearchResult searchResult)
{
var result = new SearchResultDto();
var result = SimpleMapper.Map(searchResult, new SearchResultDto());
SimpleMapper.Map(searchResult, result);
result.CreateLinks(searchResult);
return result;
return result.CreateLinks(searchResult);
}
protected virtual void CreateLinks(SearchResult searchResult)
protected SearchResultDto CreateLinks(SearchResult searchResult)
{
AddGetLink("url", searchResult.Url);
return this;
}
}
}

2
backend/src/Squidex/Areas/Api/Controllers/Search/SearchController.cs

@ -46,7 +46,7 @@ namespace Squidex.Areas.Api.Controllers.Search
{
var result = await searchManager.SearchAsync(query, Context, HttpContext.RequestAborted);
var response = result.Select(SearchResultDto.FromSearchResult).ToArray();
var response = result.Select(SearchResultDto.FromDomain).ToArray();
return Ok(response);
}

4
backend/src/Squidex/Areas/Api/Controllers/Statistics/Models/CallsUsageDtoDto.cs

@ -59,7 +59,7 @@ namespace Squidex.Areas.Api.Controllers.Statistics.Models
[LocalizedRequired]
public Dictionary<string, CallsUsagePerDateDto[]> Details { get; set; }
public static CallsUsageDtoDto FromStats(IAppLimitsPlan plan, ApiStatsSummary summary, Dictionary<string, List<ApiStats>> details)
public static CallsUsageDtoDto FromDomain(IAppLimitsPlan plan, ApiStatsSummary summary, Dictionary<string, List<ApiStats>> details)
{
return new CallsUsageDtoDto
{
@ -71,7 +71,7 @@ namespace Squidex.Areas.Api.Controllers.Statistics.Models
TotalCalls = summary.TotalCalls,
MonthBytes = summary.MonthBytes,
MonthCalls = summary.MonthCalls,
Details = details.ToDictionary(x => x.Key, x => x.Value.Select(CallsUsagePerDateDto.FromStats).ToArray())
Details = details.ToDictionary(x => x.Key, x => x.Value.Select(CallsUsagePerDateDto.FromDomain).ToArray())
};
}
}

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save