I'm just thinking, what is the best practice to create PATH mapping for rest service. Let's say we have following paths:
/users POST
/users/1 PATCH, GET
/users/1/contacts GET, POST
/users/1/contacts/1 GET, PATCH
The question is - what is the best practice to create controllers. For example we have UserController where we technically could put all these mappings. Or - we should create seperate controllers (UserController, ContactsController). f.e UserController below, if we put everything under.
@RequestMapping("users")
@RestController
public class UserController {
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<Void> createUser() {}
@RequestMapping(method = RequestMethod.GET)
public User getUser() {}
@RequestMapping(value = "{id}/contacts", method = RequestMethod.GET)
public List<Contact> getContacts() {}
@RequestMapping(value = "{id}/contacts", method = RequestMethod.POST)
public ResponseEntity<Void> createContact() {}
.....
}
And if we create separate controllers, how paths should be organized then? Probably it's a silly question, but i will be glad, if someone could share experience.
Lets suggest that number of entities related to User will increase in future. So it obvious that it is better to split it according to entities:
UserController -> UserService -> UserRepository,
ContactController -> ContactService -> ContactRepository,
FriendshipController -> FriendshipService -> FriendshipRepository
From my experience, User Controller
@RestController
@RequestMapping("/user")
public class UserController extends AbstractController {
...
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<?> createUser(@RequestHeader("X-Auth-Token") Optional<String> @RequestBody User user) {
...
@RequestMapping(method = RequestMethod.GET)
public ResponseEntity<?> listUsers(@RequestHeader("X-Auth-Token") Optional<String> authToken) {
...
related to user scope Friendship controller:
@RestController
@RequestMapping("/user/{id}")
public class FriendshipController extends AbstractController {
...
@RequestMapping(value = "/friendship/code", method = RequestMethod.POST)
public ResponseEntity<?> generateCodeForUser(@PathVariable("id") long id) {
...
@RequestMapping(value = "/friendship/code", method = RequestMethod.GET)
public ResponseEntity<?> retrieveCodeForUser(@PathVariable("id") long id) {
...
Not sure it is axiom, but help me organize my code.