From 8d57bec18857fd4a54c4c20cbff9375d17516977 Mon Sep 17 00:00:00 2001
From: oussamasic <oussamazerouali42@gmail.com>
Date: Fri, 3 Sep 2021 18:54:49 +0200
Subject: [PATCH] add checkHasRole Service

---
 .../archive-search.component.html             |  4 +-
 .../archive-search.component.ts               | 78 ++++++++++++-------
 .../src/app/archive/archive.service.ts        | 10 ++-
 3 files changed, 61 insertions(+), 31 deletions(-)

diff --git a/ui/ui-frontend/projects/archive-search/src/app/archive/archive-search/archive-search.component.html b/ui/ui-frontend/projects/archive-search/src/app/archive/archive-search/archive-search.component.html
index 677c0ebff..73be1a829 100644
--- a/ui/ui-frontend/projects/archive-search/src/app/archive/archive-search/archive-search.component.html
+++ b/ui/ui-frontend/projects/archive-search/src/app/archive/archive-search/archive-search.component.html
@@ -172,8 +172,8 @@
         ></i>
       </div>
       <div class="col-1">
-        <vitamui-common-menu-button [disabled]="itemSelected === 0" [overlayPos]="'end'" [icon]="'vitamui-icon-more-horiz'">
-          <button mat-menu-item (click)="exportDIPService()">
+        <vitamui-common-menu-button [overlayPos]="'end'" [icon]="'vitamui-icon-more-horiz'">
+          <button mat-menu-item (click)="exportDIPService()" [disabled]="(itemSelected === 0 && hasDipExportRole) || !hasDipExportRole">
             {{ 'ARCHIVE_SEARCH.DIP.EXPORT_DIP' | translate }}
           </button>
         </vitamui-common-menu-button>
diff --git a/ui/ui-frontend/projects/archive-search/src/app/archive/archive-search/archive-search.component.ts b/ui/ui-frontend/projects/archive-search/src/app/archive/archive-search/archive-search.component.ts
index 4f374bb24..438a2c2cc 100644
--- a/ui/ui-frontend/projects/archive-search/src/app/archive/archive-search/archive-search.component.ts
+++ b/ui/ui-frontend/projects/archive-search/src/app/archive/archive-search/archive-search.component.ts
@@ -56,7 +56,7 @@ import {
   SearchCriteriaCategory,
   SearchCriteriaEltDto,
   SearchCriteriaStatusEnum,
-  SearchCriteriaTypeEnum
+  SearchCriteriaTypeEnum,
 } from '../models/search.criteria';
 import { Unit } from '../models/unit.interface';
 import { VitamUISnackBarComponent } from '../shared/vitamui-snack-bar';
@@ -70,7 +70,7 @@ const FILTER_DEBOUNCE_TIME_MS = 400;
 @Component({
   selector: 'app-archive-search',
   templateUrl: './archive-search.component.html',
-  styleUrls: ['./archive-search.component.scss']
+  styleUrls: ['./archive-search.component.scss'],
 })
 export class ArchiveSearchComponent implements OnInit, OnChanges {
   constructor(
@@ -151,7 +151,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
 
     this.archiveService.getOntologiesFromJson().subscribe((data: any) => {
       this.ontologies = data;
-      this.ontologies.sort(function(a: any, b: any) {
+      this.ontologies.sort(function (a: any, b: any) {
         const shortNameA = a.Label;
         const shortNameB = b.Label;
         return shortNameA < shortNameB ? -1 : shortNameA > shortNameB ? 1 : 0;
@@ -189,7 +189,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
   archiveUnits: Unit[];
   ontologies: any;
   filterMapType: { [key: string]: string[] } = {
-    status: ['Folder', 'Document', 'Subfonds', 'Class', 'Subgrp', 'Otherlevel', 'Series', 'Subseries', 'Collection', 'Fonds']
+    status: ['Folder', 'Document', 'Subfonds', 'Class', 'Subgrp', 'Otherlevel', 'Series', 'Subseries', 'Collection', 'Fonds'],
   };
   shouldShowPreviewArchiveUnit = false;
 
@@ -217,6 +217,9 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
   listOfUAIdToInclude: CriteriaValue[] = [];
   listOfUAIdToExclude: CriteriaValue[] = [];
   isIndeterminate: boolean;
+  hasDipExportRole = false;
+  hasEliminationActionRole = false;
+  hasEliminationAnalysisRole = false;
 
   selectedCategoryChange(selectedCategoryIndex: number) {
     this.additionalSearchCriteriaCategoryIndex = selectedCategoryIndex;
@@ -282,7 +285,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
       'Series',
       'Subseries',
       'Collection',
-      'Fonds'
+      'Fonds',
     ];
 
     const searchCriteriaChange = merge(this.orderChange, this.filterChange).pipe(debounceTime(FILTER_DEBOUNCE_TIME_MS));
@@ -290,6 +293,9 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
     searchCriteriaChange.subscribe(() => {
       this.submit();
     });
+    this.checkUserHasRole('DIPExport', 'ROLE_EXPORT_DIP', +this.tenantIdentifier);
+    // this.checkUserHasRole('EliminationAnalysis', 'ROLE_EXPORT_DIP', +this.tenantIdentifier);
+    // this.checkUserHasRole('EliminationAction', 'ROLE_EXPORT_DIP', +this.tenantIdentifier);
   }
 
   ngOnChanges(changes: SimpleChanges): void {
@@ -356,7 +362,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
             this.archiveExchangeDataService.sendAppraisalFromMainSearchCriteriaAction({
               keyElt,
               valueElt,
-              action: 'REMOVE'
+              action: 'REMOVE',
             });
           }
         }
@@ -430,7 +436,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
               valueShown: true,
               status: SearchCriteriaStatusEnum.NOT_INCLUDED,
               keyTranslated,
-              valueTranslated
+              valueTranslated,
             });
             criteria.values = values;
             this.searchCriterias.set(keyElt, criteria);
@@ -451,7 +457,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
             valueShown: true,
             status: SearchCriteriaStatusEnum.NOT_INCLUDED,
             keyTranslated,
-            valueTranslated
+            valueTranslated,
           });
           const criteria = {
             key: keyElt,
@@ -460,7 +466,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
             category,
             keyTranslated,
             valueTranslated,
-            dataType
+            dataType,
           };
           this.searchCriterias.set(keyElt, criteria);
         }
@@ -513,7 +519,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
           values: strValues,
           operator: criteria.operator,
           category: SearchCriteriaTypeEnum[SearchCriteriaTypeEnum.NODES],
-          dataType: criteria.dataType
+          dataType: criteria.dataType,
         });
       }
     });
