Skip to content

Commit d0cced8

Browse files
authored
Merge pull request #48 from yngwi/master
Replace form-based update methods with json-body
2 parents 98b58c9 + 9d17b6c commit d0cced8

22 files changed

+612
-145
lines changed

pom.xml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
</parent>
1010
<groupId>eu.nampi</groupId>
1111
<artifactId>backend</artifactId>
12-
<version>0.3.2</version>
12+
<version>0.4.0</version>
1313
<name>nampi-backend</name>
1414
<description>The NAMPI backend</description>
1515

@@ -26,6 +26,10 @@
2626
<groupId>org.springframework.boot</groupId>
2727
<artifactId>spring-boot-starter-web</artifactId>
2828
</dependency>
29+
<dependency>
30+
<groupId>org.springframework.boot</groupId>
31+
<artifactId>spring-boot-starter-validation</artifactId>
32+
</dependency>
2933
<dependency>
3034
<groupId>org.springframework.boot</groupId>
3135
<artifactId>spring-boot-configuration-processor</artifactId>

src/main/java/eu/nampi/backend/configuration/HydraControllerAdvice.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.springframework.http.HttpHeaders;
1515
import org.springframework.http.HttpStatus;
1616
import org.springframework.http.ResponseEntity;
17+
import org.springframework.web.bind.MethodArgumentNotValidException;
1718
import org.springframework.web.bind.MissingServletRequestParameterException;
1819
import org.springframework.web.bind.annotation.ControllerAdvice;
1920
import org.springframework.web.bind.annotation.ExceptionHandler;
@@ -68,6 +69,13 @@ protected ResponseEntity<Object> handleMissingServletRequestParameter(
6869
return handle(ex, request, HttpStatus.BAD_REQUEST, name + " parameter is missing");
6970
}
7071

72+
@Override
73+
protected ResponseEntity<Object> handleMethodArgumentNotValid(
74+
MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status,
75+
WebRequest request) {
76+
return handle(ex, request, HttpStatus.BAD_REQUEST, "Incorrect request body");
77+
}
78+
7179
private static Throwable findCause(Throwable throwable) {
7280
Objects.requireNonNull(throwable);
7381
Throwable rootCause = throwable;

src/main/java/eu/nampi/backend/controller/AspectController.java

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package eu.nampi.backend.controller;
22

3-
import java.util.List;
43
import java.util.Optional;
54
import java.util.UUID;
5+
import javax.validation.Valid;
66
import org.apache.jena.rdf.model.Literal;
77
import org.apache.jena.rdf.model.Resource;
88
import org.apache.jena.riot.Lang;
@@ -15,9 +15,11 @@
1515
import org.springframework.web.bind.annotation.PathVariable;
1616
import org.springframework.web.bind.annotation.PostMapping;
1717
import org.springframework.web.bind.annotation.PutMapping;
18+
import org.springframework.web.bind.annotation.RequestBody;
1819
import org.springframework.web.bind.annotation.RequestHeader;
1920
import org.springframework.web.bind.annotation.RequestParam;
2021
import org.springframework.web.bind.annotation.RestController;
22+
import eu.nampi.backend.model.AspectMutationPayload;
2123
import eu.nampi.backend.model.InsertResult;
2224
import eu.nampi.backend.model.OrderByClauses;
2325
import eu.nampi.backend.model.QueryParameters;
@@ -56,35 +58,26 @@ public ResponseEntity<String> getAspect(
5658
}
5759

5860
@PostMapping(value = "/aspects", produces = {"application/ld+json", "text/turtle",
59-
"application/rdf+xml", "application/n-triples"})
61+
"application/rdf+xml", "application/n-triples"}, consumes = {"application/json"})
6062
public ResponseEntity<String> postAspect(
6163
@RequestHeader("accept") Lang lang,
62-
@RequestParam("types[]") List<Resource> types,
63-
@RequestParam("labels[]") List<Literal> labels,
64-
@RequestParam(value = "comments[]", required = false) List<Literal> comments,
65-
@RequestParam(value = "texts[]", required = false) List<Literal> texts,
66-
@RequestParam(value = "sameAs[]", required = false) List<Resource> sameAs) {
67-
InsertResult result =
68-
aspectRepository.insert(lang, types, labels, asList(comments), asList(texts),
69-
asList(sameAs));
64+
@Valid @RequestBody AspectMutationPayload payload) {
65+
InsertResult result = aspectRepository.insert(lang, payload.getTypes(), payload.getLabels(),
66+
asList(payload.getComments()), asList(payload.getTexts()), asList(payload.getSameAs()));
7067
HttpHeaders headers = new HttpHeaders();
7168
headers.add("Location", result.getEntity().getURI());
7269
return new ResponseEntity<String>(result.getResponseBody(), headers, HttpStatus.CREATED);
7370
}
7471

