From 93cf2975a743603d29328da39dd3cab5c19cd7c5 Mon Sep 17 00:00:00 2001
From: Eduard Frankford <e.frankford@student.uibk.ac.at>
Date: Thu, 13 May 2021 15:39:58 +0200
Subject: [PATCH] achievements now working with email search

---
 .../repository/search/MetaDataRepository.java | 45 +++++++++++++++++--
 .../search/SearchRepositoryConstants.java     |  2 +
 .../gitsearch/web/rest/SearchResource.java    |  2 +-
 .../app/account/achievements.component.html   | 26 +++++------
 .../app/account/achievements.component.ts     | 27 ++++++-----
 5 files changed, 72 insertions(+), 30 deletions(-)

diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepository.java b/src/main/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepository.java
index 3fdd4502a..2fc533400 100644
--- a/src/main/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepository.java
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/search/MetaDataRepository.java
@@ -297,16 +297,53 @@ public class MetaDataRepository {
 		
 		SearchRequest searchRequest = new SearchRequest(SearchRepositoryConstants.INDEX_METADATA);
 
-		BoolQueryBuilder emailQuery = QueryBuilders.boolQuery();
+		BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
+
+		BoolQueryBuilder authorBuilder = QueryBuilders.boolQuery();
+		if (email != null)
+			authorBuilder.should(QueryBuilders
+					.multiMatchQuery(email,
+							SearchRepositoryConstants.METADATA_CREATOR_EMAIL, SearchRepositoryConstants.METADATA_CONTRIBUTOR_EMAIL,
+							SearchRepositoryConstants.METADATA_PUBLISHER_EMAIL)
+					.type(MultiMatchQueryBuilder.Type.PHRASE_PREFIX));
+		if(authorBuilder.hasClauses())
+			queryBuilder.must(authorBuilder);
+		
+		
+		// Authorization restrictions
+		final MatchQueryBuilder publicQuery = QueryBuilders.matchQuery(SearchRepositoryConstants.PROJECT_VISIBILITY, "public")
+				.fuzzyTranspositions(false).autoGenerateSynonymsPhraseQuery(false).boost(0.0f);
+		if(user.isEmpty()) {
+			 queryBuilder
+				.must(publicQuery);
+		} else {
+			
+			final Collection<GrantedAuthority> authorities = user.get().getAuthorities();
+			final BoolQueryBuilder authQuery = QueryBuilders.boolQuery().boost(0.0f);
+			final Stream<QueryBuilder> prefixAuthQueries = authorities.stream()
+			  .filter(auth -> !auth.getAuthority().startsWith("ROLE"))
+			  .filter(auth -> !auth.getAuthority().startsWith("SCOPE"))
+			  .map(auth -> QueryBuilders.prefixQuery(SearchRepositoryConstants.PROJECT_NAMESPACE, auth.getAuthority()));
+			prefixAuthQueries.forEach(pq -> authQuery.should(pq) );
+			if(authQuery.hasClauses())
+				queryBuilder.must(QueryBuilders.boolQuery().should(authQuery).should(publicQuery));
+			else
+				queryBuilder.must(publicQuery);
+		}
+		
+		
+		// SearchRequest searchRequest = new SearchRequest(SearchRepositoryConstants.INDEX_METADATA);
+
+		// BoolQueryBuilder emailQuery = QueryBuilders.boolQuery();
 		
-		emailQuery
-		.must(QueryBuilders.prefixQuery(SearchRepositoryConstants.METADATA_CREATOR_EMAIL, email));
+		// emailQuery
+		// .must(QueryBuilders.prefixQuery(SearchRepositoryConstants.METADATA_CREATOR_EMAIL, email));
 
 		//addAuthorizationQuery(user, emailQuery);
 
 
 		SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
-		sourceBuilder.query(emailQuery).size(pageSize)
+		sourceBuilder.query(queryBuilder).size(pageSize)
 				.from(0);
 
 		searchRequest.source(sourceBuilder);
diff --git a/src/main/java/at/ac/uibk/gitsearch/repository/search/SearchRepositoryConstants.java b/src/main/java/at/ac/uibk/gitsearch/repository/search/SearchRepositoryConstants.java
index d2cee8b3a..da96a91be 100644
--- a/src/main/java/at/ac/uibk/gitsearch/repository/search/SearchRepositoryConstants.java
+++ b/src/main/java/at/ac/uibk/gitsearch/repository/search/SearchRepositoryConstants.java
@@ -24,7 +24,9 @@ public final class SearchRepositoryConstants {
     public static final String METADATA_CREATOR = "metadata.creator.name";
     public static final String METADATA_CREATOR_EMAIL = "metadata.creator.email";
     public static final String METADATA_CONTRIBUTOR = "metadata.contributor.name";
+    public static final String METADATA_CONTRIBUTOR_EMAIL = "metadata.contributor.email";
     public static final String METADATA_PUBLISHER = "metadata.publisher.name";
+    public static final String METADATA_PUBLISHER_EMAIL = "metadata.publisher.email";
     public static final String METADATA_LICENSE = "metadata.license";
     public static final String METADATA_TYPE = "metadata.type";
 
diff --git a/src/main/java/at/ac/uibk/gitsearch/web/rest/SearchResource.java b/src/main/java/at/ac/uibk/gitsearch/web/rest/SearchResource.java
index ae57e2c0e..42aa1c99d 100644
--- a/src/main/java/at/ac/uibk/gitsearch/web/rest/SearchResource.java
+++ b/src/main/java/at/ac/uibk/gitsearch/web/rest/SearchResource.java
@@ -83,7 +83,7 @@ public class SearchResource {
         SearchInputMetadataDTO metadata = new SearchInputMetadataDTO();
         metadata.setAuthor(login);
         search.setMetadata(metadata);
-        SearchResultsDTO results = searchService.searchResultForAuthorEmail("Michael.Breu@uibk.ac.at", 1000);
+        SearchResultsDTO results = searchService.searchResultForAuthorEmail("michael.breu@uibk.ac.at", 1000);
         int totalAmountOfViews = 0;
         int totalAmountOfDownloads = 0;
         for (SearchResultDTO result : results.getSearchResult()) {
diff --git a/src/main/webapp/app/account/achievements.component.html b/src/main/webapp/app/account/achievements.component.html
index eda41b4d7..0198fd088 100644
--- a/src/main/webapp/app/account/achievements.component.html
+++ b/src/main/webapp/app/account/achievements.component.html
@@ -1,36 +1,36 @@
 
     <h2>Achievements</h2>
 
-    <ul class="list-group">
+    <ul class="list-group" *ngIf="statistics">
         <li class="list-group-item d-flex justify-content-between align-items-center">
             More than 500 views
-            <span *ngIf="statistics.views <= 500" class="badge badge-primary badge-pill">{{statistics.views}}</span>
-            <fa-icon icon="check" *ngIf="statistics.views > 500" class="greeniconcolor"></fa-icon>
+            <span *ngIf="statistics?.views <= 500" class="badge badge-primary badge-pill">{{statistics?.views}}</span>
+            <fa-icon icon="check" *ngIf="statistics?.views > 500" class="greeniconcolor"></fa-icon>
         </li>
         <li class="list-group-item d-flex justify-content-between align-items-center">
             More than 100 views
-            <span *ngIf="statistics.views <= 100" class="badge badge-primary badge-pill">{{statistics.views}}</span>
-            <fa-icon icon="check" *ngIf="statistics.views > 100" class="greeniconcolor"></fa-icon>
+            <span *ngIf="statistics?.views <= 100" class="badge badge-primary badge-pill">{{statistics?.views}}</span>
+            <fa-icon icon="check" *ngIf="statistics?.views > 100" class="greeniconcolor"></fa-icon>
         </li>
         <li class="list-group-item d-flex justify-content-between align-items-center">
             More than 10 views
-            <span *ngIf="statistics.views <= 10" class="badge badge-primary badge-pill">{{statistics.views}}</span>
-            <fa-icon icon="check" *ngIf="statistics.views > 10" class="greeniconcolor"></fa-icon>
+            <span *ngIf="statistics?.views <= 10" class="badge badge-primary badge-pill">{{statistics?.views}}</span>
+            <fa-icon icon="check" *ngIf="statistics?.views > 10" class="greeniconcolor"></fa-icon>
         </li>
         <li class="list-group-item d-flex justify-content-between align-items-center">
             More than 500 downloads
-            <span *ngIf="statistics.downloads <= 500" class="badge badge-primary badge-pill">{{statistics.downloads}}</span>
-            <fa-icon icon="check" *ngIf="statistics.downloads > 500" class="greeniconcolor"></fa-icon>
+            <span *ngIf="statistics?.downloads <= 500" class="badge badge-primary badge-pill">{{statistics?.downloads}}</span>
+            <fa-icon icon="check" *ngIf="statistics?.downloads > 500" class="greeniconcolor"></fa-icon>
         </li>
         <li class="list-group-item d-flex justify-content-between align-items-center">
             More than 100 downloads
-            <span *ngIf="statistics.downloads <= 100" class="badge badge-primary badge-pill">{{statistics.downloads}}</span>
-            <fa-icon icon="check" *ngIf="statistics.downloads > 100" class="greeniconcolor"></fa-icon>
+            <span *ngIf="statistics?.downloads <= 100" class="badge badge-primary badge-pill">{{statistics?.downloads}}</span>
+            <fa-icon icon="check" *ngIf="statistics?.downloads > 100" class="greeniconcolor"></fa-icon>
         </li>
         <li class="list-group-item d-flex justify-content-between align-items-center">
             More than 10 downloads
-            <span *ngIf="statistics.downloads <= 10" class="badge badge-primary badge-pill">{{statistics.downloads}}</span>
-            <fa-icon icon="check" *ngIf="statistics.downloads > 10" class="greeniconcolor"></fa-icon>
+            <span *ngIf="statistics?.downloads <= 10" class="badge badge-primary badge-pill">{{statistics?.downloads}}</span>
+            <fa-icon icon="check" *ngIf="statistics?.downloads > 10" class="greeniconcolor"></fa-icon>
         </li>
     </ul>
 
diff --git a/src/main/webapp/app/account/achievements.component.ts b/src/main/webapp/app/account/achievements.component.ts
index 8996dad85..78115b762 100644
--- a/src/main/webapp/app/account/achievements.component.ts
+++ b/src/main/webapp/app/account/achievements.component.ts
@@ -23,18 +23,21 @@ export class AchievementsComponent implements OnInit {
     console.log('I have been called');
     this.searchService.getStatisticsForUser(this.account.firstName + ' ' + this.account.lastName).subscribe(
       (data: Statistics) => {
-        this.statistics = data;
-        // eslint-disable-next-line no-console
-        console.log(
-          'Data: Number of Downloads: ' +
-            data.downloads +
-            ' Number of views: ' +
-            data.views +
-            ' for account ' +
-            this.account.firstName +
-            ' ' +
-            this.account.lastName
-        );
+        if (data) {
+          this.statistics = data;
+
+          // eslint-disable-next-line no-console
+          console.log(
+            'Data: Number of Downloads: ' +
+              data.downloads +
+              ' Number of views: ' +
+              data.views +
+              ' for account ' +
+              this.account.firstName +
+              ' ' +
+              this.account.lastName
+          );
+        }
       },
       () => alert('Could not load statistics for User')
     );
-- 
GitLab