diff --git a/.forgejo/workflows/ci-settings.xml b/.forgejo/workflows/ci-settings.xml new file mode 100644 index 0000000..c206c4b --- /dev/null +++ b/.forgejo/workflows/ci-settings.xml @@ -0,0 +1,37 @@ + + + + + + nexus + * + http://repo.oguerreiro.com/repository/maven-public/ + + + + + + nexus + default + default#123! + + + maven-releases + default + default#123! + + + maven-snapshots + default + default#123! + + + diff --git a/.forgejo/workflows/release.yml b/.forgejo/workflows/release.yml index 06f5207..7b8d83e 100644 --- a/.forgejo/workflows/release.yml +++ b/.forgejo/workflows/release.yml @@ -14,7 +14,7 @@ jobs: - name: Install system dependencies run: | apt-get update - apt-get install -y nodejs npm openjdk-17-jdk maven git + apt-get install -y nodejs npm openjdk-17-jdk maven git jq export JAVA_HOME=$(dirname $(dirname $(readlink -f $(which javac)))) echo "JAVA_HOME=$JAVA_HOME" >> $GITHUB_ENV @@ -22,6 +22,7 @@ jobs: run: | java -version mvn -v + mvn help:evaluate -Dexpression=settings.localRepository -q -DforceStdout node -v npm -v @@ -52,6 +53,106 @@ jobs: git commit -am "Release ${{ steps.version.outputs.release_version }}" git push + # Create the release notes (closed issues) + # Must be here, before the new tag, to get closed issued from the LAST TAG to NOW + - name: Generate release notes from closed issues + id: generate_notes + run: | + REPO_OWNER="root" + REPO_NAME="resilient" + TOKEN="${{ secrets.FORGEJO_TOKEN }}" + VERSION="${{ steps.version.outputs.release_version }}" + API_BASE="https://git.oguerreiro.com/api/v1" + + # Step 1. Get the latest tag + echo "Step 1 : Fetching latest release tag..." + LATEST_TAG=$(curl -H "Authorization: token $TOKEN" \ + "$API_BASE/repos/$REPO_OWNER/$REPO_NAME/tags" \ + | jq -r '.[0].name') + + if [[ -z "$LATEST_TAG" || "$LATEST_TAG" == "null" ]]; then + # Doesn't have tag. Its the first release + echo "No previous tags found. Assuming first release." + CLOSED_ISSUES="" + else + # Tag found + echo "Latest tag is: $LATEST_TAG" + + # Step 2: Get the tag ref object + echo "Step 2 : Fetch tag ref object from tag = $LATEST_TAG" + TAG_REF=$(curl -H "Authorization: token $TOKEN" \ + "$API_BASE/repos/$REPO_OWNER/$REPO_NAME/git/refs/tags/$LATEST_TAG") + echo "... TAG_REF is: $TAG_REF" + + # Extract the first .object.sha (if it's an array) or directly if it's an object + if echo "$TAG_REF" | jq -e 'type == "array"' >/dev/null; then + echo "... is an array" + TAG_OBJECT_SHA=$(echo "$TAG_REF" | jq -r '.[0].object.sha') + TAG_OBJECT_TYPE=$(echo "$TAG_REF" | jq -r '.[0].object.type') + else + echo "... is an object" + TAG_OBJECT_SHA=$(echo "$TAG_REF" | jq -r '.object.sha') + TAG_OBJECT_TYPE=$(echo "$TAG_REF" | jq -r '.object.type') + fi + + echo "... TAG SHA is (1): $TAG_OBJECT_SHA" + echo "... TAG TYPE is (1): $TAG_OBJECT_TYPE" + + # Resolve annotated tag to commit SHA + while [ "$TAG_OBJECT_TYPE" != "commit" ]; do + echo "..." + echo "... TAG OBJECT is not of type commit. Try : $API_BASE/repos/$REPO_OWNER/$REPO_NAME/git/$TAG_OBJECT_TYPE/$TAG_OBJECT_SHA" + TAG_OBJECT=$(curl -H "Authorization: token $TOKEN" \ + "$API_BASE/repos/$REPO_OWNER/$REPO_NAME/git/tags/$TAG_OBJECT_SHA") + + if echo "$TAG_OBJECT" | jq -e 'type == "array"' >/dev/null; then + echo "... ... is an array" + TAG_OBJECT_SHA=$(echo "$v" | jq -r '.[0].object.sha') + TAG_OBJECT_TYPE=$(echo "$TAG_OBJECT" | jq -r '.[0].object.type') + else + echo "... ... is an object" + TAG_OBJECT_SHA=$(echo "$TAG_OBJECT" | jq -r '.object.sha') + TAG_OBJECT_TYPE=$(echo "$TAG_OBJECT" | jq -r '.object.type') + fi + + echo "... TAG_OBJECT_SHA is (2): $TAG_OBJECT_SHA" + echo "... TAG_OBJECT_TYPE is (2): $TAG_OBJECT_TYPE" + done + + echo "... commit found with SHA $TAG_OBJECT_SHA" + COMMIT_SHA=$TAG_OBJECT_SHA + + # Step 3: Get the commit date + echo "Step 3 : Get the commit date from commit = $COMMIT_SHA" + COMMIT_DATE=$(curl -H "Authorization: token $TOKEN" \ + "$API_BASE/repos/$REPO_OWNER/$REPO_NAME/git/commits/$COMMIT_SHA" \ + | jq -r '.commit.committer.date') + echo "... Fetching closed issues since $COMMIT_DATE..." + + CLOSED_ISSUES_JSON=$(curl -H "Authorization: token $TOKEN" \ + "$API_BASE/repos/$REPO_OWNER/$REPO_NAME/issues?state=closed&since=$COMMIT_DATE") + + if [[ -z "$CLOSED_ISSUES_JSON" ]]; then + echo "Warning: No closed issues or invalid response." + CLOSED_ISSUES="" + else + CLOSED_ISSUES=$(echo "$CLOSED_ISSUES_JSON" | jq -r '.[] | "- [#\(.number)](\(.html_url)) \(.title)"') + fi + fi + + # Build release notes markdown + { + echo "## Release v$VERSION" + echo + if [[ -n "$CLOSED_ISSUES" ]]; then + echo "### Closed Issues" + echo "$CLOSED_ISSUES" + else + echo "No issues closed since last release." + fi + } > release-notes.md + cat release-notes.md + - name: Tag release run: | git tag -a v${{ steps.version.outputs.release_version }} -m "Release ${{ steps.version.outputs.release_version }}" @@ -61,45 +162,42 @@ jobs: # Install @Angular dependencies - name: Install frontend dependencies + if: false # DISABLED for testing. To check if backend build is also doing frontend. run: | cd src/main/webapp npm ci - # Setup node_modules cache, for better performance - - name: Cache node_modules - uses: actions/cache@v3 - with: - path: | - **/node_modules - key: node-modules-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - node-modules- - # Build the frontend - name: Build frontend + if: false # DISABLED for testing. To check if backend build is also doing frontend. run: | cd src/main/webapp npm run build - - # Setup Maven cache, for better performance - - name: Cache Maven dependencies - uses: actions/cache@v3 - with: - path: ~/.m2/repository - key: maven-${{ runner.os }}-${{ hashFiles('**/pom.xml') }} - restore-keys: | - maven-${{ runner.os }}- - + # Build the backend (JAR). NOTE: the -Dmaven.download.parallel=false will force MAVEN to have a single connection for downloads, without this I can get "Connection reset" - name: Build backend (Spring Boot) run: | - mvn clean package -Pprod -DskipTests -Dmaven.download.parallel=false - + echo "DEBUG Outputs ************************* " + echo "Container hostname: $(hostname)" + echo "Runner working dir: $PWD" + echo "Runner user: $(whoami)" + echo "Listing contents of ~/.m2/repository:" + ls -lhR ~/.m2/repository | head -n 100 || echo "No .m2/repository found" + echo "Disk usage:" + du -sh ~/.m2/repository || echo "No .m2 directory found" + echo " " + echo "BUILD Outputs ************************* " + mvn clean package -Pprod -DskipTests -Dmaven.download.parallel=false -Dmaven.repo.local=/root/.m2/repository -s .forgejo/workflows/ci-settings.xml + container: + image: maven:3.9-eclipse-temurin-17 + volumes: + - docker-forgejo_maven-cache:/root/.m2 + # Log output - name: List output files run: | ls -lh target/*.jar || true - + # save artifacts - name: Upload backend JAR uses: actions/upload-artifact@v3 @@ -107,6 +205,38 @@ jobs: name: app-backend path: target/resilient*.jar + # Create the release + # NOTE: added system dependency install "jq" + - name: Create release and upload JAR + run: | + VERSION=${{ steps.version.outputs.release_version }} + API="https://git.oguerreiro.com/api/v1" + REPO="root/resilient" + + # Create release + RESPONSE=$(curl -X POST "$API/repos/$REPO/releases" \ + -H "Authorization: token ${{ secrets.FORGEJO_TOKEN }}" \ + -H "Content-Type: application/json" \ + -d "{ + \"tag_name\": \"v$VERSION\", + \"target_commitish\": \"master\", + \"name\": \"Release v$VERSION\", + \"body\": $(jq -Rs < release-notes.md) + }") + + RELEASE_ID=$(echo "$RESPONSE" | jq -r '.id') + echo "Created release ID: $RELEASE_ID" + + # Upload artifact + # NOTE: For safety, the artifact to upload is expected to be the EXACT $VERSION of this branch. If not, something is wrong. + JAR_FILE=$(ls target/resilient-$VERSION.jar | head -n 1) + echo "Attaching file : $JAR_FILE" + curl -X POST "$API/repos/$REPO/releases/$RELEASE_ID/assets?name=resilient-$VERSION.jar" \ + -H "Authorization: token ${{ secrets.FORGEJO_TOKEN }}" \ + -H "Content-Type: application/java-archive" \ + --data-binary @"$JAR_FILE" + + # ################################################################## # ## THIS IS A RELEASE - Change master version to next SNAPSHOT ## # ## #4. Checkout master ## diff --git a/pom.xml b/pom.xml index e8ecaa2..57fcf51 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.oguerreiro.resilient resilient - 1.0.4-SNAPSHOT + 1.0.8-SNAPSHOT jar Resilient Description for Resilient diff --git a/src/main/java/com/oguerreiro/resilient/repository/OrganizationRepository.java b/src/main/java/com/oguerreiro/resilient/repository/OrganizationRepository.java index 8ba65ab..5aef3a7 100644 --- a/src/main/java/com/oguerreiro/resilient/repository/OrganizationRepository.java +++ b/src/main/java/com/oguerreiro/resilient/repository/OrganizationRepository.java @@ -5,6 +5,7 @@ import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -38,11 +39,13 @@ public interface OrganizationRepository extends ResilientJpaRepository findOneByUser(User user); @Query("select organization from Organization organization where organization.outputInventory = true and organization.organizationType.nature = com.oguerreiro.resilient.domain.enumeration.OrganizationNature.ORGANIZATION order by (CASE WHEN organization.parent IS NULL THEN 0 ELSE 1 END), (CASE WHEN organization.sort IS NULL THEN 1 ELSE 0 END), organization.sort asc") List findAllOrganizationForOutput(); + @EntityGraph(attributePaths = "parent") Optional findOneByCode(String code); @Query(""" diff --git a/src/main/java/com/oguerreiro/resilient/security/saml2/Saml2AuthenticationHandler.java b/src/main/java/com/oguerreiro/resilient/security/saml2/Saml2AuthenticationHandler.java index f072998..1da77e8 100644 --- a/src/main/java/com/oguerreiro/resilient/security/saml2/Saml2AuthenticationHandler.java +++ b/src/main/java/com/oguerreiro/resilient/security/saml2/Saml2AuthenticationHandler.java @@ -155,8 +155,9 @@ public class Saml2AuthenticationHandler implements AuthenticationSuccessHandler, } // Create a ResilientUserDetails and replace Principal + Organization parentOrganization = userOrganization.getParent(); ResilientUserDetails userdetails = new ResilientUserDetails(username, "MOCK-PWD", authorities, securityGroup, - userOrganization, "pt-PT"); + userOrganization.getParent(), "pt-PT"); Saml2Authentication newAuthentication = new Saml2Authentication(userdetails, samlXMLResponse, userdetails.getAuthorities()); diff --git a/src/main/webapp/app/layouts/main/banner/banner.component.html b/src/main/webapp/app/layouts/main/banner/banner.component.html index 49ea24c..2e52f7e 100644 --- a/src/main/webapp/app/layouts/main/banner/banner.component.html +++ b/src/main/webapp/app/layouts/main/banner/banner.component.html @@ -1,6 +1,10 @@
-
- Route Zero +
+ Route Zero + + + InNOVA NOVA Information System on Environment and Sustainability +
\ No newline at end of file diff --git a/src/main/webapp/app/layouts/navbar/navbar.component.html b/src/main/webapp/app/layouts/navbar/navbar.component.html index 5f93d7b..e4c2b7b 100644 --- a/src/main/webapp/app/layouts/navbar/navbar.component.html +++ b/src/main/webapp/app/layouts/navbar/navbar.component.html @@ -148,7 +148,7 @@ (click)="collapseNavbar()" > - Organization + Organização
  • @@ -160,7 +160,7 @@ (click)="collapseNavbar()" > - Period + Período
  • @@ -175,7 +175,7 @@ (click)="collapseNavbar()" > - Unit Type + Tipos de Unidade
  • @@ -187,7 +187,7 @@ (click)="collapseNavbar()" > - Unit + Unidade
  • @@ -199,7 +199,7 @@ (click)="collapseNavbar()" > - Unit Converter + conversor de Unidades
  • @@ -214,7 +214,7 @@ (click)="collapseNavbar()" > - Variable Scope + Âmbito
  • @@ -226,7 +226,7 @@ (click)="collapseNavbar()" > - Variable Category + Categoria
  • @@ -238,7 +238,7 @@ (click)="collapseNavbar()" > - Variable + Variavel
  • @@ -261,7 +261,7 @@ (click)="collapseNavbar()" > - Input Data Upload + Ficheiros de Dados
  • - Input Data + Dados de Inventário
  • - Organization Type + Tipo de Organização
  • @@ -343,7 +343,7 @@ (click)="collapseNavbar()" > - Metadata Property + Propriedades Metadata
  • @@ -367,7 +367,7 @@ (click)="collapseNavbar()" > - Variable Class Type + Tipo de Classe
  • @@ -379,7 +379,7 @@ (click)="collapseNavbar()" > - Emission Factors + Fatores de Emissão
  • @@ -391,7 +391,7 @@ (click)="collapseNavbar()" > - Dashboard Comp. + Dashboard-Componente
  • @@ -403,7 +403,7 @@ (click)="collapseNavbar()" > - Document + Documentos
  • @@ -415,7 +415,7 @@ (click)="collapseNavbar()" > - Content Page + Conteúdos
  • diff --git a/src/main/webapp/content/images/Graphic1_2024.png b/src/main/webapp/content/images/Graphic1_2024.png new file mode 100644 index 0000000..6cea7ab Binary files /dev/null and b/src/main/webapp/content/images/Graphic1_2024.png differ diff --git a/src/main/webapp/content/images/Graphic2_2024.png b/src/main/webapp/content/images/Graphic2_2024.png new file mode 100644 index 0000000..598ec4c Binary files /dev/null and b/src/main/webapp/content/images/Graphic2_2024.png differ diff --git a/src/main/webapp/content/images/Graphic3_2024.png b/src/main/webapp/content/images/Graphic3_2024.png new file mode 100644 index 0000000..9fbec69 Binary files /dev/null and b/src/main/webapp/content/images/Graphic3_2024.png differ diff --git a/src/main/webapp/content/images/Graphic4_2024.png b/src/main/webapp/content/images/Graphic4_2024.png new file mode 100644 index 0000000..4b6920e Binary files /dev/null and b/src/main/webapp/content/images/Graphic4_2024.png differ diff --git a/src/main/webapp/content/images/Graphic_gases_2024.png b/src/main/webapp/content/images/Graphic_gases_2024.png new file mode 100644 index 0000000..cd7c99c Binary files /dev/null and b/src/main/webapp/content/images/Graphic_gases_2024.png differ diff --git a/src/main/webapp/content/images/Graphic_missoes_globais_2024.png b/src/main/webapp/content/images/Graphic_missoes_globais_2024.png new file mode 100644 index 0000000..4899991 Binary files /dev/null and b/src/main/webapp/content/images/Graphic_missoes_globais_2024.png differ