22
33import com .opencsv .CSVWriter ;
44
5- import org .apache . commons . lang3 . tuple . Pair ;
5+ import org .ohdsi . webapi . shiro . TokenManager ;
66import org .ohdsi .webapi .statistic .dto .AccessTrendDto ;
77import org .ohdsi .webapi .statistic .dto .AccessTrendsDto ;
88import org .ohdsi .webapi .statistic .dto .EndpointDto ;
1111import org .ohdsi .webapi .statistic .service .StatisticService ;
1212import org .springframework .boot .autoconfigure .condition .ConditionalOnProperty ;
1313import org .springframework .stereotype .Controller ;
14+ import org .springframework .web .context .request .RequestContextHolder ;
15+ import org .springframework .web .context .request .ServletRequestAttributes ;
1416
1517import javax .ws .rs .Consumes ;
16- import javax .ws .rs .GET ;
1718import javax .ws .rs .POST ;
1819import javax .ws .rs .Path ;
1920import javax .ws .rs .Produces ;
2627import java .time .format .DateTimeFormatter ;
2728import java .util .ArrayList ;
2829import java .util .List ;
30+ import java .util .Objects ;
31+ import java .util .Optional ;
2932import java .util .stream .Collectors ;
3033
3134@ Controller
3437public class StatisticController {
3538 private StatisticService service ;
3639
40+ public enum ResponseFormat {
41+ CSV , JSON
42+ }
43+
3744 private static final List <String []> EXECUTION_STATISTICS_CSV_RESULT_HEADER = new ArrayList <String []>() {{
3845 add (new String []{"Date" , "Source" , "Execution Type" });
3946 }};
@@ -56,11 +63,16 @@ public StatisticController(StatisticService service) {
5663 @ Consumes (MediaType .APPLICATION_JSON )
5764 public Response executionStatistics (ExecutionStatisticsRequest executionStatisticsRequest ) {
5865 DateTimeFormatter formatter = DateTimeFormatter .ofPattern ("yyyy-MM-dd" );
66+ String userID = executionStatisticsRequest .isShowUserInformation () ? extractUserID () : null ;
5967
6068 SourceExecutionsDto sourceExecutions = service .getSourceExecutions (LocalDate .parse (executionStatisticsRequest .getStartDate (), formatter ),
61- LocalDate .parse (executionStatisticsRequest .getEndDate (), formatter ), executionStatisticsRequest .getSourceKey ());
69+ LocalDate .parse (executionStatisticsRequest .getEndDate (), formatter ), executionStatisticsRequest .getSourceKey (), userID );
6270
63- return prepareExecutionResultResponse (sourceExecutions .getExecutions (), "execution_statistics.zip" );
71+ if (ResponseFormat .CSV .equals (executionStatisticsRequest .getResponseFormat ())) {
72+ return prepareExecutionResultResponse (sourceExecutions .getExecutions (), "execution_statistics.zip" );
73+ } else {
74+ return Response .ok (sourceExecutions ).build ();
75+ }
6476 }
6577
6678 /**
@@ -73,11 +85,16 @@ public Response executionStatistics(ExecutionStatisticsRequest executionStatisti
7385 @ Consumes (MediaType .APPLICATION_JSON )
7486 public Response accessStatistics (AccessTrendsStatisticsRequest accessTrendsStatisticsRequest ) {
7587 DateTimeFormatter formatter = DateTimeFormatter .ofPattern ("yyyy-MM-dd" );
76-
88+ String userID = accessTrendsStatisticsRequest .isShowUserInformation () ? extractUserID () : null ;
89+
7790 AccessTrendsDto trends = service .getAccessTrends (LocalDate .parse (accessTrendsStatisticsRequest .getStartDate (), formatter ),
78- LocalDate .parse (accessTrendsStatisticsRequest .getEndDate (), formatter ), accessTrendsStatisticsRequest .getEndpoints ());
91+ LocalDate .parse (accessTrendsStatisticsRequest .getEndDate (), formatter ), accessTrendsStatisticsRequest .getEndpoints (), userID );
7992
80- return prepareAccessTrendsResponse (trends .getTrends (), "execution_trends.zip" );
93+ if (ResponseFormat .CSV .equals (accessTrendsStatisticsRequest .getResponseFormat ())) {
94+ return prepareAccessTrendsResponse (trends .getTrends (), "execution_trends.zip" );
95+ } else {
96+ return Response .ok (trends ).build ();
97+ }
8198 }
8299
83100 private Response prepareExecutionResultResponse (List <SourceExecutionDto > executions , String filename ) {
@@ -121,12 +138,23 @@ private Response prepareResponse(List<String[]> data, String filename, List<Stri
121138 }
122139 }
123140
141+ private String extractUserID () {
142+ return Optional .ofNullable (RequestContextHolder .getRequestAttributes ())
143+ .map (ServletRequestAttributes .class ::cast )
144+ .map (ServletRequestAttributes ::getRequest )
145+ .map (TokenManager ::extractToken )
146+ .map (TokenManager ::getSubject )
147+ .orElse (null );
148+ }
149+
124150 public static final class ExecutionStatisticsRequest {
125151 // Format - yyyy-MM-dd
126152 String startDate ;
127153 // Format - yyyy-MM-dd
128154 String endDate ;
129155 String sourceKey ;
156+ ResponseFormat responseFormat ;
157+ boolean showUserInformation ;
130158
131159 public String getStartDate () {
132160 return startDate ;
@@ -151,6 +179,22 @@ public String getSourceKey() {
151179 public void setSourceKey (String sourceKey ) {
152180 this .sourceKey = sourceKey ;
153181 }
182+
183+ public ResponseFormat getResponseFormat () {
184+ return responseFormat ;
185+ }
186+
187+ public void setResponseFormat (ResponseFormat responseFormat ) {
188+ this .responseFormat = responseFormat ;
189+ }
190+
191+ public boolean isShowUserInformation () {
192+ return showUserInformation ;
193+ }
194+
195+ public void setShowUserInformation (boolean showUserInformation ) {
196+ this .showUserInformation = showUserInformation ;
197+ }
154198 }
155199
156200 public static final class AccessTrendsStatisticsRequest {
@@ -161,6 +205,8 @@ public static final class AccessTrendsStatisticsRequest {
161205 // Key - method (POST, GET)
162206 // Value - endpoint ("{}" can be used as a placeholder, will be converted to ".*" in regular expression)
163207 List <EndpointDto > endpoints ;
208+ ResponseFormat responseFormat ;
209+ boolean showUserInformation ;
164210
165211 public String getStartDate () {
166212 return startDate ;
@@ -185,5 +231,21 @@ public List<EndpointDto> getEndpoints() {
185231 public void setEndpoints (List <EndpointDto > endpoints ) {
186232 this .endpoints = endpoints ;
187233 }
234+
235+ public ResponseFormat getResponseFormat () {
236+ return responseFormat ;
237+ }
238+
239+ public void setResponseFormat (ResponseFormat responseFormat ) {
240+ this .responseFormat = responseFormat ;
241+ }
242+
243+ public boolean isShowUserInformation () {
244+ return showUserInformation ;
245+ }
246+
247+ public void setShowUserInformation (boolean showUserInformation ) {
248+ this .showUserInformation = showUserInformation ;
249+ }
188250 }
189251}
0 commit comments