diff --git a/restservice/src/main/java/com/plannaplan/controllers/AssignmentsController.java b/restservice/src/main/java/com/plannaplan/controllers/AssignmentsController.java index 2f07c2a..8a0a786 100755 --- a/restservice/src/main/java/com/plannaplan/controllers/AssignmentsController.java +++ b/restservice/src/main/java/com/plannaplan/controllers/AssignmentsController.java @@ -29,7 +29,8 @@ import org.springframework.web.bind.annotation.RequestMapping; @CrossOrigin @RequestMapping("/api/" + App.API_VERSION + "/assignments") @Api(tags = { - "Assignments" }, value = "Assignments", description = "Assignment is representation of student willing to join given group (lecture or calss)") + "Assignments" }, value = "Assignments", description = "Assignment is representation of student willing to join given group (lecture or calss). This comtroller is depreaceted. Use commission instead") +@Deprecated public class AssignmentsController extends TokenBasedController { @Autowired @@ -39,7 +40,8 @@ public class AssignmentsController extends TokenBasedController { private AssignmentService assignmentService; @GetMapping("/user") - @ApiOperation(value = "Return user current assignemts (from newest commision). STUDENT Token needs to be provided.") + @ApiOperation(value = "Return user current assignemts (from newest commision). STUDENT Token needs to be provided. This method is depreaceted. Use `/api/v1/commisions/user/schedule` instead.") + @Deprecated public ResponseEntity> getCurrentAssignments() throws Exception { User user = this.getCurrentUser().orElseThrow(() -> new NullPointerException("User not found")); Optional com = this.commisionService.getNewestCommision(user); diff --git a/restservice/src/main/java/com/plannaplan/controllers/CommisionController.java b/restservice/src/main/java/com/plannaplan/controllers/CommisionController.java index 03c835c..2388f12 100755 --- a/restservice/src/main/java/com/plannaplan/controllers/CommisionController.java +++ b/restservice/src/main/java/com/plannaplan/controllers/CommisionController.java @@ -33,6 +33,12 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.util.Assert; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.ArrayList; + +import com.plannaplan.responses.mappers.AssignmentResponseMappers; +import com.plannaplan.responses.models.AssignmentResponse; @RestController @CrossOrigin @@ -96,22 +102,75 @@ public class CommisionController extends TokenBasedController { @GetMapping("/user") @ApiOperation("Return list of user all commisions (history of schedules)") - public ResponseEntity> getAlCommisions() throws UserNotFoundException { + public ResponseEntity> getAlCommisions( + @RequestParam(name = "groups", defaultValue = "false") @ApiParam(value = "Boolean if we want to display wiht commision's group ids") Boolean groups) + throws UserNotFoundException { User user = this.getCurrentUser().orElseThrow(() -> new NullPointerException()); - List result = CommisionResponseMappers - .mapToResponse(this.commisionService.getUsersCommisions(user)); + + List result; + + if (!groups) { + result = CommisionResponseMappers.mapToResponse(this.commisionService.getUsersCommisions(user)); + } else { + result = CommisionResponseMappers + .mapToResponseWithGroups(this.commisionService.getUsersCommisions(user)); + } + return new ResponseEntity<>(result, HttpStatus.OK); } + @GetMapping("/user/schedule") + @ApiOperation(value = "Return user current assignemts (from newest commision). STUDENT Token needs to be provided.") + public ResponseEntity> getCurrentAssignments() throws Exception { + User user = this.getCurrentUser().orElseThrow(() -> new NullPointerException("User not found")); + Optional com = this.commisionService.getNewestCommision(user); + + if (com.isPresent()) { + List respone = this.assignmentService.getCommisionAssignments(com.get()); + return new ResponseEntity<>(AssignmentResponseMappers.mapToResponse(respone), HttpStatus.OK); + } + + return new ResponseEntity<>(new ArrayList<>(), HttpStatus.OK); + } + @PreAuthorize("hasRole('ROLE_DEANERY')") @GetMapping("/user/{id}") @ApiOperation("Return list of commisions for given user. To be able to access this data u need to provide DEANERY token") - public ResponseEntity> getCommision(@PathVariable(name = "id") Long userId) + public ResponseEntity> getCommision(@PathVariable(name = "id") Long userId, + @RequestParam(name = "groups", defaultValue = "false") @ApiParam(value = "Boolean if we want to display wiht commision's group ids") Boolean groups) throws UserNotFoundException { User user = this.userService.getById(userId).orElseThrow(() -> new NullPointerException()); - List result = CommisionResponseMappers - .mapToResponse(this.commisionService.getUsersCommisions(user)); + List result; + + if (!groups) { + result = CommisionResponseMappers.mapToResponse(this.commisionService.getUsersCommisions(user)); + } else { + result = CommisionResponseMappers + .mapToResponseWithGroups(this.commisionService.getUsersCommisions(user)); + } + return new ResponseEntity<>(result, HttpStatus.OK); } + @PreAuthorize("hasRole('ROLE_DEANERY')") + @GetMapping("/user/{id}/schedule") + @ApiOperation(value = "Return given user current assignemts (from newest commision). DEANERY Token needs to be provided.") + public ResponseEntity> getCurrentAssignmentsDeanery( + @PathVariable(name = "id") Long userId) throws Exception { + User user = this.userService.getById(userId).orElseThrow(() -> new NullPointerException()); + + if (user.getRole() == UserRoles.DEANERY) { + return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST); + } + + Optional com = this.commisionService.getNewestCommision(user); + + if (com.isPresent()) { + List respone = this.assignmentService.getCommisionAssignments(com.get()); + return new ResponseEntity<>(AssignmentResponseMappers.mapToResponse(respone), HttpStatus.OK); + } + + return new ResponseEntity<>(new ArrayList<>(), HttpStatus.OK); + } + } diff --git a/restservice/src/main/java/com/plannaplan/responses/mappers/CommisionResponseMappers.java b/restservice/src/main/java/com/plannaplan/responses/mappers/CommisionResponseMappers.java index 3303e96..7ce70d2 100755 --- a/restservice/src/main/java/com/plannaplan/responses/mappers/CommisionResponseMappers.java +++ b/restservice/src/main/java/com/plannaplan/responses/mappers/CommisionResponseMappers.java @@ -6,9 +6,15 @@ import java.util.stream.Collectors; import com.plannaplan.entities.Commision; import com.plannaplan.responses.models.CommisionResponse; +import com.plannaplan.responses.models.CommisionWithGroupsResponse; public class CommisionResponseMappers { public static final List mapToResponse(List commisions) { return commisions.stream().filter(Objects::nonNull).map(CommisionResponse::new).collect(Collectors.toList()); } + + public static final List mapToResponseWithGroups(List commisions) { + return commisions.stream().filter(Objects::nonNull).map(CommisionWithGroupsResponse::new) + .collect(Collectors.toList()); + } } diff --git a/restservice/src/main/java/com/plannaplan/responses/models/CommisionResponse.java b/restservice/src/main/java/com/plannaplan/responses/models/CommisionResponse.java index 63df94d..e995e27 100755 --- a/restservice/src/main/java/com/plannaplan/responses/models/CommisionResponse.java +++ b/restservice/src/main/java/com/plannaplan/responses/models/CommisionResponse.java @@ -1,7 +1,5 @@ package com.plannaplan.responses.models; -import java.sql.Timestamp; - import com.plannaplan.entities.Commision; import io.swagger.annotations.ApiModel; @@ -13,14 +11,14 @@ public class CommisionResponse { private Long id; @ApiModelProperty(value = "Timestamp where the user commit the commision") - private Timestamp commisionDate; + private String commisionDate; public CommisionResponse(Commision commision) { this.id = commision.getId(); - this.commisionDate = commision.getCommisionDate(); + this.commisionDate = commision.getCommisionDate().toString(); } - public Timestamp getCommisionDate() { + public String getCommisionDate() { return commisionDate; } diff --git a/restservice/src/main/java/com/plannaplan/responses/models/CommisionWithGroupsResponse.java b/restservice/src/main/java/com/plannaplan/responses/models/CommisionWithGroupsResponse.java new file mode 100755 index 0000000..435f754 --- /dev/null +++ b/restservice/src/main/java/com/plannaplan/responses/models/CommisionWithGroupsResponse.java @@ -0,0 +1,36 @@ +package com.plannaplan.responses.models; + +import java.util.List; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; + +import com.plannaplan.entities.Assignment; +import com.plannaplan.entities.Commision; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +@ApiModel(description = "Response shows information about commision and its groups.", value = "CommisionWithGroupsResponse") +public class CommisionWithGroupsResponse extends CommisionResponse { + + @ApiModelProperty(value = "List of groups ids in databse that belongs to commision") + private List groups; + + public CommisionWithGroupsResponse(Commision commision) { + super(commision); + this.groups = commision.getAssignments().stream().filter(Objects::nonNull) + .map(new Function() { + + @Override + public Long apply(Assignment arg0) { + return arg0.getGroup().getId(); + } + }).collect(Collectors.toList()); + } + + public List getGroups() { + return groups; + } + +} diff --git a/restservice/src/test/java/com/plannaplan/controllers/CommisionControllerTest.java b/restservice/src/test/java/com/plannaplan/controllers/CommisionControllerTest.java index f426785..5ff2377 100755 --- a/restservice/src/test/java/com/plannaplan/controllers/CommisionControllerTest.java +++ b/restservice/src/test/java/com/plannaplan/controllers/CommisionControllerTest.java @@ -43,6 +43,7 @@ public class CommisionControllerTest extends AbstractControllerTest { private static final String ADD_COMMISION_ENDPOINT = "/api/v1/commisions/user"; private static final String GET_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 MediaType APPLICATION_JSON_UTF8 = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); @@ -190,6 +191,58 @@ public class CommisionControllerTest extends AbstractControllerTest { .header("Authorization", "Bearer " + token)).andExpect(status().is4xxClientError()); } + @Test + public void shouldReturn4xxInScheduleEndpoint() throws Exception { + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); + mockMvc.perform(get(GET_USER_SCHEDULE_ENDPOINT)).andExpect(status().is4xxClientError()); + } + + @Test + public void shouldReturnOkInScheduleEdnpoint() throws Exception { + final User user = this.service.checkForUser(TEST_COMMISIONS_STUDENT_EMAIL, null); + final String token = this.service.login(user).getToken(); + + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); + mockMvc.perform(get(GET_USER_SCHEDULE_ENDPOINT).header("Authorization", "Bearer " + token)) + .andExpect(status().isOk()); + } + + @Test + public void shouldReturnOkInScheduleEdnpointByDeanery() throws Exception { + this.checkUsers(); + final User user = this.service.checkForUser(TEST_COMMISIONS_DEANERY_EMAIL, null); + final User student = this.service.checkForUser(TEST_COMMISIONS_STUDENT_EMAIL, null); + final String token = this.service.login(user).getToken(); + + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); + mockMvc.perform(get(GET_COMMISIONS_ENDPOINT + "/" + student.getId() + "/schedule").header("Authorization", + "Bearer " + token)).andExpect(status().isOk()); + } + + @Test + public void shouldFailInScheduleEdnpointByOtherStudent() throws Exception { + this.checkUsers(); + final User student = this.service.checkForUser(TEST_COMMISIONS_STUDENT_EMAIL, null); + final User otherStudent = this.service.checkForUser(TEST_COMMISIONS_OTHER_STUDENT_EMAIL, null); + final String token = this.service.login(student).getToken(); + + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); + mockMvc.perform(get(GET_COMMISIONS_ENDPOINT + "/" + otherStudent.getId() + "/schedule").header("Authorization", + "Bearer " + token)).andExpect(status().is4xxClientError()); + } + + @Test + public void shouldFailInScheduleEdnpointByDeaneryDeaneryRelation() throws Exception { + this.checkUsers(); + final User deanery = this.service.checkForUser(TEST_COMMISIONS_DEANERY_EMAIL, null); + final User otherDeanery = this.service.checkForUser(TEST_COMMISIONS_OTHER_DEANERY_EMAIL, null); + final String token = this.service.login(deanery).getToken(); + + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); + mockMvc.perform(get(GET_COMMISIONS_ENDPOINT + "/" + otherDeanery.getId() + "/schedule").header("Authorization", + "Bearer " + token)).andExpect(status().is4xxClientError()); + } + private void checkUsers() { if (CommisionControllerTest.user == null) { CommisionControllerTest.user = new User(null, null, TEST_COMMISIONS_STUDENT_EMAIL, UserRoles.STUDENT); diff --git a/restservice/src/test/java/com/plannaplan/responses/mappers/CommisionResponseMappersTest.java b/restservice/src/test/java/com/plannaplan/responses/mappers/CommisionResponseMappersTest.java index 95d02a6..a46b58a 100755 --- a/restservice/src/test/java/com/plannaplan/responses/mappers/CommisionResponseMappersTest.java +++ b/restservice/src/test/java/com/plannaplan/responses/mappers/CommisionResponseMappersTest.java @@ -2,11 +2,16 @@ package com.plannaplan.responses.mappers; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.lang.reflect.Field; import java.util.Arrays; import java.util.List; +import com.plannaplan.entities.Assignment; import com.plannaplan.entities.Commision; +import com.plannaplan.entities.Groups; import com.plannaplan.responses.models.CommisionResponse; +import com.plannaplan.responses.models.CommisionWithGroupsResponse; +import com.plannaplan.types.WeekDay; import org.junit.Test; @@ -17,7 +22,36 @@ public class CommisionResponseMappersTest { final List resposne = CommisionResponseMappers.mapToResponse(coms); assertTrue(resposne.get(0) instanceof CommisionResponse); - assertTrue(resposne.get(0).getCommisionDate().equals(coms.get(0).getCommisionDate())); - assertTrue(resposne.get(1).getCommisionDate().equals(coms.get(1).getCommisionDate())); + assertTrue(resposne.get(0).getCommisionDate().equals(coms.get(0).getCommisionDate().toString())); + assertTrue(resposne.get(1).getCommisionDate().equals(coms.get(1).getCommisionDate().toString())); + } + + @Test + public void shouldMapListWithEntityToListOfResponsesWithGroups() + throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { + + final Field reader = Commision.class.getDeclaredField("assignments"); + final Field groupReader = Groups.class.getDeclaredField("id"); + reader.setAccessible(true); + groupReader.setAccessible(true); + + final Commision com1 = new Commision(null); + final Groups group1 = new Groups(43, "BRAK", null, 840, WeekDay.MONDAY, null); + + groupReader.set(group1, Long.valueOf(8)); + reader.set(com1, Arrays.asList(new Assignment(group1, com1))); + + final Commision com2 = new Commision(null); + final Groups group2 = new Groups(124, "BRAK", null, 900, WeekDay.WEDNESDAY, null); + + groupReader.set(group2, Long.valueOf(9)); + reader.set(com2, Arrays.asList(new Assignment(group2, com2))); + + final List resposne = CommisionResponseMappers + .mapToResponseWithGroups(Arrays.asList(com1, com2)); + + assertTrue(resposne.size() == 2); + assertTrue(resposne.get(0).getGroups().get(0) == 8); + assertTrue(resposne.get(1).getGroups().get(0) == 9); } } diff --git a/restservice/src/test/java/com/plannaplan/responses/models/CommisionResponseTest.java b/restservice/src/test/java/com/plannaplan/responses/models/CommisionResponseTest.java index 23edc29..6a151ae 100755 --- a/restservice/src/test/java/com/plannaplan/responses/models/CommisionResponseTest.java +++ b/restservice/src/test/java/com/plannaplan/responses/models/CommisionResponseTest.java @@ -12,6 +12,6 @@ public class CommisionResponseTest { final Commision com = new Commision(null); final CommisionResponse comResponse = new CommisionResponse(com); - assertTrue(comResponse.getCommisionDate().equals(com.getCommisionDate())); + assertTrue(comResponse.getCommisionDate().equals(com.getCommisionDate().toString())); } } diff --git a/restservice/src/test/java/com/plannaplan/responses/models/CommisionWithGroupsResponseTest.java b/restservice/src/test/java/com/plannaplan/responses/models/CommisionWithGroupsResponseTest.java new file mode 100755 index 0000000..e9ef476 --- /dev/null +++ b/restservice/src/test/java/com/plannaplan/responses/models/CommisionWithGroupsResponseTest.java @@ -0,0 +1,34 @@ +package com.plannaplan.responses.models; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.lang.reflect.Field; +import java.util.Arrays; + +import com.plannaplan.entities.Assignment; +import com.plannaplan.entities.Commision; +import com.plannaplan.entities.Groups; +import com.plannaplan.types.WeekDay; + +import org.junit.Test; + +public class CommisionWithGroupsResponseTest { + @Test + public void shouldMapCommisionToResponse() + throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { + final Field reader = Commision.class.getDeclaredField("assignments"); + final Field groupReader = Groups.class.getDeclaredField("id"); + reader.setAccessible(true); + groupReader.setAccessible(true); + + final Commision com = new Commision(null); + final Groups group = new Groups(43, "BRAK", null, 840, WeekDay.MONDAY, null); + + groupReader.set(group, Long.valueOf(8)); + reader.set(com, Arrays.asList(new Assignment(group, com))); + + final CommisionWithGroupsResponse comResponse = new CommisionWithGroupsResponse(com); + + assertTrue(comResponse.getGroups().get(0) == 8); + } +}