7572
@PutMapping(value = "/aspects/{id}", produces = {"application/ld+json", "text/turtle",
76-
"application/rdf+xml", "application/n-triples"})
73+
"application/rdf+xml", "application/n-triples"}, consumes = {"application/json"})
7774
public ResponseEntity<String> putAspect(
7875
@RequestHeader("accept") Lang lang,
7976
@PathVariable UUID id,
80-
@RequestParam("types[]") List<Resource> types,
81-
@RequestParam("labels[]") List<Literal> labels,
82-
@RequestParam(value = "comments[]", required = false) List<Literal> comments,
83-
@RequestParam(value = "texts[]", required = false) List<Literal> texts,
84-
@RequestParam(value = "sameAs[]", required = false) List<Resource> sameAs) {
77+
@Valid @RequestBody AspectMutationPayload payload) {
8578
String newAspect =
86-
aspectRepository.update(lang, id, types, labels, asList(comments), asList(texts),
87-
asList(sameAs));
79+
aspectRepository.update(lang, id, payload.getTypes(), payload.getLabels(),
80+
asList(payload.getComments()), asList(payload.getTexts()), asList(payload.getSameAs()));
8881
return new ResponseEntity<String>(newAspect, HttpStatus.OK);
8982
}
9083

src/main/java/eu/nampi/backend/controller/EventController.java

Lines changed: 17 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package eu.nampi.backend.controller;
22

3-
import java.util.List;
43
import java.util.Optional;
54
import java.util.UUID;
5+
import javax.validation.Valid;
66
import org.apache.jena.rdf.model.Literal;
77
import org.apache.jena.rdf.model.Property;
88
import org.apache.jena.rdf.model.Resource;
@@ -16,15 +16,15 @@
1616
import org.springframework.web.bind.annotation.PathVariable;
1717
import org.springframework.web.bind.annotation.PostMapping;
1818
import org.springframework.web.bind.annotation.PutMapping;
19+
import org.springframework.web.bind.annotation.RequestBody;
1920
import org.springframework.web.bind.annotation.RequestHeader;
2021
import org.springframework.web.bind.annotation.RequestParam;
2122
import org.springframework.web.bind.annotation.RestController;
2223
import eu.nampi.backend.exception.ForbiddenException;
23-
import eu.nampi.backend.model.DateRange;
24+
import eu.nampi.backend.model.EventMutationPayload;
2425
import eu.nampi.backend.model.InsertResult;
2526
import eu.nampi.backend.model.OrderByClauses;
2627
import eu.nampi.backend.model.QueryParameters;
27-
import eu.nampi.backend.model.ResourceCouple;
2828
import eu.nampi.backend.repository.EventRepository;
2929
import eu.nampi.backend.repository.UserRepository;
3030

@@ -73,57 +73,35 @@ public ResponseEntity<String> getEvent(@RequestHeader("accept") Lang lang,
7373
}
7474

