Advertisement
Guest User

Untitled

a guest
May 17th, 2018
130
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 25.05 KB | None | 0 0
  1. package com.piotrkalitka.Placer.api.v1;
  2.  
  3. import com.auth0.jwt.JWT;
  4. import com.auth0.jwt.algorithms.Algorithm;
  5. import com.auth0.jwt.interfaces.DecodedJWT;
  6. import com.piotrkalitka.Placer.api.v1.apiModels.addImage.AddImageResponseBody;
  7. import com.piotrkalitka.Placer.api.v1.apiModels.addPlace.AddPlaceRequestModel;
  8. import com.piotrkalitka.Placer.api.v1.apiModels.addPlace.AddPlaceResponseModel;
  9. import com.piotrkalitka.Placer.api.v1.apiModels.changePassword.ChangePasswordRequestModel;
  10. import com.piotrkalitka.Placer.api.v1.apiModels.getMyPlaces.GetMyPlacesResponseModel;
  11. import com.piotrkalitka.Placer.api.v1.apiModels.getPlace.GetPlaceResponseModel;
  12. import com.piotrkalitka.Placer.api.v1.apiModels.getUserFavourites.GetUserFavouritesResponseModel;
  13. import com.piotrkalitka.Placer.api.v1.apiModels.login.LoginRequestModel;
  14. import com.piotrkalitka.Placer.api.v1.apiModels.login.LoginResponseModel;
  15. import com.piotrkalitka.Placer.api.v1.apiModels.ratePlace.RatePlaceRequestModel;
  16. import com.piotrkalitka.Placer.api.v1.apiModels.ratings.GetRatingsResponseModel;
  17. import com.piotrkalitka.Placer.api.v1.apiModels.refresh.RefreshRequestModel;
  18. import com.piotrkalitka.Placer.api.v1.apiModels.refresh.RefreshResponseModel;
  19. import com.piotrkalitka.Placer.api.v1.apiModels.register.RegisterRequestModel;
  20. import com.piotrkalitka.Placer.api.v1.apiModels.updatePlace.UpdatePlaceRequestModel;
  21. import com.piotrkalitka.Placer.api.v1.apiModels.updatePlace.UpdatePlaceResponseModel;
  22. import com.piotrkalitka.Placer.api.v1.dbModels.Place;
  23. import com.piotrkalitka.Placer.api.v1.dbModels.Rating;
  24. import com.piotrkalitka.Placer.api.v1.dbModels.User;
  25.  
  26. import org.springframework.http.HttpHeaders;
  27. import org.springframework.http.HttpStatus;
  28. import org.springframework.http.ResponseEntity;
  29. import org.springframework.lang.Nullable;
  30. import org.springframework.stereotype.Component;
  31. import org.springframework.web.bind.annotation.PathVariable;
  32. import org.springframework.web.bind.annotation.RequestBody;
  33. import org.springframework.web.bind.annotation.RequestHeader;
  34. import org.springframework.web.bind.annotation.RequestMapping;
  35. import org.springframework.web.bind.annotation.RequestMethod;
  36. import org.springframework.web.bind.annotation.RequestParam;
  37. import org.springframework.web.bind.annotation.ResponseBody;
  38. import org.springframework.web.bind.annotation.RestController;
  39. import org.springframework.web.multipart.MultipartFile;
  40.  
  41. import java.io.UnsupportedEncodingException;
  42. import java.util.Date;
  43. import java.util.List;
  44.  
  45. @Component
  46. @RestController
  47. @RequestMapping(value = "/v1")
  48. public class ApiController {
  49.  
  50.     private DataManager dataManager = new DataManager();
  51.  
  52.     /////////////////////////////////////// AUTH ///////////////////////////////////////////////////
  53.  
  54.     @RequestMapping(value = "/auth/register", method = RequestMethod.POST)
  55.     @ResponseBody
  56.     public ResponseEntity<Object> register(@RequestBody RegisterRequestModel requestModel) {
  57.         String email = requestModel.getEmail();
  58.         String name = requestModel.getName();
  59.         String surname = requestModel.getSurname();
  60.         String password = requestModel.getPassword();
  61.         String passwordConfirmation = requestModel.getPasswordConfirmation();
  62.  
  63.         if (isEmpty(email, name, surname, password, passwordConfirmation)) {
  64.             ApiError error = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.REGISTER_MISSING_DATA);
  65.             return new ResponseEntity<>(error, new HttpHeaders(), error.getStatus());
  66.         } else if (!DataValidator.isEmailValid(email)) {
  67.             ApiError error = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.REGISTER_EMAIL_INVALID);
  68.             return new ResponseEntity<>(error, new HttpHeaders(), error.getStatus());
  69.         } else if (!password.equals(passwordConfirmation)) {
  70.             ApiError error = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.REGISTER_PASSWORDS_NOT_MATCHES);
  71.             return new ResponseEntity<>(error, new HttpHeaders(), error.getStatus());
  72.         } else if (dataManager.isEmailRegistered(email)) {
  73.             ApiError error = new ApiError(HttpStatus.CONFLICT, ErrorMessages.REGISTER_EMAIL_TAKEN);
  74.             return new ResponseEntity<>(error, new HttpHeaders(), error.getStatus());
  75.         }
  76.  
  77.         dataManager.addUser(email, name, surname, PasswordEncoder.encodePasswordSHA256(password));
  78.         return new ResponseEntity<>(HttpStatus.CREATED);
  79.     }
  80.  
  81.     @RequestMapping(value = "/auth/login", method = RequestMethod.POST)
  82.     @ResponseBody
  83.     public ResponseEntity<Object> login(@RequestBody LoginRequestModel requestModel) {
  84.         String email = requestModel.getEmail();
  85.         String password = requestModel.getPassword();
  86.  
  87.         if (!dataManager.isEmailRegistered(email)) {
  88.             ApiError error = new ApiError(HttpStatus.NOT_FOUND, ErrorMessages.LOGIN_EMAIL_NOT_FOUND);
  89.             return new ResponseEntity<>(error, new HttpHeaders(), error.getStatus());
  90.         }
  91.  
  92.         User user = dataManager.getUser(email);
  93.  
  94.         if (!PasswordEncoder.encodePasswordSHA256(password).equals(user.getPassword())) {
  95.             ApiError error = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.LOGIN_WRONG_PASSWORD);
  96.             return new ResponseEntity<>(error, new HttpHeaders(), error.getStatus());
  97.         }
  98.  
  99.         String accessToken = generateAccessToken(user.getId(), user.getEmail());
  100.         String refreshToken = generateRefreshToken(user.getId(), user.getEmail());
  101.         return new ResponseEntity<>(new LoginResponseModel(user.getEmail(), accessToken, refreshToken), new HttpHeaders(), HttpStatus.OK);
  102.     }
  103.  
  104.     @RequestMapping(value = "/auth/refresh", method = RequestMethod.POST)
  105.     @ResponseBody
  106.     public ResponseEntity<Object> refresh(@RequestBody RefreshRequestModel requestModel) {
  107.         String refreshToken = requestModel.getRefreshToken();
  108.         if (isEmpty(refreshToken)) {
  109.             ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.REFRESH_MISSING_TOKEN);
  110.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  111.         }
  112.         if (!DataManager.isTokenValid(refreshToken)) {
  113.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.REFRESH_TOKEN_INVALID);
  114.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  115.         }
  116.         User user = dataManager.getUserByToken(refreshToken);
  117.         String accessToken = generateAccessToken(user.getId(), user.getEmail());
  118.         refreshToken = generateRefreshToken(user.getId(), user.getEmail());
  119.  
  120.         RefreshResponseModel responseModel = new RefreshResponseModel(user.getEmail(), accessToken, refreshToken);
  121.         return new ResponseEntity<>(responseModel, new HttpHeaders(), HttpStatus.OK);
  122.     }
  123.  
  124.     @RequestMapping(value = "/auth/changePassword", method = RequestMethod.PATCH)
  125.     @ResponseBody
  126.     public ResponseEntity<Object> changePassword(@RequestBody ChangePasswordRequestModel requestModel) {
  127.  
  128.         String email = requestModel.getEmail();
  129.         String oldPassword = requestModel.getOldPassword();
  130.         String password = requestModel.getPassword();
  131.         String passwordConfirmation = requestModel.getPasswordConfirmation();
  132.  
  133.         if (isEmpty(email, oldPassword, password, passwordConfirmation)) {
  134.             ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.CHANGE_PASSWORD_MISSING_DATA);
  135.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  136.         }
  137.  
  138.         User user = dataManager.getUser(email);
  139.  
  140.         if (user == null) {
  141.             ApiError apiError = new ApiError(HttpStatus.NOT_FOUND, ErrorMessages.CHANGE_PASSWORD_USER_NOT_FOUND);
  142.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  143.         }
  144.         if (!PasswordEncoder.encodePasswordSHA256(oldPassword).equals(user.getPassword())) {
  145.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.CHANGE_PASSWORD_WRONG_PASSWORD);
  146.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  147.         }
  148.  
  149.         dataManager.changePassword(user.getId(), PasswordEncoder.encodePasswordSHA256(password));
  150.         return new ResponseEntity<>(HttpStatus.OK);
  151.     }
  152.  
  153.     /////////////////////////////////////// PLACES /////////////////////////////////////////////////
  154.  
  155.     @RequestMapping(value = "/places/{placeId}", method = RequestMethod.GET)
  156.     @ResponseBody
  157.     public ResponseEntity<Object> getPlace(@PathVariable("placeId") int placeId) {
  158.         Place place = dataManager.getPlace(placeId);
  159.         if (place == null) {
  160.             ApiError apiError = new ApiError(HttpStatus.NOT_FOUND, ErrorMessages.GET_PLACE_NOT_FOUND);
  161.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  162.         }
  163.         return new ResponseEntity<>(new GetPlaceResponseModel(place), new HttpHeaders(), HttpStatus.OK);
  164.     }
  165.  
  166.     @RequestMapping(value = "/places", method = RequestMethod.GET)
  167.     @ResponseBody
  168.     public ResponseEntity<Object> getPlaces(@RequestParam(required = false, name = "limit") Integer limit) {
  169.         if (limit == null) limit = 100;
  170.         List<Place> places = dataManager.getPlaces(limit);
  171.         return new ResponseEntity<>(places, new HttpHeaders(), HttpStatus.OK);
  172.     }
  173.  
  174.     /////////////////////////////////////// PLACES - RATING ////////////////////////////////////////
  175.  
  176.     @RequestMapping(value = "/places/{placeId}/ratings", method = RequestMethod.POST)
  177.     @ResponseBody
  178.     public ResponseEntity<Object> rate(@RequestBody RatePlaceRequestModel requestModel, @PathVariable("placeId") int placeId, @RequestHeader("Authorization") String authToken) {
  179.         if (!DataManager.isTokenValid(authToken)) {
  180.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.INVALID_TOKEN);
  181.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  182.         }
  183.  
  184.         int rate = requestModel.getRate();
  185.  
  186.         if (rate < 1 || rate > 5) {
  187.             ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.RATE_PLACE_RATE_RANGE);
  188.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  189.         }
  190.  
  191.         int userId = getUserIdFromToken(authToken);
  192.  
  193.         if (dataManager.isRated(userId, placeId)) {
  194.             ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.RATE_PLACE_ALREADY_RATED);
  195.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  196.         }
  197.  
  198.         dataManager.rate(userId, placeId, rate);
  199.         return new ResponseEntity<>(HttpStatus.CREATED);
  200.     }
  201.  
  202.     @RequestMapping(value = "/places/{placeId}/ratings", method = RequestMethod.DELETE)
  203.     @ResponseBody
  204.     public ResponseEntity<Object> removeRate(@PathVariable int placeId, @RequestHeader("Authorization") String authToken) {
  205.         if (!DataManager.isTokenValid(authToken)) {
  206.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.INVALID_TOKEN);
  207.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  208.         }
  209.  
  210.         int userId = getUserIdFromToken(authToken);
  211.  
  212.         if (!dataManager.isRated(userId, placeId)) {
  213.             ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.REMOVE_RATE_NOT_RATED);
  214.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  215.         }
  216.  
  217.         dataManager.removeRate(placeId, userId);
  218.         return new ResponseEntity<>(HttpStatus.NO_CONTENT);
  219.  
  220.     }
  221.  
  222.     @RequestMapping(value = "/places/{placeId}/ratings", method = RequestMethod.GET)
  223.     @ResponseBody
  224.     public ResponseEntity<Object> getRatings(@PathVariable("placeId") int placeId) {
  225.         List<Rating> ratings = dataManager.getRatings(placeId);
  226.  
  227.         GetRatingsResponseModel responseModel = new GetRatingsResponseModel(ratings);
  228.         return new ResponseEntity<>(responseModel, new HttpHeaders(), HttpStatus.OK);
  229.     }
  230.  
  231.     /////////////////////////////////////// USER ///////////////////////////////////////////////////
  232.  
  233.     @RequestMapping(value = "/user/places", method = RequestMethod.GET)
  234.     @ResponseBody
  235.     public ResponseEntity<Object> getMyPlaces(@RequestHeader("Authorization") String authToken) {
  236.  
  237.         if (!DataManager.isTokenValid(authToken)) {
  238.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.INVALID_TOKEN);
  239.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  240.         }
  241.  
  242.         int userId = getUserIdFromToken(authToken);
  243.         List<Place> places = dataManager.getUserPlaces(userId);
  244.  
  245.         GetMyPlacesResponseModel model = new GetMyPlacesResponseModel(places);
  246.  
  247.         return new ResponseEntity<>(model, new HttpHeaders(), HttpStatus.OK);
  248.     }
  249.  
  250.     @RequestMapping(value = "/user/places", method = RequestMethod.POST)
  251.     @ResponseBody
  252.     public ResponseEntity<Object> addPlace(@RequestBody AddPlaceRequestModel requestModel, @RequestHeader("Authorization") String authToken) {
  253.         String name = requestModel.getName();
  254.         String address = requestModel.getAddress();
  255.         String website = requestModel.getWebsite();
  256.         String phoneNumber = requestModel.getPhoneNumber();
  257.         String description = requestModel.getDescription();
  258.  
  259.         if (!DataManager.isTokenValid(authToken)) {
  260.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.INVALID_TOKEN);
  261.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  262.         }
  263.  
  264.         if (isEmpty(name, address, website, phoneNumber, description)) {
  265.             ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.ADD_PLACE_MISSING_DATA);
  266.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  267.         }
  268.  
  269.         User user = dataManager.getUserByToken(authToken);
  270.         int userId = user.getId();
  271.  
  272.         int placeId = dataManager.addPlace(userId, name, address, website, phoneNumber, description);
  273.         Place place = new Place(placeId, userId, name, address, website, phoneNumber, description);
  274.         AddPlaceResponseModel model = new AddPlaceResponseModel(place);
  275.         return new ResponseEntity<>(model, new HttpHeaders(), HttpStatus.CREATED);
  276.     }
  277.  
  278.     @RequestMapping(value = "/user/places/{placeId}", method = RequestMethod.PATCH)
  279.     @ResponseBody
  280.     public ResponseEntity<Object> updatePlace(@RequestBody UpdatePlaceRequestModel requestModel, @RequestHeader("Authorization") String authToken, @PathVariable("placeId") int placeId) {
  281.  
  282.         String newName = requestModel.getName();
  283.         String newAddress = requestModel.getAddress();
  284.         String newWebsite = requestModel.getWebsite();
  285.         String newPhoneNumber = requestModel.getPhoneNumber();
  286.         String newDescription = requestModel.getDescription();
  287.  
  288.         Place place = dataManager.getPlace(placeId);
  289.         User user = dataManager.getUserByToken(authToken);
  290.  
  291.         if (place == null) {
  292.             ApiError apiError = new ApiError(HttpStatus.NOT_FOUND, ErrorMessages.UPDATE_PLACE_NOT_FOUND);
  293.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  294.         }
  295.         if (place.getUserId() != user.getId()) {
  296.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.UPDATE_PLACE_FORBIDDEN);
  297.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  298.         }
  299.  
  300.         if (isEmpty(newName)) newName = place.getName();
  301.         if (isEmpty(newAddress)) newAddress = place.getAddress();
  302.         if (isEmpty(newWebsite)) newWebsite = place.getWebsite();
  303.         if (isEmpty(newPhoneNumber)) newPhoneNumber = place.getPhoneNumber();
  304.         if (isEmpty(newDescription)) newDescription = place.getDescription();
  305.  
  306.         dataManager.updatePlace(placeId, user.getId(), newName, newAddress, newWebsite, newPhoneNumber, newDescription);
  307.         UpdatePlaceResponseModel model = new UpdatePlaceResponseModel(new Place(placeId, user.getId(), newName, newAddress, newWebsite, newPhoneNumber, newDescription));
  308.         return new ResponseEntity<>(model, new HttpHeaders(), HttpStatus.OK);
  309.     }
  310.  
  311.     @RequestMapping(value = "/user/places/{placeId}", method = RequestMethod.DELETE)
  312.     @ResponseBody
  313.     public ResponseEntity<Object> removePlace(@PathVariable("placeId") int placeId, @RequestHeader("Authorization") String authToken) {
  314.         if (!DataManager.isTokenValid(authToken)) {
  315.             ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.INVALID_TOKEN);
  316.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  317.         }
  318.  
  319.         int userId = dataManager.getUserByToken(authToken).getId();
  320.         Place place = dataManager.getPlace(placeId);
  321.  
  322.         if (place == null) {
  323.             ApiError apiError = new ApiError(HttpStatus.NOT_FOUND, ErrorMessages.REMOVE_PLACE_NOT_FOUND);
  324.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  325.         }
  326.         if (place.getUserId() != userId) {
  327.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.REMOVE_PLACE_FORBIDDEN);
  328.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  329.         }
  330.  
  331.         dataManager.removePlace(placeId);
  332.         return new ResponseEntity<>(HttpStatus.NO_CONTENT);
  333.     }
  334.  
  335.     /////////////////////////////////////// PLACES - IMAGES ////////////////////////////////////////
  336.  
  337.     @RequestMapping(value = "/user/places/{placeId}/images", method = RequestMethod.POST)
  338.     @ResponseBody
  339.     public ResponseEntity<Object> addImage(@RequestHeader("Authorization") String authToken, @PathVariable("placeId") int placeId, @RequestParam("image") MultipartFile image) {
  340.         if (!DataManager.isTokenValid(authToken)) {
  341.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.INVALID_TOKEN);
  342.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  343.         }
  344.         if (image.isEmpty()) {
  345.             ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.ADD_IMAGE_IMAGE_EMPTY);
  346.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  347.         }
  348.  
  349.         User user = dataManager.getUserByToken(authToken);
  350.         Place place = dataManager.getPlace(placeId);
  351.  
  352.         if (user.getId() != place.getUserId()) {
  353.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.ADD_IMAGE_FORBIDDEN);
  354.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  355.         }
  356.  
  357.         String filePath = dataManager.saveImage(placeId, image);
  358.  
  359.         if (filePath == null) {
  360.             ApiError apiError = new ApiError(HttpStatus.BAD_GATEWAY, ErrorMessages.ADD_IMAGE_ERROR);
  361.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  362.         }
  363.  
  364.         int imageId = dataManager.addImage(placeId, filePath);
  365.         AddImageResponseBody model = new AddImageResponseBody(imageId, filePath);
  366.  
  367.         return new ResponseEntity<>(model, new HttpHeaders(), HttpStatus.CREATED);
  368.     }
  369.  
  370.     @RequestMapping(value = "/user/places/{placeId}/images/{imageId}", method = RequestMethod.DELETE)
  371.     @ResponseBody
  372.     public ResponseEntity<Object> removeImage(@RequestHeader("Authorization") String authToken, @PathVariable("placeId") int placeId, @PathVariable("imageId") int imageId) {
  373.         if (!DataManager.isTokenValid(authToken)) {
  374.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.INVALID_TOKEN);
  375.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  376.         }
  377.  
  378.         User user = dataManager.getUserByToken(authToken);
  379.         Place place = dataManager.getPlace(placeId);
  380.  
  381.         if (place.getUserId() != user.getId()) {
  382.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.REMOVE_IMAGE_FORBIDDEN);
  383.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  384.         }
  385.         if (!dataManager.doesImageExist(imageId)) {
  386.             ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.REMOVE_IMAGE_IMAGE_NOT_EXIST);
  387.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  388.         }
  389.  
  390.         dataManager.removeImage(imageId);
  391.         return new ResponseEntity<>(HttpStatus.NO_CONTENT);
  392.     }
  393.  
  394.     @RequestMapping(value = "/user/places/{placeId}/image", method = RequestMethod.GET)
  395.     @ResponseBody
  396.     public ResponseEntity<Object> getImagesForPlace(@PathVariable("placeId") int placeId) {
  397.         return null;
  398.     }
  399.  
  400.     /////////////////////////////////////// USER-FAVOURITES ////////////////////////////////////////
  401.  
  402.     @RequestMapping(value = "/user/favourites/{placeId}", method = RequestMethod.POST)
  403.     @ResponseBody
  404.     public ResponseEntity<Object> addUserToFavourites(@PathVariable("placeId") int placeId, @RequestHeader("Authorization") String authToken) {
  405.         if (!DataManager.isTokenValid(authToken)) {
  406.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.INVALID_TOKEN);
  407.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  408.         }
  409.         int userId = getUserIdFromToken(authToken);
  410.  
  411.         if (dataManager.isFavourite(userId, placeId)) {
  412.             ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.ADD_FAVOURITE_ALREADY_ADDED);
  413.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  414.         }
  415.  
  416.         dataManager.addFavourite(userId, placeId);
  417.  
  418.         return new ResponseEntity<>(HttpStatus.OK);
  419.     }
  420.  
  421.     @RequestMapping(value = "/user/favourites", method = RequestMethod.GET)
  422.     @ResponseBody
  423.     public ResponseEntity<Object> getUserFavourites(@RequestHeader("Authorization") String authToken) {
  424.         if (!DataManager.isTokenValid(authToken)) {
  425.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.INVALID_TOKEN);
  426.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  427.         }
  428.  
  429.         int userId = getUserIdFromToken(authToken);
  430.         List<Place> places = dataManager.getUserFavourites(userId);
  431.         GetUserFavouritesResponseModel model = new GetUserFavouritesResponseModel(places);
  432.         return new ResponseEntity<>(model, new HttpHeaders(), HttpStatus.OK);
  433.     }
  434.  
  435.     @RequestMapping(value = "/user/favourites/{id}", method = RequestMethod.DELETE)
  436.     @ResponseBody
  437.     public ResponseEntity<Object> removeFromFavourites(@PathVariable("id") int placeId, @RequestHeader("Authorization") String authToken) {
  438.         if (!DataManager.isTokenValid(authToken)) {
  439.             ApiError apiError = new ApiError(HttpStatus.FORBIDDEN, ErrorMessages.INVALID_TOKEN);
  440.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  441.         }
  442.  
  443.         int userId = getUserIdFromToken(authToken);
  444.         if (!dataManager.isFavourite(userId, placeId)) {
  445.             ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, ErrorMessages.REMOVE_FAVOURITE_PLACE_NOT_FAVOURITE);
  446.             return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());
  447.         }
  448.  
  449.         dataManager.removeFromFavourite(userId, placeId);
  450.         return new ResponseEntity<>(HttpStatus.OK);
  451.     }
  452.  
  453.     ////////////////////////////////////////////////////////////////////////////////////////////////
  454.  
  455.     private static boolean isEmpty(String string) {
  456.         return string == null || string.equals("");
  457.     }
  458.  
  459.     private static boolean isEmpty(String... strings) {
  460.         for (String string : strings) {
  461.             if (isEmpty(string)) return true;
  462.         }
  463.         return false;
  464.     }
  465.  
  466.     @Nullable
  467.     private static String generateAccessToken(int userId, String email) {
  468.         try {
  469.             Algorithm algorithm = Algorithm.HMAC256(Constants.JWT_SECRET);
  470.             return JWT.create()
  471.                     .withExpiresAt(new Date(new Date().getTime() + Constants.ACCESS_TOKEN_DURATION_MILLIS))
  472.                     .withClaim("id", userId)
  473.                     .withClaim("email", email)
  474.                     .sign(algorithm);
  475.         } catch (UnsupportedEncodingException ignore) {
  476.             return null;
  477.         }
  478.     }
  479.  
  480.     @Nullable
  481.     private static String generateRefreshToken(int userId, String email) {
  482.         try {
  483.             Algorithm algorithm = Algorithm.HMAC256(Constants.JWT_SECRET);
  484.             return JWT.create()
  485.                     .withExpiresAt(new Date(new Date().getTime() + Constants.REFRESH_TOKEN_DURATION_MILLIS))
  486.                     .withClaim("id", userId)
  487.                     .withClaim("email", email)
  488.                     .sign(algorithm);
  489.         } catch (UnsupportedEncodingException ignore) {
  490.             return null;
  491.         }
  492.     }
  493.  
  494.     private static int getUserIdFromToken(String token) {
  495.         DecodedJWT decodedJWT = JWT.decode(token);
  496.         return decodedJWT.getClaim("id").asInt();
  497.     }
  498.  
  499. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement