From c38496b20d9c0e1de9e4008230c2435215029129 Mon Sep 17 00:00:00 2001
From: RIHTARSIC Joze <joze.rihtarsic@ext.ec.europa.eu>
Date: Wed, 26 Apr 2023 15:52:26 +0200
Subject: [PATCH] update UI on access-tokens

---
 .../membership-panel.component.html           |  8 +--
 .../admin-domain/admin-domain.component.html  |  2 +-
 .../domain-panel/domain-panel.component.html  | 14 ++---
 ...omain-sml-integration-panel.component.html |  6 +-
 smp-docker/images/build-docker-images.sh      |  8 +--
 .../pom.xml                                   |  2 +-
 .../smp/services/ui/UIDomainService.java      | 60 +++++++++++++++----
 7 files changed, 66 insertions(+), 34 deletions(-)

diff --git a/smp-angular/src/app/common/panels/membership-panel/membership-panel.component.html b/smp-angular/src/app/common/panels/membership-panel/membership-panel.component.html
index 56e37c8a1..90b262679 100644
--- a/smp-angular/src/app/common/panels/membership-panel/membership-panel.component.html
+++ b/smp-angular/src/app/common/panels/membership-panel/membership-panel.component.html
@@ -43,22 +43,22 @@
       <table class="mat-elevation-z2" mat-table [dataSource]="data">
 
         <ng-container matColumnDef="username">
-          <th mat-header-cell *matHeaderCellDef>username</th>
+          <th mat-header-cell *matHeaderCellDef>Username</th>
           <td mat-cell *matCellDef="let row">{{row.username}}</td>
         </ng-container>
 
         <ng-container matColumnDef="fullName">
-          <th mat-header-cell *matHeaderCellDef>fullName</th>
+          <th mat-header-cell *matHeaderCellDef>Full name</th>
           <td mat-cell *matCellDef="let row">{{row.fullName}}</td>
         </ng-container>
 
         <ng-container matColumnDef="roleType">
-          <th mat-header-cell *matHeaderCellDef>roleType</th>
+          <th mat-header-cell *matHeaderCellDef>Role type</th>
           <td mat-cell *matCellDef="let row">{{row.roleType}}</td>
         </ng-container>
 
         <ng-container matColumnDef="memberOf">
-          <th mat-header-cell *matHeaderCellDef>memberOf</th>
+          <th mat-header-cell *matHeaderCellDef>Member of</th>
           <td mat-cell *matCellDef="let row">{{row.memberOf}}</td>
         </ng-container>
 
diff --git a/smp-angular/src/app/system-settings/admin-domain/admin-domain.component.html b/smp-angular/src/app/system-settings/admin-domain/admin-domain.component.html
index 93123054f..ef83f7446 100644
--- a/smp-angular/src/app/system-settings/admin-domain/admin-domain.component.html
+++ b/smp-angular/src/app/system-settings/admin-domain/admin-domain.component.html
@@ -57,7 +57,7 @@
 <ng-template #searchDomainPanel>
   <mat-form-field id="domain-filter">
     <mat-label>Filter Domain by domain code</mat-label>
-    <input matInput (keyup)="applyDomainFilter($event)" placeholder="Domain code" #inputDomainFilter>
+    <input matInput (keyup)="applyDomainFilter($event)"  #inputDomainFilter>
   </mat-form-field>
 
   <mat-toolbar class="mat-elevation-z2">
diff --git a/smp-angular/src/app/system-settings/admin-domain/domain-panel/domain-panel.component.html b/smp-angular/src/app/system-settings/admin-domain/domain-panel/domain-panel.component.html
index cdaa82209..600f86c91 100644
--- a/smp-angular/src/app/system-settings/admin-domain/domain-panel/domain-panel.component.html
+++ b/smp-angular/src/app/system-settings/admin-domain/domain-panel/domain-panel.component.html
@@ -4,7 +4,7 @@
     <div class="panel" *ngIf="_domain!=null &&  !_domain.domainId"><p style="font-weight: bold">Enter data and click 'Save' to create new domain</div>
     <mat-form-field style="width:100%">
       <mat-label>Domain Code</mat-label>
-      <input matInput placeholder="Domain Code"
+      <input matInput
              id="domainCode_id" #domainCode
              matTooltip="The SMP's domain code. The code must be unique and is used in HTTP header 'Domain' or URL path sequence when retrieving/creating the resource using the webservice API"
              formControlName="domainCode" maxlength="63"
@@ -30,11 +30,10 @@
     </mat-form-field>
     <mat-form-field style="width:100%">
       <mat-label>Response signature Certificate (Signature CertAlias)</mat-label>
