diff --git a/.gitignore b/.gitignore index 780840c..450c0f4 100644 --- a/.gitignore +++ b/.gitignore @@ -19,12 +19,15 @@ *.tar.gz *.rar +<<<<<<< HEAD # Resources src/main/resources # Properties files *.properties +======= +>>>>>>> ce793d902e0374fe41c8edd9e05657e1adfc1a66 # IntelliJ \.idea @@ -33,3 +36,4 @@ hs_err_pid* # ignore any .properties files *.properties +/.jpb/ diff --git a/README.md b/README.md index 7b787a4..802f27d 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,11 @@ Team Vanquish Project 2 Implementation - [ ] Client/Server communication is done with JSON in HTTP request and response bodies. - [ ] All low-level persistence logic is abstracted away with Hibernate/Spring Data - [ ] Documentation (all classes and methods have adequate Javadoc comments) +<<<<<<< HEAD - [ ] All Exceptions are caught and logged to a file/database +======= +- [ ] All VanquishP2.Exceptions are caught and logged to a file/database +>>>>>>> ce793d902e0374fe41c8edd9e05657e1adfc1a66 - [ ] Data useful to the application is retrieved from a third party API - [ ] Adequate test coverage for the service-layer - [ ] DevOps CI/CD pipeline is used to build and deploy project to a publicly available remote location @@ -32,14 +36,24 @@ the users that like particular artists. * As a user, I can add or remove songs from a playlist. * As a user, I can rate a song with a like or dislike. * As a user, I can look up an album and see what songs are on it. +<<<<<<< HEAD * As a user, I can look up an artist and see a list of their top 5 songs. * As a premium user, I can schedule a concert. * As a premium user, I can cancel a concert. +======= +* As a user, I can look up an artist and see a [limited] list of their songs. +* As a premium user, I can schedule a concert. +* As a premium user, I can cancel a concert. +* As a premium user, I can see a list of liked songs for a user. +>>>>>>> ce793d902e0374fe41c8edd9e05657e1adfc1a66 * As a premium user, I can see a like/dislike ratio for a particular song. ### Bonus Stories * As a user, I can view a list of users who like the same songs. +<<<<<<< HEAD * As a premium user, I can see a list of liked songs for a user. +======= +>>>>>>> ce793d902e0374fe41c8edd9e05657e1adfc1a66 * As a premium user, I can see a like/dislike ratio for an entire artist. ## Tech Stack diff --git a/pom.xml b/pom.xml index 7a6587d..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,15 +17,44 @@ 1.8 + - - javax.servlet - javax.servlet-api - 4.0.1 + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-validation + 2.5.5 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-tomcat + 2.5.5 provided + + org.springframework.boot + spring-boot-starter-test + test + + + + com.vaadin.external.google + android-json + 0.0.20131108.vaadin1 + compile + + com.fasterxml.jackson.core @@ -54,97 +83,63 @@ 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 + io.jsonwebtoken + jjwt-api + 0.11.2 - - org.springframework.boot - spring-boot-starter-data-jpa - 2.5.5 + io.jsonwebtoken + jjwt-impl + 0.11.2 + runtime - - org.springframework.boot - spring-boot-starter-validation - 2.5.5 + io.jsonwebtoken + jjwt-jackson + 0.11.2 + runtime - + - org.springframework.boot - spring-boot-starter-web - 2.5.5 + org.mockito + mockito-core + 4.0.0 - - - - - - - - - - - org.springframework.boot - spring-boot-starter-test - 2.5.5 - test - + - com.vaadin.external.google - android-json - 0.0.20131108.vaadin1 - compile + com.h2database + h2 + 1.4.200 - - org.springframework.boot - spring-boot-starter-data-jpa - - com.squareup.okhttp3 okhttp 4.9.2 - - junit - junit - test - + + junit + junit + 4.13.2 + test + - + org.springframework.boot spring-boot-maven-plugin - - + \ No newline at end of file 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 8ffc9d6..b649502 100644 --- a/src/main/java/Application/P2Application.java +++ b/src/main/java/Application/P2Application.java @@ -1,23 +1,11 @@ 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; -import org.springframework.context.ConfigurableApplicationContext; 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") @@ -25,15 +13,6 @@ 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()); - } + SpringApplication.run(P2Application.class, args); } } diff --git a/src/main/java/Application/ServletInitializer.java b/src/main/java/Application/ServletInitializer.java index 31c43b5..ca9925f 100644 --- a/src/main/java/Application/ServletInitializer.java +++ b/src/main/java/Application/ServletInitializer.java @@ -4,10 +4,8 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; public class ServletInitializer extends SpringBootServletInitializer { - - @Override - protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { - return application.sources(P2Application.class); - } - -} + @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 new file mode 100644 index 0000000..150b989 --- /dev/null +++ b/src/main/java/Application/aspects/LoggerAspect.java @@ -0,0 +1,52 @@ +package Application.aspects; + +import Application.services.LoggerService; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +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; + +/** + * 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.*.*) && !within(Application.filters..*) && !within(Application.configs..*)") + public void logAll() { + + } + + @Around("within(Application.*.*) && !within(Application.filters..*) && !within(Application.configs..*)") + 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/Application/configs/FilterConfig.java b/src/main/java/Application/configs/FilterConfig.java new file mode 100644 index 0000000..31480f9 --- /dev/null +++ b/src/main/java/Application/configs/FilterConfig.java @@ -0,0 +1,20 @@ +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/controllers/AlbumController.java b/src/main/java/Application/controllers/AlbumController.java index 2d7656e..3b429fa 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; @@ -12,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 @@ -106,7 +105,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/AuthenticationController.java b/src/main/java/Application/controllers/AuthenticationController.java index 14d9b77..85626da 100644 --- a/src/main/java/Application/controllers/AuthenticationController.java +++ b/src/main/java/Application/controllers/AuthenticationController.java @@ -2,18 +2,16 @@ 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; 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; @@ -25,47 +23,39 @@ @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 - * @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()) { - 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 * @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){ - User user = userService.registerUser(regData, User.Role.BASIC); - String jwt = jwtUtil.createJWT(user.getUserInfo()); - response.setHeader(jwtUtil.getHeader(), jwt); - return user; + public User registerBasicUser(@RequestBody @Valid UserRegistrationDTO regData){ + return userService.registerUser(regData, User.Role.BASIC); } /** @@ -74,11 +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){ - 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; + 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 623b638..00feda2 100644 --- a/src/main/java/Application/controllers/LikeDislikeController.java +++ b/src/main/java/Application/controllers/LikeDislikeController.java @@ -1,128 +1,153 @@ package Application.controllers; +import Application.deezer.JSONStringToModelConverter; import Application.exceptions.UserDoesNotExistException; -import Application.models.Track; -import Application.models.User; +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 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 { 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; } - @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(); - - //get user from username - Optional user = likeDislikeService.getUserByUsername(username); + public Track likeTrack(@RequestBody Track track, @PathVariable String currentUser) throws JSONException { + 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) - { - //add user to track's list of users who like it - database.getUserLikes().add(presentUser); - likeDislikeService.saveTrack(database); - } - 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); + if(database != null) { + Track databaseTrack = new Track(database.getTrack_id(),database.getTitle(),database.getDuration(), + database.getPlaylists(),database.getUserLikes(),database.getUserDislikes(),database.getArtist(), + database.getAlbum()); + + databaseTrack.getUserLikes().add(user.get()); + likeDislikeService.saveTrack(databaseTrack); + } else { + createNewArtist(track, user); } - //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); + 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()); } - @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(); - - //get user from username - Optional user = likeDislikeService.getUserByUsername(username); + public Track dislikeTrack(@RequestBody Track track, @PathVariable String currentUser) throws JSONException { + 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) { - //add user to track's list of users who like it - database.getUserDislikes().add(presentUser); - likeDislikeService.saveTrack(database); + Track databaseTrack = new Track(database.getTrack_id(),database.getTitle(),database.getDuration(), + database.getPlaylists(),database.getUserLikes(),database.getUserDislikes(),database.getArtist(), + database.getAlbum()); + + 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); + else { + createNewArtist(track, user); } - //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); + 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()); } - @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; + } + + 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); } } 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/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); - } - } -} 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); - } -} - 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/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/src/test/java/UserDBTest.java b/src/test/java/UserDBTest.java new file mode 100644 index 0000000..fbc959c --- /dev/null +++ b/src/test/java/UserDBTest.java @@ -0,0 +1,67 @@ +import Application.DTOs.UserRegistrationDTO; +import Application.P2Application; +import Application.models.User; +import Application.models.UserInfo; +import Application.repositories.LocationRepository; +import Application.repositories.UserInfoRepository; +import Application.repositories.UserRepository; +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.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +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())); + } +} + + + +