diff --git a/.github/workflows/blackduck.yml b/.github/workflows/blackduck.yml index 4371dfef..7514912f 100644 --- a/.github/workflows/blackduck.yml +++ b/.github/workflows/blackduck.yml @@ -31,12 +31,53 @@ jobs: distribution: 'temurin' cache: maven - - name: Install dependencies + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: '22' + + - name: Install Maven dependencies run: | mvn clean install -P unit-tests -DskipIntegrationTests mvn clean install -f app/single-tenant/central-space/demoapp/pom.xml -DskipTests mvn clean install -f app/multi-tenant/central-space/cloud-cap-samples-java/pom.xml -DskipTests - + + - name: Setup npm registries and install SAP packages + env: + NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} + SAP_CDS_MTXS_TARBALL: ${{ secrets.SAP_CDS_MTXS_TARBALL }} + SAP_CDS_DK_TARBALL: ${{ secrets.SAP_CDS_DK_TARBALL }} + run: | + set +x + echo "::add-mask::$NPM_AUTH_TOKEN" + echo "::add-mask::$SAP_CDS_MTXS_TARBALL" + echo "::add-mask::$SAP_CDS_DK_TARBALL" + + MTXS="$SAP_CDS_MTXS_TARBALL" + DK="$SAP_CDS_DK_TARBALL" + TARBALL_HOST=$(printf '%s' "$MTXS" | sed -E 's#^https?://([^/]+)/.*#\1#') + + for dir in \ + "app/multi-tenant/central-space/cloud-cap-samples-java" \ + "app/multi-tenant/central-space/cloud-cap-samples-java/mtx/sidecar" \ + "app/multi-tenant/personal-space/cloud-cap-samples-java" \ + "app/multi-tenant/personal-space/cloud-cap-samples-java/mtx/sidecar"; do + + printf '@sap:registry=https://registry.npmjs.org/\n//%s/:_authToken=%s\nlegacy-peer-deps=true\n' \ + "$TARBALL_HOST" "$NPM_AUTH_TOKEN" > "$dir/.npmrc" + + tmp=$(mktemp) + jq --arg mtxs "$MTXS" --arg dk "$DK" ' + (if .dependencies["@sap/cds-mtxs"] then .dependencies["@sap/cds-mtxs"] = $mtxs else . end) + | (if .dependencies["@sap/cds-dk"] then .dependencies["@sap/cds-dk"] = $dk else . end) + | .overrides["@sap/cds-mtxs"] = $mtxs + ' "$dir/package.json" > "$tmp" && mv "$tmp" "$dir/package.json" + + npm install --prefix "$dir" + + git checkout "$dir/package.json" + done + # - name: Download Synopsys Detect Script # run: curl --silent -O https://detect.synopsys.com/detect9.sh - name: Download Black Duck Detect Script diff --git a/.github/workflows/cfdeploy.yml b/.github/workflows/cfdeploy.yml index a5242aa8..637f9e57 100644 --- a/.github/workflows/cfdeploy.yml +++ b/.github/workflows/cfdeploy.yml @@ -48,6 +48,11 @@ jobs: java-version: 21 distribution: 'temurin' + - name: Set up Node.js 🟢 + uses: actions/setup-node@v4 + with: + node-version: '22' + - name: Build and package 🔨 run: | echo "🚀 Building and packaging..." @@ -71,6 +76,36 @@ jobs: fi fi + - name: Setup npm registry and pin SAP tarballs 📦 + env: + NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} + SAP_CDS_MTXS_TARBALL: ${{ secrets.SAP_CDS_MTXS_TARBALL }} + SAP_CDS_DK_TARBALL: ${{ secrets.SAP_CDS_DK_TARBALL }} + run: | + set +x + echo "::add-mask::$NPM_AUTH_TOKEN" + echo "::add-mask::$SAP_CDS_MTXS_TARBALL" + echo "::add-mask::$SAP_CDS_DK_TARBALL" + + MTXS="$SAP_CDS_MTXS_TARBALL" + DK="$SAP_CDS_DK_TARBALL" + TARBALL_HOST=$(printf '%s' "$MTXS" | sed -E 's#^https?://([^/]+)/.*#\1#') + + for dir in \ + "app/single-tenant/personal-space/demoapp" \ + "app/single-tenant/personal-space/demoapp/db" \ + "app/single-tenant/personal-space/demoapp/app"; do + + printf '@sap:registry=https://registry.npmjs.org/\n//%s/:_authToken=%s\nlegacy-peer-deps=true\n' \ + "$TARBALL_HOST" "$NPM_AUTH_TOKEN" > "$dir/.npmrc" + + tmp=$(mktemp) + jq --arg mtxs "$MTXS" --arg dk "$DK" ' + (if .dependencies["@sap/cds-mtxs"] then .dependencies["@sap/cds-mtxs"] = $mtxs else . end) + | (if .dependencies["@sap/cds-dk"] then .dependencies["@sap/cds-dk"] = $dk else . end) + ' "$dir/package.json" > "$tmp" && mv "$tmp" "$dir/package.json" + done + - name: Prepare and Deploy to Cloud Foundry ☁️ run: | set +x @@ -142,6 +177,11 @@ jobs: java-version: 21 distribution: 'temurin' + - name: Set up Node.js 🟢 + uses: actions/setup-node@v4 + with: + node-version: '22' + - name: Override cds.services.version (runtime only) if: ${{ github.event.inputs.cds_services_version != '' }} env: @@ -204,6 +244,36 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: Setup npm registry and pin SAP tarballs 📦 + env: + NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} + SAP_CDS_MTXS_TARBALL: ${{ secrets.SAP_CDS_MTXS_TARBALL }} + SAP_CDS_DK_TARBALL: ${{ secrets.SAP_CDS_DK_TARBALL }} + run: | + set +x + echo "::add-mask::$NPM_AUTH_TOKEN" + echo "::add-mask::$SAP_CDS_MTXS_TARBALL" + echo "::add-mask::$SAP_CDS_DK_TARBALL" + + MTXS="$SAP_CDS_MTXS_TARBALL" + DK="$SAP_CDS_DK_TARBALL" + TARBALL_HOST=$(printf '%s' "$MTXS" | sed -E 's#^https?://([^/]+)/.*#\1#') + + for dir in \ + "app/single-tenant/central-space/demoapp" \ + "app/single-tenant/central-space/demoapp/db" \ + "app/single-tenant/central-space/demoapp/app"; do + + printf '@sap:registry=https://registry.npmjs.org/\n//%s/:_authToken=%s\nlegacy-peer-deps=true\n' \ + "$TARBALL_HOST" "$NPM_AUTH_TOKEN" > "$dir/.npmrc" + + tmp=$(mktemp) + jq --arg mtxs "$MTXS" --arg dk "$DK" ' + (if .dependencies["@sap/cds-mtxs"] then .dependencies["@sap/cds-mtxs"] = $mtxs else . end) + | (if .dependencies["@sap/cds-dk"] then .dependencies["@sap/cds-dk"] = $dk else . end) + ' "$dir/package.json" > "$tmp" && mv "$tmp" "$dir/package.json" + done + - name: Prepare and Deploy to Cloud Foundry ☁️ run: | set +x diff --git a/.github/workflows/multiTenancyDeployLocal.yml b/.github/workflows/multiTenancyDeployLocal.yml index b9379e38..dd5d767f 100644 --- a/.github/workflows/multiTenancyDeployLocal.yml +++ b/.github/workflows/multiTenancyDeployLocal.yml @@ -52,6 +52,35 @@ jobs: with: node-version: '20' # Ensure to use at least version 18 + - name: Setup npm registry and pin SAP tarballs 📦 + env: + NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} + SAP_CDS_MTXS_TARBALL: ${{ secrets.SAP_CDS_MTXS_TARBALL }} + SAP_CDS_DK_TARBALL: ${{ secrets.SAP_CDS_DK_TARBALL }} + run: | + set +x + echo "::add-mask::$NPM_AUTH_TOKEN" + echo "::add-mask::$SAP_CDS_MTXS_TARBALL" + echo "::add-mask::$SAP_CDS_DK_TARBALL" + + MTXS="$SAP_CDS_MTXS_TARBALL" + DK="$SAP_CDS_DK_TARBALL" + TARBALL_HOST=$(printf '%s' "$MTXS" | sed -E 's#^https?://([^/]+)/.*#\1#') + + for dir in \ + "app/multi-tenant/personal-space/cloud-cap-samples-java" \ + "app/multi-tenant/personal-space/cloud-cap-samples-java/mtx/sidecar"; do + + printf '@sap:registry=https://registry.npmjs.org/\n//%s/:_authToken=%s\nlegacy-peer-deps=true\n' \ + "$TARBALL_HOST" "$NPM_AUTH_TOKEN" > "$dir/.npmrc" + + tmp=$(mktemp) + jq --arg mtxs "$MTXS" --arg dk "$DK" ' + (if .dependencies["@sap/cds-mtxs"] then .dependencies["@sap/cds-mtxs"] = $mtxs else . end) + | (if .dependencies["@sap/cds-dk"] then .dependencies["@sap/cds-dk"] = $dk else . end) + ' "$dir/package.json" > "$tmp" && mv "$tmp" "$dir/package.json" + done + - name: Install MBT ⚙️ run: | echo "🔧 Installing MBT..." diff --git a/.github/workflows/multiTenant_deploy_and_Integration_test.yml b/.github/workflows/multiTenant_deploy_and_Integration_test.yml index 1aac12e5..59c3f65b 100644 --- a/.github/workflows/multiTenant_deploy_and_Integration_test.yml +++ b/.github/workflows/multiTenant_deploy_and_Integration_test.yml @@ -43,6 +43,35 @@ jobs: with: node-version: '20' # Ensure to use at least version 18 + - name: Setup npm registry and pin SAP tarballs 📦 + env: + NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} + SAP_CDS_MTXS_TARBALL: ${{ secrets.SAP_CDS_MTXS_TARBALL }} + SAP_CDS_DK_TARBALL: ${{ secrets.SAP_CDS_DK_TARBALL }} + run: | + set +x + echo "::add-mask::$NPM_AUTH_TOKEN" + echo "::add-mask::$SAP_CDS_MTXS_TARBALL" + echo "::add-mask::$SAP_CDS_DK_TARBALL" + + MTXS="$SAP_CDS_MTXS_TARBALL" + DK="$SAP_CDS_DK_TARBALL" + TARBALL_HOST=$(printf '%s' "$MTXS" | sed -E 's#^https?://([^/]+)/.*#\1#') + + for dir in \ + "app/multi-tenant/central-space/cloud-cap-samples-java" \ + "app/multi-tenant/central-space/cloud-cap-samples-java/mtx/sidecar"; do + + printf '@sap:registry=https://registry.npmjs.org/\n//%s/:_authToken=%s\nlegacy-peer-deps=true\n' \ + "$TARBALL_HOST" "$NPM_AUTH_TOKEN" > "$dir/.npmrc" + + tmp=$(mktemp) + jq --arg mtxs "$MTXS" --arg dk "$DK" ' + (if .dependencies["@sap/cds-mtxs"] then .dependencies["@sap/cds-mtxs"] = $mtxs else . end) + | (if .dependencies["@sap/cds-dk"] then .dependencies["@sap/cds-dk"] = $dk else . end) + ' "$dir/package.json" > "$tmp" && mv "$tmp" "$dir/package.json" + done + - name: Install MBT ⚙️ run: | echo "🔧 Installing MBT..." diff --git a/.github/workflows/multiTenant_deploy_and_Integration_test_LatestVersion.yml b/.github/workflows/multiTenant_deploy_and_Integration_test_LatestVersion.yml index a4742b63..180d14c0 100644 --- a/.github/workflows/multiTenant_deploy_and_Integration_test_LatestVersion.yml +++ b/.github/workflows/multiTenant_deploy_and_Integration_test_LatestVersion.yml @@ -43,6 +43,35 @@ jobs: with: node-version: '20' # Ensure to use at least version 18 + - name: Setup npm registry and pin SAP tarballs 📦 + env: + NPM_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} + SAP_CDS_MTXS_TARBALL: ${{ secrets.SAP_CDS_MTXS_TARBALL }} + SAP_CDS_DK_TARBALL: ${{ secrets.SAP_CDS_DK_TARBALL }} + run: | + set +x + echo "::add-mask::$NPM_AUTH_TOKEN" + echo "::add-mask::$SAP_CDS_MTXS_TARBALL" + echo "::add-mask::$SAP_CDS_DK_TARBALL" + + MTXS="$SAP_CDS_MTXS_TARBALL" + DK="$SAP_CDS_DK_TARBALL" + TARBALL_HOST=$(printf '%s' "$MTXS" | sed -E 's#^https?://([^/]+)/.*#\1#') + + for dir in \ + "app/multi-tenant/central-space/cloud-cap-samples-java" \ + "app/multi-tenant/central-space/cloud-cap-samples-java/mtx/sidecar"; do + + printf '@sap:registry=https://registry.npmjs.org/\n//%s/:_authToken=%s\nlegacy-peer-deps=true\n' \ + "$TARBALL_HOST" "$NPM_AUTH_TOKEN" > "$dir/.npmrc" + + tmp=$(mktemp) + jq --arg mtxs "$MTXS" --arg dk "$DK" ' + (if .dependencies["@sap/cds-mtxs"] then .dependencies["@sap/cds-mtxs"] = $mtxs else . end) + | (if .dependencies["@sap/cds-dk"] then .dependencies["@sap/cds-dk"] = $dk else . end) + ' "$dir/package.json" > "$tmp" && mv "$tmp" "$dir/package.json" + done + - name: Install MBT ⚙️ run: | echo "🔧 Installing MBT..." diff --git a/app/multi-tenant/central-space/cloud-cap-samples-java/package.json b/app/multi-tenant/central-space/cloud-cap-samples-java/package.json index 83094ad6..1a49eaa1 100644 --- a/app/multi-tenant/central-space/cloud-cap-samples-java/package.json +++ b/app/multi-tenant/central-space/cloud-cap-samples-java/package.json @@ -6,8 +6,8 @@ "repository": "https://github.com/SAP-samples/cloud-cap-samples-java.git", "dependencies": { "@cap-js/hana": "^2.1.2", - "@sap/cds": "^9.8.0", - "@sap/cds-dk": "^9.8.0", + "@sap/cds": "^9", + "@sap/cds-dk": "^9", "@sap/cds-mtxs": "^3" } } diff --git a/app/multi-tenant/personal-space/cloud-cap-samples-java/package.json b/app/multi-tenant/personal-space/cloud-cap-samples-java/package.json index 001ac052..1a49eaa1 100644 --- a/app/multi-tenant/personal-space/cloud-cap-samples-java/package.json +++ b/app/multi-tenant/personal-space/cloud-cap-samples-java/package.json @@ -6,8 +6,8 @@ "repository": "https://github.com/SAP-samples/cloud-cap-samples-java.git", "dependencies": { "@cap-js/hana": "^2.1.2", - "@sap/cds": "^9.2.0", - "@sap/cds-dk": "^9.3.1", + "@sap/cds": "^9", + "@sap/cds-dk": "^9", "@sap/cds-mtxs": "^3" } } diff --git a/pom.xml b/pom.xml index 43e0f514..ae1735a1 100644 --- a/pom.xml +++ b/pom.xml @@ -23,7 +23,7 @@ - 1.10.3.1-SNAPSHOT + 1.10.3.2-SNAPSHOT 21 ${java.version} ${java.version} diff --git a/sdm/src/main/java/com/sap/cds/sdm/handler/applicationservice/SDMReadAttachmentsHandler.java b/sdm/src/main/java/com/sap/cds/sdm/handler/applicationservice/SDMReadAttachmentsHandler.java index c203f9a8..5a77a7ec 100644 --- a/sdm/src/main/java/com/sap/cds/sdm/handler/applicationservice/SDMReadAttachmentsHandler.java +++ b/sdm/src/main/java/com/sap/cds/sdm/handler/applicationservice/SDMReadAttachmentsHandler.java @@ -147,6 +147,21 @@ public void processBefore(CdsReadEventContext context) throws IOException { repoValue.getIsAsyncVirusScanEnabled()); Optional attachmentDraftEntity = context.getModel().findEntity(context.getTarget().getQualifiedName() + "_drafts"); + logger.debug( + "Draft entity: {}", + attachmentDraftEntity.isPresent() + ? attachmentDraftEntity.get().getQualifiedName() + : "No draft entity"); + Optional attachmentActiveEntity = + context.getModel().findEntity(context.getTarget().getQualifiedName()); + logger.debug( + "Active entity: {}", + attachmentActiveEntity.isPresent() + ? attachmentActiveEntity.get().getQualifiedName() + : "No active entity"); + if (attachmentDraftEntity.isEmpty() && attachmentActiveEntity.isPresent()) { + attachmentDraftEntity = attachmentActiveEntity; + } String upIdKey = "", upID = ""; if (attachmentDraftEntity.isPresent()) { upIdKey = SDMUtils.getUpIdKey(attachmentDraftEntity.get());