-      <mat-select placeholder="Response signature Certificate (Signature CertAlias)"
-                  formControlName="signatureKeyAlias"
+      <mat-select formControlName="signatureKeyAlias"
                   matTooltip="Certificate is used for signing REST responses for the domain."
                   id="signatureKeyAlias_id">
-        <mat-option [value]="''" disabled></mat-option>
+        <mat-option [value]="''" ></mat-option>
         <mat-option *ngFor="let cert of keystoreCertificates" [value]="cert.alias">
           {{cert.alias}} ({{cert.certificateId}})
         </mat-option>
@@ -45,12 +44,10 @@
 
     <mat-form-field style="width:100%">
       <mat-label>Visibility of the domain</mat-label>
-      <mat-select placeholder="Visibility of the domain"
-                  formControlName="visibility"
+      <mat-select  formControlName="visibility"
                   name="visibility"
                   matTooltip="Visibility of the domain."
                   id="domainVisibility_id">
-        <mat-option [value]="''" diabled>Choose visibility of the domain</mat-option>
         <mat-option *ngFor="let visibility of domainVisibilityOptions"
                     [value]="visibility.value">
           {{visibility.key}}
@@ -63,8 +60,7 @@
 
   <mat-form-field *ngIf="domainResourceTypes?.length" style="width:100%">
     <mat-label>Default resource type for the domain</mat-label>
-    <mat-select placeholder="Default resource type for the domain"
-                formControlName="defaultResourceTypeIdentifier"
+    <mat-select formControlName="defaultResourceTypeIdentifier"
                 matTooltip="Default resource type for the domain."
                 id="domainDefaultResourceType_id">
       <mat-option [value]="''" disabled></mat-option>
diff --git a/smp-angular/src/app/system-settings/admin-domain/domain-sml-panel/domain-sml-integration-panel.component.html b/smp-angular/src/app/system-settings/admin-domain/domain-sml-panel/domain-sml-integration-panel.component.html
index 8d3d5f4bc..c29aa9fe6 100644
--- a/smp-angular/src/app/system-settings/admin-domain/domain-sml-panel/domain-sml-integration-panel.component.html
+++ b/smp-angular/src/app/system-settings/admin-domain/domain-sml-panel/domain-sml-integration-panel.component.html
@@ -5,7 +5,8 @@
     <h3>SML integration data</h3>
     <div class="panel" *ngIf="isDomainRegistered"><p style="font-weight: bold">Domain is registered to SML!</p>The Registered domain can not be deleted or changed the SMP SML identifier</div>
     <mat-form-field style="width:100%">
-      <input matInput placeholder="SML domain"
+      <mat-label>SML domain</mat-label>
+      <input matInput
              matTooltip="The domain-specific part of the SML DNS zone (e.g., ‘mydomain’ for mydomain.sml.dns.zone or leave empty for sml.dns.zone). Note: has informative value only, SML DNS zone used for publishing is based on SML configuration."
              name="smlSubdomain"
              id="smldomain_id"
@@ -41,7 +42,7 @@
     </mat-form-field>
     <mat-form-field style="width:100%">
       <mat-label>SML SMP identifier</mat-label>
-      <input matInput placeholder="SML SMP identifier" name="smlSmpId"
+      <input matInput name="smlSmpId"
              id="smlSMPId_id" #smlSMPId
              formControlName="smlSmpId"
              (keydown)="onFieldKeyPressed('smlSmpId', 'smlsmpidTimeout')"
@@ -71,7 +72,6 @@
                     matTooltip="Client Certificate used for SML authentication. The SML Client-Cert http Header is also generated from the certificate">
       <mat-label>SML Client Certificate Alias</mat-label>
       <mat-select
-        placeholder="SML ClientCert Alias"
         formControlName="smlClientKeyAlias"
         id="smlClientKeyAlias_id">
         <mat-option [value]="''">Choose certificate for signing soap response</mat-option>
diff --git a/smp-docker/images/build-docker-images.sh b/smp-docker/images/build-docker-images.sh
index b2cc519fb..47fe2fc05 100755
--- a/smp-docker/images/build-docker-images.sh
+++ b/smp-docker/images/build-docker-images.sh
@@ -68,7 +68,7 @@ if [[ -z "${SMP_VERSION}" ]]; then
 
 fi
 
-SMP_PLUGIN_EXAMPLE="../../smp-examples/smp-spi-example/target/"
+SMP_PLUGIN_EXAMPLE="../../smp-examples/smp-spi-payload-validation-example/target/"
 
 DIRNAME=$(dirname "$0")
 cd "$DIRNAME"
