Merged with master

This commit is contained in:
Filip Izydorczyk 2020-12-12 15:38:47 +01:00
commit ffc4f4709b
10 changed files with 278 additions and 16 deletions

40
.gitlab-ci.yml Executable file
View File

@ -0,0 +1,40 @@
stages:
- build
- deploy
build:
stage: build
image: maven
script:
- echo "Start building App"
- echo "spring.profiles.active=prod" > restservice/src/main/resources/application.properties
- mvn clean
- mvn install
- cd restservice
- mvn clean package spring-boot:repackage
- echo "Build successfully!"
artifacts:
expire_in: 1 hour
paths:
- restservice/target/
deploy_production:
stage: deploy
before_script:
- apt-get update
- apt-get --yes --force-yes install rsync
script:
- 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
- eval $(ssh-agent -s)
- ssh-add <(echo "$SSH_PRIVATE_KEY")
- mkdir -p ~/.ssh
- '[[ -f /.dockerenv ]] && echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config'
- echo "Deploying to server"
- ssh backend@wmi-backend-gc.plannaplan.pl -t "sudo systemctl stop plannaplan-backend"
- ssh backend@wmi-backend-gc.plannaplan.pl -t "rm -rf /opt/plannaplan-backend/backend.jar"
- rsync --progress restservice/target/*.jar backend@wmi-backend-gc.plannaplan.pl:/opt/plannaplan-backend/backend.jar
- sleep 5
- ssh backend@wmi-backend-gc.plannaplan.pl -t "sudo systemctl start plannaplan-backend"
- echo "Deployed"
only:
- master

View File

@ -29,7 +29,8 @@ import org.springframework.web.bind.annotation.RequestMapping;
@CrossOrigin @CrossOrigin
@RequestMapping("/api/" + App.API_VERSION + "/assignments") @RequestMapping("/api/" + App.API_VERSION + "/assignments")
@Api(tags = { @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 { public class AssignmentsController extends TokenBasedController {
@Autowired @Autowired
@ -39,7 +40,8 @@ public class AssignmentsController extends TokenBasedController {
private AssignmentService assignmentService; private AssignmentService assignmentService;
@GetMapping("/user") @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<List<AssignmentResponse>> getCurrentAssignments() throws Exception { public ResponseEntity<List<AssignmentResponse>> getCurrentAssignments() throws Exception {
User user = this.getCurrentUser().orElseThrow(() -> new NullPointerException("User not found")); User user = this.getCurrentUser().orElseThrow(() -> new NullPointerException("User not found"));
Optional<Commision> com = this.commisionService.getNewestCommision(user); Optional<Commision> com = this.commisionService.getNewestCommision(user);

View File

@ -33,6 +33,12 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.util.Assert; 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 java.util.ArrayList;
import com.plannaplan.responses.mappers.AssignmentResponseMappers;
import com.plannaplan.responses.models.AssignmentResponse;
@RestController @RestController
@CrossOrigin @CrossOrigin
@ -96,22 +102,75 @@ public class CommisionController extends TokenBasedController {
@GetMapping("/user") @GetMapping("/user")
@ApiOperation("Return list of user all commisions (history of schedules)") @ApiOperation("Return list of user all commisions (history of schedules)")
public ResponseEntity<List<CommisionResponse>> getAlCommisions() throws UserNotFoundException { public ResponseEntity<List<? extends CommisionResponse>> 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()); User user = this.getCurrentUser().orElseThrow(() -> new NullPointerException());
List<CommisionResponse> result = CommisionResponseMappers
.mapToResponse(this.commisionService.getUsersCommisions(user)); List<? extends CommisionResponse> result;
if (!groups) {
result = CommisionResponseMappers.mapToResponse(this.commisionService.getUsersCommisions(user));
} else {
result = CommisionResponseMappers
.mapToResponseWithGroups(this.commisionService.getUsersCommisions(user));
}
return new ResponseEntity<>(result, HttpStatus.OK); 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<List<AssignmentResponse>> getCurrentAssignments() throws Exception {
User user = this.getCurrentUser().orElseThrow(() -> new NullPointerException("User not found"));
Optional<Commision> com = this.commisionService.getNewestCommision(user);
if (com.isPresent()) {
List<Assignment> 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')") @PreAuthorize("hasRole('ROLE_DEANERY')")
@GetMapping("/user/{id}") @GetMapping("/user/{id}")
@ApiOperation("Return list of commisions for given user. To be able to access this data u need to provide DEANERY token") @ApiOperation("Return list of commisions for given user. To be able to access this data u need to provide DEANERY token")
public ResponseEntity<List<CommisionResponse>> getCommision(@PathVariable(name = "id") Long userId) public ResponseEntity<List<? extends CommisionResponse>> 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 { throws UserNotFoundException {
User user = this.userService.getById(userId).orElseThrow(() -> new NullPointerException()); User user = this.userService.getById(userId).orElseThrow(() -> new NullPointerException());
List<CommisionResponse> result = CommisionResponseMappers List<? extends CommisionResponse> result;
.mapToResponse(this.commisionService.getUsersCommisions(user));
if (!groups) {
result = CommisionResponseMappers.mapToResponse(this.commisionService.getUsersCommisions(user));
} else {
result = CommisionResponseMappers
.mapToResponseWithGroups(this.commisionService.getUsersCommisions(user));
}
return new ResponseEntity<>(result, HttpStatus.OK); 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<List<AssignmentResponse>> 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<Commision> com = this.commisionService.getNewestCommision(user);
if (com.isPresent()) {
List<Assignment> respone = this.assignmentService.getCommisionAssignments(com.get());
return new ResponseEntity<>(AssignmentResponseMappers.mapToResponse(respone), HttpStatus.OK);
}
return new ResponseEntity<>(new ArrayList<>(), HttpStatus.OK);
}
} }

View File

@ -6,9 +6,15 @@ import java.util.stream.Collectors;
import com.plannaplan.entities.Commision; import com.plannaplan.entities.Commision;
import com.plannaplan.responses.models.CommisionResponse; import com.plannaplan.responses.models.CommisionResponse;
import com.plannaplan.responses.models.CommisionWithGroupsResponse;
public class CommisionResponseMappers { public class CommisionResponseMappers {
public static final List<CommisionResponse> mapToResponse(List<Commision> commisions) { public static final List<CommisionResponse> mapToResponse(List<Commision> commisions) {
return commisions.stream().filter(Objects::nonNull).map(CommisionResponse::new).collect(Collectors.toList()); return commisions.stream().filter(Objects::nonNull).map(CommisionResponse::new).collect(Collectors.toList());
} }
public static final List<CommisionWithGroupsResponse> mapToResponseWithGroups(List<Commision> commisions) {
return commisions.stream().filter(Objects::nonNull).map(CommisionWithGroupsResponse::new)
.collect(Collectors.toList());
}
} }

View File

@ -1,7 +1,5 @@
package com.plannaplan.responses.models; package com.plannaplan.responses.models;
import java.sql.Timestamp;
import com.plannaplan.entities.Commision; import com.plannaplan.entities.Commision;
import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModel;
@ -13,14 +11,14 @@ public class CommisionResponse {
private Long id; private Long id;
@ApiModelProperty(value = "Timestamp where the user commit the commision") @ApiModelProperty(value = "Timestamp where the user commit the commision")
private Timestamp commisionDate; private String commisionDate;
public CommisionResponse(Commision commision) { public CommisionResponse(Commision commision) {
this.id = commision.getId(); this.id = commision.getId();
this.commisionDate = commision.getCommisionDate(); this.commisionDate = commision.getCommisionDate().toString();
} }
public Timestamp getCommisionDate() { public String getCommisionDate() {
return commisionDate; return commisionDate;
} }

View File

@ -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<Long> groups;
public CommisionWithGroupsResponse(Commision commision) {
super(commision);
this.groups = commision.getAssignments().stream().filter(Objects::nonNull)
.map(new Function<Assignment, Long>() {
@Override
public Long apply(Assignment arg0) {
return arg0.getGroup().getId();
}
}).collect(Collectors.toList());
}
public List<Long> getGroups() {
return groups;
}
}

View File

@ -43,6 +43,7 @@ public class CommisionControllerTest extends AbstractControllerTest {
private static final String ADD_COMMISION_ENDPOINT = "/api/v1/commisions/user"; 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_COMMISIONS_ENDPOINT = "/api/v1/commisions/user";
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 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"));
@ -190,6 +191,58 @@ public class CommisionControllerTest extends AbstractControllerTest {
.header("Authorization", "Bearer " + token)).andExpect(status().is4xxClientError()); .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() { private void checkUsers() {
if (CommisionControllerTest.user == null) { if (CommisionControllerTest.user == null) {
CommisionControllerTest.user = new User(null, null, TEST_COMMISIONS_STUDENT_EMAIL, UserRoles.STUDENT); CommisionControllerTest.user = new User(null, null, TEST_COMMISIONS_STUDENT_EMAIL, UserRoles.STUDENT);

View File

@ -2,11 +2,16 @@ package com.plannaplan.responses.mappers;
import static org.junit.jupiter.api.Assertions.assertTrue; import static org.junit.jupiter.api.Assertions.assertTrue;
import java.lang.reflect.Field;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import com.plannaplan.entities.Assignment;
import com.plannaplan.entities.Commision; import com.plannaplan.entities.Commision;
import com.plannaplan.entities.Groups;
import com.plannaplan.responses.models.CommisionResponse; import com.plannaplan.responses.models.CommisionResponse;
import com.plannaplan.responses.models.CommisionWithGroupsResponse;
import com.plannaplan.types.WeekDay;
import org.junit.Test; import org.junit.Test;
@ -17,7 +22,36 @@ public class CommisionResponseMappersTest {
final List<CommisionResponse> resposne = CommisionResponseMappers.mapToResponse(coms); final List<CommisionResponse> resposne = CommisionResponseMappers.mapToResponse(coms);
assertTrue(resposne.get(0) instanceof CommisionResponse); assertTrue(resposne.get(0) instanceof CommisionResponse);
assertTrue(resposne.get(0).getCommisionDate().equals(coms.get(0).getCommisionDate())); assertTrue(resposne.get(0).getCommisionDate().equals(coms.get(0).getCommisionDate().toString()));
assertTrue(resposne.get(1).getCommisionDate().equals(coms.get(1).getCommisionDate())); 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<CommisionWithGroupsResponse> 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);
} }
} }

View File

@ -12,6 +12,6 @@ public class CommisionResponseTest {
final Commision com = new Commision(null); final Commision com = new Commision(null);
final CommisionResponse comResponse = new CommisionResponse(com); final CommisionResponse comResponse = new CommisionResponse(com);
assertTrue(comResponse.getCommisionDate().equals(com.getCommisionDate())); assertTrue(comResponse.getCommisionDate().equals(com.getCommisionDate().toString()));
} }
} }

View File

@ -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);
}
}