Project

General

Profile

1
package eu.dnetlib.repo.manager.controllers;
2

    
3
import eu.dnetlib.domain.data.PiwikInfo;
4
import eu.dnetlib.repo.manager.domain.OrderByField;
5
import eu.dnetlib.repo.manager.domain.OrderByType;
6
import eu.dnetlib.repo.manager.domain.Paging;
7
import eu.dnetlib.repo.manager.service.PiWikServiceImpl;
8
import eu.dnetlib.repo.manager.service.RepositoryService;
9
import eu.dnetlib.repo.manager.shared.RepositoryServiceException;
10
import io.swagger.annotations.Api;
11
import io.swagger.annotations.ApiImplicitParam;
12
import io.swagger.annotations.ApiImplicitParams;
13
import org.apache.log4j.Logger;
14
import org.springframework.beans.factory.annotation.Autowired;
15
import org.springframework.core.io.FileSystemResource;
16
import org.springframework.http.MediaType;
17
import org.springframework.http.ResponseEntity;
18
import org.springframework.security.access.prepost.PostAuthorize;
19
import org.springframework.security.access.prepost.PreAuthorize;
20
import org.springframework.web.bind.annotation.*;
21

    
22
import javax.servlet.http.HttpServletRequest;
23
import javax.servlet.http.HttpServletResponse;
24
import java.io.File;
25
import java.io.FileNotFoundException;
26
import java.io.IOException;
27
import java.io.PrintWriter;
28
import java.nio.file.Files;
29
import java.nio.file.Path;
30
import java.text.SimpleDateFormat;
31
import java.util.Date;
32
import java.util.List;
33

    
34
@RestController
35
@RequestMapping(value = "/piwik")
36
@Api(description = "Piwik API",  tags = {"piwik"})
37
public class PiWikController {
38

    
39
    private static final Logger LOGGER = Logger
40
            .getLogger(PiWikController.class);
41

    
42
    @Autowired
43
    private PiWikServiceImpl piWikService;
44

    
45
    @Autowired
46
    private RepositoryService repositoryService;
47

    
48

    
49
    @RequestMapping(value = "/getPiwikSiteForRepo/{repositoryId}" , method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
50
    @ResponseBody
51
    @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or (@repositoryService.getRepositoryById(#repositoryId).registeredBy==authentication.userInfo.email and hasRole('ROLE_USER'))")
52
    public PiwikInfo getPiwikSiteForRepo(@PathVariable("repositoryId") String repositoryId) {
53
        return piWikService.getPiwikSiteForRepo(repositoryId);
54
    }
55

    
56
    @RequestMapping(value = "/savePiwikInfo" , method = RequestMethod.POST,produces = MediaType.APPLICATION_JSON_VALUE)
57
    @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or (@repositoryService.getRepositoryById(#piwikInfo.repositoryId).registeredBy==authentication.userInfo.email and hasRole('ROLE_USER'))")
58
    public PiwikInfo savePiwikInfo(@RequestBody PiwikInfo piwikInfo) {
59
        return piWikService.savePiwikInfo(piwikInfo);
60
    }
61

    
62
    @RequestMapping(value = "/getPiwikSitesForRepos" , method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
63
    @ApiImplicitParams({
64
            @ApiImplicitParam(name = "from", dataType = "number", paramType = "query"),
65
            @ApiImplicitParam(name = "quantity", dataType = "number", paramType = "query"),
66
            @ApiImplicitParam(name = "order", dataType = "eu.dnetlib.repo.manager.domain.OrderByType", paramType = "query"),
67
            @ApiImplicitParam(name = "orderField", dataType = "eu.dnetlib.repo.manager.domain.OrderByField", paramType = "query"),
68
            @ApiImplicitParam(name = "searchField", dataType = "string", paramType = "query"),
69
    })
70
    public Paging<PiwikInfo> getPiwikSitesForRepos(
71
            @RequestParam(value = "from",required=false,defaultValue = "0") int from,
72
            @RequestParam(value = "quantity",required=false,defaultValue = "100") int quantity,
73
            @RequestParam(value = "order",required=false,defaultValue = "DSC") OrderByType orderType,
74
            @RequestParam(value = "orderField", required = false, defaultValue = "REPOSITORY_NAME") OrderByField orderField,
75
            @RequestParam(value = "searchField", required = false, defaultValue = "") String searchField
76

    
77
    ){
78
        Paging<PiwikInfo> results = new Paging<>();
79
        List<PiwikInfo> returning = piWikService.getPiwikSitesForRepos(orderField,orderType,from,quantity,searchField);
80
        results.setFrom(from);
81
        results.setTo(from + returning.size());
82
        results.setTotal(piWikService.getPiwikSitesTotals(searchField));
83
        results.setResults(returning);
84
        return results;
85
    }
86
    @ApiImplicitParams({
87
            @ApiImplicitParam(name = "from", dataType = "number", paramType = "query"),
88
            @ApiImplicitParam(name = "quantity", dataType = "number", paramType = "query"),
89
            @ApiImplicitParam(name = "order", dataType = "eu.dnetlib.repo.manager.domain.OrderByType", paramType = "query"),
90
            @ApiImplicitParam(name = "searchField", dataType = "eu.dnetlib.repo.manager.domain.OrderByField", paramType = "query"),
91
            @ApiImplicitParam(name = "orderField", dataType = "string", paramType = "query"),
92
    })
93
    @RequestMapping(value = "/getPiwikSitesForRepos/csv" , method = RequestMethod.GET,produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
94
    @ResponseBody
95
    public FileSystemResource getPiwikSitesForReposToCsv(
96
            @RequestParam(value = "from",required=false,defaultValue = "0") int from,
97
            @RequestParam(value = "quantity",required=false,defaultValue = "10000") int quantity,
98
            @RequestParam(value = "order",required=false,defaultValue = "DSC") OrderByType orderType,
99
            @RequestParam(value = "orderField", required = false, defaultValue = "REPOSITORY_NAME") OrderByField orderField,
100
            @RequestParam(value = "searchField", required = false, defaultValue = "") String searchField,
101
            HttpServletResponse response,
102
            HttpServletRequest request
103
    ) throws IOException {
104

    
105
        Path p = Files.createTempFile("exportingCsv-", new Date().toString());
106
        List<PiwikInfo> returning = piWikService.getPiwikSitesForRepos(orderField,orderType,0,10000,searchField);
107
        try (PrintWriter writer = new PrintWriter(p.toFile())) {
108

    
109
            StringBuilder sb = new StringBuilder();
110
            sb.append(" Repository ID , Repository name, Country, Site ID, Authentication token, Creation date, Requestor full name, Requestor email, Validated, Validation date, Comment \n");
111

    
112
            for(PiwikInfo piwikInfo : returning){
113
                sb.append(
114
                        (piwikInfo.getRepositoryId() == null ? "," : piwikInfo.getRepositoryId()+ ",")+
115
                                (piwikInfo.getRepositoryName() == null ? "," : piwikInfo.getRepositoryName()+ ",")+
116
                                (piwikInfo.getCountry() == null ? "," : piwikInfo.getCountry()+ ",")+
117
                                (piwikInfo.getSiteId() == null ? "," : piwikInfo.getSiteId()+ ",") +
118
                                (piwikInfo.getAuthenticationToken() == null ? "," : piwikInfo.getAuthenticationToken()+ ",")+
119
                                (piwikInfo.getCreationDate() == null ? "," : piwikInfo.getCreationDate().toString()+ ",") +
120
                                (piwikInfo.getRequestorName() == null ? "," : piwikInfo.getRequestorName()+ ",") +
121
                                (piwikInfo.getRequestorEmail() == null ? "," : piwikInfo.getRequestorEmail()+ ",")+
122
                                piwikInfo.isValidated() + "," +
123
                                (piwikInfo.getValidationDate() == null ? "," : piwikInfo.getValidationDate().toString()+ ",") +
124
                                (piwikInfo.getComment() == null ? "\n" : piwikInfo.getComment()+ "\n")
125

    
126
                );
127
            }
128
            writer.write(sb.toString());
129

    
130
        } catch (FileNotFoundException e) {
131
            LOGGER.error(e.getMessage());
132
        }
133

    
134

    
135
        String mimeType = request.getServletContext().getMimeType(p.toFile().getAbsolutePath());
136
        if (mimeType == null) {
137
            mimeType = "application/octet-stream";
138
        }
139
        response.setContentType(mimeType);
140
        response.setContentLength((int) p.toFile().length());
141

    
142

    
143
        String headerKey = "Content-Disposition";
144
        SimpleDateFormat sdfDate = new SimpleDateFormat("ddMMyyyy");//dd/MM/yyyy
145
        Date now = new Date();
146
        String strDate = sdfDate.format(now);
147
        String headerValue = String.format("attachment; filename=\"csv-%s.csv\"",
148
                strDate);
149
        response.setHeader(headerKey, headerValue);
150

    
151

    
152
        return new FileSystemResource(p.toFile());
153

    
154
    }
155

    
156

    
157
    @RequestMapping(value = "/approvePiwikSite/{repositoryId}" , method = RequestMethod.GET)
158
    @ResponseBody
159
    @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN')")
160
    public ResponseEntity<Object> approvePiwikSite(@PathVariable("repositoryId") String repositoryId) {
161
        return piWikService.approvePiwikSite(repositoryId);
162
    }
163

    
164
    @RequestMapping(value = "/getOpenaireId/{repositoryId}" , method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE)
165
    @ResponseBody
166
    @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN')")
167
    public String getOpenaireId(String repositoryid){
168
        return piWikService.getOpenaireId(repositoryid);
169
    }
170

    
171
    @RequestMapping(value = "/markPiwikSiteAsValidated/{repositoryId}" , method = RequestMethod.POST,
172
            consumes = MediaType.APPLICATION_JSON_VALUE)
173
    @ResponseBody
174
    @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN')")
175
    public ResponseEntity<Object> markPiwikSiteAsValidated(@PathVariable("repositoryId") String repositoryId) throws RepositoryServiceException {
176
        return piWikService.markPiwikSiteAsValidated(repositoryId);
177
    }
178

    
179
    @RequestMapping(value = "/enableMetricsForRepository", method = RequestMethod.POST,
180
            consumes = MediaType.APPLICATION_JSON_VALUE)
181
    @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_PROVIDE_ADMIN') or (hasRole('ROLE_USER') and #piwikInfo.requestorEmail == authentication.userInfo.email)")
182
    public PiwikInfo enableMetricsForRepository(@RequestParam("officialName") String officialName,
183
                                                @RequestParam("repoWebsite") String repoWebsite,
184
                                                @RequestBody PiwikInfo piwikInfo) throws RepositoryServiceException {
185
        return piWikService.enableMetricsForRepository(officialName, repoWebsite, piwikInfo);
186
    }
187

    
188

    
189
}
(5-5/11)