@@ -189,11 +189,11 @@ validateAndPrepareArtefacts() {
   if [[ ! -f "${SMP_PLUGIN_EXAMPLE}" ]]; then
     echo "SMP SPI plugin  '${SMP_PLUGIN_EXAMPLE}' not found. copy from artefacts ${SMP_ARTEFACTS}!"
     ls -ltr ${SMP_ARTEFACTS}
-    cp "${SMP_ARTEFACTS}/smp-spi-example-$SMP_VERSION.jar" ./tomcat-mysql-smp-sml/artefacts/smp-spi-example.jar
+    cp "${SMP_ARTEFACTS}/smp-spi-payload-validation-example-$SMP_VERSION.jar" ./tomcat-mysql-smp-sml/artefacts/smp-spi-payload-validation-example.jar
   else
-    cp "${SMP_PLUGIN_EXAMPLE}/smp-spi-example-$SMP_VERSION.jar" ./tomcat-mysql-smp-sml/artefacts/smp-spi-example.jar
+    cp "${SMP_PLUGIN_EXAMPLE}/smp-spi-payload-validation-example-$SMP_VERSION.jar" ./tomcat-mysql-smp-sml/artefacts/smp-spi-payload-validation-example.jar
   fi
-}
+
 
 # -----------------------------------------------------------------------------
 # build docker images
diff --git a/smp-examples/smp-spi-payload-validation-example/pom.xml b/smp-examples/smp-spi-payload-validation-example/pom.xml
index c574fe76e..d0bd80981 100644
--- a/smp-examples/smp-spi-payload-validation-example/pom.xml
+++ b/smp-examples/smp-spi-payload-validation-example/pom.xml
@@ -25,7 +25,7 @@
     </properties>
 
     <artifactId>smp-spi-payload-validation-example</artifactId>
-    <name>smp-spi-example</name>
+    <name>smp-spi-payload-validation-example</name>
     <description>Example of SMP's SPI Payload validation.</description>
     <dependencies>
         <dependency>
diff --git a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainService.java b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainService.java
index 118d92e93..c031dc2a2 100644
--- a/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainService.java
+++ b/smp-server-library/src/main/java/eu/europa/ec/edelivery/smp/services/ui/UIDomainService.java
@@ -4,16 +4,17 @@ import eu.europa.ec.edelivery.smp.data.dao.*;
 import eu.europa.ec.edelivery.smp.data.enums.VisibilityType;
 import eu.europa.ec.edelivery.smp.data.model.DBDomain;
 import eu.europa.ec.edelivery.smp.data.model.DBDomainResourceDef;
+import eu.europa.ec.edelivery.smp.data.model.DBGroup;
 import eu.europa.ec.edelivery.smp.data.model.ext.DBResourceDef;
+import eu.europa.ec.edelivery.smp.data.model.user.DBDomainMember;
+import eu.europa.ec.edelivery.smp.data.model.user.DBGroupMember;
 import eu.europa.ec.edelivery.smp.data.ui.DomainRO;
-import eu.europa.ec.edelivery.smp.data.ui.ResourceDefinitionRO;
 import eu.europa.ec.edelivery.smp.data.ui.ServiceResult;
 import eu.europa.ec.edelivery.smp.data.ui.enums.EntityROStatus;
 import eu.europa.ec.edelivery.smp.exceptions.BadRequestException;
 import eu.europa.ec.edelivery.smp.exceptions.ErrorBusinessCode;
 import eu.europa.ec.edelivery.smp.logging.SMPLogger;
 import eu.europa.ec.edelivery.smp.logging.SMPLoggerFactory;
-import eu.europa.ec.edelivery.smp.sml.SmlConnector;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.core.convert.ConversionService;
 import org.springframework.stereotype.Service;