7575
@PostMapping(value = "/events", produces = {"application/ld+json", "text/turtle",
76-
"application/rdf+xml", "application/n-triples"})
76+
"application/rdf+xml", "application/n-triples"}, consumes = {"application/json"})
7777
public ResponseEntity<String> postEvent(
7878
@RequestHeader("accept") Lang lang,
79-
@RequestParam("types[]") List<Resource> types,
80-
@RequestParam("labels[]") List<Literal> labels,
81-
@RequestParam(value = "comments[]", required = false) List<Literal> comments,
82-
@RequestParam(value = "texts[]", required = false) List<Literal> texts,
83-
@RequestParam("authors[]") List<Resource> authors,
84-
@RequestParam("source") Resource source,
85-
@RequestParam("sourceLocation") Literal sourceLocation,
86-
@RequestParam("mainParticipant") ResourceCouple mainParticipant,
87-
@RequestParam(value = "otherParticipants[]",
88-
required = false) List<ResourceCouple> otherParticipants,
89-
@RequestParam(value = "aspects[]", required = false) List<ResourceCouple> aspects,
90-
@RequestParam("place") Optional<Resource> place,
91-
@RequestParam("date") Optional<DateRange> date) {
92-
InsertResult result =
93-
eventRepository.insert(lang, types, labels, asList(comments), asList(texts),
94-
authors, source, sourceLocation, mainParticipant, asList(otherParticipants),
95-
asList(aspects), place, date);
79+
@Valid @RequestBody EventMutationPayload payload) {
80+
InsertResult result = eventRepository.insert(lang, payload.getTypes(), payload.getLabels(),
81+
asList(payload.getComments()), asList(payload.getTexts()), payload.getAuthors(),
82+
payload.getSource(), payload.getSourceLocation(), payload.getMainParticipant(),
83+
asList(payload.getOtherParticipants()), asList(payload.getAspects()),
84+
Optional.ofNullable(payload.getPlace()), Optional.ofNullable(payload.getDate()));
9685
HttpHeaders headers = new HttpHeaders();
9786
headers.add("Location", result.getEntity().getURI());
9887
return new ResponseEntity<String>(result.getResponseBody(), headers, HttpStatus.CREATED);
9988
}
10089

10190
@PutMapping(value = "/events/{id}", produces = {"application/ld+json", "text/turtle",
102-
"application/rdf+xml", "application/n-triples"})
91+
"application/rdf+xml", "application/n-triples"}, consumes = {"application/json"})
10392
public ResponseEntity<String> putEvent(
10493
@PathVariable("id") UUID id,
10594
@RequestHeader("accept") Lang lang,
106-
@RequestParam("types[]") List<Resource> types,
107-
@RequestParam("labels[]") List<Literal> labels,
108-
@RequestParam(value = "comments[]", required = false) List<Literal> comments,
109-
@RequestParam(value = "texts[]", required = false) List<Literal> texts,
110-
@RequestParam("authors[]") List<Resource> authors,
111-
@RequestParam("source") Resource source,
112-
@RequestParam("sourceLocation") Literal sourceLocation,
113-
@RequestParam("mainParticipant") ResourceCouple mainParticipant,
114-
@RequestParam(value = "otherParticipants[]",
115-
required = false) List<ResourceCouple> otherParticipants,
116-
@RequestParam(value = "aspects[]", required = false) List<ResourceCouple> aspects,
117-
@RequestParam("place") Optional<Resource> place,
118-
@RequestParam("date") Optional<DateRange> date) {
95+
@Valid @RequestBody EventMutationPayload payload) {
11996
UUID userId = userRepository.getCurrentUser().map(user -> user.getRdfId()).orElseThrow();
12097
if (!eventRepository.isAuthor(userId, id)) {
12198
throw new ForbiddenException();
12299
}
123-
String newEvent =
124-
eventRepository.update(lang, id, types, labels, asList(comments), asList(texts), authors,
125-
source, sourceLocation, mainParticipant, asList(otherParticipants), asList(aspects),
126-
place, date);
100+
String newEvent = eventRepository.update(lang, id, payload.getTypes(), payload.getLabels(),
101+
asList(payload.getComments()), asList(payload.getTexts()), payload.getAuthors(),
102+
payload.getSource(), payload.getSourceLocation(), payload.getMainParticipant(),
103+
asList(payload.getOtherParticipants()), asList(payload.getAspects()),
104+
Optional.ofNullable(payload.getPlace()), Optional.ofNullable(payload.getDate()));
127105
return new ResponseEntity<String>(newEvent, HttpStatus.CREATED);
128106
}
129107

