2019-02-16 11:04:41 +01:00
package eu.dnetlib.repo.manager.service ;
import com.fasterxml.jackson.databind.ObjectMapper ;
import eu.dnetlib.domain.data.PiwikInfo ;
2019-07-22 15:00:51 +02:00
import eu.dnetlib.domain.data.Repository ;
import eu.dnetlib.repo.manager.domain.OrderByField ;
import eu.dnetlib.repo.manager.domain.OrderByType ;
2019-11-28 12:25:56 +01:00
import eu.dnetlib.repo.manager.domain.RepositoryServiceException ;
2019-02-16 11:04:41 +01:00
import org.apache.commons.codec.digest.DigestUtils ;
import org.apache.log4j.Logger ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.beans.factory.annotation.Qualifier ;
import org.springframework.beans.factory.annotation.Value ;
import org.springframework.dao.EmptyResultDataAccessException ;
import org.springframework.http.HttpStatus ;
import org.springframework.http.ResponseEntity ;
import org.springframework.jdbc.core.JdbcTemplate ;
import org.springframework.jdbc.core.RowMapper ;
import org.springframework.security.access.prepost.PreAuthorize ;
2019-07-22 15:00:51 +02:00
import org.springframework.security.core.context.SecurityContextHolder ;
2019-02-16 11:04:41 +01:00
import org.springframework.stereotype.Service ;
import javax.sql.DataSource ;
import java.io.IOException ;
import java.io.UnsupportedEncodingException ;
import java.net.URL ;
import java.net.URLEncoder ;
import java.sql.Types ;
import java.util.List ;
import java.util.Map ;
@Service ( " piwikService " )
public class PiWikServiceImpl implements PiWikService {
@Autowired
private DataSource dataSource ;
@Value ( " ${services.repomanager.analyticsURL} " )
private String analyticsURL ;
2019-07-22 15:00:51 +02:00
@Autowired
private RepositoryService repositoryService ;
2019-02-16 11:04:41 +01:00
@Autowired
@Qualifier ( " emailUtils " )
2019-07-23 09:47:39 +02:00
private EmailUtils emailUtils ;
2019-02-16 11:04:41 +01:00
private static final Logger LOGGER = Logger
. getLogger ( PiWikServiceImpl . class ) ;
private final static String GET_PIWIK_SITE = " select repositoryid, siteid, authenticationtoken, creationdate, requestorname, requestoremail, validated, validationdate, comment, repositoryname, country from piwik_site where repositoryid = ?; " ;
private final static String INSERT_PIWIK_INFO = " insert into piwik_site (repositoryid, siteid, creationdate, requestorname, requestoremail, validated, repositoryname, country, authenticationtoken) values (?, ?, now(), ?, ?, ?, ?, ?, ?) " ;
2019-07-23 10:07:39 +02:00
private final static String GET_PIWIK_SITES = " select repositoryid, siteid, authenticationtoken, creationdate, requestorname, requestoremail, validated, validationdate, comment, repositoryname, country from piwik_site " ;
private final static String GET_PIWIK_SITES_TOTAL = " select count(*) as totals from piwik_site " ;
2019-02-16 11:04:41 +01:00
private final static String APPROVE_PIWIK_SITE = " update piwik_site set validated=true, validationdate=now() where repositoryid = ?; " ;
private RowMapper < PiwikInfo > piwikRowMapper = ( rs , i ) - > new PiwikInfo ( rs . getString ( " repositoryid " ) , getOpenaireId ( rs . getString ( " repositoryid " ) ) , rs . getString ( " repositoryname " ) , rs . getString ( " country " ) ,
rs . getString ( " siteid " ) , rs . getString ( " authenticationtoken " ) , rs . getTimestamp ( " creationdate " ) , rs . getString ( " requestorname " ) , rs . getString ( " requestoremail " ) ,
rs . getBoolean ( " validated " ) , rs . getTimestamp ( " validationdate " ) , rs . getString ( " comment " ) ) ;
@Override
2019-07-22 15:00:51 +02:00
public PiwikInfo getPiwikSiteForRepo ( String repositoryId ) {
2021-07-26 13:34:42 +02:00
try {
2019-02-16 11:04:41 +01:00
return new JdbcTemplate ( dataSource ) . queryForObject ( GET_PIWIK_SITE , new String [ ] { repositoryId } , new int [ ] { Types . VARCHAR } , piwikRowMapper ) ;
2021-07-26 13:34:42 +02:00
} catch ( EmptyResultDataAccessException e ) {
2019-02-16 11:04:41 +01:00
return null ;
}
}
@Override
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-07-22 15:00:51 +02:00
public PiwikInfo savePiwikInfo ( PiwikInfo piwikInfo ) {
2019-02-16 11:04:41 +01:00
JdbcTemplate jdbcTemplate = new JdbcTemplate ( dataSource ) ;
jdbcTemplate . update ( INSERT_PIWIK_INFO , new Object [ ] { piwikInfo . getRepositoryId ( ) , piwikInfo . getSiteId ( ) , piwikInfo . getRequestorName ( ) ,
piwikInfo . getRequestorEmail ( ) , piwikInfo . isValidated ( ) , piwikInfo . getRepositoryName ( ) , piwikInfo . getCountry ( ) , piwikInfo . getAuthenticationToken ( ) } ,
new int [ ] { Types . VARCHAR , Types . VARCHAR , Types . VARCHAR , Types . VARCHAR , Types . BOOLEAN , Types . VARCHAR , Types . VARCHAR , Types . VARCHAR } ) ;
return piwikInfo ;
}
@Override
2019-07-22 15:00:51 +02:00
public List < PiwikInfo > getPiwikSitesForRepos ( OrderByField orderByField , OrderByType orderByType , int from , int quantity , String searchField ) {
2021-07-26 13:34:42 +02:00
try {
String finalizedQuery = GET_PIWIK_SITES + " where ( " +
2019-07-22 15:00:51 +02:00
" repositoryid ilike ? " +
" or siteid ilike ? " +
" or requestorname ilike ? " +
" or requestoremail ilike ? " +
" or comment ilike ? " +
2021-07-26 13:34:42 +02:00
" or repositoryname ilike ? " +
2019-07-22 15:00:51 +02:00
" or country ilike ? "
2021-07-26 13:34:42 +02:00
+ " ) order by " + orderByField + " " + orderByType + " offset ? limit ? " ;
2019-07-22 15:00:51 +02:00
return new JdbcTemplate ( dataSource ) . query ( finalizedQuery , preparedStatement - > {
2021-07-26 13:34:42 +02:00
preparedStatement . setString ( 1 , " % " + searchField + " % " ) ;
preparedStatement . setString ( 2 , " % " + searchField + " % " ) ;
preparedStatement . setString ( 3 , " % " + searchField + " % " ) ;
preparedStatement . setString ( 4 , " % " + searchField + " % " ) ;
preparedStatement . setString ( 5 , " % " + searchField + " % " ) ;
preparedStatement . setString ( 6 , " % " + searchField + " % " ) ;
preparedStatement . setString ( 7 , " % " + searchField + " % " ) ;
preparedStatement . setInt ( 8 , from ) ;
preparedStatement . setInt ( 9 , quantity ) ;
2019-07-22 15:00:51 +02:00
} , piwikRowMapper ) ;
2021-07-26 13:34:42 +02:00
} catch ( EmptyResultDataAccessException e ) {
2019-02-16 11:04:41 +01:00
return null ;
}
}
2019-07-23 10:07:39 +02:00
@Override
2021-07-26 13:34:42 +02:00
public int getPiwikSitesTotals ( String searchField ) {
try {
String finalizedQuery = GET_PIWIK_SITES_TOTAL + " where ( " +
2019-08-01 13:55:17 +02:00
" repositoryid ilike ? " +
" or siteid ilike ? " +
" or requestorname ilike ? " +
" or requestoremail ilike ? " +
" or comment ilike ? " +
2021-07-26 13:34:42 +02:00
" or repositoryname ilike ? " +
2019-08-01 13:55:17 +02:00
" or country ilike ?) " ;
return new JdbcTemplate ( dataSource ) . query ( finalizedQuery , preparedStatement - > {
2021-07-26 13:34:42 +02:00
preparedStatement . setString ( 1 , " % " + searchField + " % " ) ;
preparedStatement . setString ( 2 , " % " + searchField + " % " ) ;
preparedStatement . setString ( 3 , " % " + searchField + " % " ) ;
preparedStatement . setString ( 4 , " % " + searchField + " % " ) ;
preparedStatement . setString ( 5 , " % " + searchField + " % " ) ;
preparedStatement . setString ( 6 , " % " + searchField + " % " ) ;
preparedStatement . setString ( 7 , " % " + searchField + " % " ) ;
} , rowMapper - > {
2019-08-01 13:55:17 +02:00
rowMapper . next ( ) ;
return rowMapper . getInt ( " totals " ) ;
} ) ;
2021-07-26 13:34:42 +02:00
} catch ( EmptyResultDataAccessException e ) {
2019-07-23 10:07:39 +02:00
return 0 ;
}
}
2019-02-16 11:04:41 +01:00
@Override
2021-07-21 13:51:18 +02:00
@PreAuthorize ( " hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') " )
2019-07-22 15:00:51 +02:00
public ResponseEntity < Object > approvePiwikSite ( String repositoryId ) {
2021-07-26 13:34:42 +02:00
new JdbcTemplate ( dataSource ) . update ( APPROVE_PIWIK_SITE , new Object [ ] { repositoryId } , new int [ ] { Types . VARCHAR } ) ;
return new ResponseEntity < > ( " OK " , HttpStatus . OK ) ;
2019-02-16 11:04:41 +01:00
}
@Override
2019-07-22 15:00:51 +02:00
public String getOpenaireId ( String repositoryId ) {
2019-02-16 11:04:41 +01:00
if ( repositoryId ! = null & & repositoryId . contains ( " :: " ) )
return repositoryId . split ( " :: " ) [ 0 ] + " :: " + DigestUtils . md5Hex ( repositoryId . split ( " :: " ) [ 1 ] ) ;
return null ;
}
@Override
2021-07-21 13:51:18 +02:00
@PreAuthorize ( " hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') " )
2019-07-22 15:00:51 +02:00
public ResponseEntity < Object > markPiwikSiteAsValidated ( String repositoryId ) throws RepositoryServiceException {
2019-02-16 11:04:41 +01:00
try {
approvePiwikSite ( repositoryId ) ;
PiwikInfo piwikInfo = getPiwikSiteForRepo ( repositoryId ) ;
emailUtils . sendAdministratorMetricsEnabled ( piwikInfo ) ;
emailUtils . sendUserMetricsEnabled ( piwikInfo ) ;
} catch ( EmptyResultDataAccessException e ) {
LOGGER . error ( " Error while approving piwik site: " , e ) ;
throw new RepositoryServiceException ( " General error " , RepositoryServiceException . ErrorCode . GENERAL_ERROR ) ;
} catch ( Exception e ) {
LOGGER . error ( " Error while sending email to administrator or user about the enabling of metrics " , e ) ;
2021-10-22 13:32:44 +02:00
throw new RepositoryServiceException ( e , RepositoryServiceException . ErrorCode . GENERAL_ERROR ) ;
2019-02-16 11:04:41 +01:00
}
2021-07-26 13:34:42 +02:00
return new ResponseEntity < > ( " OK " , HttpStatus . OK ) ;
2019-02-16 11:04:41 +01:00
}
@Override
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-07-22 15:00:51 +02:00
public PiwikInfo enableMetricsForRepository ( String officialName ,
String repoWebsite ,
PiwikInfo piwikInfo ) throws RepositoryServiceException {
2019-02-16 11:04:41 +01:00
try {
String URL = analyticsURL + " siteName= " + URLEncoder . encode ( officialName , " UTF-8 " ) + " &url= "
+ URLEncoder . encode ( repoWebsite , " UTF-8 " ) ;
Map map = new ObjectMapper ( ) . readValue ( new URL ( URL ) , Map . class ) ;
String siteId = null ;
2021-07-26 13:34:42 +02:00
if ( map . get ( " value " ) ! = null ) {
2019-02-16 11:04:41 +01:00
siteId = map . get ( " value " ) . toString ( ) ;
}
piwikInfo . setSiteId ( siteId ) ;
savePiwikInfo ( piwikInfo ) ;
2019-07-22 15:00:51 +02:00
Repository repository = repositoryService . getRepositoryById ( piwikInfo . getRepositoryId ( ) ) ;
repository . setPiwikInfo ( piwikInfo ) ;
repositoryService . updateRepository ( repository , SecurityContextHolder . getContext ( ) . getAuthentication ( ) ) ;
2019-02-16 11:04:41 +01:00
emailUtils . sendAdministratorRequestToEnableMetrics ( piwikInfo ) ;
emailUtils . sendUserRequestToEnableMetrics ( piwikInfo ) ;
} catch ( UnsupportedEncodingException uee ) {
LOGGER . error ( " Error while creating piwikScript URL " , uee ) ;
throw new RepositoryServiceException ( " login.generalError " , RepositoryServiceException . ErrorCode . GENERAL_ERROR ) ;
} catch ( IOException ioe ) {
LOGGER . error ( " Error while creating piwik site " , ioe ) ;
throw new RepositoryServiceException ( " login.generalError " , RepositoryServiceException . ErrorCode . GENERAL_ERROR ) ;
} catch ( Exception e ) {
LOGGER . error ( " Error while sending email to administrator or user about the request to enable metrics " , e ) ;
2021-10-22 13:32:44 +02:00
throw new RepositoryServiceException ( e , RepositoryServiceException . ErrorCode . GENERAL_ERROR ) ;
2019-02-16 11:04:41 +01:00
}
return piwikInfo ;
}
2021-07-26 13:34:42 +02:00
@Override
public Integer getTotal ( ) {
return new JdbcTemplate ( dataSource ) . queryForObject ( GET_PIWIK_SITES_TOTAL , new Object [ ] { } , Integer . class ) ;
}
2019-02-16 11:04:41 +01:00
2021-07-26 13:34:42 +02:00
@Override
public Integer getValidated ( boolean validated ) {
String finalizedQuery = GET_PIWIK_SITES_TOTAL + " where validated = ? " ;
return new JdbcTemplate ( dataSource ) . queryForObject ( finalizedQuery , new Object [ ] { validated } , Integer . class ) ;
}
2019-02-16 11:04:41 +01:00
}