From 515cb572485e92d28b2ef9befd8682ac2e67b99e Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Sun, 14 Nov 2021 18:37:49 -0500 Subject: [PATCH 1/9] Updated AuthenticationController --- .../Controllers/AuthenticationController.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/VanquishP2/Controllers/AuthenticationController.java b/src/main/java/VanquishP2/Controllers/AuthenticationController.java index 22ac5cd..4b522b2 100644 --- a/src/main/java/VanquishP2/Controllers/AuthenticationController.java +++ b/src/main/java/VanquishP2/Controllers/AuthenticationController.java @@ -49,24 +49,24 @@ public ResponseEntity authenticate(@RequestBody LoginCredentialsDTO cr } /** - * Register Basic User + * Register Premium User * @param regData Registration Data from Frontend * @return The new registered User Data */ - @PostMapping(value = "/register/basic", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) - public ResponseEntity registerBasicUser(@RequestBody @Valid UserRegistrationDTO regData) { - User user = userService.registerUser(regData, User.Role.BASIC); + @PostMapping(value = "/register/premium", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) + public ResponseEntity registerPremiumUser(@RequestBody @Valid UserRegistrationDTO regData){ + User user = userService.registerUser(regData, User.Role.PREMIUM); return new ResponseEntity<>(user, HttpStatus.OK); } /** - * Register Premium User + * Register Basic User * @param regData Registration Data from Frontend * @return The new registered User Data */ - @PostMapping(value = "/register/premium", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) - public ResponseEntity registerPremiumUser(@RequestBody @Valid UserRegistrationDTO regData){ - User user = userService.registerUser(regData, User.Role.PREMIUM); + @PostMapping(value = "/register/basic", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) + public ResponseEntity registerBasicUser(@RequestBody @Valid UserRegistrationDTO regData) { + User user = userService.registerUser(regData, User.Role.BASIC); return new ResponseEntity<>(user, HttpStatus.OK); } } From a9ff25cbc4ede5b6412a33aae85f627acbfa421e Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Sun, 14 Nov 2021 21:12:17 -0500 Subject: [PATCH 2/9] Updates Logger completed and code refactored to match --- .../Beans/Aspects/LoggerAspect.java | 49 +++++++++++++++++++ .../Beans/ModelServices/LoggerService.java | 10 +--- 2 files changed, 50 insertions(+), 9 deletions(-) create mode 100644 src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java diff --git a/src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java b/src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java new file mode 100644 index 0000000..f5c75c2 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java @@ -0,0 +1,49 @@ +package VanquishP2.Application.Beans.Aspects; + +import VanquishP2.Application.Beans.ModelServices.LoggerService; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; + +/** + * LoggerAspect + * Logs all method calls and exceptions for all classes except filters. + * + * @author Kollier Martin + */ + + +@Aspect +@Component +public class LoggerAspect { + private final LoggerService loggerService; + + public LoggerAspect(LoggerService loggerService) { + this.loggerService = loggerService; + } + + @Pointcut("within(VanquishP2.*.*.*.*)") + public void logAll() { + + } + + @Around("within(VanquishP2.*.*.*.*)") + public void logAroundAll(ProceedingJoinPoint joinPoint) throws Throwable { + try { + joinPoint.proceed(); + } catch (Exception ignored){ + + } + } + + @AfterThrowing(pointcut = "logAll()", throwing = "e") + public void logMethodException(JoinPoint jp, Throwable e) { + String methodSig = extractMethodSignature(jp); + loggerService.writeLog(String.format("%s was thrown in method %s with message: %s", e.getClass().getSimpleName(), methodSig, e.getMessage()), 3); + } + + private String extractMethodSignature(JoinPoint jp) { + return jp.getTarget().getClass().toString() + "." + jp.getSignature().getName(); + } +} diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java index 1344a3b..9b440f2 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java @@ -19,21 +19,13 @@ public LoggerService(LoggerRepo repo) { } public void writeLog(String message, int level) { - Logger logger = new Logger(getCurrentDateTime(), formatLogEntry(message), level); + Logger logger = new Logger(getCurrentDateTime(), message, level); repo.save(logger); - } private String getCurrentDateTime() { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); return formatter.format(System.currentTimeMillis()); } - - private String formatLogEntry(String message){ - StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); - String stackTrace = stackTraceElements[stackTraceElements.length - 1].toString(); - - return String.format("[%s] %s%n", stackTrace, message); - } } From ce793d902e0374fe41c8edd9e05657e1adfc1a66 Mon Sep 17 00:00:00 2001 From: kollier-martin Date: Mon, 15 Nov 2021 15:11:44 -0500 Subject: [PATCH 3/9] Back-End Fixes A few tests are implemented now Added lines to UserService Fixed UserRegistrationDTO not setting city and location --- .../Beans/ModelServices/UserService.java | 2 +- .../Application/Beans/Models/Location.java | 2 +- .../Application/Beans/Models/User.java | 2 +- .../VanquishP2/DTOs/UserRegistrationDTO.java | 2 + src/test/java/Models/UserDBTest.java | 50 ------------- src/test/java/P2ApplicationTests.java | 11 --- src/test/java/UserDBTest.java | 73 +++++++++++++++++++ 7 files changed, 78 insertions(+), 64 deletions(-) delete mode 100644 src/test/java/Models/UserDBTest.java delete mode 100644 src/test/java/P2ApplicationTests.java create mode 100644 src/test/java/UserDBTest.java diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java index 9a48f6f..f556df3 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java @@ -117,7 +117,7 @@ public User registerUser(UserRegistrationDTO data, User.Role role) { newUser = new User(role, newUserInfo); locationRepository.save(location); - userRepository.save(newUser); + newUser = userRepository.save(newUser); newUserInfo.setLocation(location); newUserInfo.setUser(newUser); diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Location.java b/src/main/java/VanquishP2/Application/Beans/Models/Location.java index 59973a3..9f5f616 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/Location.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Location.java @@ -46,7 +46,7 @@ public void setState(String state) { this.state = state; } - @OneToMany(mappedBy = "location") + @OneToMany(mappedBy = "location", cascade = CascadeType.REMOVE) private List userLocations; public List getUserInfo() { return userLocations; diff --git a/src/main/java/VanquishP2/Application/Beans/Models/User.java b/src/main/java/VanquishP2/Application/Beans/Models/User.java index 6e96a83..013d321 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/User.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/User.java @@ -77,7 +77,7 @@ public void setFavorites(List favorites) { this.favorites = favorites; } - @OneToOne(mappedBy = "user") + @OneToOne(mappedBy = "user", cascade = CascadeType.REMOVE) private UserInfo userInfo; public UserInfo getUserInfo() { return userInfo; diff --git a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java index c19b40d..ecfc99c 100644 --- a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java +++ b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java @@ -43,6 +43,8 @@ public UserRegistrationDTO(String firstName, String lastName, this.username = username; this.password = password; this.email = email; + this.city = city; + this.state = state; } public UserRegistrationDTO(String username, String password, String email) { diff --git a/src/test/java/Models/UserDBTest.java b/src/test/java/Models/UserDBTest.java deleted file mode 100644 index 0b056d9..0000000 --- a/src/test/java/Models/UserDBTest.java +++ /dev/null @@ -1,50 +0,0 @@ -package Models; - -import VanquishP2.Application.Beans.Models.Location; -import VanquishP2.Application.Beans.Models.User; -import VanquishP2.Application.Beans.Models.UserInfo; -import VanquishP2.Application.Beans.Repos.UserInfoRepository; -import VanquishP2.Application.Beans.Repos.UserRepository; -import VanquishP2.Application.P2Application; -import VanquishP2.DTOs.UserRegistrationDTO; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit4.SpringRunner; - -import javax.annotation.Resource; - -@SpringBootTest(classes = P2Application.class) -@ActiveProfiles("test") -@RunWith(SpringRunner.class) -class UserDBTest { - @Resource - private UserRepository userRepository; - - @Resource - private UserInfoRepository userInfoRepository; - - @Test - void contextLoads() { - } - - @Test - public void goodSave(){ - UserInfo userInfo = new UserInfo(new UserRegistrationDTO("Kollier", - "Martin", - "KMART23", - "3t3styG=5!", - "astronomical@space.net", - "Mars", - "Milky Way")); - - userInfoRepository.save(userInfo); - - User user = new User(User.Role.PREMIUM, userInfo); - userRepository.save(user); - - Assertions.assertEquals("Koller", userInfoRepository.findByFirstName("Kollier").get().getFirstName()); - } -} diff --git a/src/test/java/P2ApplicationTests.java b/src/test/java/P2ApplicationTests.java deleted file mode 100644 index 9133fdd..0000000 --- a/src/test/java/P2ApplicationTests.java +++ /dev/null @@ -1,11 +0,0 @@ -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class P2ApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/src/test/java/UserDBTest.java b/src/test/java/UserDBTest.java new file mode 100644 index 0000000..f424404 --- /dev/null +++ b/src/test/java/UserDBTest.java @@ -0,0 +1,73 @@ +import VanquishP2.Application.Beans.Models.Location; +import VanquishP2.Application.Beans.Models.User; +import VanquishP2.Application.Beans.Models.UserInfo; +import VanquishP2.Application.Beans.Repos.LocationRepository; +import VanquishP2.Application.Beans.Repos.UserInfoRepository; +import VanquishP2.Application.Beans.Repos.UserRepository; +import VanquishP2.Application.P2Application; +import VanquishP2.DTOs.UserRegistrationDTO; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import javax.persistence.EntityManager; +import javax.persistence.EntityNotFoundException; +import java.util.Optional; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = P2Application.class) +class UserDBTest { + @Autowired + private UserInfoRepository userInfoRepository; + + @Autowired + private LocationRepository locationRepository; + + @Autowired + private UserRepository userRepository; + + @Test + void contextLoads() { + } + + @Test + public void userInfoRegisterTest(){ + UserRegistrationDTO registeredUser = new UserRegistrationDTO("Kollier", + "Martin", + "KMART23", + "3t3styG=5!", + "astronomical@space.net", + "Mars", + "Milky Way"); + + UserInfo userInfo = new UserInfo(registeredUser); + User newUser = new User(); + + locationRepository.save(userInfo.getLocation()); + userInfo = userInfoRepository.save(userInfo); + newUser = userRepository.save(newUser); + + userInfo.setUser(newUser); + + Assertions.assertNotNull(userInfoRepository.save(userInfo)); + } + + @Test + public void testSaveThenDelete(){ + User newUser = new User(); + newUser = userRepository.save(newUser); + userRepository.delete(newUser); + + Assertions.assertEquals(Optional.empty(), userRepository.findByID(newUser.getID())); + } +} + + + + From 4b83daf39d54afe3e669de66917ac2ed48f90c9e Mon Sep 17 00:00:00 2001 From: andrewdpetersen Date: Wed, 17 Nov 2021 14:21:46 -0600 Subject: [PATCH 4/9] test --- src/main/java/Application/P2Application.java | 20 -------- .../Application/aspects/LoggerAspect.java | 49 +++++++++++++++++++ 2 files changed, 49 insertions(+), 20 deletions(-) create mode 100644 src/main/java/Application/aspects/LoggerAspect.java diff --git a/src/main/java/Application/P2Application.java b/src/main/java/Application/P2Application.java index 8ffc9d6..59cdde0 100644 --- a/src/main/java/Application/P2Application.java +++ b/src/main/java/Application/P2Application.java @@ -1,14 +1,5 @@ package Application; -import Application.deezer.AlbumSearch; -import Application.deezer.ArtistSearch; -import Application.deezer.TrackSearch; -import Application.models.Album; -import Application.models.Artist; -import Application.models.Track; -import Application.services.ConcertService; -import Application.services.TrackService; -import org.json.JSONException; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; @@ -16,8 +7,6 @@ import org.springframework.context.annotation.PropertySource; import org.springframework.transaction.annotation.EnableTransactionManagement; -import java.util.List; - @SpringBootApplication(scanBasePackages = "Application") @EntityScan("Application") @PropertySource(value = "classpath:application.properties") @@ -26,14 +15,5 @@ public class P2Application { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(P2Application.class, args); - - TrackService service = context.getBean(TrackService.class); - ConcertService service2 = context.getBean(ConcertService.class); - - System.out.println("TESTING: TrackSearch for \"kiwi\""); - List trackList = TrackSearch.searchTracks("kiwi",3); - for(Track track:trackList){ - System.out.println(track.toString()); - } } } diff --git a/src/main/java/Application/aspects/LoggerAspect.java b/src/main/java/Application/aspects/LoggerAspect.java new file mode 100644 index 0000000..2d5986b --- /dev/null +++ b/src/main/java/Application/aspects/LoggerAspect.java @@ -0,0 +1,49 @@ +package Application.aspects; + +import Application.services.LoggerService; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; + +/** + * LoggerAspect + * Logs all method calls and exceptions for all classes except filters. + * + * @author Kollier Martin + */ + + +@Aspect +@Component +public class LoggerAspect { + private final LoggerService loggerService; + + public LoggerAspect(LoggerService loggerService) { + this.loggerService = loggerService; + } + + @Pointcut("within(Application.*.*)") + public void logAll() { + + } + + @Around("within(Application.*.*)") + public void logAroundAll(ProceedingJoinPoint joinPoint) throws Throwable { + try { + joinPoint.proceed(); + } catch (Exception ignored){ + + } + } + + @AfterThrowing(pointcut = "logAll()", throwing = "e") + public void logMethodException(JoinPoint jp, Throwable e) { + String methodSig = extractMethodSignature(jp); + loggerService.writeLog(String.format("%s was thrown in method %s with message: %s", e.getClass().getSimpleName(), methodSig, e.getMessage()), 3); + } + + private String extractMethodSignature(JoinPoint jp) { + return jp.getTarget().getClass().toString() + "." + jp.getSignature().getName(); + } +} From d20a88941aa28964079ed63f17d080f508ea9705 Mon Sep 17 00:00:00 2001 From: andrewdpetersen Date: Wed, 17 Nov 2021 14:39:21 -0600 Subject: [PATCH 5/9] exceptions to be caught by logger --- pom.xml | 126 ++---------------- .../controllers/AlbumController.java | 3 +- .../controllers/ArtistController.java | 3 +- .../controllers/TrackController.java | 5 +- .../java/Application/deezer/AlbumSearch.java | 5 +- .../java/Application/deezer/ArtistSearch.java | 7 +- .../deezer/JSONObjectToModelConverter.java | 11 +- .../deezer/JSONStringToModelConverter.java | 9 +- .../java/Application/deezer/TrackSearch.java | 5 +- .../ObjectToModel/GenreConverterTest.java | 3 +- .../ObjectToModel/TopTrackConverterTest.java | 5 +- .../StringToModel/AlbumConverterTest.java | 3 +- .../StringToModel/ArtistConverterTest.java | 3 +- .../StringToModel/GenreConverterTest.java | 3 +- .../StringToModel/TrackConverterTest.java | 3 +- target/classes/beans.xml | 6 - 16 files changed, 50 insertions(+), 150 deletions(-) delete mode 100644 target/classes/beans.xml diff --git a/pom.xml b/pom.xml index 291ecac..569405c 100644 --- a/pom.xml +++ b/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot @@ -17,149 +17,43 @@ 1.8 - - - - javax.servlet - javax.servlet-api - 4.0.1 - provided - - -<<<<<<< HEAD - - - com.fasterxml.jackson.core - jackson-databind - 2.13.0 - - - -======= - - org.springframework.boot - spring-boot-starter-validation - 2.5.5 - - ->>>>>>> ce793d902e0374fe41c8edd9e05657e1adfc1a66 - - com.fasterxml.jackson.core - jackson-core - 2.13.0 - - - - -<<<<<<< HEAD - org.mariadb.jdbc - mariadb-java-client - 2.7.3 - runtime - - - - - org.json - json - 20210307 - - - - - io.jsonwebtoken - jjwt-api - 0.11.1 - - - io.jsonwebtoken - jjwt-impl - 0.11.1 - runtime - - - - io.jsonwebtoken - jjwt-jackson - 0.11.1 - runtime - - - + org.springframework.boot spring-boot-starter-data-jpa - 2.5.5 - org.springframework.boot spring-boot-starter-validation 2.5.5 - org.springframework.boot spring-boot-starter-web - 2.5.5 - - - - - - - - - -======= + org.springframework.boot spring-boot-starter-tomcat 2.5.5 provided ->>>>>>> ce793d902e0374fe41c8edd9e05657e1adfc1a66 org.springframework.boot spring-boot-starter-test - 2.5.5 test -<<<<<<< HEAD -======= ->>>>>>> ce793d902e0374fe41c8edd9e05657e1adfc1a66 com.vaadin.external.google android-json 0.0.20131108.vaadin1 compile -<<<<<<< HEAD - - org.springframework.boot - spring-boot-starter-data-jpa - - - - - com.squareup.okhttp3 - okhttp - 4.9.2 - - - junit - junit - test - - - -======= @@ -225,11 +119,11 @@ 1.4.200 - - com.squareup.okhttp3 - okhttp - 4.9.2 - + + com.squareup.okhttp3 + okhttp + 4.9.2 + junit junit @@ -238,16 +132,14 @@ ->>>>>>> ce793d902e0374fe41c8edd9e05657e1adfc1a66 org.springframework.boot spring-boot-maven-plugin - - + \ No newline at end of file diff --git a/src/main/java/Application/controllers/AlbumController.java b/src/main/java/Application/controllers/AlbumController.java index 2d7656e..48e3a85 100644 --- a/src/main/java/Application/controllers/AlbumController.java +++ b/src/main/java/Application/controllers/AlbumController.java @@ -3,6 +3,7 @@ import Application.deezer.AlbumSearch; import Application.models.Album; import Application.services.AlbumService; +import org.json.JSONException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -106,7 +107,7 @@ public ResponseEntity remove(@PathVariable String title) { @GetMapping(value = "/album/search/{title}", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(value = HttpStatus.OK) - public Album[] searchForAlbumsByTitle(@PathVariable ("title") String title){ + public Album[] searchForAlbumsByTitle(@PathVariable ("title") String title) throws JSONException { System.out.println("Test: Album"); List albumList = AlbumSearch.albumSearch(title,5); Album[] albums = new Album[5]; diff --git a/src/main/java/Application/controllers/ArtistController.java b/src/main/java/Application/controllers/ArtistController.java index 3fc788c..abceb8f 100644 --- a/src/main/java/Application/controllers/ArtistController.java +++ b/src/main/java/Application/controllers/ArtistController.java @@ -2,6 +2,7 @@ import Application.deezer.ArtistSearch; import Application.models.Artist; import Application.services.ArtistService; +import org.json.JSONException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -35,7 +36,7 @@ public Artist getArtistById(@PathVariable("id") Integer id) { @GetMapping(value = "artist/search/{name}", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(value = HttpStatus.OK) - public Artist[] searchForArtistsByName(@PathVariable ("name") String title){ + public Artist[] searchForArtistsByName(@PathVariable ("name") String title) throws JSONException { System.out.println("Test: Artist"); List artistList = ArtistSearch.artistSearch(title,5); Artist[] artists = new Artist[5]; diff --git a/src/main/java/Application/controllers/TrackController.java b/src/main/java/Application/controllers/TrackController.java index 3c5bbec..d996914 100644 --- a/src/main/java/Application/controllers/TrackController.java +++ b/src/main/java/Application/controllers/TrackController.java @@ -6,6 +6,7 @@ import Application.services.APIClientService; import Application.services.TrackService; import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -40,7 +41,7 @@ public Track getTrackById(@PathVariable ("id") Integer id){ @GetMapping(value = "track/search/{title}", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(value = HttpStatus.OK) - public Track[] searchForTracksByTitle(@PathVariable ("title") String title){ + public Track[] searchForTracksByTitle(@PathVariable ("title") String title) throws JSONException { List trackList = TrackSearch.searchTracks(title,5); Track[] tracks = new Track[5]; for (int i=0;i<5;i++) { @@ -51,7 +52,7 @@ public Track[] searchForTracksByTitle(@PathVariable ("title") String title){ @GetMapping(value = "track/byAlbum/{id}") @ResponseStatus(value = HttpStatus.OK) - public Track[] getTracksByAlbum(@PathVariable ("id") Integer album_id){ + public Track[] getTracksByAlbum(@PathVariable ("id") Integer album_id) throws JSONException { String url = "https://api.deezer.com/album/"+album_id+"/tracks"; String jsonResponse = APIClientService.get(url); JSONObject jsonObject = new JSONObject(jsonResponse); diff --git a/src/main/java/Application/deezer/AlbumSearch.java b/src/main/java/Application/deezer/AlbumSearch.java index bbf22a4..b3f3785 100644 --- a/src/main/java/Application/deezer/AlbumSearch.java +++ b/src/main/java/Application/deezer/AlbumSearch.java @@ -3,13 +3,14 @@ import Application.models.Album; import Application.services.APIClientService; import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; import java.util.List; public class AlbumSearch { - public static List albumSearch(String albumTitle, int numberOfResults){ + public static List albumSearch(String albumTitle, int numberOfResults) throws JSONException { List albumSearch = new ArrayList<>(); String urlStart = "https://api.deezer.com/search/album?q="+albumTitle+"&index="; @@ -26,7 +27,7 @@ public static List albumSearch(String albumTitle, int numberOfResults){ //data is NOT a string, it is a JSONArray with 1 JSONObject in it... JSONArray data = jsonObject.getJSONArray("data"); - if(data.isEmpty()){ + if(data.length()==0){ return albumSearch; } JSONObject jsonData = data.getJSONObject(0); diff --git a/src/main/java/Application/deezer/ArtistSearch.java b/src/main/java/Application/deezer/ArtistSearch.java index 3897eb1..9923ac6 100644 --- a/src/main/java/Application/deezer/ArtistSearch.java +++ b/src/main/java/Application/deezer/ArtistSearch.java @@ -5,6 +5,7 @@ import Application.models.Track; import Application.services.APIClientService; import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; @@ -12,7 +13,7 @@ public class ArtistSearch { - public static List artistSearch(String artistName, int numberOfResults){ + public static List artistSearch(String artistName, int numberOfResults) throws JSONException { List artistSearch = new ArrayList<>(); String urlStart = "https://api.deezer.com/search/artist?q="+artistName+"&index="; @@ -28,7 +29,7 @@ public static List artistSearch(String artistName, int numberOfResults){ //data is NOT a string, it is a JSONArray with 1 JSONObject in it... JSONArray data = jsonObject.getJSONArray("data"); - if(data.isEmpty()){ + if(data.length()==0){ return artistSearch; } @@ -46,7 +47,7 @@ public static List artistSearch(String artistName, int numberOfResults){ return artistSearch; } - public static List getTopTracks(Artist artist,int numberOfTracks){ + public static List getTopTracks(Artist artist,int numberOfTracks) throws JSONException { List topTracks = new ArrayList<>(); String request = "https://api.deezer.com/artist/"+artist.getID()+"/top?limit="+numberOfTracks; diff --git a/src/main/java/Application/deezer/JSONObjectToModelConverter.java b/src/main/java/Application/deezer/JSONObjectToModelConverter.java index fd87abb..84ff7ca 100644 --- a/src/main/java/Application/deezer/JSONObjectToModelConverter.java +++ b/src/main/java/Application/deezer/JSONObjectToModelConverter.java @@ -5,10 +5,11 @@ import Application.models.Genre; import Application.models.Track; import Application.services.APIClientService; +import org.json.JSONException; import org.json.JSONObject; public class JSONObjectToModelConverter { - public static Track trackConverter(JSONObject jsonObject){ + public static Track trackConverter(JSONObject jsonObject) throws JSONException { int track_id = jsonObject.getInt("id"); String title = jsonObject.getString("title"); @@ -38,7 +39,7 @@ public static Track trackConverter(JSONObject jsonObject){ return track; } - public static Artist artistConverter(JSONObject jsonObject){ + public static Artist artistConverter(JSONObject jsonObject) throws JSONException { int artist_id = jsonObject.getInt("id"); String name = jsonObject.getString("name"); String pictureUrl = jsonObject.getString("picture_medium"); @@ -46,7 +47,7 @@ public static Artist artistConverter(JSONObject jsonObject){ return new Artist(name,artist_id,pictureUrl); } - public static Album albumConverter(JSONObject jsonObject){ + public static Album albumConverter(JSONObject jsonObject) throws JSONException { int album_id = jsonObject.getInt("id"); String title = jsonObject.getString("title"); String release_date = jsonObject.getString("release_date"); @@ -68,7 +69,7 @@ public static Album albumConverter(JSONObject jsonObject){ return album; } - public static Genre genreConverter(String json){ + public static Genre genreConverter(String json) throws JSONException { JSONObject jsonObject = new JSONObject(json); int genre_id = jsonObject.getInt("id"); String name = jsonObject.getString("name"); @@ -77,7 +78,7 @@ public static Genre genreConverter(String json){ return new Genre(genre_id,name,pictureUrl); } - public static Track topTrackConverter(JSONObject jsonTrack,Artist artist,Album album){ + public static Track topTrackConverter(JSONObject jsonTrack,Artist artist,Album album) throws JSONException { int track_id = jsonTrack.getInt("id"); String title = jsonTrack.getString("title"); Track track = new Track(track_id,title); diff --git a/src/main/java/Application/deezer/JSONStringToModelConverter.java b/src/main/java/Application/deezer/JSONStringToModelConverter.java index 2044ba6..1052fb6 100644 --- a/src/main/java/Application/deezer/JSONStringToModelConverter.java +++ b/src/main/java/Application/deezer/JSONStringToModelConverter.java @@ -5,11 +5,12 @@ import Application.models.Genre; import Application.models.Track; import Application.services.APIClientService; +import org.json.JSONException; import org.json.JSONObject; public class JSONStringToModelConverter { - public static Track trackConverter(String json){ + public static Track trackConverter(String json) throws JSONException { JSONObject jsonObject = new JSONObject(json); int track_id = jsonObject.getInt("id"); @@ -40,7 +41,7 @@ public static Track trackConverter(String json){ return track; } - public static Artist artistConverter(String json){ + public static Artist artistConverter(String json) throws JSONException { JSONObject jsonObject = new JSONObject(json); int artist_id = jsonObject.getInt("id"); String name = jsonObject.getString("name"); @@ -49,7 +50,7 @@ public static Artist artistConverter(String json){ return new Artist(name,artist_id,pictureUrl); } - public static Album albumConverter(String json){ + public static Album albumConverter(String json) throws JSONException { JSONObject jsonObject = new JSONObject(json); int album_id = jsonObject.getInt("id"); String title = jsonObject.getString("title"); @@ -72,7 +73,7 @@ public static Album albumConverter(String json){ return album; } - public static Genre genreConverter(String json){ + public static Genre genreConverter(String json) throws JSONException { JSONObject jsonObject = new JSONObject(json); int genre_id = jsonObject.getInt("id"); String name = jsonObject.getString("name"); diff --git a/src/main/java/Application/deezer/TrackSearch.java b/src/main/java/Application/deezer/TrackSearch.java index 6b3c7c7..b1159b7 100644 --- a/src/main/java/Application/deezer/TrackSearch.java +++ b/src/main/java/Application/deezer/TrackSearch.java @@ -3,6 +3,7 @@ import Application.models.Track; import Application.services.APIClientService; import org.json.JSONArray; +import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; @@ -10,7 +11,7 @@ public class TrackSearch { - public static List searchTracks(String track_title, int numberOfResults){ + public static List searchTracks(String track_title, int numberOfResults) throws JSONException { List trackSearch = new ArrayList<>(); String urlStart = "https://api.deezer.com/search/track?q="+track_title+"&index="; @@ -26,7 +27,7 @@ public static List searchTracks(String track_title, int numberOfResults){ //data is NOT a string, it is a JSONArray with 1 JSONObject in it... JSONArray data = jsonObject.getJSONArray("data"); - if(data.isEmpty()){ + if(data.length()==0){ return trackSearch; } JSONObject jsonData = data.getJSONObject(0); diff --git a/src/test/java/ToModelConverterTests/ObjectToModel/GenreConverterTest.java b/src/test/java/ToModelConverterTests/ObjectToModel/GenreConverterTest.java index 32ac28a..773345b 100644 --- a/src/test/java/ToModelConverterTests/ObjectToModel/GenreConverterTest.java +++ b/src/test/java/ToModelConverterTests/ObjectToModel/GenreConverterTest.java @@ -1,5 +1,6 @@ package ToModelConverterTests.ObjectToModel; +import org.json.JSONException; import org.junit.*; import static Application.deezer.JSONObjectToModelConverter.genreConverter; @@ -27,7 +28,7 @@ public void after() { } @Test - public void genreConverterTest(){ + public void genreConverterTest() throws JSONException { int genreID = genreConverter(json).getGenreID(); String genreName = genreConverter(json).getGenreName(); String genrePic = genreConverter(json).getImageURL(); diff --git a/src/test/java/ToModelConverterTests/ObjectToModel/TopTrackConverterTest.java b/src/test/java/ToModelConverterTests/ObjectToModel/TopTrackConverterTest.java index 9f302c9..e0d6f02 100644 --- a/src/test/java/ToModelConverterTests/ObjectToModel/TopTrackConverterTest.java +++ b/src/test/java/ToModelConverterTests/ObjectToModel/TopTrackConverterTest.java @@ -3,6 +3,7 @@ import Application.models.Album; import Application.models.Artist; import Application.models.Track; +import org.json.JSONException; import org.junit.*; import org.json.JSONObject; @@ -24,7 +25,7 @@ public static void afterClass() { } @Before //before each test starts - public void before() { + public void before() throws JSONException { album = new Album(); album.setID(2); album.setAlbum_title("Album Title"); @@ -48,7 +49,7 @@ public void after() { } @Test - public void testTopTrackConverter(){ + public void testTopTrackConverter() throws JSONException { int trackID = topTrackConverter(jsonTrack,artist,album).getTrack_id(); String trackTitle = topTrackConverter(jsonTrack,artist,album).getTitle(); Class thisClass = topTrackConverter(jsonTrack,artist,album).getClass(); diff --git a/src/test/java/ToModelConverterTests/StringToModel/AlbumConverterTest.java b/src/test/java/ToModelConverterTests/StringToModel/AlbumConverterTest.java index dcf35e1..c55f297 100644 --- a/src/test/java/ToModelConverterTests/StringToModel/AlbumConverterTest.java +++ b/src/test/java/ToModelConverterTests/StringToModel/AlbumConverterTest.java @@ -1,5 +1,6 @@ package ToModelConverterTests.StringToModel; +import org.json.JSONException; import org.junit.*; import static Application.deezer.JSONStringToModelConverter.albumConverter; @@ -27,7 +28,7 @@ public void after() { } @Test - public void albumConverterTest(){ + public void albumConverterTest() throws JSONException { int album_id = albumConverter(albumJson).getID(); String title = albumConverter(albumJson).getAlbum_title(); String date = albumConverter(albumJson).getDate(); diff --git a/src/test/java/ToModelConverterTests/StringToModel/ArtistConverterTest.java b/src/test/java/ToModelConverterTests/StringToModel/ArtistConverterTest.java index c1281b2..0404e94 100644 --- a/src/test/java/ToModelConverterTests/StringToModel/ArtistConverterTest.java +++ b/src/test/java/ToModelConverterTests/StringToModel/ArtistConverterTest.java @@ -1,6 +1,7 @@ package ToModelConverterTests.StringToModel; import Application.models.Artist; +import org.json.JSONException; import org.junit.*; import static Application.deezer.JSONStringToModelConverter.artistConverter; @@ -27,7 +28,7 @@ public void after() { } @Test - public void artistConverterTest(){ + public void artistConverterTest() throws JSONException { int artist_id = artistConverter(artistJson).getID(); String name = artistConverter(artistJson).getName(); String picURL = artistConverter(artistJson).getImage_url(); diff --git a/src/test/java/ToModelConverterTests/StringToModel/GenreConverterTest.java b/src/test/java/ToModelConverterTests/StringToModel/GenreConverterTest.java index 0867155..3123160 100644 --- a/src/test/java/ToModelConverterTests/StringToModel/GenreConverterTest.java +++ b/src/test/java/ToModelConverterTests/StringToModel/GenreConverterTest.java @@ -1,5 +1,6 @@ package ToModelConverterTests.StringToModel; +import org.json.JSONException; import org.junit.*; import static Application.deezer.JSONObjectToModelConverter.genreConverter; @@ -26,7 +27,7 @@ public void after() { } @Test - public void genreConverterTest(){ + public void genreConverterTest() throws JSONException { int genreID = genreConverter(json).getGenreID(); String genreName = genreConverter(json).getGenreName(); String genrePic = genreConverter(json).getImageURL(); diff --git a/src/test/java/ToModelConverterTests/StringToModel/TrackConverterTest.java b/src/test/java/ToModelConverterTests/StringToModel/TrackConverterTest.java index 5c18dff..b30961e 100644 --- a/src/test/java/ToModelConverterTests/StringToModel/TrackConverterTest.java +++ b/src/test/java/ToModelConverterTests/StringToModel/TrackConverterTest.java @@ -1,6 +1,7 @@ package ToModelConverterTests.StringToModel; import Application.models.Track; +import org.json.JSONException; import org.junit.*; import static Application.deezer.JSONStringToModelConverter.trackConverter; @@ -30,7 +31,7 @@ public void after() { } @Test - public void trackConverterTest(){ + public void trackConverterTest() throws JSONException { int track_id = trackConverter(trackJson).getTrack_id(); String track_title = trackConverter(trackJson).getTitle(); diff --git a/target/classes/beans.xml b/target/classes/beans.xml deleted file mode 100644 index 142def2..0000000 --- a/target/classes/beans.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file From 6f17990413717708e52c4655f28fce8196fcd9b9 Mon Sep 17 00:00:00 2001 From: kollier-martin Date: Wed, 17 Nov 2021 15:43:47 -0500 Subject: [PATCH 6/9] Fixed Null CORSFilter --- .../Application/configs/FilterConfig.java | 21 ++++++ .../filters/AuthenticationFilter.java | 65 ------------------- 2 files changed, 21 insertions(+), 65 deletions(-) create mode 100644 src/main/java/Application/configs/FilterConfig.java delete mode 100644 src/main/java/Application/filters/AuthenticationFilter.java diff --git a/src/main/java/Application/configs/FilterConfig.java b/src/main/java/Application/configs/FilterConfig.java new file mode 100644 index 0000000..18d28a2 --- /dev/null +++ b/src/main/java/Application/configs/FilterConfig.java @@ -0,0 +1,21 @@ +package Application.configs; + +import Application.filters.CORSFilter; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Collections; + +@Configuration +public class FilterConfig { + + @Bean + @SuppressWarnings({"rawtypes, unchecked"}) + public FilterRegistrationBean corsRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); + filterRegistrationBean.setFilter(new CORSFilter()); + filterRegistrationBean.setUrlPatterns(Collections.singletonList("/*")); + return filterRegistrationBean; + } +} \ No newline at end of file diff --git a/src/main/java/Application/filters/AuthenticationFilter.java b/src/main/java/Application/filters/AuthenticationFilter.java deleted file mode 100644 index 6cb52b9..0000000 --- a/src/main/java/Application/filters/AuthenticationFilter.java +++ /dev/null @@ -1,65 +0,0 @@ -package Application.filters; - -import Application.DTOs.PrincipalDTO; -import Application.exceptions.AuthenticationException; -import Application.services.LoggerService; -import Application.utils.JWTUtil; -import io.jsonwebtoken.Claims; -import org.springframework.context.ApplicationContext; -import org.springframework.stereotype.Component; -import org.springframework.web.context.support.WebApplicationContextUtils; - -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * Authentication Filter - * Chains with other filters on every endpoint call to make sure the current request is from a valid source - * @author Kollier Martin - * @date 11/8/2021 - */ - -@Component -public class AuthenticationFilter implements Filter { - private LoggerService loggerService; - private JWTUtil jwtUtil; - - @Override - public void init(FilterConfig config) { - ApplicationContext container = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext()); - this.jwtUtil = container.getBean(JWTUtil.class); - this.loggerService = container.getBean(LoggerService.class); - } - - @Override - public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { - HttpServletRequest request = (HttpServletRequest) req; - HttpServletResponse response = (HttpServletResponse) resp; - parseToken(request); - chain.doFilter(request, response); - } - - private void parseToken(HttpServletRequest request) { - String errMessage = "Unauthorized user tried to barge their way in here! Don't worry, I caught this transgression. Error: %s"; - - try { - String header = request.getHeader(jwtUtil.getHeader()); - - if (header == null || !header.startsWith(jwtUtil.getPrefix())) { - loggerService.writeLog(errMessage, 3); - return; - } - - String token = header.replaceAll(jwtUtil.getPrefix(), ""); - - Claims jwtClaims = jwtUtil.parseJWT(token); - PrincipalDTO principalDTO = new PrincipalDTO(jwtClaims); - request.setAttribute("principal", principalDTO); - - } catch (AuthenticationException e) { - loggerService.writeLog(("Uh oh... Authentication Filter has a message: " + e.getMessage()), 3); - } - } -} From 3980c95d3791fb593a698bfdbd268077eda7e9da Mon Sep 17 00:00:00 2001 From: kollier-martin Date: Wed, 17 Nov 2021 16:21:57 -0500 Subject: [PATCH 7/9] Fixed NullBean Error --- src/main/java/Application/P2Application.java | 2 +- src/main/java/Application/ServletInitializer.java | 11 +++++++++++ src/main/java/Application/aspects/LoggerAspect.java | 4 ++-- src/main/java/Application/configs/FilterConfig.java | 1 - 4 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 src/main/java/Application/ServletInitializer.java diff --git a/src/main/java/Application/P2Application.java b/src/main/java/Application/P2Application.java index 59cdde0..7296ce6 100644 --- a/src/main/java/Application/P2Application.java +++ b/src/main/java/Application/P2Application.java @@ -14,6 +14,6 @@ public class P2Application { public static void main(String[] args) { - ConfigurableApplicationContext context = SpringApplication.run(P2Application.class, args); + SpringApplication.run(P2Application.class, args); } } diff --git a/src/main/java/Application/ServletInitializer.java b/src/main/java/Application/ServletInitializer.java new file mode 100644 index 0000000..ca9925f --- /dev/null +++ b/src/main/java/Application/ServletInitializer.java @@ -0,0 +1,11 @@ +package Application; + +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; + +public class ServletInitializer extends SpringBootServletInitializer { + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(P2Application.class); + } +} \ No newline at end of file diff --git a/src/main/java/Application/aspects/LoggerAspect.java b/src/main/java/Application/aspects/LoggerAspect.java index 2d5986b..2477912 100644 --- a/src/main/java/Application/aspects/LoggerAspect.java +++ b/src/main/java/Application/aspects/LoggerAspect.java @@ -23,12 +23,12 @@ public LoggerAspect(LoggerService loggerService) { this.loggerService = loggerService; } - @Pointcut("within(Application.*.*)") + @Pointcut("within(Application.*.*) && !within(Application.filters..*) && !within(Application.configs..*)") public void logAll() { } - @Around("within(Application.*.*)") + @Around("within(Application.*.*) && !within(Application.filters..*) && !within(Application.configs..*)") public void logAroundAll(ProceedingJoinPoint joinPoint) throws Throwable { try { joinPoint.proceed(); diff --git a/src/main/java/Application/configs/FilterConfig.java b/src/main/java/Application/configs/FilterConfig.java index 18d28a2..31480f9 100644 --- a/src/main/java/Application/configs/FilterConfig.java +++ b/src/main/java/Application/configs/FilterConfig.java @@ -9,7 +9,6 @@ @Configuration public class FilterConfig { - @Bean @SuppressWarnings({"rawtypes, unchecked"}) public FilterRegistrationBean corsRegistrationBean() { From ba3aa7c034dcab058d780debaa46b93d8c656069 Mon Sep 17 00:00:00 2001 From: kollier-martin Date: Wed, 17 Nov 2021 16:55:43 -0500 Subject: [PATCH 8/9] Michael's Push --- .../Application/DTOs/UserRegistrationDTO.java | 1 - src/main/java/Application/P2Application.java | 1 - .../Application/aspects/LoggerAspect.java | 5 +- .../controllers/AlbumController.java | 2 - .../controllers/AuthenticationController.java | 33 ++-- .../controllers/LikeDislikeController.java | 150 ++++++++++++------ src/main/java/Application/models/Album.java | 10 ++ src/main/java/Application/models/Track.java | 26 +++ .../repositories/TrackRepository.java | 11 ++ .../services/LikeDislikeService.java | 70 +++++++- .../Application/services/LoggerService.java | 17 +- .../services/TrackPlaylistService.java | 3 - src/main/java/Application/utils/JWTUtil.java | 90 ----------- 13 files changed, 225 insertions(+), 194 deletions(-) delete mode 100644 src/main/java/Application/utils/JWTUtil.java diff --git a/src/main/java/Application/DTOs/UserRegistrationDTO.java b/src/main/java/Application/DTOs/UserRegistrationDTO.java index 85bc50e..e95fca2 100644 --- a/src/main/java/Application/DTOs/UserRegistrationDTO.java +++ b/src/main/java/Application/DTOs/UserRegistrationDTO.java @@ -1,6 +1,5 @@ package Application.DTOs; -import Application.models.Location; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.Email; diff --git a/src/main/java/Application/P2Application.java b/src/main/java/Application/P2Application.java index 7296ce6..b649502 100644 --- a/src/main/java/Application/P2Application.java +++ b/src/main/java/Application/P2Application.java @@ -3,7 +3,6 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.PropertySource; import org.springframework.transaction.annotation.EnableTransactionManagement; diff --git a/src/main/java/Application/aspects/LoggerAspect.java b/src/main/java/Application/aspects/LoggerAspect.java index 2477912..150b989 100644 --- a/src/main/java/Application/aspects/LoggerAspect.java +++ b/src/main/java/Application/aspects/LoggerAspect.java @@ -3,7 +3,10 @@ import Application.services.LoggerService; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.*; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; /** diff --git a/src/main/java/Application/controllers/AlbumController.java b/src/main/java/Application/controllers/AlbumController.java index 48e3a85..3b429fa 100644 --- a/src/main/java/Application/controllers/AlbumController.java +++ b/src/main/java/Application/controllers/AlbumController.java @@ -13,8 +13,6 @@ import java.util.List; import java.util.Optional; -import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; - /** * AlbumController * Handles requests that involve the manipulating or retrieval of album data diff --git a/src/main/java/Application/controllers/AuthenticationController.java b/src/main/java/Application/controllers/AuthenticationController.java index 14d9b77..7ff0622 100644 --- a/src/main/java/Application/controllers/AuthenticationController.java +++ b/src/main/java/Application/controllers/AuthenticationController.java @@ -2,11 +2,11 @@ import Application.DTOs.LoginCredentialsDTO; import Application.DTOs.UserRegistrationDTO; +import Application.exceptions.UserDoesNotExistException; import Application.models.User; import Application.models.UserInfo; import Application.services.UserInfoService; import Application.services.UserService; -import Application.utils.JWTUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -25,18 +25,9 @@ @RestController @RequestMapping("/4TheMusic") public class AuthenticationController { - - private final JWTUtil jwtUtil; private final UserInfoService userInfoService; private final UserService userService; - @Autowired - public AuthenticationController(JWTUtil jwtUtil, UserInfoService userInfoService, UserService userService) { - this.jwtUtil = jwtUtil; - this.userInfoService = userInfoService; - this.userService = userService; - } - /** * Authenticate and Login User * @param credentials username and password @@ -47,14 +38,19 @@ public AuthenticationController(JWTUtil jwtUtil, UserInfoService userInfoService public UserInfo authenticate(@RequestBody LoginCredentialsDTO credentials, HttpServletResponse response) { Optional userInfo = userInfoService.authenticate(credentials.getUsername(), credentials.getPassword()); - if (userInfo.isPresent()) { - String jwt = jwtUtil.createJWT(userInfo.get()); - response.setHeader(jwtUtil.getHeader(), jwt); + if (!userInfo.isPresent()){ + throw new UserDoesNotExistException("User does not exist!"); } return userInfo.get(); } + @Autowired + public AuthenticationController(UserInfoService userInfoService, UserService userService) { + this.userInfoService = userInfoService; + this.userService = userService; + } + /** * Register Basic User * @param regData Registration Data from Frontend @@ -62,10 +58,7 @@ public UserInfo authenticate(@RequestBody LoginCredentialsDTO credentials, HttpS */ @PostMapping(value = "/register/basic", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) public User registerBasicUser(@RequestBody @Valid UserRegistrationDTO regData, HttpServletResponse response){ - User user = userService.registerUser(regData, User.Role.BASIC); - String jwt = jwtUtil.createJWT(user.getUserInfo()); - response.setHeader(jwtUtil.getHeader(), jwt); - return user; + return userService.registerUser(regData, User.Role.BASIC); } /** @@ -75,10 +68,6 @@ public User registerBasicUser(@RequestBody @Valid UserRegistrationDTO regData, H */ @PostMapping(value = "/register/premium", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) public User registerPremiumUser(@RequestBody @Valid UserRegistrationDTO regData, HttpServletResponse response){ - System.out.println(regData); - User user = userService.registerUser(regData, User.Role.PREMIUM); - String jwt = jwtUtil.createJWT(user.getUserInfo()); - response.setHeader(jwtUtil.getHeader(), jwt); - return user; + return userService.registerUser(regData, User.Role.PREMIUM); } } diff --git a/src/main/java/Application/controllers/LikeDislikeController.java b/src/main/java/Application/controllers/LikeDislikeController.java index 623b638..0ff89c2 100644 --- a/src/main/java/Application/controllers/LikeDislikeController.java +++ b/src/main/java/Application/controllers/LikeDislikeController.java @@ -1,18 +1,27 @@ package Application.controllers; -import Application.exceptions.UserDoesNotExistException; -import Application.models.Track; -import Application.models.User; +import Application.deezer.JSONStringToModelConverter; +import Application.models.*; +import Application.services.APIClientService; import Application.services.LikeDislikeService; import Application.utils.JWTUtil; +import org.json.JSONException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpServletRequest; +import java.util.LinkedList; +import java.util.List; import java.util.Optional; +/** + * LikeDislikeController + * Handles requests that involve the manipulating or retrieval of tracks in regards to like/dislike + * @date 11/09/21 + * @author Michael Reece + */ @RestController @RequestMapping(value = "/4TheMusic") public class LikeDislikeController { @@ -25,36 +34,62 @@ public LikeDislikeController(JWTUtil jwtUtil, LikeDislikeService likeDislikeServ this.likeDislikeService = likeDislikeService; } - @PostMapping(value = "/like", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + /** + * Like a track for the current user + * @param track from the RequestBody + * @param currentUser from the path variable + * @return the track after a successful 'like' + */ + @PostMapping(value = "/like/{currentUser}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(value = HttpStatus.OK) - public Track likeTrack(@RequestBody Track track, HttpServletResponse response){ - /* Username from token - > From Kollier :D */ - String username = jwtUtil.parseJWT(response.getHeader(jwtUtil.getHeader())).getSubject(); - + public Track likeTrack(@RequestBody Track track,@PathVariable String currentUser,HttpServletRequest request) throws JSONException { //get user from username - Optional user = likeDislikeService.getUserByUsername(username); + Optional user = likeDislikeService.getUserByUsername(currentUser); if(user.isPresent()) { - User presentUser = new User(user.get().getRole(), user.get().getUserInfo()); //if track exists on our database already, grab it from there to update Track database = likeDislikeService.getTrack(track.getTrack_id()); if(database != null) { + // public Track(Integer track_id, String title, String duration, List playlists, List userLikes, List userDislikes, Artist artist, Album album) + Track databaseTrack = new Track(database.getTrack_id(),database.getTitle(),database.getDuration(), + database.getPlaylists(),database.getUserLikes(),database.getUserDislikes(),database.getArtist(), + database.getAlbum()); //add user to track's list of users who like it - database.getUserLikes().add(presentUser); - likeDislikeService.saveTrack(database); + databaseTrack.getUserLikes().add(user.get()); + likeDislikeService.saveTrack(databaseTrack); } else //if it doesn't exist on our database already, we need to create it { //create new track with user on the list of users who like it - track.getUserLikes().add(presentUser); - likeDislikeService.saveTrack(track); + //create artist object to persist + Artist artist = new Artist(track.getArtist().getName(),track.getArtist().getID(),track.getArtist().getImage_url()); + likeDislikeService.saveArtist(artist); + String albumRequest = "https://api.deezer.com/album/" + track.getAlbum().getID(); + String stringJsonAlbum = APIClientService.get(albumRequest); + Album resultAlbum = JSONStringToModelConverter.albumConverter(stringJsonAlbum); + Genre genre = new Genre(resultAlbum.getGenre().getGenreID(),resultAlbum.getGenre().getGenreName(),resultAlbum.getGenre().getImageURL()); + likeDislikeService.saveGenre(genre); + Album album = new Album(track.getAlbum().getID(),track.getAlbum().getAlbum_title(),track.getAlbum().getDate(), artist, genre); + likeDislikeService.saveAlbum(album); + Track newTrack = new Track(track.getTrack_id(),track.getTitle(),artist,album); + //System.out.println(newTrack.getTrack_id()); + Album newAlbum = likeDislikeService.getAlbum(album.getID()); + Artist newArtist = likeDislikeService.getArtist(artist.getID()); + newArtist.getAlbums().add(album); + likeDislikeService.saveArtist(newArtist); + likeDislikeService.saveTrack(newTrack); + newAlbum.getTracks().add(newTrack); + likeDislikeService.saveAlbum(newAlbum); + newTrack.getUserLikes().add(user.get()); + likeDislikeService.saveTrack(newTrack); } //add track to user's liked list after either creating a new track or updating current one - presentUser.getLiked_tracks().add(likeDislikeService.getTrack(track.getTrack_id())); - likeDislikeService.saveUser(presentUser); + //we know the track exists because we just persisted it. + user.get().getLiked_tracks().add(likeDislikeService.getTrack(track.getTrack_id())); + likeDislikeService.saveUser(user.get()); } else { @@ -64,36 +99,61 @@ public Track likeTrack(@RequestBody Track track, HttpServletResponse response){ return likeDislikeService.getTrack(track.getTrack_id()); } - @PostMapping(value = "/dislike", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + /** + * Dislike a track for the current user + * @param track from the RequestBody + * @param currentUser from the path variable + * @return the track after a successful 'dislike' + */ + @PostMapping(value = "/dislike/{currentUser}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(value = HttpStatus.OK) - public Track dislikeTrack(@RequestBody Track track, HttpServletResponse response){ - /* Username from token - > From Kollier :D */ - String username = jwtUtil.parseJWT(response.getHeader(jwtUtil.getHeader())).getSubject(); - + public Track dislikeTrack(@RequestBody Track track,@PathVariable String currentUser,HttpServletRequest request) throws JSONException { //get user from username - Optional user = likeDislikeService.getUserByUsername(username); + Optional user = likeDislikeService.getUserByUsername(currentUser); if(user.isPresent()) { - User presentUser = new User(user.get().getRole(), user.get().getUserInfo()); //if track exists on our database already, grab it from there to update Track database = likeDislikeService.getTrack(track.getTrack_id()); if(database != null) { + // public Track(Integer track_id, String title, String duration, List playlists, List userLikes, List userDislikes, Artist artist, Album album) + Track databaseTrack = new Track(database.getTrack_id(),database.getTitle(),database.getDuration(), + database.getPlaylists(),database.getUserLikes(),database.getUserDislikes(),database.getArtist(), + database.getAlbum()); //add user to track's list of users who like it - database.getUserDislikes().add(presentUser); - likeDislikeService.saveTrack(database); + databaseTrack.getUserDislikes().add(user.get()); + likeDislikeService.saveTrack(databaseTrack); } else //if it doesn't exist on our database already, we need to create it { //create new track with user on the list of users who like it - track.getUserDislikes().add(presentUser); - likeDislikeService.saveTrack(track); + //create artist object to persist + Artist artist = new Artist(track.getArtist().getName(),track.getArtist().getID(),track.getArtist().getImage_url()); + likeDislikeService.saveArtist(artist); + String albumRequest = "https://api.deezer.com/album/" + track.getAlbum().getID(); + String stringJsonAlbum = APIClientService.get(albumRequest); + Album resultAlbum = JSONStringToModelConverter.albumConverter(stringJsonAlbum); + Genre genre = new Genre(resultAlbum.getGenre().getGenreID(),resultAlbum.getGenre().getGenreName(),resultAlbum.getGenre().getImageURL()); + likeDislikeService.saveGenre(genre); + Album album = new Album(track.getAlbum().getID(),track.getAlbum().getAlbum_title(),track.getAlbum().getDate(), artist, genre); + likeDislikeService.saveAlbum(album); + Track newTrack = new Track(track.getTrack_id(),track.getTitle(),artist,album); + Album newAlbum = likeDislikeService.getAlbum(album.getID()); + Artist newArtist = likeDislikeService.getArtist(artist.getID()); + newArtist.getAlbums().add(album); + likeDislikeService.saveArtist(newArtist); + likeDislikeService.saveTrack(newTrack); + newAlbum.getTracks().add(newTrack); + likeDislikeService.saveAlbum(newAlbum); + newTrack.getUserDislikes().add(user.get()); + likeDislikeService.saveTrack(newTrack); } - //add track to user's liked list after either creating a new track or updating current one - presentUser.getDisliked_tracks().add(likeDislikeService.getTrack(track.getTrack_id())); - likeDislikeService.saveUser(presentUser); + //add track to user's disliked list after either creating a new track or updating current one + //we know the track exists because we just persisted it. + user.get().getDisliked_tracks().add(likeDislikeService.getTrack(track.getTrack_id())); + likeDislikeService.saveUser(user.get()); } else { @@ -103,26 +163,14 @@ public Track dislikeTrack(@RequestBody Track track, HttpServletResponse response return likeDislikeService.getTrack(track.getTrack_id()); } - @GetMapping(value="/track/ratio", produces = MediaType.APPLICATION_JSON_VALUE) + @GetMapping(value="/getRatio/{track_id}") @ResponseStatus(value=HttpStatus.OK) - public String likeDislikeRatio(@RequestBody Track track) - { - //get track id from the track that comes in - Integer id = track.getTrack_id(); - - //make sure it exists in our database, if it doesn't there are no likes or dislikes on it. - Track currentTrack = likeDislikeService.getTrack(id); - if(currentTrack == null) - { - //there is no like/dislike ratio because the track is not persisted in our database and therefore has no likes/dislikes - return "0/0"; - } - else - { - //count how many users are on both lists and then build a string that displays those numbers for the premium user - int trackLikes = currentTrack.getUserLikes().size(); - int trackDislikes = currentTrack.getUserDislikes().size(); - return "Likes: " + trackLikes + " Dislikes: " + trackDislikes; - } + public List getRatioByTrackId(@PathVariable ("track_id") Integer track_id){ + Integer likes = likeDislikeService.getTotalLikes(track_id); + Integer dislikes = likeDislikeService.getTotalDislikes(track_id); + List ratio = new LinkedList<>(); + ratio.add(likes); + ratio.add(dislikes); + return ratio; } } diff --git a/src/main/java/Application/models/Album.java b/src/main/java/Application/models/Album.java index 0af87e0..2ee898e 100644 --- a/src/main/java/Application/models/Album.java +++ b/src/main/java/Application/models/Album.java @@ -22,6 +22,16 @@ public Album() { tracks = new ArrayList<>(); } + public Album(Integer id, String albumTitle, String releaseDate, Artist artist, Genre genre) + { + this.ID = id; + this.albumTitle = albumTitle; + this.date = releaseDate; + this.artist = artist; + this.genre = genre; + this.tracks = new ArrayList<>(); + } + @Id @Column(name = "AlbumID") private Integer ID; diff --git a/src/main/java/Application/models/Track.java b/src/main/java/Application/models/Track.java index 11d230f..f9dfc68 100644 --- a/src/main/java/Application/models/Track.java +++ b/src/main/java/Application/models/Track.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; +import java.util.ArrayList; import java.util.List; @Table(name = "tracks") @@ -24,12 +25,37 @@ public Track() { public Track(Integer id, String title) { this.track_id = id; this.title = title; + this.userLikes = new ArrayList<>(); + this.userDislikes = new ArrayList<>(); } public Track(String title, String duration, Artist artist) { this.title = title; this.duration = duration; this.artist = artist; + this.userLikes = new ArrayList<>(); + this.userDislikes = new ArrayList<>(); + } + + public Track(Integer id, String title, Artist artist, Album album) + { + this.track_id = id; + this.title = title; + this.artist = artist; + this.album = album; + this.userLikes = new ArrayList<>(); + this.userDislikes = new ArrayList<>(); + } + + public Track(Integer track_id, String title, String duration, List playlists, List userLikes, List userDislikes, Artist artist, Album album) { + this.track_id = track_id; + this.title = title; + this.duration = duration; + this.playlists = playlists; + this.userLikes = userLikes; + this.userDislikes = userDislikes; + this.artist = artist; + this.album = album; } @Id diff --git a/src/main/java/Application/repositories/TrackRepository.java b/src/main/java/Application/repositories/TrackRepository.java index 54592ca..04ccf0f 100644 --- a/src/main/java/Application/repositories/TrackRepository.java +++ b/src/main/java/Application/repositories/TrackRepository.java @@ -2,8 +2,19 @@ import Application.models.Track; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; +import java.util.List; + @Repository public interface TrackRepository extends JpaRepository { + @Query(value = "select track_id from tracks where track_id=:id", nativeQuery = true) + List getTracksById(Integer id); + + @Query(value="select user_likes_userid from users_liked_tracks where liked_tracks_track_id=:track_id",nativeQuery = true) + List getLikesByTrackId(Integer track_id); + + @Query(value="select user_dislikes_userid from users_disliked_tracks where disliked_tracks_track_id=:track_id",nativeQuery = true) + List getDislikesByTrackId(Integer track_id); } diff --git a/src/main/java/Application/services/LikeDislikeService.java b/src/main/java/Application/services/LikeDislikeService.java index 82fba2a..4bfed9f 100644 --- a/src/main/java/Application/services/LikeDislikeService.java +++ b/src/main/java/Application/services/LikeDislikeService.java @@ -1,29 +1,39 @@ package Application.services; -import Application.models.Track; -import Application.models.User; -import Application.models.UserInfo; -import Application.repositories.TrackRepository; -import Application.repositories.UserInfoRepository; -import Application.repositories.UserRepository; +import Application.models.*; +import Application.repositories.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; import java.util.Optional; +/** + * TrackPlaylistService + * The middle man, or service, that connects to the persistence layer for everything relating to the like/dislike functionality for tracks. + * + * @date 11/9/21 + * @author Michael Reece + */ @Service @Transactional public class LikeDislikeService { private final TrackRepository trackRepository; private final UserRepository userRepository; private final UserInfoRepository userInfoRepository; + private final ArtistRepository artistRepository; + private final AlbumRepository albumRepository; + private final GenreRepository genreRepository; @Autowired - public LikeDislikeService(TrackRepository trackRepository, UserRepository userRepository, UserInfoRepository userInfoRepository){ + public LikeDislikeService(TrackRepository trackRepository, UserRepository userRepository, UserInfoRepository userInfoRepository, ArtistRepository artistRepository, AlbumRepository albumRepository, GenreRepository genreRepository){ this.trackRepository = trackRepository; this.userRepository = userRepository; this.userInfoRepository = userInfoRepository; + this.albumRepository = albumRepository; + this.artistRepository = artistRepository; + this.genreRepository = genreRepository; } public void saveTrack(Track track){ @@ -31,7 +41,43 @@ public void saveTrack(Track track){ } public Track getTrack(Integer id){ - return trackRepository.getById(id); + List getTracks = trackRepository.getTracksById(id); + if(getTracks.size() != 0) + { + return trackRepository.getById(getTracks.get((0))); + } + + return null; + } + + public void saveGenre(Genre genre) + { + genreRepository.save(genre); + } + + public Genre getGenre(Integer id) + { + return genreRepository.getById(id); + } + + public void saveArtist(Artist artist) + { + artistRepository.save(artist); + } + + public Artist getArtist(Integer id) + { + return artistRepository.getById(id); + } + + public void saveAlbum(Album album) + { + albumRepository.save(album); + } + + public Album getAlbum(Integer id) + { + return albumRepository.getById(id); } public void saveUser(User user) @@ -59,4 +105,12 @@ public Optional getUserByUsername(String username) } return Optional.empty(); } + + public Integer getTotalLikes(Integer track_id){ + return trackRepository.getLikesByTrackId(track_id).size(); + } + + public Integer getTotalDislikes(Integer track_id){ + return trackRepository.getDislikesByTrackId(track_id).size(); + } } diff --git a/src/main/java/Application/services/LoggerService.java b/src/main/java/Application/services/LoggerService.java index 0141527..4429817 100644 --- a/src/main/java/Application/services/LoggerService.java +++ b/src/main/java/Application/services/LoggerService.java @@ -19,26 +19,13 @@ public LoggerService(LoggerRepo repo) { } public void writeLog(String message, int level) { - Logger logger = new Logger(getCurrentDateTime(), formatLogEntry(message), level); - + Logger logger = new Logger(getCurrentDateTime(), message, level); + repo.save(logger); - } private String getCurrentDateTime() { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); return formatter.format(System.currentTimeMillis()); } - - private String formatLogEntry(String message){ - StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); - StringBuilder stackTrace = new StringBuilder(); - - for(StackTraceElement element : stackTraceElements) { - stackTrace.append("\n").append(element); - } - - - return String.format("[%s] %s%n", stackTrace, message); - } } diff --git a/src/main/java/Application/services/TrackPlaylistService.java b/src/main/java/Application/services/TrackPlaylistService.java index 43ae665..e0f3e50 100644 --- a/src/main/java/Application/services/TrackPlaylistService.java +++ b/src/main/java/Application/services/TrackPlaylistService.java @@ -5,12 +5,9 @@ import Application.repositories.PlaylistRepository; import Application.repositories.TrackRepository; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.util.List; - @Service @Transactional public class TrackPlaylistService { diff --git a/src/main/java/Application/utils/JWTUtil.java b/src/main/java/Application/utils/JWTUtil.java deleted file mode 100644 index 5bf274e..0000000 --- a/src/main/java/Application/utils/JWTUtil.java +++ /dev/null @@ -1,90 +0,0 @@ -package Application.utils; - -import Application.exceptions.AuthenticationException; -import Application.models.UserInfo; -import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jwts; -import io.jsonwebtoken.SignatureAlgorithm; -import io.jsonwebtoken.security.Keys; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.security.Key; -import java.sql.Date; - -/** - * JWTUtil - * Class used for the creation/parsing of JWTs - * @author Kollier Martin - * @date 11/1/2021 - */ -@Component -public class JWTUtil { - - @Value("${jwt.header}") - private String header; - - @Value("${jwt.prefix}") - private String prefix; - - @Value("#{24*60*60*1000}") - private int expiration; - - private Key key; - - public JWTUtil(){ - createKey(); - } - - private void createKey(){ - key = Keys.secretKeyFor(SignatureAlgorithm.HS256); - } - - public String createJWT(UserInfo userInfo){ - return Jwts.builder() - .setIssuer("Vanquish") - .setSubject(userInfo.getUsername()) - .signWith(key) - .setExpiration(new Date(System.currentTimeMillis() + expiration)) - .compact(); - } - - public Claims parseJWT(String token) throws AuthenticationException { - return Jwts.parserBuilder() // Creates parser instance - .setSigningKey(key) // Specify the key to verify this jws signature - .build() // Returns a new, thread-safe, parser - .parseClaimsJws(token) - .getBody(); - } - - public String getHeader() { - return header; - } - - public String getPrefix() { - return prefix; - } - - public int getExpiration() { - return expiration; - } - - public Key getKey() { - return key; - } - - @Override - public String toString() { - return "JWTUtil {\n" + - "header: " + header + ",\n" + - "prefix: " + prefix + ",\n" + - "expiration: " + expiration + ",\n" + - "key: " + key + ",\n" + - '}'; - } - - public void printVars(){ - System.out.println(this); - } -} - From 67b32809de68fe1c9e32fdaa02f9f8ca1c79e92e Mon Sep 17 00:00:00 2001 From: kollier-martin Date: Wed, 17 Nov 2021 17:10:09 -0500 Subject: [PATCH 9/9] Controller Changes Removed All JWTUtil and few stray comments --- .../controllers/AuthenticationController.java | 9 +- .../controllers/LikeDislikeController.java | 119 +++++++----------- 2 files changed, 51 insertions(+), 77 deletions(-) diff --git a/src/main/java/Application/controllers/AuthenticationController.java b/src/main/java/Application/controllers/AuthenticationController.java index 7ff0622..85626da 100644 --- a/src/main/java/Application/controllers/AuthenticationController.java +++ b/src/main/java/Application/controllers/AuthenticationController.java @@ -12,8 +12,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; - -import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.util.Optional; @@ -31,11 +29,10 @@ public class AuthenticationController { /** * Authenticate and Login User * @param credentials username and password - * @param response The HTTP Response * @return The new user and their key */ @PostMapping(value = "/login", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) - public UserInfo authenticate(@RequestBody LoginCredentialsDTO credentials, HttpServletResponse response) { + public UserInfo authenticate(@RequestBody LoginCredentialsDTO credentials) { Optional userInfo = userInfoService.authenticate(credentials.getUsername(), credentials.getPassword()); if (!userInfo.isPresent()){ @@ -57,7 +54,7 @@ public AuthenticationController(UserInfoService userInfoService, UserService use * @return The new registered User Data */ @PostMapping(value = "/register/basic", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) - public User registerBasicUser(@RequestBody @Valid UserRegistrationDTO regData, HttpServletResponse response){ + public User registerBasicUser(@RequestBody @Valid UserRegistrationDTO regData){ return userService.registerUser(regData, User.Role.BASIC); } @@ -67,7 +64,7 @@ public User registerBasicUser(@RequestBody @Valid UserRegistrationDTO regData, H * @return The new registered User Data */ @PostMapping(value = "/register/premium", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) - public User registerPremiumUser(@RequestBody @Valid UserRegistrationDTO regData, HttpServletResponse response){ + public User registerPremiumUser(@RequestBody @Valid UserRegistrationDTO regData){ return userService.registerUser(regData, User.Role.PREMIUM); } } diff --git a/src/main/java/Application/controllers/LikeDislikeController.java b/src/main/java/Application/controllers/LikeDislikeController.java index 0ff89c2..00feda2 100644 --- a/src/main/java/Application/controllers/LikeDislikeController.java +++ b/src/main/java/Application/controllers/LikeDislikeController.java @@ -1,17 +1,16 @@ package Application.controllers; import Application.deezer.JSONStringToModelConverter; +import Application.exceptions.UserDoesNotExistException; import Application.models.*; import Application.services.APIClientService; import Application.services.LikeDislikeService; -import Application.utils.JWTUtil; import org.json.JSONException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletRequest; import java.util.LinkedList; import java.util.List; import java.util.Optional; @@ -26,11 +25,10 @@ @RequestMapping(value = "/4TheMusic") public class LikeDislikeController { private final LikeDislikeService likeDislikeService; - private final JWTUtil jwtUtil; + private final String errMessage = "User with name %s does not exist!"; @Autowired - public LikeDislikeController(JWTUtil jwtUtil, LikeDislikeService likeDislikeService) { - this.jwtUtil = jwtUtil; + public LikeDislikeController(LikeDislikeService likeDislikeService) { this.likeDislikeService = likeDislikeService; } @@ -42,58 +40,29 @@ public LikeDislikeController(JWTUtil jwtUtil, LikeDislikeService likeDislikeServ */ @PostMapping(value = "/like/{currentUser}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(value = HttpStatus.OK) - public Track likeTrack(@RequestBody Track track,@PathVariable String currentUser,HttpServletRequest request) throws JSONException { - //get user from username + public Track likeTrack(@RequestBody Track track, @PathVariable String currentUser) throws JSONException { Optional user = likeDislikeService.getUserByUsername(currentUser); if(user.isPresent()) { - //if track exists on our database already, grab it from there to update Track database = likeDislikeService.getTrack(track.getTrack_id()); - if(database != null) - { - // public Track(Integer track_id, String title, String duration, List playlists, List userLikes, List userDislikes, Artist artist, Album album) + if(database != null) { Track databaseTrack = new Track(database.getTrack_id(),database.getTitle(),database.getDuration(), database.getPlaylists(),database.getUserLikes(),database.getUserDislikes(),database.getArtist(), database.getAlbum()); - //add user to track's list of users who like it + databaseTrack.getUserLikes().add(user.get()); likeDislikeService.saveTrack(databaseTrack); - } - else //if it doesn't exist on our database already, we need to create it - { - //create new track with user on the list of users who like it - //create artist object to persist - Artist artist = new Artist(track.getArtist().getName(),track.getArtist().getID(),track.getArtist().getImage_url()); - likeDislikeService.saveArtist(artist); - String albumRequest = "https://api.deezer.com/album/" + track.getAlbum().getID(); - String stringJsonAlbum = APIClientService.get(albumRequest); - Album resultAlbum = JSONStringToModelConverter.albumConverter(stringJsonAlbum); - Genre genre = new Genre(resultAlbum.getGenre().getGenreID(),resultAlbum.getGenre().getGenreName(),resultAlbum.getGenre().getImageURL()); - likeDislikeService.saveGenre(genre); - Album album = new Album(track.getAlbum().getID(),track.getAlbum().getAlbum_title(),track.getAlbum().getDate(), artist, genre); - likeDislikeService.saveAlbum(album); - Track newTrack = new Track(track.getTrack_id(),track.getTitle(),artist,album); - //System.out.println(newTrack.getTrack_id()); - Album newAlbum = likeDislikeService.getAlbum(album.getID()); - Artist newArtist = likeDislikeService.getArtist(artist.getID()); - newArtist.getAlbums().add(album); - likeDislikeService.saveArtist(newArtist); - likeDislikeService.saveTrack(newTrack); - newAlbum.getTracks().add(newTrack); - likeDislikeService.saveAlbum(newAlbum); - newTrack.getUserLikes().add(user.get()); - likeDislikeService.saveTrack(newTrack); + } else { + createNewArtist(track, user); } - //add track to user's liked list after either creating a new track or updating current one - //we know the track exists because we just persisted it. user.get().getLiked_tracks().add(likeDislikeService.getTrack(track.getTrack_id())); likeDislikeService.saveUser(user.get()); } else { - //throw userdoesnotexistexception + throw new UserDoesNotExistException(String.format(errMessage, currentUser)); } return likeDislikeService.getTrack(track.getTrack_id()); @@ -107,57 +76,31 @@ public Track likeTrack(@RequestBody Track track,@PathVariable String currentUser */ @PostMapping(value = "/dislike/{currentUser}", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(value = HttpStatus.OK) - public Track dislikeTrack(@RequestBody Track track,@PathVariable String currentUser,HttpServletRequest request) throws JSONException { - //get user from username + public Track dislikeTrack(@RequestBody Track track, @PathVariable String currentUser) throws JSONException { Optional user = likeDislikeService.getUserByUsername(currentUser); if(user.isPresent()) { - //if track exists on our database already, grab it from there to update Track database = likeDislikeService.getTrack(track.getTrack_id()); if(database != null) { - // public Track(Integer track_id, String title, String duration, List playlists, List userLikes, List userDislikes, Artist artist, Album album) Track databaseTrack = new Track(database.getTrack_id(),database.getTitle(),database.getDuration(), database.getPlaylists(),database.getUserLikes(),database.getUserDislikes(),database.getArtist(), database.getAlbum()); - //add user to track's list of users who like it + databaseTrack.getUserDislikes().add(user.get()); likeDislikeService.saveTrack(databaseTrack); } - else //if it doesn't exist on our database already, we need to create it - { - //create new track with user on the list of users who like it - //create artist object to persist - Artist artist = new Artist(track.getArtist().getName(),track.getArtist().getID(),track.getArtist().getImage_url()); - likeDislikeService.saveArtist(artist); - String albumRequest = "https://api.deezer.com/album/" + track.getAlbum().getID(); - String stringJsonAlbum = APIClientService.get(albumRequest); - Album resultAlbum = JSONStringToModelConverter.albumConverter(stringJsonAlbum); - Genre genre = new Genre(resultAlbum.getGenre().getGenreID(),resultAlbum.getGenre().getGenreName(),resultAlbum.getGenre().getImageURL()); - likeDislikeService.saveGenre(genre); - Album album = new Album(track.getAlbum().getID(),track.getAlbum().getAlbum_title(),track.getAlbum().getDate(), artist, genre); - likeDislikeService.saveAlbum(album); - Track newTrack = new Track(track.getTrack_id(),track.getTitle(),artist,album); - Album newAlbum = likeDislikeService.getAlbum(album.getID()); - Artist newArtist = likeDislikeService.getArtist(artist.getID()); - newArtist.getAlbums().add(album); - likeDislikeService.saveArtist(newArtist); - likeDislikeService.saveTrack(newTrack); - newAlbum.getTracks().add(newTrack); - likeDislikeService.saveAlbum(newAlbum); - newTrack.getUserDislikes().add(user.get()); - likeDislikeService.saveTrack(newTrack); + else { + createNewArtist(track, user); } - //add track to user's disliked list after either creating a new track or updating current one - //we know the track exists because we just persisted it. user.get().getDisliked_tracks().add(likeDislikeService.getTrack(track.getTrack_id())); likeDislikeService.saveUser(user.get()); } else { - //throw userdoesnotexistexception + throw new UserDoesNotExistException(String.format(errMessage, currentUser)); } return likeDislikeService.getTrack(track.getTrack_id()); @@ -168,9 +111,43 @@ public Track dislikeTrack(@RequestBody Track track,@PathVariable String currentU public List getRatioByTrackId(@PathVariable ("track_id") Integer track_id){ Integer likes = likeDislikeService.getTotalLikes(track_id); Integer dislikes = likeDislikeService.getTotalDislikes(track_id); + List ratio = new LinkedList<>(); + ratio.add(likes); ratio.add(dislikes); + return ratio; } + + private void createNewArtist(Track track, Optional user) throws JSONException { + String albumRequest = "https://api.deezer.com/album/" + track.getAlbum().getID(); + String stringJsonAlbum = APIClientService.get(albumRequest); + + Artist artist = new Artist(track.getArtist().getName(), track.getArtist().getID(), track.getArtist().getImage_url()); + likeDislikeService.saveArtist(artist); + + Album resultAlbum = JSONStringToModelConverter.albumConverter(stringJsonAlbum); + Genre genre = new Genre(resultAlbum.getGenre().getGenreID(),resultAlbum.getGenre().getGenreName(),resultAlbum.getGenre().getImageURL()); + likeDislikeService.saveGenre(genre); + + Album album = new Album(track.getAlbum().getID(),track.getAlbum().getAlbum_title(),track.getAlbum().getDate(), artist, genre); + likeDislikeService.saveAlbum(album); + + Track newTrack = new Track(track.getTrack_id(),track.getTitle(), artist,album); + + Album newAlbum = likeDislikeService.getAlbum(album.getID()); + + Artist newArtist = likeDislikeService.getArtist(artist.getID()); + newArtist.getAlbums().add(album); + likeDislikeService.saveArtist(newArtist); + + likeDislikeService.saveTrack(newTrack); + newAlbum.getTracks().add(newTrack); + + likeDislikeService.saveAlbum(newAlbum); + newTrack.getUserDislikes().add(user.get()); + + likeDislikeService.saveTrack(newTrack); + } }