src/main/java/eu/nampi/backend/controller/GroupController.java

Lines changed: 13 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package eu.nampi.backend.controller;
22

3-
import java.util.List;
43
import java.util.Optional;
54
import java.util.UUID;
5+
import javax.validation.Valid;
66
import org.apache.jena.rdf.model.Literal;
77
import org.apache.jena.rdf.model.Resource;
88
import org.apache.jena.riot.Lang;
@@ -15,9 +15,11 @@
1515
import org.springframework.web.bind.annotation.PathVariable;
1616
import org.springframework.web.bind.annotation.PostMapping;
1717
import org.springframework.web.bind.annotation.PutMapping;
18+
import org.springframework.web.bind.annotation.RequestBody;
1819
import org.springframework.web.bind.annotation.RequestHeader;
1920
import org.springframework.web.bind.annotation.RequestParam;
2021
import org.springframework.web.bind.annotation.RestController;
22+
import eu.nampi.backend.model.GroupMutationPayload;
2123
import eu.nampi.backend.model.InsertResult;
2224
import eu.nampi.backend.model.OrderByClauses;
2325
import eu.nampi.backend.model.QueryParameters;
@@ -57,36 +59,27 @@ public ResponseEntity<String> getGvent(
5759
}
5860

5961
@PostMapping(value = "/groups", produces = {"application/ld+json", "text/turtle",
60-
"application/rdf+xml", "application/n-triples"})
62+
"application/rdf+xml", "application/n-triples"}, consumes = {"application/json"})
6163
public ResponseEntity<String> postGroup(
6264
@RequestHeader("accept") Lang lang,
63-
@RequestParam("types[]") List<Resource> types,
64-
@RequestParam("labels[]") List<Literal> labels,
65-
@RequestParam(value = "comments[]", required = false) List<Literal> comments,
66-
@RequestParam(value = "texts[]", required = false) List<Literal> texts,
67-
@RequestParam(value = "sameAs[]", required = false) List<Resource> sameAs,
68-
@RequestParam(value = "partOf[]", required = false) List<Resource> partOfs) {
69-
InsertResult result =
70-
groupRepository.insert(lang, types, labels, asList(comments), asList(texts),
71-
asList(sameAs), asList(partOfs));
65+
@Valid @RequestBody GroupMutationPayload payload) {
66+
InsertResult result = groupRepository.insert(lang, payload.getTypes(), payload.getLabels(),
67+
asList(payload.getComments()), asList(payload.getTexts()), asList(payload.getSameAs()),
68+
asList(payload.getPartOf()));
7269
HttpHeaders headers = new HttpHeaders();
7370
headers.add("Location", result.getEntity().getURI());
7471
return new ResponseEntity<String>(result.getResponseBody(), headers, HttpStatus.CREATED);
7572
}
7673

7774
@PutMapping(value = "/groups/{id}", produces = {"application/ld+json", "text/turtle",
78-
"application/rdf+xml", "application/n-triples"})
75+
"application/rdf+xml", "application/n-triples"}, consumes = {"application/json"})
7976
public ResponseEntity<String> putGroup(
8077
@RequestHeader("accept") Lang lang,
8178
@PathVariable UUID id,
82-
@RequestParam("types[]") List<Resource> types,
83-
@RequestParam("labels[]") List<Literal> labels,
84-
@RequestParam(value = "comments[]", required = false) List<Literal> comments,
85-
@RequestParam(value = "texts[]", required = false) List<Literal> texts,
86-
@RequestParam(value = "sameAs[]", required = false) List<Resource> sameAs,
87-
@RequestParam(value = "partOf[]", required = false) List<Resource> partOfs) {
88-
String newGroup = groupRepository.update(lang, id, types, labels, asList(comments),
89-
asList(texts), asList(sameAs), asList(partOfs));
79+
@Valid @RequestBody GroupMutationPayload payload) {
80+
String newGroup = groupRepository.update(lang, id, payload.getTypes(), payload.getLabels(),
81+
asList(payload.getComments()), asList(payload.getTexts()), asList(payload.getSameAs()),
82+
asList(payload.getPartOf()));
9083
return new ResponseEntity<String>(newGroup, HttpStatus.OK);
9184
}
9285