@@ -532,7 +538,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
           values: strValues,
           operator: criteria.operator,
           category: SearchCriteriaTypeEnum[SearchCriteriaTypeEnum.FIELDS],
-          dataType: criteria.dataType
+          dataType: criteria.dataType,
         });
       }
     });
@@ -555,7 +561,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
         values: typesFilterValues,
         operator: 'EQ',
         category: SearchCriteriaTypeEnum[SearchCriteriaTypeEnum.FIELDS],
-        dataType: 'STRING'
+        dataType: 'STRING',
       });
     }
   }
@@ -574,7 +580,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
               values: [...new Array({ id: value, value })],
               operator: 'EQ',
               category: SearchCriteriaTypeEnum[SearchCriteriaTypeEnum.APPRAISAL_RULE],
-              dataType: criteria.dataType
+              dataType: criteria.dataType,
             });
           });
         } else {
@@ -587,7 +593,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
             values: strValues,
             operator: criteria.operator,
             category: SearchCriteriaTypeEnum[SearchCriteriaTypeEnum.APPRAISAL_RULE],
-            dataType: criteria.dataType
+            dataType: criteria.dataType,
           });
         }
         this.updateCriteriaStatus(SearchCriteriaStatusEnum.NOT_INCLUDED, SearchCriteriaStatusEnum.IN_PROGRESS);
@@ -603,7 +609,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
       criteriaList: this.criteriaSearchList,
       pageNumber: this.currentPage,
       size: PAGE_SIZE,
-      sortingCriteria
+      sortingCriteria,
     };
     this.archiveService.searchArchiveUnitsByCriteria(searchCriteria, this.accessContract).subscribe(
       (pagedResult: PagedResult) => {
@@ -656,7 +662,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
         operator: criteria.operator,
         keyTranslated: criteria.keyTranslated,
         valueTranslated: criteria.valueTranslated,
-        dataType: criteria.dataType
+        dataType: criteria.dataType,
       });
     });
 
@@ -664,7 +670,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
       id: null,
       name: '',
       savingDate: new Date().toISOString(),
-      searchCriteriaList: _criteriaList
+      searchCriteriaList: _criteriaList,
     };
 
     this.openCriteriaPopup(_searchCriteriaHistory);
@@ -677,7 +683,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
     dialogConfig.data = {
       searchCriteriaHistory: searchCriteriaHistory$,
       originalSearchCriteria: this.searchCriterias,
-      nbCriterias: this.archiveExchangeDataService.nbFilters(searchCriteriaHistory$)
+      nbCriterias: this.archiveExchangeDataService.nbFilters(searchCriteriaHistory$),
     };
 
     const dialogRef = this.dialog.open(SearchCriteriaSaverComponent, dialogConfig);
