2019-02-16 11:04:41 +01:00
package eu.dnetlib.repo.manager.controllers ;
import eu.dnetlib.domain.data.PiwikInfo ;
2019-07-22 15:00:51 +02:00
import eu.dnetlib.repo.manager.domain.OrderByField ;
import eu.dnetlib.repo.manager.domain.OrderByType ;
2019-07-23 10:07:39 +02:00
import eu.dnetlib.repo.manager.domain.Paging ;
2022-08-05 10:48:16 +02:00
import eu.dnetlib.repo.manager.exception.RepositoryServiceException ;
2019-02-16 11:04:41 +01:00
import eu.dnetlib.repo.manager.service.PiWikServiceImpl ;
2023-06-01 19:48:01 +02:00
import io.swagger.v3.oas.annotations.Parameter ;
import io.swagger.v3.oas.annotations.Parameters ;
import io.swagger.v3.oas.annotations.tags.Tag ;
2023-01-11 17:50:31 +01:00
import org.slf4j.Logger ;
import org.slf4j.LoggerFactory ;
2019-02-16 11:04:41 +01:00
import org.springframework.beans.factory.annotation.Autowired ;
2019-07-23 11:39:08 +02:00
import org.springframework.core.io.FileSystemResource ;
2019-02-16 11:04:41 +01:00
import org.springframework.http.MediaType ;
import org.springframework.http.ResponseEntity ;
import org.springframework.security.access.prepost.PreAuthorize ;
import org.springframework.web.bind.annotation.* ;
2019-07-23 11:39:08 +02:00
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
import java.io.FileNotFoundException ;
import java.io.IOException ;
import java.io.PrintWriter ;
import java.nio.file.Files ;
import java.nio.file.Path ;
import java.text.SimpleDateFormat ;
import java.util.Date ;
2019-02-16 11:04:41 +01:00
import java.util.List ;
@RestController
@RequestMapping ( value = " /piwik " )
2023-06-01 19:48:01 +02:00
@Tag ( name = " piwik " , description = " Piwik API " )
2019-02-16 11:04:41 +01:00
public class PiWikController {
2023-01-11 17:50:31 +01:00
private static final Logger logger = LoggerFactory . getLogger ( PiWikController . class ) ;
2019-07-23 11:39:08 +02:00
2019-02-16 11:04:41 +01:00
@Autowired
2019-07-22 15:00:51 +02:00
private PiWikServiceImpl piWikService ;
2019-02-16 11:04:41 +01:00
2023-10-11 12:00:48 +02:00
@RequestMapping ( value = " /validated " , method = RequestMethod . GET , produces = MediaType . APPLICATION_JSON_VALUE )
@ResponseBody
public Boolean isPiwikValidated ( @RequestParam ( " repositoryId " ) String repositoryId ) {
PiwikInfo info = piWikService . getPiwikSiteForRepo ( repositoryId ) ;
if ( info ! = null ) {
return info . isValidated ( ) ;
}
return false ;
}
2019-02-16 11:04:41 +01:00
@RequestMapping ( value = " /getPiwikSiteForRepo/{repositoryId} " , method = RequestMethod . GET , produces = MediaType . APPLICATION_JSON_VALUE )
@ResponseBody
2022-11-03 13:35:05 +01:00
@PreAuthorize ( " hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#repositoryId) or (@repositoryService.getRepositoryById(#repositoryId).registeredby==null and hasAuthority('REGISTERED_USER')) " )
2019-02-16 11:04:41 +01:00
public PiwikInfo getPiwikSiteForRepo ( @PathVariable ( " repositoryId " ) String repositoryId ) {
return piWikService . getPiwikSiteForRepo ( repositoryId ) ;
}
@RequestMapping ( value = " /savePiwikInfo " , method = RequestMethod . POST , produces = MediaType . APPLICATION_JSON_VALUE )
2022-11-03 13:35:05 +01:00
@PreAuthorize ( " hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#piwikInfo.repositoryId) or (@repositoryService.getRepositoryById(#piwikInfo.repositoryId).registeredby==null and hasAuthority('REGISTERED_USER')) " )
2019-02-16 11:04:41 +01:00
public PiwikInfo savePiwikInfo ( @RequestBody PiwikInfo piwikInfo ) {
return piWikService . savePiwikInfo ( piwikInfo ) ;
}
@RequestMapping ( value = " /getPiwikSitesForRepos " , method = RequestMethod . GET , produces = MediaType . APPLICATION_JSON_VALUE )
2023-06-01 19:48:01 +02:00
@Parameters ( {
@Parameter ( name = " from " , description = " number " ) ,
@Parameter ( name = " quantity " , description = " number " ) ,
@Parameter ( name = " order " , description = " eu.dnetlib.repo.manager.domain.OrderByType " ) ,
@Parameter ( name = " orderField " , description = " eu.dnetlib.repo.manager.domain.OrderByField " ) ,
@Parameter ( name = " searchField " , description = " string " )
2019-07-23 09:47:39 +02:00
} )
2019-07-23 10:07:39 +02:00
public Paging < PiwikInfo > getPiwikSitesForRepos (
2023-06-02 13:23:54 +02:00
@RequestParam ( value = " from " , required = false , defaultValue = " 0 " ) int from ,
@RequestParam ( value = " quantity " , required = false , defaultValue = " 100 " ) int quantity ,
@RequestParam ( value = " order " , required = false , defaultValue = " DSC " ) OrderByType orderType ,
2019-07-22 15:00:51 +02:00
@RequestParam ( value = " orderField " , required = false , defaultValue = " REPOSITORY_NAME " ) OrderByField orderField ,
@RequestParam ( value = " searchField " , required = false , defaultValue = " " ) String searchField
) {
2019-07-23 10:07:39 +02:00
Paging < PiwikInfo > results = new Paging < > ( ) ;
List < PiwikInfo > returning = piWikService . getPiwikSitesForRepos ( orderField , orderType , from , quantity , searchField ) ;
results . setFrom ( from ) ;
results . setTo ( from + returning . size ( ) ) ;
2019-08-01 13:55:17 +02:00
results . setTotal ( piWikService . getPiwikSitesTotals ( searchField ) ) ;
2019-07-23 10:07:39 +02:00
results . setResults ( returning ) ;
return results ;
2019-02-16 11:04:41 +01:00
}
2023-01-13 11:20:06 +01:00
2023-06-01 19:48:01 +02:00
@Parameters ( {
@Parameter ( name = " from " , description = " number " ) ,
@Parameter ( name = " quantity " , description = " number " ) ,
@Parameter ( name = " order " , description = " eu.dnetlib.repo.manager.domain.OrderByType " ) ,
@Parameter ( name = " searchField " , description = " eu.dnetlib.repo.manager.domain.OrderByField " ) ,
@Parameter ( name = " orderField " , description = " string " )
2019-07-23 11:39:08 +02:00
} )
@RequestMapping ( value = " /getPiwikSitesForRepos/csv " , method = RequestMethod . GET , produces = MediaType . APPLICATION_OCTET_STREAM_VALUE )
@ResponseBody
public FileSystemResource getPiwikSitesForReposToCsv (
2019-08-30 11:02:38 +02:00
@RequestParam ( value = " from " , required = false , defaultValue = " 0 " ) int from ,
@RequestParam ( value = " quantity " , required = false , defaultValue = " 10000 " ) int quantity ,
2019-07-23 11:39:08 +02:00
@RequestParam ( value = " order " , required = false , defaultValue = " DSC " ) OrderByType orderType ,
@RequestParam ( value = " orderField " , required = false , defaultValue = " REPOSITORY_NAME " ) OrderByField orderField ,
@RequestParam ( value = " searchField " , required = false , defaultValue = " " ) String searchField ,
HttpServletResponse response ,
HttpServletRequest request
) throws IOException {
Path p = Files . createTempFile ( " exportingCsv- " , new Date ( ) . toString ( ) ) ;
2019-08-30 11:02:38 +02:00
List < PiwikInfo > returning = piWikService . getPiwikSitesForRepos ( orderField , orderType , 0 , 10000 , searchField ) ;
2019-07-23 11:39:08 +02:00
try ( PrintWriter writer = new PrintWriter ( p . toFile ( ) ) ) {
StringBuilder sb = new StringBuilder ( ) ;
2019-07-23 11:47:20 +02:00
sb . append ( " Repository ID , Repository name, Country, Site ID, Authentication token, Creation date, Requestor full name, Requestor email, Validated, Validation date, Comment \ n " ) ;
2019-07-23 11:39:08 +02:00
for ( PiwikInfo piwikInfo : returning ) {
2023-01-13 11:20:06 +01:00
sb . append ( piwikInfo . getRepositoryId ( ) = = null ? " , " : piwikInfo . getRepositoryId ( ) + " , " )
. append ( piwikInfo . getRepositoryName ( ) = = null ? " , " : piwikInfo . getRepositoryName ( ) + " , " )
. append ( piwikInfo . getCountry ( ) = = null ? " , " : piwikInfo . getCountry ( ) + " , " )
. append ( piwikInfo . getSiteId ( ) = = null ? " , " : piwikInfo . getSiteId ( ) + " , " )
. append ( piwikInfo . getAuthenticationToken ( ) = = null ? " , " : piwikInfo . getAuthenticationToken ( ) + " , " )
. append ( piwikInfo . getCreationDate ( ) = = null ? " , " : piwikInfo . getCreationDate ( ) . toString ( ) + " , " )
. append ( piwikInfo . getRequestorName ( ) = = null ? " , " : piwikInfo . getRequestorName ( ) + " , " )
. append ( piwikInfo . getRequestorEmail ( ) = = null ? " , " : piwikInfo . getRequestorEmail ( ) + " , " )
. append ( piwikInfo . isValidated ( ) ) . append ( " , " )
. append ( piwikInfo . getValidationDate ( ) = = null ? " , " : piwikInfo . getValidationDate ( ) . toString ( ) + " , " )
. append ( piwikInfo . getComment ( ) = = null ? " \ n " : piwikInfo . getComment ( ) + " \ n " ) ;
2019-07-23 11:39:08 +02:00
}
writer . write ( sb . toString ( ) ) ;
} catch ( FileNotFoundException e ) {
2022-12-14 15:33:12 +01:00
logger . error ( e . getMessage ( ) ) ;
2019-07-23 11:39:08 +02:00
}
String mimeType = request . getServletContext ( ) . getMimeType ( p . toFile ( ) . getAbsolutePath ( ) ) ;
if ( mimeType = = null ) {
mimeType = " application/octet-stream " ;
}
response . setContentType ( mimeType ) ;
response . setContentLength ( ( int ) p . toFile ( ) . length ( ) ) ;
String headerKey = " Content-Disposition " ;
SimpleDateFormat sdfDate = new SimpleDateFormat ( " ddMMyyyy " ) ; //dd/MM/yyyy
Date now = new Date ( ) ;
String strDate = sdfDate . format ( now ) ;
String headerValue = String . format ( " attachment; filename= \" csv-%s.csv \" " ,
strDate ) ;
response . setHeader ( headerKey , headerValue ) ;
return new FileSystemResource ( p . toFile ( ) ) ;
}
2019-02-16 11:04:41 +01:00
@RequestMapping ( value = " /approvePiwikSite/{repositoryId} " , method = RequestMethod . GET )
@ResponseBody
2021-07-21 13:51:18 +02:00
@PreAuthorize ( " hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') " )
2019-02-16 11:04:41 +01:00
public ResponseEntity < Object > approvePiwikSite ( @PathVariable ( " repositoryId " ) String repositoryId ) {
return piWikService . approvePiwikSite ( repositoryId ) ;
}
@RequestMapping ( value = " /getOpenaireId/{repositoryId} " , method = RequestMethod . GET , produces = MediaType . APPLICATION_JSON_VALUE )
@ResponseBody
2022-11-03 13:35:05 +01:00
@PreAuthorize ( " hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOf(#repositoryId) or (@repositoryService.getRepositoryById(#repositoryId).registeredby==null and hasAuthority('REGISTERED_USER')) " )
2019-11-29 11:17:16 +01:00
public String getOpenaireId ( @PathVariable ( " repositoryId " ) String repositoryId ) {
return piWikService . getOpenaireId ( repositoryId ) ;
2019-02-16 11:04:41 +01:00
}
@RequestMapping ( value = " /markPiwikSiteAsValidated/{repositoryId} " , method = RequestMethod . POST ,
consumes = MediaType . APPLICATION_JSON_VALUE )
@ResponseBody
2021-07-21 13:51:18 +02:00
@PreAuthorize ( " hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') " )
2019-02-16 11:04:41 +01:00
public ResponseEntity < Object > markPiwikSiteAsValidated ( @PathVariable ( " repositoryId " ) String repositoryId ) throws RepositoryServiceException {
return piWikService . markPiwikSiteAsValidated ( repositoryId ) ;
}
@RequestMapping ( value = " /enableMetricsForRepository " , method = RequestMethod . POST ,
consumes = MediaType . APPLICATION_JSON_VALUE )
2021-07-21 13:51:18 +02:00
@PreAuthorize ( " hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or (hasAuthority('REGISTERED_USER') and #piwikInfo.requestorEmail == authentication.userInfo.email) " )
2019-02-16 11:04:41 +01:00
public PiwikInfo enableMetricsForRepository ( @RequestParam ( " officialName " ) String officialName ,
@RequestParam ( " repoWebsite " ) String repoWebsite ,
@RequestBody PiwikInfo piwikInfo ) throws RepositoryServiceException {
return piWikService . enableMetricsForRepository ( officialName , repoWebsite , piwikInfo ) ;
}
}