src/main/java/eu/nampi/backend/controller/PersonController.java

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
package eu.nampi.backend.controller;
22

3-
import java.util.ArrayList;
4-
import java.util.List;
53
import java.util.Optional;
64
import java.util.UUID;
5+
import javax.validation.Valid;
76
import org.apache.jena.rdf.model.Literal;
87
import org.apache.jena.rdf.model.Resource;
98
import org.apache.jena.riot.Lang;
@@ -16,11 +15,13 @@
1615
import org.springframework.web.bind.annotation.PathVariable;
1716
import org.springframework.web.bind.annotation.PostMapping;
1817
import org.springframework.web.bind.annotation.PutMapping;
18+
import org.springframework.web.bind.annotation.RequestBody;
1919
import org.springframework.web.bind.annotation.RequestHeader;
2020
import org.springframework.web.bind.annotation.RequestParam;
2121
import org.springframework.web.bind.annotation.RestController;
2222
import eu.nampi.backend.model.InsertResult;
2323
import eu.nampi.backend.model.OrderByClauses;
24+
import eu.nampi.backend.model.PersonMutationPayload;
2425
import eu.nampi.backend.model.QueryParameters;
2526
import eu.nampi.backend.repository.PersonRepository;
2627

@@ -57,33 +58,25 @@ public ResponseEntity<String> getEvent(
5758
}
5859

5960
@PostMapping(value = "/persons", produces = {"application/ld+json", "text/turtle",
60-
"application/rdf+xml", "application/n-triples"})
61+
"application/rdf+xml", "application/n-triples"}, consumes = {"application/json"})
6162
public ResponseEntity<String> postPerson(
6263
@RequestHeader("accept") Lang lang,
63-
@RequestParam("types[]") List<Resource> types,
64-
@RequestParam("labels[]") List<Literal> labels,
65-
@RequestParam(value = "comments[]", required = false) List<Literal> comments,
66-
@RequestParam(value = "texts[]", required = false) List<Literal> texts,
67-
@RequestParam(value = "sameAs[]", required = false) List<Resource> sameAs) {
68-
InsertResult result = personRepository.insert(lang, types, labels, asList(comments),
69-
asList(texts), asList(sameAs));
64+
@Valid @RequestBody PersonMutationPayload payload) {
65+
InsertResult result = personRepository.insert(lang, payload.getTypes(), payload.getLabels(),
66+
asList(payload.getComments()), asList(payload.getTexts()), asList(payload.getSameAs()));
7067
HttpHeaders headers = new HttpHeaders();
7168
headers.add("Location", result.getEntity().getURI());
7269
return new ResponseEntity<String>(result.getResponseBody(), headers, HttpStatus.CREATED);
7370
}
7471

7572
@PutMapping(value = "/persons/{id}", produces = {"application/ld+json", "text/turtle",
76-
"application/rdf+xml", "application/n-triples"})
73+
"application/rdf+xml", "application/n-triples"}, consumes = {"application/json"})
7774
public ResponseEntity<String> putPerson(
7875
@RequestHeader("accept") Lang lang,
7976
@PathVariable UUID id,
80-
@RequestParam("types[]") List<Resource> types,
81-
@RequestParam("labels[]") List<Literal> labels,
82-
@RequestParam(value = "comments[]", required = false) List<Literal> comments,
83-
@RequestParam(value = "texts[]", required = false) List<Literal> texts,
84-
@RequestParam(value = "sameAs[]", required = false) List<Resource> sameAs) {
85-
String newPerson = personRepository.update(lang, id, types, labels,
86-
comments == null ? new ArrayList<>() : asList(comments), asList(texts), asList(sameAs));
77+
@Valid @RequestBody PersonMutationPayload payload) {
78+
String newPerson = personRepository.update(lang, id, payload.getTypes(), payload.getLabels(),
79+
asList(payload.getComments()), asList(payload.getTexts()), asList(payload.getSameAs()));
8780
return new ResponseEntity<String>(newPerson, HttpStatus.OK);
8881
}
8982

0 commit comments

Comments
 (0)