diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplateCommandMiddleware.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplateCommandMiddleware.cs index be9a60503..717d5daef 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplateCommandMiddleware.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplateCommandMiddleware.cs @@ -6,6 +6,7 @@ // ========================================================================== using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; using Squidex.CLI.Commands.Implementation; using Squidex.CLI.Commands.Implementation.FileSystem; using Squidex.CLI.Commands.Implementation.Sync; @@ -28,13 +29,15 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates public sealed class TemplateCommandMiddleware : ICommandMiddleware { private readonly TemplatesClient templatesClient; + private readonly TemplatesOptions templateOptions; private readonly IUrlGenerator urlGenerator; private readonly ISemanticLog log; - public TemplateCommandMiddleware(TemplatesClient templatesClient, IUrlGenerator urlGenerator, + public TemplateCommandMiddleware(TemplatesClient templatesClient, IOptions templateOptions, IUrlGenerator urlGenerator, ISemanticLog log) { this.templatesClient = templatesClient; + this.templateOptions = templateOptions.Value; this.urlGenerator = urlGenerator; this.log = log; @@ -102,6 +105,13 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates { var client = app.Clients.First(); + var url = templateOptions.LocalUrl; + + if (string.IsNullOrEmpty(url)) + { + url = urlGenerator.Root(); + } + return new Session( app.Name, new DirectoryInfo(Path.GetTempPath()), @@ -111,7 +121,7 @@ namespace Squidex.Domain.Apps.Entities.Apps.Templates AppName = app.Name, ClientId = $"{app.Name}:{client.Key}", ClientSecret = client.Value.Secret, - Url = urlGenerator.Root() + Url = url })); } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplatesOptions.cs b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplatesOptions.cs index c8f428f53..cb376ff59 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplatesOptions.cs +++ b/backend/src/Squidex.Domain.Apps.Entities/Apps/Templates/TemplatesOptions.cs @@ -5,12 +5,12 @@ // 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 sealed class TemplatesOptions { + public string? LocalUrl { get; set; } + public TemplateRepository[] Repositories { get; set; } } } diff --git a/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj b/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj index 87e16cdf6..1a8830906 100644 --- a/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj +++ b/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj @@ -34,7 +34,7 @@ - + diff --git a/backend/src/Squidex/Squidex.csproj b/backend/src/Squidex/Squidex.csproj index 215deca2a..127746983 100644 --- a/backend/src/Squidex/Squidex.csproj +++ b/backend/src/Squidex/Squidex.csproj @@ -83,7 +83,7 @@ - + diff --git a/backend/tests/docker-compose.yml b/backend/tests/docker-compose.yml index 722435d13..bd2fb15b0 100644 --- a/backend/tests/docker-compose.yml +++ b/backend/tests/docker-compose.yml @@ -13,15 +13,17 @@ services: - "8080:80" environment: - URLS__BASEURL=http://localhost:8080 + - ASSETS_RESIZERURL=http://resizer:8081 - EVENTSTORE__MONGODB__CONFIGURATION=mongodb://mongo + - GRAPHQL__CACHEDURATION=0 - IDENTITY__ADMINCLIENTID=root - IDENTITY__ADMINCLIENTSECRET=xeLd6jFxqbXJrfmNLlO2j1apagGGGSyZJhFnIuHp4I0= + - IDENTITY__MULTIPLEDOMAINS=true + - SCRIPTING__TIMEOUTEXECUTION=00:00:10 + - SCRIPTING__TIMEOUTSCRIPT=00:00:10 - STORE__MONGODB__CONFIGURATION=mongodb://mongo - STORE__TYPE=MongoDB - - SCRIPTING__TIMEOUTSCRIPT=00:00:10 - - SCRIPTING__TIMEOUTEXECUTION=00:00:10 - - GRAPHQL__CACHEDURATION=0 - - ASSETS_RESIZERURL=http://resizer:8081 + - TEMPLATES__LOCALURL=http://localhost:80 networks: - internal depends_on: diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/AppCreationTests.cs b/backend/tools/TestSuite/TestSuite.ApiTests/AppCreationTests.cs index 88c2ad87b..661a924bb 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/AppCreationTests.cs +++ b/backend/tools/TestSuite/TestSuite.ApiTests/AppCreationTests.cs @@ -113,5 +113,28 @@ namespace TestSuite.ApiTests // STEP 3: Create app again await _.Apps.PostAppAsync(createRequest); } + + [Fact] + public async Task Should_create_app_from_templates() + { + var appName = Guid.NewGuid().ToString(); + + // STEP 1: Get template. + var templates = await _.Templates.GetTemplatesAsync(); + + var template = templates.Items.First(x => x.IsStarter); + + + // STEP 2: Create app. + var createRequest = new CreateAppDto { Name = appName, Template = template.Name }; + + await _.Apps.PostAppAsync(createRequest); + + + // STEP 3: Get schemas + var schemas = await _.Schemas.GetSchemasAsync(appName); + + Assert.NotEmpty(schemas.Items); + } } } diff --git a/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj b/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj index f27884c45..0a7612c2a 100644 --- a/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj +++ b/backend/tools/TestSuite/TestSuite.ApiTests/TestSuite.ApiTests.csproj @@ -14,7 +14,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/backend/tools/TestSuite/TestSuite.LoadTests/TestSuite.LoadTests.csproj b/backend/tools/TestSuite/TestSuite.LoadTests/TestSuite.LoadTests.csproj index b9208691f..be74f562b 100644 --- a/backend/tools/TestSuite/TestSuite.LoadTests/TestSuite.LoadTests.csproj +++ b/backend/tools/TestSuite/TestSuite.LoadTests/TestSuite.LoadTests.csproj @@ -6,7 +6,7 @@ enable - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/backend/tools/TestSuite/TestSuite.Shared/ClientManagerWrapper.cs b/backend/tools/TestSuite/TestSuite.Shared/ClientManagerWrapper.cs index 796c93ce9..e0ff506e1 100644 --- a/backend/tools/TestSuite/TestSuite.Shared/ClientManagerWrapper.cs +++ b/backend/tools/TestSuite/TestSuite.Shared/ClientManagerWrapper.cs @@ -41,6 +41,9 @@ namespace TestSuite [Lazy] public ISchemasClient Schemas => ClientManager.CreateSchemasClient(); + [Lazy] + public ITemplatesClient Templates => ClientManager.CreateTemplatesClient(); + public ClientManagerWrapper() { var appName = GetValue("config:app:name", "integration-tests"); diff --git a/backend/tools/TestSuite/TestSuite.Shared/Fixtures/ClientFixture.cs b/backend/tools/TestSuite/TestSuite.Shared/Fixtures/ClientFixture.cs index 9f4154726..a011084c3 100644 --- a/backend/tools/TestSuite/TestSuite.Shared/Fixtures/ClientFixture.cs +++ b/backend/tools/TestSuite/TestSuite.Shared/Fixtures/ClientFixture.cs @@ -22,5 +22,7 @@ namespace TestSuite.Fixtures public IRulesClient Rules => Squidex.Rules; public ISchemasClient Schemas => Squidex.Schemas; + + public ITemplatesClient Templates => Squidex.Templates; } } diff --git a/backend/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj b/backend/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj index 86500d8ae..019cddd16 100644 --- a/backend/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj +++ b/backend/tools/TestSuite/TestSuite.Shared/TestSuite.Shared.csproj @@ -11,7 +11,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive @@ -21,7 +21,7 @@ - +