@@ -864,7 +870,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
         pageNumber: this.currentPage,
         size: PAGE_SIZE,
         sortingCriteria,
-        language: this.translateService.currentLang
+        language: this.translateService.currentLang,
       };
       this.archiveService.exportCsvSearchArchiveUnitsByCriteria(searchCriteria, this.accessContract);
     }
@@ -956,14 +962,14 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
       pageNumber: this.currentPage,
       size: PAGE_SIZE,
       sortingCriteria,
-      language: this.translateService.currentLang
+      language: this.translateService.currentLang,
     };
     this.archiveService.exportDIP(exportDIPSearchCriteria, this.accessContract).subscribe((data) => {
       console.log('response', JSON.parse(data));
       const guid = 'aeeaaaaaaggtywctaanl4al3rxsbxziaaaaq';
       const message = 'custom message for different workflows';
-      let index = this.startupService.getReferentialUrl().lastIndexOf('/');
-      let serviceUrl =
+      const index = this.startupService.getReferentialUrl().lastIndexOf('/');
+      const serviceUrl =
         this.startupService.getReferentialUrl().substring(0, index) +
         '/logbook-operation/tenant/' +
         this.tenantIdentifier +
@@ -989,7 +995,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
           values: listOfUAIdToInclude,
           operator: 'EQ',
           category: SearchCriteriaTypeEnum[SearchCriteriaTypeEnum.FIELDS],
-          dataType: 'String'
+          dataType: 'String',
         });
       }
 
@@ -999,7 +1005,7 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
           values: listOfUAIdToExclude,
           operator: 'NOT_EQ',
           category: SearchCriteriaTypeEnum[SearchCriteriaTypeEnum.FIELDS],
-          dataType: 'String'
+          dataType: 'String',
         });
       }
     }
@@ -1019,10 +1025,28 @@ export class ArchiveSearchComponent implements OnInit, OnChanges {
       panelClass: 'vitamui-snack-bar',
       data: {
         type: 'WorkflowSuccessSnackBar',
-        message: message,
-        serviceUrl: serviceUrl
+        message,
+        serviceUrl,
       },
-      duration: 100000
+      duration: 100000,
+    });
+  }
+
+  checkUserHasRole(operation: string, role: string, tenantIdentifier: number) {
+    this.archiveService.hasArchiveSearcheRole(role, tenantIdentifier).subscribe((result) => {
+      switch (operation) {
+        case 'DIPExport':
+          this.hasDipExportRole = result;
+          break;
+        case 'EliminationAnalysis':
+          this.hasEliminationAnalysisRole = result;
+          break;
+        case 'EliminationAction':
+          this.hasEliminationActionRole = result;
+          break;
+        default:
+          break;
+      }
     });
   }
 }
diff --git a/ui/ui-frontend/projects/archive-search/src/app/archive/archive.service.ts b/ui/ui-frontend/projects/archive-search/src/app/archive/archive.service.ts
index d9b0922bc..6c41603c4 100644
--- a/ui/ui-frontend/projects/archive-search/src/app/archive/archive.service.ts
+++ b/ui/ui-frontend/projects/archive-search/src/app/archive/archive.service.ts
@@ -39,7 +39,7 @@ import { Inject, Injectable, LOCALE_ID } from '@angular/core';
 import { MatSnackBar } from '@angular/material/snack-bar';
 import { Observable, of, throwError, TimeoutError } from 'rxjs';
 import { catchError, map, tap } from 'rxjs/operators';
-import { SearchService } from 'ui-frontend-common';
+import { SearchService, SecurityService } from 'ui-frontend-common';
 import { ArchiveApiService } from '../core/api/archive-api.service';
 import { FilingHoldingSchemeNode } from './models/node.interface';
 import { SearchResponse } from './models/search-response.interface';
@@ -55,7 +55,8 @@ export class ArchiveService extends SearchService<any> {
     private archiveApiService: ArchiveApiService,
     http: HttpClient,
     @Inject(LOCALE_ID) private locale: string,
-    private snackBar: MatSnackBar
+    private snackBar: MatSnackBar,
+    private securityService: SecurityService
   ) {
     super(http, archiveApiService, 'ALL');
   }
@@ -219,6 +220,11 @@ export class ArchiveService extends SearchService<any> {
     headers = headers.append('X-Access-Contract-Id', accessContract);
     return this.archiveApiService.exportDIP(criteriaDto, headers);
   }
+
+  hasArchiveSearcheRole(role: string, tenantIdentifier: number): Observable<boolean> {
+    const applicationIdentifier = 'ARCHIVE_SEARCH_MANAGEMENT_APP';
+    return this.securityService.hasRole(applicationIdentifier, tenantIdentifier, role);
+  }
 }
 
 function idExists(units: Unit[], id: string): boolean {
-- 
GitLab