Merge pull request 'file-saving' (#44) from file-saving into master
Reviewed-on: http://git.plannaplan.pl/filipizydorczyk/backend/pulls/44
This commit is contained in:
commit
3222faeab2
86
buisnesslogic/src/main/java/com/plannaplan/models/ExportData.java
Executable file
86
buisnesslogic/src/main/java/com/plannaplan/models/ExportData.java
Executable file
@ -0,0 +1,86 @@
|
|||||||
|
package com.plannaplan.models;
|
||||||
|
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.Stream;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Container to keep data to export
|
||||||
|
*/
|
||||||
|
public class ExportData {
|
||||||
|
|
||||||
|
private static final String GROUP_FIELD = "gr_nr";
|
||||||
|
private static final String USER_FIELD = "user_id";
|
||||||
|
private static final String CYKL_FIELD = "zaj_cykl_id";
|
||||||
|
|
||||||
|
private String userId;
|
||||||
|
private String zajCyklId;
|
||||||
|
private String grNr;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param userId usosid
|
||||||
|
* @param zajCyklId course cycle
|
||||||
|
* @param grNr group number
|
||||||
|
*/
|
||||||
|
public ExportData(String userId, String zajCyklId, String grNr) {
|
||||||
|
this.setUserId(userId);
|
||||||
|
this.setZajCyklId(zajCyklId);
|
||||||
|
this.setGrNr(grNr);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return group number
|
||||||
|
*/
|
||||||
|
public String getGrNr() {
|
||||||
|
return grNr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param grNr group number
|
||||||
|
*/
|
||||||
|
public void setGrNr(String grNr) {
|
||||||
|
this.grNr = grNr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return course cycle
|
||||||
|
*/
|
||||||
|
public String getZajCyklId() {
|
||||||
|
return zajCyklId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param zajCyklId course cycle
|
||||||
|
*/
|
||||||
|
public void setZajCyklId(String zajCyklId) {
|
||||||
|
this.zajCyklId = zajCyklId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return usosid
|
||||||
|
*/
|
||||||
|
public String getUserId() {
|
||||||
|
return userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param userId usosid
|
||||||
|
*/
|
||||||
|
public void setUserId(String userId) {
|
||||||
|
this.userId = userId;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return csv fromated line
|
||||||
|
*/
|
||||||
|
public String convertToCSVRecord() {
|
||||||
|
return Stream.of(this.userId, this.zajCyklId, this.grNr).collect(Collectors.joining(","));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return csv formated first line
|
||||||
|
*/
|
||||||
|
public static String getCSVHeader() {
|
||||||
|
return USER_FIELD + ", " + CYKL_FIELD + ", " + GROUP_FIELD;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,10 +1,12 @@
|
|||||||
package com.plannaplan.services;
|
package com.plannaplan.services;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
import com.plannaplan.entities.Commision;
|
import com.plannaplan.entities.Commision;
|
||||||
import com.plannaplan.entities.User;
|
import com.plannaplan.entities.User;
|
||||||
|
import com.plannaplan.models.ExportData;
|
||||||
import com.plannaplan.repositories.AssignmentRepository;
|
import com.plannaplan.repositories.AssignmentRepository;
|
||||||
import com.plannaplan.repositories.CommisionRepository;
|
import com.plannaplan.repositories.CommisionRepository;
|
||||||
|
|
||||||
@ -22,6 +24,8 @@ public class CommisionService {
|
|||||||
private CommisionRepository repo;
|
private CommisionRepository repo;
|
||||||
@Autowired
|
@Autowired
|
||||||
private AssignmentRepository aRepository;
|
private AssignmentRepository aRepository;
|
||||||
|
@Autowired
|
||||||
|
private UserService userService;
|
||||||
|
|
||||||
public CommisionService() {
|
public CommisionService() {
|
||||||
}
|
}
|
||||||
@ -77,4 +81,21 @@ public class CommisionService {
|
|||||||
public long getCommisionsAmmount() {
|
public long getCommisionsAmmount() {
|
||||||
return this.repo.count();
|
return this.repo.count();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return list of ExportData inmstancces keeping data to exprt to file
|
||||||
|
*/
|
||||||
|
public List<ExportData> getExportData() {
|
||||||
|
final List<ExportData> response = new ArrayList<>();
|
||||||
|
|
||||||
|
this.userService.getAllStudents().forEach(student -> {
|
||||||
|
student.getStudentRegisteredGrups().forEach(group -> {
|
||||||
|
response.add(new ExportData(student.getUsosId(), Integer.toString(group.getZajCykId()),
|
||||||
|
Integer.toString(group.getGrNr())));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
return response;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
14
buisnesslogic/src/test/java/com/plannaplan/models/ExportDataTest.java
Executable file
14
buisnesslogic/src/test/java/com/plannaplan/models/ExportDataTest.java
Executable file
@ -0,0 +1,14 @@
|
|||||||
|
package com.plannaplan.models;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class ExportDataTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldConvertDataToCSVRecord() {
|
||||||
|
final ExportData data = new ExportData("4234", "242352", "12");
|
||||||
|
assertTrue(data.convertToCSVRecord().equals("4234,242352,12"));
|
||||||
|
}
|
||||||
|
}
|
@ -62,6 +62,14 @@
|
|||||||
<version>4.5.10</version>
|
<version>4.5.10</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
|
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-io</groupId>
|
||||||
|
<artifactId>commons-io</artifactId>
|
||||||
|
<version>2.5</version>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.springframework.boot</groupId>
|
<groupId>org.springframework.boot</groupId>
|
||||||
<artifactId>spring-boot-starter-web</artifactId>
|
<artifactId>spring-boot-starter-web</artifactId>
|
||||||
|
@ -12,12 +12,15 @@ import io.swagger.annotations.ApiParam;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
|
import javax.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
import com.plannaplan.App;
|
import com.plannaplan.App;
|
||||||
import com.plannaplan.entities.Assignment;
|
import com.plannaplan.entities.Assignment;
|
||||||
import com.plannaplan.entities.Commision;
|
import com.plannaplan.entities.Commision;
|
||||||
import com.plannaplan.entities.Groups;
|
import com.plannaplan.entities.Groups;
|
||||||
import com.plannaplan.entities.User;
|
import com.plannaplan.entities.User;
|
||||||
import com.plannaplan.exceptions.UserNotFoundException;
|
import com.plannaplan.exceptions.UserNotFoundException;
|
||||||
|
import com.plannaplan.models.ExportData;
|
||||||
import com.plannaplan.responses.mappers.CommisionResponseMappers;
|
import com.plannaplan.responses.mappers.CommisionResponseMappers;
|
||||||
import com.plannaplan.responses.models.CommisionResponse;
|
import com.plannaplan.responses.models.CommisionResponse;
|
||||||
import com.plannaplan.services.AssignmentService;
|
import com.plannaplan.services.AssignmentService;
|
||||||
@ -27,6 +30,8 @@ import com.plannaplan.services.GroupService;
|
|||||||
import com.plannaplan.types.AppState;
|
import com.plannaplan.types.AppState;
|
||||||
import com.plannaplan.types.UserRoles;
|
import com.plannaplan.types.UserRoles;
|
||||||
|
|
||||||
|
import org.apache.commons.io.IOUtils;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
@ -37,6 +42,8 @@ import org.springframework.util.Assert;
|
|||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
@ -236,4 +243,32 @@ public class CommisionController extends TokenBasedController {
|
|||||||
return new ResponseEntity<>(new ArrayList<>(), HttpStatus.OK);
|
return new ResponseEntity<>(new ArrayList<>(), HttpStatus.OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param response spring response to set headers
|
||||||
|
*/
|
||||||
|
@GetMapping("/export/csv")
|
||||||
|
@PreAuthorize("hasRole('ROLE_ADMIN')")
|
||||||
|
@ApiOperation(value = "Export acceptes assignmetns as csv file to import to usos. You need to provide ADMIN token in order to get access to this data.")
|
||||||
|
public void getFile(HttpServletResponse response) {
|
||||||
|
try {
|
||||||
|
String csvString = ExportData.getCSVHeader() + "\n";
|
||||||
|
final Iterator<ExportData> it = this.commisionService.getExportData().iterator();
|
||||||
|
while (it.hasNext()) {
|
||||||
|
final ExportData data = it.next();
|
||||||
|
csvString += (data.convertToCSVRecord() + "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
final InputStream is = IOUtils.toInputStream(csvString, "UTF-8");
|
||||||
|
|
||||||
|
IOUtils.copy(is, response.getOutputStream());
|
||||||
|
response.setContentType("application/csv");
|
||||||
|
response.setHeader("Content-Disposition", "attachment; filename=\"export.csv\"");
|
||||||
|
response.flushBuffer();
|
||||||
|
} catch (IOException ex) {
|
||||||
|
|
||||||
|
throw new RuntimeException("IOError writing file to output stream");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,7 @@ import com.plannaplan.entities.User;
|
|||||||
import com.plannaplan.services.UserService;
|
import com.plannaplan.services.UserService;
|
||||||
import com.plannaplan.types.UserRoles;
|
import com.plannaplan.types.UserRoles;
|
||||||
|
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;
|
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.*;
|
||||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
||||||
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
|
||||||
@ -31,11 +32,13 @@ public class CommisionControllerTest extends AbstractControllerTest {
|
|||||||
private UserService service;
|
private UserService service;
|
||||||
|
|
||||||
private static User user;
|
private static User user;
|
||||||
|
private static User admin;
|
||||||
private static User otherUser;
|
private static User otherUser;
|
||||||
private static User asker;
|
private static User asker;
|
||||||
private static User otherAsker;
|
private static User otherAsker;
|
||||||
|
|
||||||
private static final String TEST_COMMISIONS_STUDENT_EMAIL = "commisions.student@notexisting.domain";
|
private static final String TEST_COMMISIONS_STUDENT_EMAIL = "commisions.student@notexisting.domain";
|
||||||
|
private static final String TEST_COMMISIONS_ADMIN_EMAIL = "commisions.admin@notexisiting,domain";
|
||||||
private static final String TEST_COMMISIONS_OTHER_STUDENT_EMAIL = "commisions.student2@notexisting.domain";
|
private static final String TEST_COMMISIONS_OTHER_STUDENT_EMAIL = "commisions.student2@notexisting.domain";
|
||||||
private static final String TEST_COMMISIONS_DEANERY_EMAIL = "commisions.deanery@notexisting.domain";
|
private static final String TEST_COMMISIONS_DEANERY_EMAIL = "commisions.deanery@notexisting.domain";
|
||||||
private static final String TEST_COMMISIONS_OTHER_DEANERY_EMAIL = "commisions.deanery2@notexisting.domain";
|
private static final String TEST_COMMISIONS_OTHER_DEANERY_EMAIL = "commisions.deanery2@notexisting.domain";
|
||||||
@ -45,6 +48,8 @@ public class CommisionControllerTest extends AbstractControllerTest {
|
|||||||
private static final String GET_SOMEONE_COMMISIONS_ENDPOINT = "/api/v1/commisions/user";
|
private static final String GET_SOMEONE_COMMISIONS_ENDPOINT = "/api/v1/commisions/user";
|
||||||
private static final String GET_USER_SCHEDULE_ENDPOINT = "/api/v1/commisions/user/schedule";
|
private static final String GET_USER_SCHEDULE_ENDPOINT = "/api/v1/commisions/user/schedule";
|
||||||
|
|
||||||
|
private static final String EXPORT_DATA = "/api/v1/commisions/export/csv";
|
||||||
|
|
||||||
private static final MediaType APPLICATION_JSON_UTF8 = new MediaType(MediaType.APPLICATION_JSON.getType(),
|
private static final MediaType APPLICATION_JSON_UTF8 = new MediaType(MediaType.APPLICATION_JSON.getType(),
|
||||||
MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));
|
MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8"));
|
||||||
|
|
||||||
@ -254,6 +259,10 @@ public class CommisionControllerTest extends AbstractControllerTest {
|
|||||||
UserRoles.STUDENT);
|
UserRoles.STUDENT);
|
||||||
this.service.save(otherUser);
|
this.service.save(otherUser);
|
||||||
}
|
}
|
||||||
|
if (CommisionControllerTest.admin == null) {
|
||||||
|
CommisionControllerTest.admin = new User(null, null, TEST_COMMISIONS_ADMIN_EMAIL, UserRoles.ADMIN);
|
||||||
|
this.service.save(admin);
|
||||||
|
}
|
||||||
if (CommisionControllerTest.asker == null) {
|
if (CommisionControllerTest.asker == null) {
|
||||||
CommisionControllerTest.asker = new User(null, null, TEST_COMMISIONS_DEANERY_EMAIL, UserRoles.DEANERY);
|
CommisionControllerTest.asker = new User(null, null, TEST_COMMISIONS_DEANERY_EMAIL, UserRoles.DEANERY);
|
||||||
this.service.save(asker);
|
this.service.save(asker);
|
||||||
@ -264,4 +273,38 @@ public class CommisionControllerTest extends AbstractControllerTest {
|
|||||||
this.service.save(otherAsker);
|
this.service.save(otherAsker);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldExportData() throws Exception {
|
||||||
|
this.checkUsers();
|
||||||
|
final User admin = this.service.checkForUser(TEST_COMMISIONS_ADMIN_EMAIL, null);
|
||||||
|
final String token = this.service.login(admin).getToken();
|
||||||
|
|
||||||
|
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
|
||||||
|
mockMvc.perform(get(EXPORT_DATA).header("Authorization", "Bearer " + token)).andExpect(status().isOk());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldNotExportDataDueToWrongPermision() throws Exception {
|
||||||
|
this.checkUsers();
|
||||||
|
final User student = this.service.checkForUser(TEST_COMMISIONS_STUDENT_EMAIL, null);
|
||||||
|
final String token = this.service.login(student).getToken();
|
||||||
|
|
||||||
|
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
|
||||||
|
mockMvc.perform(get(EXPORT_DATA).header("Authorization", "Bearer " + token))
|
||||||
|
.andExpect(status().is4xxClientError());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void shouldExportDataBeCsvFile() throws Exception {
|
||||||
|
this.checkUsers();
|
||||||
|
final User admin = this.service.checkForUser(TEST_COMMISIONS_ADMIN_EMAIL, null);
|
||||||
|
final String token = this.service.login(admin).getToken();
|
||||||
|
|
||||||
|
MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build();
|
||||||
|
|
||||||
|
assertTrue(
|
||||||
|
mockMvc.perform(get(EXPORT_DATA).header("Authorization", "Bearer " + token)).andExpect(status().isOk())
|
||||||
|
.andReturn().getResponse().getContentAsString().contains("user_id, zaj_cykl_id, gr_nr"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user