From 41bdbdcce710538e764e91b6fa38a043c829a579 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 18:01:36 +0200 Subject: [PATCH 01/18] Build improvements. --- .testrunsettings | 6 ++++++ Dockerfile | 7 +------ Dockerfile.build | 7 +------ 3 files changed, 8 insertions(+), 12 deletions(-) create mode 100644 .testrunsettings diff --git a/.testrunsettings b/.testrunsettings new file mode 100644 index 000000000..0082141a9 --- /dev/null +++ b/.testrunsettings @@ -0,0 +1,6 @@ + + + + 4 + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 86485f677..7b5213883 100644 --- a/Dockerfile +++ b/Dockerfile @@ -19,12 +19,7 @@ RUN cp -a /tmp/node_modules src/Squidex/ \ && npm run build # Test Backend -RUN dotnet restore \ - && dotnet test --filter Category!=Dependencies tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj \ - && dotnet test tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj \ - && dotnet test tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj \ - && dotnet test tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj \ - && dotnet test tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj +RUN dotnet restore && dotnet test -s ../../.testrunsettings --filter Category!=Dependencies # Publish RUN dotnet publish src/Squidex/Squidex.csproj --output /out/alpine --configuration Release -r alpine.3.7-x64 diff --git a/Dockerfile.build b/Dockerfile.build index 30a5d3091..f1468b1e0 100644 --- a/Dockerfile.build +++ b/Dockerfile.build @@ -16,12 +16,7 @@ RUN cp -a /tmp/node_modules src/Squidex/ \ && npm run build # Test Backend -RUN dotnet restore \ - && dotnet test --filter Category!=Dependencies tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj \ - && dotnet test tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj \ - && dotnet test tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj \ - && dotnet test tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj \ - && dotnet test tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj +RUN dotnet restore && dotnet test -s ../../.testrunsettings --filter Category!=Dependencies # Publish RUN dotnet publish src/Squidex/Squidex.csproj --output /out/ --configuration Release \ No newline at end of file From 3502e679af697c94393419b38ae155369967d65f Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 18:14:43 +0200 Subject: [PATCH 02/18] Share nuget folder. --- .drone.yml | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/.drone.yml b/.drone.yml index bc95a8247..04d7f8979 100644 --- a/.drone.yml +++ b/.drone.yml @@ -28,6 +28,8 @@ steps: path: /var/run/docker.sock - name: docker2 path: /var/lib/docker + - name: nuget + path: ~/.nuget/packages environment: DOCKER_USERNAME: from_secret: DOCKER_USERNAME @@ -51,6 +53,8 @@ steps: path: /var/run/docker.sock - name: docker2 path: /var/lib/docker + - name: nuget + path: ~/.nuget/packages environment: DOCKER_USERNAME: from_secret: DOCKER_USERNAME @@ -73,6 +77,8 @@ steps: path: /var/run/docker.sock - name: docker2 path: /var/lib/docker + - name: nuget + path: ~/.nuget/packages when: event: - tag @@ -154,4 +160,7 @@ volumes: path: /var/run/docker.sock - name: docker2 host: - path: /var/lib/docker \ No newline at end of file + path: /var/lib/docker + - name: nuget + host: + path: /var/lib/nuget \ No newline at end of file From 4e588c0d72b7c65b4c3fc3fe6c01ba4959f1c192 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 18:17:55 +0200 Subject: [PATCH 03/18] Test --- .testrunsettings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.testrunsettings b/.testrunsettings index 0082141a9..69a779394 100644 --- a/.testrunsettings +++ b/.testrunsettings @@ -1,6 +1,6 @@ - 4 + 6 \ No newline at end of file From 42ce42502b894e90f0c0714031024a77e13cd24d Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 18:21:16 +0200 Subject: [PATCH 04/18] Another attempt. --- .drone.yml | 4 ++-- .testrunsettings | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.drone.yml b/.drone.yml index 04d7f8979..b9452ffb5 100644 --- a/.drone.yml +++ b/.drone.yml @@ -29,7 +29,7 @@ steps: - name: docker2 path: /var/lib/docker - name: nuget - path: ~/.nuget/packages + path: /home/.nuget/packages environment: DOCKER_USERNAME: from_secret: DOCKER_USERNAME @@ -54,7 +54,7 @@ steps: - name: docker2 path: /var/lib/docker - name: nuget - path: ~/.nuget/packages + path: /home/.nuget/packages environment: DOCKER_USERNAME: from_secret: DOCKER_USERNAME diff --git a/.testrunsettings b/.testrunsettings index 69a779394..0082141a9 100644 --- a/.testrunsettings +++ b/.testrunsettings @@ -1,6 +1,6 @@ - 6 + 4 \ No newline at end of file From 331e39a1e19a282c8e76b645d0d3256f3488b049 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 18:23:28 +0200 Subject: [PATCH 05/18] FF --- .testrunsettings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.testrunsettings b/.testrunsettings index 0082141a9..69a779394 100644 --- a/.testrunsettings +++ b/.testrunsettings @@ -1,6 +1,6 @@ - 4 + 6 \ No newline at end of file From e71953030a121fe54a5d66d2912f295e5443de58 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 18:24:27 +0200 Subject: [PATCH 06/18] Pull Request fix. --- .drone.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.drone.yml b/.drone.yml index b9452ffb5..e0e7ab7f6 100644 --- a/.drone.yml +++ b/.drone.yml @@ -12,6 +12,8 @@ steps: path: /var/run/docker.sock - name: docker2 path: /var/lib/docker + - name: nuget + path: /home/.nuget/packages when: event: - pull_request From 6c791e4e80914d97fba3c0bcf4825516f19be2a5 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 18:25:43 +0200 Subject: [PATCH 07/18] T --- .testrunsettings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.testrunsettings b/.testrunsettings index 69a779394..0082141a9 100644 --- a/.testrunsettings +++ b/.testrunsettings @@ -1,6 +1,6 @@ - 6 + 4 \ No newline at end of file From 311db4942cde17eb4b31057843e77b6435d2f1f4 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 18:28:33 +0200 Subject: [PATCH 08/18] Test --- .testrunsettings | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.testrunsettings b/.testrunsettings index 0082141a9..ef537d413 100644 --- a/.testrunsettings +++ b/.testrunsettings @@ -1,6 +1,6 @@ - 4 + 5 \ No newline at end of file From df80cfd57cee3e36385c6e3cd531b2d575557da0 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 18:34:41 +0200 Subject: [PATCH 09/18] Nuget cache extraction test #1 --- .drone.yml | 8 ++++---- .testrunsettings | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.drone.yml b/.drone.yml index e0e7ab7f6..92b954985 100644 --- a/.drone.yml +++ b/.drone.yml @@ -13,7 +13,7 @@ steps: - name: docker2 path: /var/lib/docker - name: nuget - path: /home/.nuget/packages + path: /root/.nuget/packages/ when: event: - pull_request @@ -31,7 +31,7 @@ steps: - name: docker2 path: /var/lib/docker - name: nuget - path: /home/.nuget/packages + path: /root/.nuget/packages/ environment: DOCKER_USERNAME: from_secret: DOCKER_USERNAME @@ -56,7 +56,7 @@ steps: - name: docker2 path: /var/lib/docker - name: nuget - path: /home/.nuget/packages + path: /root/.nuget/packages/ environment: DOCKER_USERNAME: from_secret: DOCKER_USERNAME @@ -80,7 +80,7 @@ steps: - name: docker2 path: /var/lib/docker - name: nuget - path: ~/.nuget/packages + path: /root/.nuget/packages/ when: event: - tag diff --git a/.testrunsettings b/.testrunsettings index ef537d413..0082141a9 100644 --- a/.testrunsettings +++ b/.testrunsettings @@ -1,6 +1,6 @@ - 5 + 4 \ No newline at end of file From b68330af435a0178da4044111b9a46cd9d9aa0c7 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 18:51:45 +0200 Subject: [PATCH 10/18] Test --- Dockerfile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Dockerfile b/Dockerfile index 7b5213883..e6750cb62 100644 --- a/Dockerfile +++ b/Dockerfile @@ -17,6 +17,8 @@ RUN cp -a /tmp/node_modules src/Squidex/ \ && cd src/Squidex \ && npm run test:coverage \ && npm run build + +RUN find / -name "*.nupkg" # Test Backend RUN dotnet restore && dotnet test -s ../../.testrunsettings --filter Category!=Dependencies From 16921870eb236b58b32589ecffcd30d4043ac0b1 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 18:58:09 +0200 Subject: [PATCH 11/18] A --- .drone.yml | 8 ++++---- Dockerfile | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.drone.yml b/.drone.yml index 92b954985..26210c516 100644 --- a/.drone.yml +++ b/.drone.yml @@ -13,7 +13,7 @@ steps: - name: docker2 path: /var/lib/docker - name: nuget - path: /root/.nuget/packages/ + path: /root/.nuget/packages when: event: - pull_request @@ -31,7 +31,7 @@ steps: - name: docker2 path: /var/lib/docker - name: nuget - path: /root/.nuget/packages/ + path: /root/.nuget/packages environment: DOCKER_USERNAME: from_secret: DOCKER_USERNAME @@ -56,7 +56,7 @@ steps: - name: docker2 path: /var/lib/docker - name: nuget - path: /root/.nuget/packages/ + path: /root/.nuget/packages environment: DOCKER_USERNAME: from_secret: DOCKER_USERNAME @@ -80,7 +80,7 @@ steps: - name: docker2 path: /var/lib/docker - name: nuget - path: /root/.nuget/packages/ + path: /root/.nuget/packages when: event: - tag diff --git a/Dockerfile b/Dockerfile index e6750cb62..54958061e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,6 +5,10 @@ FROM squidex/dotnet:2.2-sdk-chromium-phantomjs-node as builder WORKDIR /src +COPY . . + +RUN dotnet restore + COPY src/Squidex/package*.json /tmp/ # Install Node packages @@ -17,8 +21,6 @@ RUN cp -a /tmp/node_modules src/Squidex/ \ && cd src/Squidex \ && npm run test:coverage \ && npm run build - -RUN find / -name "*.nupkg" # Test Backend RUN dotnet restore && dotnet test -s ../../.testrunsettings --filter Category!=Dependencies From 4dd3a56691ba135130a5ed0e64ae2719bb6f55bb Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 19:03:08 +0200 Subject: [PATCH 12/18] Reverted --- Dockerfile | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Dockerfile b/Dockerfile index 54958061e..7b5213883 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,10 +5,6 @@ FROM squidex/dotnet:2.2-sdk-chromium-phantomjs-node as builder WORKDIR /src -COPY . . - -RUN dotnet restore - COPY src/Squidex/package*.json /tmp/ # Install Node packages From d9c05be89f3e56e6f1c39bd6fa5174dda5f18c55 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 18 Jun 2019 19:45:33 +0200 Subject: [PATCH 13/18] Reverted docker build volume. --- .drone.yml | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/.drone.yml b/.drone.yml index 26210c516..bc95a8247 100644 --- a/.drone.yml +++ b/.drone.yml @@ -12,8 +12,6 @@ steps: path: /var/run/docker.sock - name: docker2 path: /var/lib/docker - - name: nuget - path: /root/.nuget/packages when: event: - pull_request @@ -30,8 +28,6 @@ steps: path: /var/run/docker.sock - name: docker2 path: /var/lib/docker - - name: nuget - path: /root/.nuget/packages environment: DOCKER_USERNAME: from_secret: DOCKER_USERNAME @@ -55,8 +51,6 @@ steps: path: /var/run/docker.sock - name: docker2 path: /var/lib/docker - - name: nuget - path: /root/.nuget/packages environment: DOCKER_USERNAME: from_secret: DOCKER_USERNAME @@ -79,8 +73,6 @@ steps: path: /var/run/docker.sock - name: docker2 path: /var/lib/docker - - name: nuget - path: /root/.nuget/packages when: event: - tag @@ -162,7 +154,4 @@ volumes: path: /var/run/docker.sock - name: docker2 host: - path: /var/lib/docker - - name: nuget - host: - path: /var/lib/nuget \ No newline at end of file + path: /var/lib/docker \ No newline at end of file From ab1fb499fdedc464a7f86001dde1f052a1645e2c Mon Sep 17 00:00:00 2001 From: Sebastian Date: Tue, 18 Jun 2019 23:00:24 +0200 Subject: [PATCH 14/18] Simple fixes. --- Dockerfile | 12 +++++++++-- Dockerfile.build | 12 +++++++++-- src/Squidex/package-lock.json | 38 +++++++++++++++++++++-------------- src/Squidex/package.json | 16 ++++++++------- 4 files changed, 52 insertions(+), 26 deletions(-) diff --git a/Dockerfile b/Dockerfile index 86485f677..e57b35d67 100644 --- a/Dockerfile +++ b/Dockerfile @@ -5,11 +5,20 @@ FROM squidex/dotnet:2.2-sdk-chromium-phantomjs-node as builder WORKDIR /src +# Copy Node project files. COPY src/Squidex/package*.json /tmp/ # Install Node packages RUN cd /tmp && npm install --loglevel=error +# Copy nuget project files. +COPY /**/**/*.csproj /tmp/ +# Copy nuget.config for package sources. +COPY NuGet.Config /tmp/ + +# Install nuget packages +RUN bash -c 'pushd /tmp; for p in *.csproj; do dotnet restore $p --verbosity quiet; true; done; popd' + COPY . . # Build Frontend @@ -19,8 +28,7 @@ RUN cp -a /tmp/node_modules src/Squidex/ \ && npm run build # Test Backend -RUN dotnet restore \ - && dotnet test --filter Category!=Dependencies tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj \ +RUN dotnet test tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj --filter Category!=Dependencies \ && dotnet test tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj \ && dotnet test tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj \ && dotnet test tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj \ diff --git a/Dockerfile.build b/Dockerfile.build index 30a5d3091..96debc8cd 100644 --- a/Dockerfile.build +++ b/Dockerfile.build @@ -2,11 +2,20 @@ FROM squidex/dotnet:2.2-sdk-chromium-phantomjs-node as builder WORKDIR /src +# Copy Node project files. COPY src/Squidex/package*.json /tmp/ # Install Node packages RUN cd /tmp && npm install --loglevel=error +# Copy Dotnet project files. +COPY /**/**/*.csproj /tmp/ +# Copy nuget.config for package sources. +COPY NuGet.Config /tmp/ + +# Install Dotnet packages +RUN bash -c 'pushd /tmp; for p in *.csproj; do dotnet restore $p --verbosity quiet; true; done; popd' + COPY . . # Build Frontend @@ -16,8 +25,7 @@ RUN cp -a /tmp/node_modules src/Squidex/ \ && npm run build # Test Backend -RUN dotnet restore \ - && dotnet test --filter Category!=Dependencies tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj \ +RUN dotnet test tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj --filter Category!=Dependencies \ && dotnet test tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj \ && dotnet test tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj \ && dotnet test tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj \ diff --git a/src/Squidex/package-lock.json b/src/Squidex/package-lock.json index 3051cf82b..b8073c031 100644 --- a/src/Squidex/package-lock.json +++ b/src/Squidex/package-lock.json @@ -3196,14 +3196,22 @@ } }, "browserslist": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.3.5.tgz", - "integrity": "sha512-z9ZhGc3d9e/sJ9dIx5NFXkKoaiQTnrvrMsN3R1fGb1tkWWNSz12UewJn9TNxGo1l7J23h0MRaPmk7jfeTZYs1w==", + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.6.3.tgz", + "integrity": "sha512-CNBqTCq22RKM8wKJNowcqihHJ4SkI8CGeK7KOR9tPboXUuS5Zk5lQgzzTbs4oxD8x+6HUshZUa2OyNI9lR93bQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000912", - "electron-to-chromium": "^1.3.86", - "node-releases": "^1.0.5" + "caniuse-lite": "^1.0.30000975", + "electron-to-chromium": "^1.3.164", + "node-releases": "^1.1.23" + }, + "dependencies": { + "caniuse-lite": { + "version": "1.0.30000975", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000975.tgz", + "integrity": "sha512-ZsXA9YWQX6ATu5MNg+Vx/cMQ+hM6vBBSqDeJs8ruk9z0ky4yIHML15MoxcFt088ST2uyjgqyUGRJButkptWf0w==", + "dev": true + } } }, "buffer": { @@ -3450,9 +3458,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000918", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000918.tgz", - "integrity": "sha512-CAZ9QXGViBvhHnmIHhsTPSWFBujDaelKnUj7wwImbyQRxmXynYqKGi3UaZTSz9MoVh+1EVxOS/DFIkrJYgR3aw==", + "version": "1.0.30000975", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000975.tgz", + "integrity": "sha512-ZsXA9YWQX6ATu5MNg+Vx/cMQ+hM6vBBSqDeJs8ruk9z0ky4yIHML15MoxcFt088ST2uyjgqyUGRJButkptWf0w==", "dev": true }, "canonical-path": { @@ -4950,9 +4958,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.90", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.90.tgz", - "integrity": "sha512-IjJZKRhFbWSOX1w0sdIXgp4CMRguu6UYcTckyFF/Gjtemsu/25eZ+RXwFlV+UWcIueHyQA1UnRJxocTpH5NdGA==", + "version": "1.3.164", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.164.tgz", + "integrity": "sha512-VLlalqUeduN4+fayVtRZvGP2Hl1WrRxlwzh2XVVMJym3IFrQUS29BFQ1GP/BxOJXJI1OFCrJ5BnFEsAe8NHtOg==", "dev": true }, "elliptic": { @@ -10755,9 +10763,9 @@ } }, "node-releases": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.1.tgz", - "integrity": "sha512-2UXrBr6gvaebo5TNF84C66qyJJ6r0kxBObgZIDX3D3/mt1ADKiHux3NJPWisq0wxvJJdkjECH+9IIKYViKj71Q==", + "version": "1.1.23", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.23.tgz", + "integrity": "sha512-uq1iL79YjfYC0WXoHbC/z28q/9pOl8kSHaXdWmAAc8No+bDwqkZbzIJz55g/MUsPgSGm9LZ7QSUbzTcH5tz47w==", "dev": true, "requires": { "semver": "^5.3.0" diff --git a/src/Squidex/package.json b/src/Squidex/package.json index 72f1ab671..09a66cd63 100644 --- a/src/Squidex/package.json +++ b/src/Squidex/package.json @@ -47,21 +47,23 @@ "zone.js": "0.9.1" }, "devDependencies": { - "@angular/compiler-cli": "7.2.14", "@angular/compiler": "7.2.14", + "@angular/compiler-cli": "7.2.14", "@ngtools/webpack": "7.3.8", "@types/core-js": "2.5.0", "@types/jasmine": "3.3.12", "@types/marked": "0.6.5", "@types/mousetrap": "1.6", "@types/node": "12.0.0", - "@types/react-dom": "16.8.4", "@types/react": "16.8.16", + "@types/react-dom": "16.8.4", "@types/sortablejs": "1.7.2", "angular-router-loader": "0.8.5", "angular2-template-loader": "0.6.2", "awesome-typescript-loader": "5.2.1", "babel-core": "6.26.3", + "browserslist": "^4.6.3", + "caniuse-lite": "^1.0.30000975", "circular-dependency-plugin": "5.0.2", "codelyzer": "5.0.1", "cpx": "1.5.0", @@ -72,16 +74,16 @@ "ignore-loader": "0.1.2", "istanbul-instrumenter-loader": "3.0.1", "jasmine-core": "3.4.0", + "karma": "4.1.0", "karma-chrome-launcher": "2.2.0", "karma-cli": "2.0.0", "karma-coverage-istanbul-reporter": "2.0.5", "karma-htmlfile-reporter": "0.3.8", - "karma-jasmine-html-reporter": "1.4.2", "karma-jasmine": "2.0.1", + "karma-jasmine-html-reporter": "1.4.2", "karma-mocha-reporter": "2.2.5", "karma-sourcemap-loader": "0.3.7", "karma-webpack": "3.0.5", - "karma": "4.1.0", "mini-css-extract-plugin": "0.6.0", "node-sass": "4.12.0", "optimize-css-assets-webpack-plugin": "5.0.1", @@ -93,15 +95,15 @@ "style-loader": "0.23.1", "ts-loader": "5.4.5", "tsconfig-paths-webpack-plugin": "3.2.0", - "tslint-webpack-plugin": "2.0.4", "tslint": "5.16.0", + "tslint-webpack-plugin": "2.0.4", "typemoq": "2.1.0", "typescript": "3.2.4", "uglifyjs-webpack-plugin": "2.1.2", "underscore": "1.9.1", + "webpack": "4.30.0", "webpack-cli": "3.3.1", "webpack-dev-server": "3.3.1", - "webpack-merge": "4.2.1", - "webpack": "4.30.0" + "webpack-merge": "4.2.1" } } From 36a4d2f1c033d8cc35e09304df2c50a45cd0a572 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Thu, 20 Jun 2019 09:11:05 +0200 Subject: [PATCH 15/18] Middleware to log resolver exceptions. --- .../Contents/GraphQL/CachingGraphQLService.cs | 11 +++-- .../Contents/GraphQL/GraphQLModel.cs | 4 +- .../Contents/GraphQL/LoggingMiddleware.cs | 42 +++++++++++++++++++ .../Contents/GraphQL/GraphQLTestBase.cs | 3 +- 4 files changed, 55 insertions(+), 5 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Entities/Contents/GraphQL/LoggingMiddleware.cs diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/CachingGraphQLService.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/CachingGraphQLService.cs index 2c57f06da..e56e28cb3 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/CachingGraphQLService.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/CachingGraphQLService.cs @@ -12,6 +12,7 @@ using Microsoft.Extensions.Caching.Memory; using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Assets; using Squidex.Infrastructure; +using Squidex.Infrastructure.Log; namespace Squidex.Domain.Apps.Entities.Contents.GraphQL { @@ -20,6 +21,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL private static readonly TimeSpan CacheDuration = TimeSpan.FromMinutes(10); private readonly IContentQueryService contentQuery; private readonly IGraphQLUrlGenerator urlGenerator; + private readonly ISemanticLog log; private readonly IAssetQueryService assetQuery; private readonly IAppProvider appProvider; @@ -28,18 +30,21 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL IAppProvider appProvider, IAssetQueryService assetQuery, IContentQueryService contentQuery, - IGraphQLUrlGenerator urlGenerator) + IGraphQLUrlGenerator urlGenerator, + ISemanticLog log) : base(cache) { Guard.NotNull(appProvider, nameof(appProvider)); Guard.NotNull(assetQuery, nameof(assetQuery)); Guard.NotNull(contentQuery, nameof(contentQuery)); Guard.NotNull(urlGenerator, nameof(urlGenerator)); + Guard.NotNull(log, nameof(log)); this.appProvider = appProvider; this.assetQuery = assetQuery; this.contentQuery = contentQuery; this.urlGenerator = urlGenerator; + this.log = log; } public async Task<(bool HasError, object Response)> QueryAsync(QueryContext context, params GraphQLQuery[] queries) @@ -70,14 +75,14 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL return result; } - private static async Task<(bool HasError, object Response)> QueryInternalAsync(GraphQLModel model, GraphQLExecutionContext ctx, GraphQLQuery query) + private async Task<(bool HasError, object Response)> QueryInternalAsync(GraphQLModel model, GraphQLExecutionContext ctx, GraphQLQuery query) { if (string.IsNullOrWhiteSpace(query.Query)) { return (false, new { data = new object() }); } - var result = await model.ExecuteAsync(ctx, query); + var result = await model.ExecuteAsync(ctx, query, log); if (result.Errors?.Any() == true) { diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs index a07e8aca3..1373ee437 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs @@ -20,6 +20,7 @@ using Squidex.Domain.Apps.Entities.Contents.GraphQL.Types; using Squidex.Domain.Apps.Entities.Contents.GraphQL.Types.Utils; using Squidex.Domain.Apps.Entities.Schemas; using Squidex.Infrastructure; +using Squidex.Infrastructure.Log; using GraphQLSchema = GraphQL.Types.Schema; #pragma warning disable IDE0003 @@ -171,7 +172,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL return contentTypes.GetOrAdd(schema, s => new ContentGraphType()); } - public async Task<(object Data, object[] Errors)> ExecuteAsync(GraphQLExecutionContext context, GraphQLQuery query) + public async Task<(object Data, object[] Errors)> ExecuteAsync(GraphQLExecutionContext context, GraphQLQuery query, ISemanticLog log) { Guard.NotNull(context, nameof(context)); @@ -179,6 +180,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL var result = await new DocumentExecuter().ExecuteAsync(options => { + options.FieldMiddleware.Use(LoggingMiddleware.Create(log)); options.OperationName = query.OperationName; options.UserContext = context; options.Schema = graphQLSchema; diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/LoggingMiddleware.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/LoggingMiddleware.cs new file mode 100644 index 000000000..9db32cab0 --- /dev/null +++ b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/LoggingMiddleware.cs @@ -0,0 +1,42 @@ +// ========================================================================== +// Squidex Headless CMS +// ========================================================================== +// Copyright (c) Squidex UG (haftungsbeschraenkt) +// All rights reserved. Licensed under the MIT license. +// ========================================================================== + +using System; +using GraphQL.Instrumentation; +using Squidex.Infrastructure; +using Squidex.Infrastructure.Log; + +namespace Squidex.Domain.Apps.Entities.Contents.GraphQL +{ + public static class LoggingMiddleware + { + public static Func Create(ISemanticLog log) + { + Guard.NotNull(log, nameof(log)); + + return new Func(next => + { + return async context => + { + try + { + return await next(context); + } + catch (Exception ex) + { + log.LogWarning(ex, w => w + .WriteProperty("action", "reolveField") + .WriteProperty("status", "failed") + .WriteProperty("field", context.FieldName)); + + throw ex; + } + }; + }); + } + } +} diff --git a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLTestBase.cs b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLTestBase.cs index d3f6b5ea1..53e155449 100644 --- a/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLTestBase.cs +++ b/tests/Squidex.Domain.Apps.Entities.Tests/Contents/GraphQL/GraphQLTestBase.cs @@ -24,6 +24,7 @@ using Squidex.Domain.Apps.Entities.Schemas; using Squidex.Infrastructure; using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Json.Objects; +using Squidex.Infrastructure.Log; using Xunit; #pragma warning disable SA1311 // Static readonly fields must begin with upper-case letter @@ -96,7 +97,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL A.CallTo(() => appProvider.GetSchemasAsync(appId)).Returns(allSchemas); - sut = new CachingGraphQLService(cache, appProvider, assetQuery, contentQuery, new FakeUrlGenerator()); + sut = new CachingGraphQLService(cache, appProvider, assetQuery, contentQuery, new FakeUrlGenerator(), A.Fake()); } protected static IContentEntity CreateContent(Guid id, Guid refId, Guid assetId, NamedContentData data = null, NamedContentData dataDraft = null) From e1a75a8f6aab555b2800fba3de5f49118938668d Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Thu, 20 Jun 2019 18:16:35 +0200 Subject: [PATCH 16/18] Formatting fixes. --- .../IdentityServer/Views/Account/Login.cshtml | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/Squidex/Areas/IdentityServer/Views/Account/Login.cshtml b/src/Squidex/Areas/IdentityServer/Views/Account/Login.cshtml index 54b6042d0..dd23d6a95 100644 --- a/src/Squidex/Areas/IdentityServer/Views/Account/Login.cshtml +++ b/src/Squidex/Areas/IdentityServer/Views/Account/Login.cshtml @@ -53,22 +53,22 @@ { if (Model.IsLogin) { - if (Model.IsFailed) - { -
Email or password not correct.
- } + if (Model.IsFailed) + { +
Email or password not correct.
+ } -
-
- -
+ +
+ +
-
- -
+
+ +
- -
+ + } else { @@ -95,7 +95,6 @@ else var redirectButtons = document.getElementsByClassName("redirect-button"); if (redirectButtons.length === 1) { - debugger; redirectButtons[0].click(); } From 880e8bf92dee27f01a26f001cf23ea6eb16bd017 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adam=20Hlad=C3=ADk?= Date: Fri, 21 Jun 2019 19:50:08 +0200 Subject: [PATCH 17/18] Bad field name in GraphQL schema description (#370) * change nested field name source * nested field unique name * QueryGraphTypeVisitor property --- .../Contents/GraphQL/GraphQLModel.cs | 4 ++-- .../Contents/GraphQL/IGraphModel.cs | 2 +- .../Contents/GraphQL/Types/ContentDataGraphType.cs | 2 +- .../Contents/GraphQL/Types/NestedGraphType.cs | 10 +++++----- .../Contents/GraphQL/Types/QueryGraphTypeVisitor.cs | 6 ++++-- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs index 1373ee437..9cb3dc67e 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/GraphQLModel.cs @@ -136,9 +136,9 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL return partitionResolver(key); } - public (IGraphType ResolveType, ValueResolver Resolver) GetGraphType(ISchemaEntity schema, IField field) + public (IGraphType ResolveType, ValueResolver Resolver) GetGraphType(ISchemaEntity schema, IField field, string fieldName) { - return field.Accept(new QueryGraphTypeVisitor(schema, GetContentType, this, assetListType)); + return field.Accept(new QueryGraphTypeVisitor(schema, GetContentType, this, assetListType, fieldName)); } public IGraphType GetAssetType() diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/IGraphModel.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/IGraphModel.cs index f44c36b58..1ee303d6a 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/IGraphModel.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/IGraphModel.cs @@ -35,6 +35,6 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL IGraphType GetContentDataType(Guid schemaId); - (IGraphType ResolveType, ValueResolver Resolver) GetGraphType(ISchemaEntity schema, IField field); + (IGraphType ResolveType, ValueResolver Resolver) GetGraphType(ISchemaEntity schema, IField field, string fieldName); } } diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphType.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphType.cs index 7dfd1480b..eb6ef19f5 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphType.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/ContentDataGraphType.cs @@ -27,7 +27,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types foreach (var (field, fieldName, typeName) in schema.SchemaDef.Fields.SafeFields()) { - var (resolvedType, valueResolver) = model.GetGraphType(schema, field); + var (resolvedType, valueResolver) = model.GetGraphType(schema, field, fieldName); if (valueResolver != null) { diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedGraphType.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedGraphType.cs index 7f64227bb..2964ed201 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedGraphType.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/NestedGraphType.cs @@ -16,18 +16,18 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types { public sealed class NestedGraphType : ObjectGraphType { - public NestedGraphType(IGraphModel model, ISchemaEntity schema, IArrayField field) + public NestedGraphType(IGraphModel model, ISchemaEntity schema, IArrayField field, string fieldName) { var schemaType = schema.TypeName(); var schemaName = schema.DisplayName(); - var fieldName = field.DisplayName(); + var fieldDisplayName = field.DisplayName(); Name = $"{schemaType}{fieldName}ChildDto"; foreach (var (nestedField, nestedName, _) in field.Fields.SafeFields()) { - var fieldInfo = model.GetGraphType(schema, nestedField); + var fieldInfo = model.GetGraphType(schema, nestedField, nestedName); if (fieldInfo.ResolveType != null) { @@ -38,12 +38,12 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types Name = nestedName, Resolver = resolver, ResolvedType = fieldInfo.ResolveType, - Description = $"The {fieldName}/{nestedField.DisplayName()} nested field." + Description = $"The {fieldDisplayName}/{nestedField.DisplayName()} nested field." }); } } - Description = $"The structure of the {schemaName}.{fieldName} nested schema."; + Description = $"The structure of the {schemaName}.{fieldDisplayName} nested schema."; } private static FuncFieldResolver ValueResolver(NestedField nestedField, (IGraphType ResolveType, ValueResolver Resolver) fieldInfo) diff --git a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/QueryGraphTypeVisitor.cs b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/QueryGraphTypeVisitor.cs index 32a9a308f..195eee1a7 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/QueryGraphTypeVisitor.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/GraphQL/Types/QueryGraphTypeVisitor.cs @@ -22,13 +22,15 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types private readonly Func schemaResolver; private readonly IGraphModel model; private readonly IGraphType assetListType; + private readonly string fieldName; - public QueryGraphTypeVisitor(ISchemaEntity schema, Func schemaResolver, IGraphModel model, IGraphType assetListType) + public QueryGraphTypeVisitor(ISchemaEntity schema, Func schemaResolver, IGraphModel model, IGraphType assetListType, string fieldName) { this.model = model; this.assetListType = assetListType; this.schema = schema; this.schemaResolver = schemaResolver; + this.fieldName = fieldName; } public (IGraphType ResolveType, ValueResolver Resolver) Visit(IArrayField field) @@ -93,7 +95,7 @@ namespace Squidex.Domain.Apps.Entities.Contents.GraphQL.Types private (IGraphType ResolveType, ValueResolver Resolver) ResolveNested(IArrayField field) { - var schemaFieldType = new ListGraphType(new NonNullGraphType(new NestedGraphType(model, schema, field))); + var schemaFieldType = new ListGraphType(new NonNullGraphType(new NestedGraphType(model, schema, field, this.fieldName))); return (schemaFieldType, NoopResolver); } From 4b7fa30f4aff2d9b8214e4862f89b885f5645bb5 Mon Sep 17 00:00:00 2001 From: Sebastian Date: Fri, 21 Jun 2019 20:05:00 +0200 Subject: [PATCH 18/18] Fix for scheduling. --- .../Contents/ScheduleJob.cs | 11 ++++++----- .../Api/Controllers/Contents/Models/ScheduleJobDto.cs | 10 ++++++---- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/src/Squidex.Domain.Apps.Entities/Contents/ScheduleJob.cs b/src/Squidex.Domain.Apps.Entities/Contents/ScheduleJob.cs index 9936e98ef..4145dd954 100644 --- a/src/Squidex.Domain.Apps.Entities/Contents/ScheduleJob.cs +++ b/src/Squidex.Domain.Apps.Entities/Contents/ScheduleJob.cs @@ -1,4 +1,5 @@ -// ========================================================================== + +// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) @@ -22,17 +23,17 @@ namespace Squidex.Domain.Apps.Entities.Contents public Instant DueTime { get; } - public ScheduleJob(Guid id, Status status, RefToken scheduledBy, Instant due) + public ScheduleJob(Guid id, Status status, RefToken scheduledBy, Instant dueTime) { Id = id; ScheduledBy = scheduledBy; Status = status; - DueTime = due; + DueTime = dueTime; } - public static ScheduleJob Build(Status status, RefToken by, Instant due) + public static ScheduleJob Build(Status status, RefToken scheduledBy, Instant dueTime) { - return new ScheduleJob(Guid.NewGuid(), status, by, due); + return new ScheduleJob(Guid.NewGuid(), status, scheduledBy, dueTime); } } } diff --git a/src/Squidex/Areas/Api/Controllers/Contents/Models/ScheduleJobDto.cs b/src/Squidex/Areas/Api/Controllers/Contents/Models/ScheduleJobDto.cs index b0e7b34cb..ef7ebda7b 100644 --- a/src/Squidex/Areas/Api/Controllers/Contents/Models/ScheduleJobDto.cs +++ b/src/Squidex/Areas/Api/Controllers/Contents/Models/ScheduleJobDto.cs @@ -6,6 +6,7 @@ // ========================================================================== using System; +using System.ComponentModel.DataAnnotations; using NodaTime; using Squidex.Domain.Apps.Core.Contents; using Squidex.Infrastructure; @@ -25,13 +26,14 @@ namespace Squidex.Areas.Api.Controllers.Contents.Models public Status Status { get; set; } /// - /// The user who schedule the content. + /// The target date and time when the content should be scheduled. /// - public RefToken ScheduledBy { get; set; } + public Instant DueTime { get; set; } /// - /// The target date and time when the content should be scheduled. + /// The user who schedule the content. /// - public Instant DueTime { get; set; } + [Required] + public RefToken ScheduledBy { get; set; } } }