@@ -34,18 +35,31 @@ public class UIDomainService extends UIServiceBase<DBDomain, DomainRO> {
 
 
     private DomainDao domainDao;
+    private DomainMemberDao domainMemberDao;
     private ResourceDao resourceDao;
     private ResourceDefDao resourceDefDao;
     private DomainResourceDefDao domainResourceDefDao;
     private ConversionService conversionService;
-
-
-    public UIDomainService(ConversionService conversionService, DomainDao domainDao, ResourceDao resourceDao, ResourceDefDao resourceDefDao, DomainResourceDefDao domainResourceDefDao) {
+    private GroupDao groupDao;
+    private GroupMemberDao groupMemberDao;
+
+
+    public UIDomainService(ConversionService conversionService,
+                           DomainDao domainDao,
+                           DomainMemberDao domainMemberDao,
+                           ResourceDao resourceDao,
+                           ResourceDefDao resourceDefDao,
+                           DomainResourceDefDao domainResourceDefDao,
+                           GroupDao groupDao,
+                           GroupMemberDao groupMemberDao) {
         this.conversionService = conversionService;
         this.domainDao = domainDao;
         this.resourceDao = resourceDao;
         this.resourceDefDao = resourceDefDao;
         this.domainResourceDefDao = domainResourceDefDao;
+        this.domainMemberDao = domainMemberDao;
+        this.groupDao = groupDao;
+        this.groupMemberDao = groupMemberDao;
     }
 
     @Override
@@ -86,13 +100,14 @@ public class UIDomainService extends UIServiceBase<DBDomain, DomainRO> {
         domain.setDomainCode(data.getDomainCode());
         domain.setDefaultResourceTypeIdentifier(data.getDefaultResourceTypeIdentifier());
         domain.setSignatureKeyAlias(data.getSignatureKeyAlias());
-        domain.setVisibility(data.getVisibility() == null? VisibilityType.PUBLIC:data.getVisibility());
+        domain.setVisibility(data.getVisibility() == null ? VisibilityType.PUBLIC : data.getVisibility());
         domainDao.persistFlushDetach(domain);
     }
 
 
     /**
      * Update only basic domain data from DomainRO object. Ignore other
+     *
      * @param domainId
      * @param data
      * @return
@@ -116,8 +131,8 @@ public class UIDomainService extends UIServiceBase<DBDomain, DomainRO> {
         if (domain == null) {
             throw new BadRequestException(ErrorBusinessCode.NOT_FOUND, "Domain does not exist in database!");
         }
-        if (domain.isSmlRegistered() && !StringUtils.equals(data.getSmlSmpId(), domain.getSmlSmpId())){
-            String msg = "SMP-SML identifier must not change for registered domain ["+domain.getDomainCode()+"]!";
+        if (domain.isSmlRegistered() && !StringUtils.equals(data.getSmlSmpId(), domain.getSmlSmpId())) {
+            String msg = "SMP-SML identifier must not change for registered domain [" + domain.getDomainCode() + "]!";
             throw new BadRequestException(ErrorBusinessCode.NOT_FOUND, msg);
         }
 
@@ -130,6 +145,7 @@ public class UIDomainService extends UIServiceBase<DBDomain, DomainRO> {
     @Transactional
     public void updateResourceDefDomainList(Long domainId, List<String> resourceDefIds) {
         DBDomain domain = domainDao.find(domainId);
+        LOG.info("add resources: [{}]", resourceDefIds);
         if (domain == null) {
             LOG.warn("Can not delete domain for ID [{}], because it does not exists!", domainId);
             throw new BadRequestException(ErrorBusinessCode.NOT_FOUND, "Domain does not exist in database!");
@@ -155,14 +171,14 @@ public class UIDomainService extends UIServiceBase<DBDomain, DomainRO> {
 
 
     @Transactional
-    public DomainRO getDomainData(Long domainId){
-        DBDomain domain =  domainDao.find(domainId);
+    public DomainRO getDomainData(Long domainId) {
+        DBDomain domain = domainDao.find(domainId);
         return conversionService.convert(domain, DomainRO.class);
     }
 
     @Transactional
-    public DomainRO getDomainDataByDomainCode(String domainCode){
-        DBDomain domain =  domainDao.getDomainByCode(domainCode).orElse(null);
+    public DomainRO getDomainDataByDomainCode(String domainCode) {
+        DBDomain domain = domainDao.getDomainByCode(domainCode).orElse(null);
         return conversionService.convert(domain, DomainRO.class);
     }
 
@@ -196,11 +212,31 @@ public class UIDomainService extends UIServiceBase<DBDomain, DomainRO> {
             throw new BadRequestException(ErrorBusinessCode.INVALID_INPUT_DATA, "Can not delete domain because it has resources [" + count + "]! Delete resources first!");
         }
 
+        // if there are no resources  / just "unpin" the members and the groups
+        List<DBDomainMember> memberList = domainMemberDao.getDomainMembers(domain.getId(), -1, -1, null);
+        for (DBDomainMember member : memberList) {
+            domainMemberDao.remove(member);
+        }
+        // delete all groups
+        List<DBGroup> groupList = domain.getDomainGroups();
+        for (DBGroup group : groupList) {
+            // all groups should be without resources see the check above:  getResourceCountForDomain
+            deleteDomainGroup(group);
+        }
+        // finally remove the domain
         domainDao.remove(domain);
         DomainRO domainRO = conversionService.convert(domain, DomainRO.class);
         domainRO.setStatus(EntityROStatus.REMOVE.getStatusNumber());
         return domainRO;
     }
 
+    private void deleteDomainGroup(DBGroup group) {
+        List<DBGroupMember> memberList = groupMemberDao.getGroupMembers(group.getId(), -1, -1, null);
+        for (DBGroupMember member : memberList) {
+            groupMemberDao.remove(member);
+        }
+        groupDao.remove(group);
+    }
+
 
 }
-- 
GitLab