diff --git a/buisnesslogic/src/main/java/com/plannaplan/services/GroupService.java b/buisnesslogic/src/main/java/com/plannaplan/services/GroupService.java index a01de30..b77dacb 100755 --- a/buisnesslogic/src/main/java/com/plannaplan/services/GroupService.java +++ b/buisnesslogic/src/main/java/com/plannaplan/services/GroupService.java @@ -41,4 +41,14 @@ public class GroupService { public Optional getGroupById(Long id) { return this.repo.findById(id); } + + public Optional findNotExistingGroup(List ids) { + for (Long oneId : ids) { + if (this.repo.existsById(oneId) == false) { + return Optional.of(oneId); + } + } + return Optional.empty(); + + } } \ No newline at end of file diff --git a/buisnesslogic/src/main/java/com/plannaplan/services/UserService.java b/buisnesslogic/src/main/java/com/plannaplan/services/UserService.java index 4eaa65e..73a0644 100755 --- a/buisnesslogic/src/main/java/com/plannaplan/services/UserService.java +++ b/buisnesslogic/src/main/java/com/plannaplan/services/UserService.java @@ -49,4 +49,8 @@ public class UserService { return this.repo.searchForUsers(query, UserRoles.STUDENT); } + public Optional getById(Long userId) { + return this.repo.findById(userId); + } + } \ No newline at end of file diff --git a/restservice/src/main/java/com/plannaplan/controllers/CommisionController.java b/restservice/src/main/java/com/plannaplan/controllers/CommisionController.java index ea7d2aa..864b8de 100755 --- a/restservice/src/main/java/com/plannaplan/controllers/CommisionController.java +++ b/restservice/src/main/java/com/plannaplan/controllers/CommisionController.java @@ -2,9 +2,11 @@ package com.plannaplan.controllers; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Optional; import com.plannaplan.App; import com.plannaplan.entities.Assignment; @@ -17,10 +19,12 @@ import com.plannaplan.responses.models.CommisionResponse; import com.plannaplan.services.AssignmentService; import com.plannaplan.services.CommisionService; import com.plannaplan.services.GroupService; +import com.plannaplan.types.UserRoles; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; +import org.springframework.util.Assert; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -30,40 +34,64 @@ import org.springframework.web.bind.annotation.RequestMapping; @RequestMapping("/api/" + App.API_VERSION + "/commisions") public class CommisionController extends TokenBasedController { - @Autowired - private CommisionService commisionService; + @Autowired + private CommisionService commisionService; - @Autowired - private GroupService groupServcicxe; + @Autowired + private GroupService groupServcicxe; - @Autowired - private AssignmentService assignmentService; + @Autowired + private AssignmentService assignmentService; - public CommisionController() { - } + public CommisionController() { + } - @PostMapping("/add") - public ResponseEntity addCommision(@RequestBody List groups) throws UserNotFoundException { + @PostMapping(value = { "/add", "/add/{id}" }) + public ResponseEntity addCommision(@RequestBody List groups, + @PathVariable(name = "id", required = false) Long userId) { - User user = this.getCurrentUser().orElseThrow(() -> new NullPointerException()); - Commision com = new Commision(user); - this.commisionService.save(com); + try { - groups.stream().forEach((groupId) -> { - Groups group = this.groupServcicxe.getGroupById(groupId).orElseThrow(() -> new NullPointerException()); - Assignment a = new Assignment(group, com); - this.assignmentService.save(a); - }); + final User asker = this.getCurrentUser() + .orElseThrow(() -> new UserNotFoundException("Invalid token")); - return new ResponseEntity<>("Succes", HttpStatus.OK); - } + final User user = userId != null + ? userService.getById(userId).orElseThrow( + () -> new UserNotFoundException("Given user id not exist")) + : asker; - @GetMapping("/getAllCommisions") - public ResponseEntity> getAlCommisions() throws UserNotFoundException { - User user = this.getCurrentUser().orElseThrow(() -> new NullPointerException()); - List result = CommisionResponseMappers - .mapToResponse(this.commisionService.getUsersCommisions(user)); - return new ResponseEntity<>(result, HttpStatus.OK); - } + Assert.isTrue((asker.getRole() == UserRoles.DEANERY && user.getRole() == UserRoles.STUDENT + || (asker.getId() == user.getId() && user.getRole() == UserRoles.STUDENT)), + "Incorrect attempt to change plan"); + + Optional notExistingGroup = this.groupServcicxe.findNotExistingGroup(groups); + Assert.isTrue(!notExistingGroup.isPresent(), "Group " + + notExistingGroup.orElse(Long.MIN_VALUE).toString() + "doesn't exist"); + + final Commision com = new Commision(user); + this.commisionService.save(com); + + groups.stream().forEach((groupId) -> { + Groups group = this.groupServcicxe.getGroupById(groupId) + .orElseThrow(() -> new NullPointerException()); + Assignment a = new Assignment(group, com); + this.assignmentService.save(a); + }); + + return new ResponseEntity<>("Succes", HttpStatus.OK); + } catch (UserNotFoundException exception) { + return new ResponseEntity<>(exception.getMessage(), HttpStatus.NOT_FOUND); + } catch (IllegalArgumentException exception) { + return new ResponseEntity<>(exception.getMessage(), HttpStatus.BAD_REQUEST); + } + } + + @GetMapping("/getAllCommisions") + public ResponseEntity> getAlCommisions() throws UserNotFoundException { + User user = this.getCurrentUser().orElseThrow(() -> new NullPointerException()); + List result = CommisionResponseMappers + .mapToResponse(this.commisionService.getUsersCommisions(user)); + return new ResponseEntity<>(result, HttpStatus.OK); + } } diff --git a/restservice/src/test/java/com/plannaplan/controllers/CommisionControllerTest.java b/restservice/src/test/java/com/plannaplan/controllers/CommisionControllerTest.java index bf371d7..ab32320 100755 --- a/restservice/src/test/java/com/plannaplan/controllers/CommisionControllerTest.java +++ b/restservice/src/test/java/com/plannaplan/controllers/CommisionControllerTest.java @@ -35,10 +35,18 @@ public class CommisionControllerTest { private UserService service; private static User user; + private static User otherUser; + private static User asker; + private static User otherAsker; + + private static final String TEST_COMMISIONS_STUDENT_EMAIL = "commisions.student@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_OTHER_DEANERY_EMAIL = "commisions.deanery2@notexisting.domain"; private static final String ADD_COMMISION_ENDPOINT = "/api/v1/commisions/add"; private static final String GET_COMMISIONS_ENDPOINT = "/api/v1/commisions/getAllCommisions"; - private static final String TEST_COMMISIONS_EMAIL = "commisions@notexisting.domain"; + private static final MediaType APPLICATION_JSON_UTF8 = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); @@ -51,8 +59,8 @@ public class CommisionControllerTest { @Test public void shouldFailedAddingCommisionDueToNoArgs() throws Exception { - this.checkUser(); - final String token = this.service.login(TEST_COMMISIONS_EMAIL); + this.checkUsers(); + final String token = this.service.login(TEST_COMMISIONS_STUDENT_EMAIL); MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); mockMvc.perform(post(ADD_COMMISION_ENDPOINT).header("Authorization", "Bearer " + token)) @@ -61,8 +69,8 @@ public class CommisionControllerTest { @Test public void shouldReturnOkAddingCommision() throws Exception { - this.checkUser(); - final String token = this.service.login(TEST_COMMISIONS_EMAIL); + this.checkUsers(); + final String token = this.service.login(TEST_COMMISIONS_STUDENT_EMAIL); MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); mockMvc.perform(post(ADD_COMMISION_ENDPOINT).header("Authorization", "Bearer " + token) @@ -77,18 +85,100 @@ public class CommisionControllerTest { @Test public void shouldReturnOkGettingAllCommisions() throws Exception { - this.checkUser(); - final String token = this.service.login(TEST_COMMISIONS_EMAIL); + this.checkUsers(); + final String token = this.service.login(TEST_COMMISIONS_STUDENT_EMAIL); MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); mockMvc.perform(get(GET_COMMISIONS_ENDPOINT).header("Authorization", "Bearer " + token)) .andExpect(status().isOk()); } - private void checkUser() { + @Test + public void shouldAddCommisionWithSelfIdPrivided() throws Exception { + this.checkUsers(); + final String token = this.service.login(TEST_COMMISIONS_STUDENT_EMAIL); + + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); + mockMvc.perform(post(ADD_COMMISION_ENDPOINT + "/" + CommisionControllerTest.user.getId().toString()) + .header("Authorization", "Bearer " + token).contentType(APPLICATION_JSON_UTF8).content("[]")) + .andExpect(status().isOk()); + } + + @Test + public void shouldFailCommisionWithSomeoneIdPrividedAsStudent() throws Exception { + this.checkUsers(); + + final String token = this.service.login(TEST_COMMISIONS_STUDENT_EMAIL); + + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); + mockMvc.perform(post(ADD_COMMISION_ENDPOINT + "/" + CommisionControllerTest.otherUser.getId().toString()) + .header("Authorization", "Bearer " + token).contentType(APPLICATION_JSON_UTF8).content("[]")) + .andExpect(status().is4xxClientError()); + } + + @Test + public void shouldFailCommisionAsDeanaryWithNoId() throws Exception { + this.checkUsers(); + final String token = this.service.login(TEST_COMMISIONS_DEANERY_EMAIL); + + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); + mockMvc.perform(post(ADD_COMMISION_ENDPOINT).header("Authorization", "Bearer " + token) + .contentType(APPLICATION_JSON_UTF8).content("[]")).andExpect(status().is4xxClientError()); + } + + @Test + public void shouldFailCommisionWithSelfIdPrividedAsDeanary() throws Exception { + this.checkUsers(); + final String token = this.service.login(TEST_COMMISIONS_DEANERY_EMAIL); + + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); + mockMvc.perform(post(ADD_COMMISION_ENDPOINT + "/" + CommisionControllerTest.asker.getId().toString()) + .header("Authorization", "Bearer " + token).contentType(APPLICATION_JSON_UTF8).content("[]")) + .andExpect(status().is4xxClientError()); + } + + @Test + public void shouldAddCommisionWithSomeoneIdPrividedAsDeanary() throws Exception { + this.checkUsers(); + + final String token = this.service.login(TEST_COMMISIONS_DEANERY_EMAIL); + + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); + mockMvc.perform(post(ADD_COMMISION_ENDPOINT + "/" + CommisionControllerTest.otherUser.getId().toString()) + .header("Authorization", "Bearer " + token).contentType(APPLICATION_JSON_UTF8).content("[]")) + .andExpect(status().isOk()); + } + + @Test + public void shouldFailCommisionWithOtherDeanaryIdPrividedAsDeanary() throws Exception { + this.checkUsers(); + + final String token = this.service.login(TEST_COMMISIONS_DEANERY_EMAIL); + + MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).apply(springSecurity()).build(); + mockMvc.perform(post(ADD_COMMISION_ENDPOINT + "/" + CommisionControllerTest.otherAsker.getId().toString()) + .header("Authorization", "Bearer " + token).contentType(APPLICATION_JSON_UTF8).content("[]")) + .andExpect(status().is4xxClientError()); + } + + private void checkUsers() { if (CommisionControllerTest.user == null) { - CommisionControllerTest.user = new User(null, null, TEST_COMMISIONS_EMAIL, UserRoles.TEST_USER); + CommisionControllerTest.user = new User(null, null, TEST_COMMISIONS_STUDENT_EMAIL, UserRoles.STUDENT); this.service.save(user); } + if (CommisionControllerTest.otherUser == null) { + CommisionControllerTest.otherUser = new User(null, null, TEST_COMMISIONS_OTHER_STUDENT_EMAIL, + UserRoles.STUDENT); + this.service.save(otherUser); + } + if (CommisionControllerTest.asker == null) { + CommisionControllerTest.asker = new User(null, null, TEST_COMMISIONS_DEANERY_EMAIL, UserRoles.DEANERY); + this.service.save(asker); + } + if (CommisionControllerTest.otherAsker == null) { + CommisionControllerTest.otherAsker = new User(null, null, TEST_COMMISIONS_OTHER_DEANERY_EMAIL, + UserRoles.DEANERY); + this.service.save(otherAsker); + } } }