From 05819283f5d6016581958202ebfdb210050f9135 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Fri, 29 Oct 2021 11:01:19 -0400 Subject: [PATCH 01/27] Update README.md --- README.md | 42 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/README.md b/README.md index cb635d7..b31a202 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,44 @@ # Vanquish-P2 Team Vanquish Project 2 Implementation + +### Minimum Requirements +1. Proper use of OOP principles and a well layered application structure +2. Users are interfacing with an advanced UI built with Angular running in a browser +4. CRUD operations are supported for one or more domain objects via the web application's API endpoints +5. Client/Server communication is done with JSON in HTTP request and response bodies. +6. All low-level persistence logic is abstracted away with Hibernate/Spring Data +7. Documentation (all classes and methods have adequate Javadoc comments) +8. All Exceptions are caught and logged to a file +9. Data useful to the application is retrieved from a third party API +10. Adequate test coverage for the service-layer +11. DevOps CI/CD pipeline is used to build and deploy project to a publicly available remote location + + +## -- App Name Here -- +You will need to write a small paragraph describing your application. It should be 4-6 sentences and briefly cover the important points and features. + +### Minimum Viable Product +Your team will need to work with the trainer to come up with a satisfactory list of user stories for MVP as well as bonus stories. They should begin with "As a [stakeholder] I can... and describe what the user should be able to do. Aim for at least 2 different roles, user and administrator. Try to come up with 8 or so user stories for MVP. Carefully consider what your team can accomplish in 3 weeks and try not to set yourselves too great a task. + +* As a user, I can see... +* As a user, I can purchase... +* As a user, I can check... +* As an administrator, I can schedule... +* As an administrator, I can cancel... +* As an administrator, I can view... + +### Bonus Stories +* As an administrator, I can... + +## Tech Stack +You should be employing the following technologies in your project. + - Java 8 + - JavaScript/TypeScript + - HTML & CSS + - Angular 4 + - Apache Maven for dependencies and project management + - Git & Github for version control + - MariaDB deployed on AWS RDS for data persistence + - Hibernate/Spring Data to abstract away JDBC code + - AWS EC2, ElasticBeanstalk, S3, CodeBuild, CodePipeline for CI/CD pipeline + - Spring Boot From e8ba3b453e5cfcb092c1435ac70f32bd27480bc8 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Fri, 29 Oct 2021 11:02:42 -0400 Subject: [PATCH 02/27] Update README.md --- README.md | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index b31a202..de42319 100644 --- a/README.md +++ b/README.md @@ -2,16 +2,17 @@ Team Vanquish Project 2 Implementation ### Minimum Requirements -1. Proper use of OOP principles and a well layered application structure -2. Users are interfacing with an advanced UI built with Angular running in a browser -4. CRUD operations are supported for one or more domain objects via the web application's API endpoints -5. Client/Server communication is done with JSON in HTTP request and response bodies. -6. All low-level persistence logic is abstracted away with Hibernate/Spring Data -7. Documentation (all classes and methods have adequate Javadoc comments) -8. All Exceptions are caught and logged to a file -9. Data useful to the application is retrieved from a third party API -10. Adequate test coverage for the service-layer -11. DevOps CI/CD pipeline is used to build and deploy project to a publicly available remote location +- [] Proper use of OOP principles and a well layered application structure +- [] Users are interfacing with an advanced UI built with Angular running in a browser +- [] CRUD operations are supported for one or more domain objects via the web application's API endpoints +- [] Client/Server communication is done with JSON in HTTP request and response bodies. +- [] 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) +- [] All Exceptions are caught and logged to a file +- [] 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 ## -- App Name Here -- From 374258925e8d32436404390131076aacfb74f223 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Fri, 29 Oct 2021 11:03:18 -0400 Subject: [PATCH 03/27] Update README.md --- README.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index de42319..4cf1f23 100644 --- a/README.md +++ b/README.md @@ -2,17 +2,17 @@ Team Vanquish Project 2 Implementation ### Minimum Requirements -- [] Proper use of OOP principles and a well layered application structure -- [] Users are interfacing with an advanced UI built with Angular running in a browser -- [] CRUD operations are supported for one or more domain objects via the web application's API endpoints -- [] Client/Server communication is done with JSON in HTTP request and response bodies. -- [] 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) -- [] All Exceptions are caught and logged to a file -- [] 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 +- [ ] Proper use of OOP principles and a well layered application structure +- [ ] Users are interfacing with an advanced UI built with Angular running in a browser +- [ ] CRUD operations are supported for one or more domain objects via the web application's API endpoints +- [ ] Client/Server communication is done with JSON in HTTP request and response bodies. +- [ ] 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) +- [ ] All Exceptions are caught and logged to a file +- [ ] 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 ## -- App Name Here -- From 8d862ef58946081ce13bf7d94e7087ddd3a062d6 Mon Sep 17 00:00:00 2001 From: kollier-martin Date: Fri, 29 Oct 2021 13:17:17 -0400 Subject: [PATCH 04/27] Utils and Servlets push for early setup --- src/beans.xml | 6 ++ src/main/java/Servlets/HelloServlet.java | 30 ++++++++++ src/main/java/Servlets/PingServlet.java | 36 +++++++++++ src/main/java/Util/CORSFilter.java | 60 +++++++++++++++++++ .../java/Util/DependencyLoaderListener.java | 26 ++++++++ src/main/java/Util/JWTUtil.java | 45 ++++++++++++++ src/main/java/Util/RequestArgChecker.java | 55 +++++++++++++++++ src/main/java/Util/ServiceRequests.java | 49 +++++++++++++++ src/main/resources/application.properties | 7 ++- 9 files changed, 313 insertions(+), 1 deletion(-) create mode 100644 src/beans.xml create mode 100644 src/main/java/Servlets/HelloServlet.java create mode 100644 src/main/java/Servlets/PingServlet.java create mode 100644 src/main/java/Util/CORSFilter.java create mode 100644 src/main/java/Util/DependencyLoaderListener.java create mode 100644 src/main/java/Util/JWTUtil.java create mode 100644 src/main/java/Util/RequestArgChecker.java create mode 100644 src/main/java/Util/ServiceRequests.java diff --git a/src/beans.xml b/src/beans.xml new file mode 100644 index 0000000..142def2 --- /dev/null +++ b/src/beans.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/src/main/java/Servlets/HelloServlet.java b/src/main/java/Servlets/HelloServlet.java new file mode 100644 index 0000000..4e94bc2 --- /dev/null +++ b/src/main/java/Servlets/HelloServlet.java @@ -0,0 +1,30 @@ +package Servlets; + +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +@WebServlet(name = "HelloServlet", value = "/hello") +public class HelloServlet extends HttpServlet { + private String message; + + public void init() { + message = "Hello World!"; + } + + public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + response.setContentType("text/html"); + + // Hello + PrintWriter out = response.getWriter(); + out.println(""); + out.println("

" + message + "

"); + out.println(""); + } + + public void destroy() { + } +} \ No newline at end of file diff --git a/src/main/java/Servlets/PingServlet.java b/src/main/java/Servlets/PingServlet.java new file mode 100644 index 0000000..1098b6c --- /dev/null +++ b/src/main/java/Servlets/PingServlet.java @@ -0,0 +1,36 @@ +package Servlets; + +import org.json.JSONException; +import org.json.JSONObject; + +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(name = "PingServlet", value = "/ping") +public class PingServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + System.out.println(request.getRequestURI()); + response.setStatus(202); + response.setContentType("application/json"); + + JSONObject jObj = new JSONObject(); + + try { + jObj.put("response", "Pong!"); + } catch (JSONException e) { + e.printStackTrace(); + } + + response.getWriter().print(jObj); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + } +} diff --git a/src/main/java/Util/CORSFilter.java b/src/main/java/Util/CORSFilter.java new file mode 100644 index 0000000..1f1cf64 --- /dev/null +++ b/src/main/java/Util/CORSFilter.java @@ -0,0 +1,60 @@ +package Util; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class CORSFilter implements Filter { + + /** + * Default constructor. + */ + public CORSFilter() { + // TODO Auto-generated constructor stub + } + + /** + * @see Filter#init(FilterConfig) + */ + @Override + public void init(FilterConfig fConfig) throws ServletException { + // TODO Auto-generated method stub + } + + /** + * @see Filter#destroy() + */ + @Override + public void destroy() { + // TODO Auto-generated method stub + } + + + + /** + * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) + */ + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) + throws IOException, ServletException { + + HttpServletRequest request = (HttpServletRequest) servletRequest; + System.out.println("CORSFilter HTTP Request: " + request.getMethod()); + + // Authorize (allow) all domains to consume the content + ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Origin", "*"); + ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Methods","*"); + ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Headers","*"); + + HttpServletResponse resp = (HttpServletResponse) servletResponse; + + // For HTTP OPTIONS verb/method reply with ACCEPTED status code -- per CORS handshake + if (request.getMethod().equals("OPTIONS")) { + resp.setStatus(HttpServletResponse.SC_ACCEPTED); + return; + } + + // pass the request along the filter chain + chain.doFilter(request, servletResponse); + } +} \ No newline at end of file diff --git a/src/main/java/Util/DependencyLoaderListener.java b/src/main/java/Util/DependencyLoaderListener.java new file mode 100644 index 0000000..3cc1f4b --- /dev/null +++ b/src/main/java/Util/DependencyLoaderListener.java @@ -0,0 +1,26 @@ +package Util; + +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; +import javax.servlet.annotation.WebListener; + +/** + * This class is tied to the startup and shutdown of tomcat. Just implement + * the ServletContextListener and put whatever logic into the overridden + * methods. Make sure you inform tomcat of this class by including it + * in your deployment descriptor (web.xml) under the listener tag. + */ +@WebListener +public class DependencyLoaderListener implements ServletContextListener { + @Override + public void contextInitialized(ServletContextEvent sce) { + System.out.println("Initializing Listener..."); + } + + @Override + public void contextDestroyed(ServletContextEvent sce) { + System.out.println("Closing Listener..."); + ServiceRequests.writeSummary(); + } +} + diff --git a/src/main/java/Util/JWTUtil.java b/src/main/java/Util/JWTUtil.java new file mode 100644 index 0000000..1217707 --- /dev/null +++ b/src/main/java/Util/JWTUtil.java @@ -0,0 +1,45 @@ +package Util; + +import io.jsonwebtoken.*; +import io.jsonwebtoken.security.Keys; + +import javax.servlet.http.HttpServletRequest; +import java.security.Key; + +public class JWTUtil { + private static Key key; + + private static void createKey(){ + key = Keys.secretKeyFor(SignatureAlgorithm.HS256); + } + + public static String createJWT(HttpServletRequest request){ + createKey(); + + // Build the java web token + String jwt = Jwts.builder().setIssuer(request.getRequestURL().toString()) + .setSubject(request.getParameter("username")) + .signWith(key) + .compact(); + + return jwt; + } + + public static boolean parseJWT(String jwsString) { + boolean parsed = false; + + try { + Jws jws = Jwts.parserBuilder() // Creates parser instance + .setSigningKey(key) // Specify the key to verify this jws signature + .build() // Returns a new, thread-safe, parser + .parseClaimsJws(jwsString); // Parse the jws and return the original jws + + parsed = true; + }catch (JwtException e){ + // JWT is invalid + e.printStackTrace(); + } + + return parsed; + } +} diff --git a/src/main/java/Util/RequestArgChecker.java b/src/main/java/Util/RequestArgChecker.java new file mode 100644 index 0000000..c6a9849 --- /dev/null +++ b/src/main/java/Util/RequestArgChecker.java @@ -0,0 +1,55 @@ +package Util; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Enumeration; + +public class RequestArgChecker { + private static String paramName, paramValue; + private static String[] paramValues; + private static Enumeration parameterNames; + + public static String[] handleRequest(HttpServletRequest req, HttpServletResponse res) throws IOException { + String[] parameterAndArg = new String[2]; + parameterNames = req.getParameterNames(); + + while (parameterNames.hasMoreElements()) { + + paramName = parameterNames.nextElement(); + parameterAndArg[0] = paramName; + + paramValues = req.getParameterValues(paramName); + + if(paramValues.length > 1) { + for (String value : paramValues) { + paramValue = value; + System.out.println(paramValue); + } + } else { + parameterAndArg[1] = paramValues[0]; + } + } + + return parameterAndArg; + } + + public static void printRequestParam(HttpServletRequest req, HttpServletResponse res) throws IOException{ + res.setContentType("text/plain"); + + Enumeration parameterNames = req.getParameterNames(); + + while (parameterNames.hasMoreElements()) { + + String paramName = parameterNames.nextElement(); + System.out.println(paramName); + + String[] paramValues = req.getParameterValues(paramName); + for (int i = 0; i < paramValues.length; i++) { + String paramValue = paramValues[i]; + System.out.println(paramValue); + } + + } + } +} diff --git a/src/main/java/Util/ServiceRequests.java b/src/main/java/Util/ServiceRequests.java new file mode 100644 index 0000000..e867e34 --- /dev/null +++ b/src/main/java/Util/ServiceRequests.java @@ -0,0 +1,49 @@ +package Util; + +import Logging.MyLogger; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +/** + * This class is used to record every request made in a single session. + */ +public abstract class ServiceRequests { + // The request count for this session + private static int requestCount = 0; + private static ArrayList requestLog = new ArrayList<>(); + + public static void writeSummary(){ + SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z"); + Date date = new Date(System.currentTimeMillis()); + + try{ + File file = new File("D:\\Programming Files\\Revature\\Erika-Kollier\\src\\main\\resources\\logs\\requestLog.log"); + FileWriter fileWriter = new FileWriter(file); + BufferedWriter out = new BufferedWriter(fileWriter); + + out.write("There were " + requestCount + " requests in session: " + formatter.format(date)); + out.newLine(); + for (String request : requestLog) { + out.write(request); + out.newLine(); + } + + System.out.println("Request Summary has been written to designated to file."); + } catch (IOException e) { + MyLogger.getMyLogger().writeLog(e.toString(), 3); + } + } + + public static void addRequest(String requestInfo, Date date){ + SimpleDateFormat formatter= new SimpleDateFormat("HH:mm:ss z"); + + requestCount++; + requestLog.add(requestInfo + " " + formatter.format(date)); + } +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8b13789..81ab613 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1 +1,6 @@ - +# Spring DB Information +spring.datasource.url=jdbc:mariadb://practice.cnybvnomlu5g.us-east-2.rds.amazonaws.com:3306/Project2?useSSL=false +spring.datasource.driver-class-name=org.mariadb.jdbc.Driver +spring.datasource.username=admin +spring.datasource.password=bTf598GbSauZ +spring.jpa.database-platform=org.hibernate.dialect.MariaDB From a658d288f9af79c72f5f143f3d03adaa668e7518 Mon Sep 17 00:00:00 2001 From: kollier-martin Date: Fri, 29 Oct 2021 14:01:22 -0400 Subject: [PATCH 05/27] Hiccup --- .gitignore | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0276604..efac0e9 100644 --- a/.gitignore +++ b/.gitignore @@ -20,7 +20,7 @@ *.rar # Resources -# src/main/resources +src/main/resources # IntelliJ \.idea From 0f5992f3bd34a61780c99ea2df36dec37984c6f2 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Fri, 29 Oct 2021 14:03:48 -0400 Subject: [PATCH 06/27] Delete src/main/resources directory --- src/main/resources/application.properties | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 src/main/resources/application.properties diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 81ab613..0000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1,6 +0,0 @@ -# Spring DB Information -spring.datasource.url=jdbc:mariadb://practice.cnybvnomlu5g.us-east-2.rds.amazonaws.com:3306/Project2?useSSL=false -spring.datasource.driver-class-name=org.mariadb.jdbc.Driver -spring.datasource.username=admin -spring.datasource.password=bTf598GbSauZ -spring.jpa.database-platform=org.hibernate.dialect.MariaDB From 7ea238faae07eb13c2a5ceea0c6bc01380dbd6ed Mon Sep 17 00:00:00 2001 From: kollier-martin Date: Fri, 29 Oct 2021 18:04:46 -0400 Subject: [PATCH 07/27] CredentialValidator: Regex for account creation. Can be used on both frontend and backend User, UserInfo (Optional Separate or Together) - Need to create Role class UserService and Controller classes created for understanding and implementation WebConfig for CORSFilter Data Generators and Data classes created for quick DB population --- pom.xml | 6 ++ src/main/java/Configs/PersistenceConfig.java | 21 ++++++ src/main/java/Configs/WebConfig.java | 17 +++++ .../java/Controllers/HelloController.java | 24 +++++++ src/main/java/Controllers/PingController.java | 24 +++++++ src/main/java/Controllers/UserController.java | 19 +++++ src/main/java/DataGenerators/DataLists.java | 70 ++++++++++++++++++ src/main/java/DataGenerators/UserGen.java | 34 +++++++++ src/main/java/Models/User.java | 72 +++++++++++++++++++ src/main/java/Models/UserInfo.java | 54 ++++++++++++++ src/main/java/Services/UserService.java | 66 +++++++++++++++++ src/main/java/Util/CORSFilter.java | 60 ---------------- src/main/java/Util/CredentialValidator.java | 31 ++++++++ .../java/Util/DependencyLoaderListener.java | 1 + .../EmailValidatorTest.java | 7 ++ .../PasswordValidatorTest.java | 4 ++ .../UsernameValidatorTest.java | 4 ++ 17 files changed, 454 insertions(+), 60 deletions(-) create mode 100644 src/main/java/Configs/PersistenceConfig.java create mode 100644 src/main/java/Configs/WebConfig.java create mode 100644 src/main/java/Controllers/HelloController.java create mode 100644 src/main/java/Controllers/PingController.java create mode 100644 src/main/java/Controllers/UserController.java create mode 100644 src/main/java/DataGenerators/DataLists.java create mode 100644 src/main/java/DataGenerators/UserGen.java create mode 100644 src/main/java/Models/User.java create mode 100644 src/main/java/Models/UserInfo.java create mode 100644 src/main/java/Services/UserService.java delete mode 100644 src/main/java/Util/CORSFilter.java create mode 100644 src/main/java/Util/CredentialValidator.java create mode 100644 src/test/java/UserRegistrationTests/EmailValidatorTest.java create mode 100644 src/test/java/UserRegistrationTests/PasswordValidatorTest.java create mode 100644 src/test/java/UserRegistrationTests/UsernameValidatorTest.java diff --git a/pom.xml b/pom.xml index 33fd8cc..a16d801 100644 --- a/pom.xml +++ b/pom.xml @@ -46,6 +46,12 @@ spring-boot-starter-test test + + com.vaadin.external.google + android-json + 0.0.20131108.vaadin1 + compile + diff --git a/src/main/java/Configs/PersistenceConfig.java b/src/main/java/Configs/PersistenceConfig.java new file mode 100644 index 0000000..128695f --- /dev/null +++ b/src/main/java/Configs/PersistenceConfig.java @@ -0,0 +1,21 @@ +package Configs; + +/** + * DB Persistence Configuration + * + * @description This class contains all the session information for Hibernate to function + * within Spring + * @date 10/29/2021 + * @author Vanquish + */ + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@Configuration +@EnableTransactionManagement +public class PersistenceConfig { + // Hibernate Variables + // @Value("") +} diff --git a/src/main/java/Configs/WebConfig.java b/src/main/java/Configs/WebConfig.java new file mode 100644 index 0000000..2c79ff7 --- /dev/null +++ b/src/main/java/Configs/WebConfig.java @@ -0,0 +1,17 @@ +package Configs; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH") + .allowedHeaders("*") + .allowedOrigins("*"); + } +} diff --git a/src/main/java/Controllers/HelloController.java b/src/main/java/Controllers/HelloController.java new file mode 100644 index 0000000..4672f25 --- /dev/null +++ b/src/main/java/Controllers/HelloController.java @@ -0,0 +1,24 @@ +package Controllers; + +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping(name = "HelloServlet", value = "/hello") +public class HelloController { + JSONObject jObj = new JSONObject(); + + @CrossOrigin + public String helloWorld(){ + try { + jObj.put("Response", "Hello World!"); + } catch (JSONException e) { + e.printStackTrace(); + } + + return jObj.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/Controllers/PingController.java b/src/main/java/Controllers/PingController.java new file mode 100644 index 0000000..6ddcd62 --- /dev/null +++ b/src/main/java/Controllers/PingController.java @@ -0,0 +1,24 @@ +package Controllers; + +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping(name = "PingServlet", value = "/ping") +public class PingController { + JSONObject jObj = new JSONObject(); + + @CrossOrigin + public String pong(){ + try { + jObj.put("Response", "pong!"); + } catch (JSONException e) { + e.printStackTrace(); + } + + return jObj.toString(); + } +} diff --git a/src/main/java/Controllers/UserController.java b/src/main/java/Controllers/UserController.java new file mode 100644 index 0000000..736512f --- /dev/null +++ b/src/main/java/Controllers/UserController.java @@ -0,0 +1,19 @@ +package Controllers; + +import Models.User; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/user") +public class UserController { + @CrossOrigin + @GetMapping("/{id}") + public User retrieve(@PathVariable int id) { + User user = null; + + // User with this ID + // Query query = getSession().createQuery("from User where ID = :id", User.class); + + return user; + } +} diff --git a/src/main/java/DataGenerators/DataLists.java b/src/main/java/DataGenerators/DataLists.java new file mode 100644 index 0000000..cc338d7 --- /dev/null +++ b/src/main/java/DataGenerators/DataLists.java @@ -0,0 +1,70 @@ +package DataGenerators; + +public class DataLists { + static String[] names = { + "Chace", "Nielsen", + "Leticia", "Allen", + "Lyric", "Branch", + "Cooper", "Malone", + "Kasen", "Hardy", + "Keira", "Poole", + "Braedon", "Wood", + "Porter", "Gentry", + "Augustus", "James", + "Rodolfo", "Patton", + "Iyana", "Berry", + "Dawson", "Sheppard"}; + + static String[] passwords = { + "solo", "variable", + "treaty", "dismissal", + "possible", "quarrel", + "challenge", "compact", + "partner", "disorder", + "medieval", "soil", + "snuggle", "quotation", + "lamb", "accurate", + "embarrassment", "standard", + "investment", "low", + "include", "hay", + "opponent", "idempotent" + }; + + static String[] usernames = { + "Aireril", "Alisomet", + "Anostung", "Aspenbo", + "AuthorPlatinum", "Astroboy", + "Bigg2free", "Bookwood", + "Bucklippe", "Chwiredu", + "Clubbieli", "Conveonsu", + "FreshTary", "HiVibrant", + "Katrien", "Leadessl", + "Litachet", "Manpsler", + "MoLight", "Nonpactel", + "Onitypema", "Perachet", + "Pherietm", "Puffro" + }; + + static String[] emails = { + "andre.kling@mills.com", + "gayle.turcotte@connelly.biz", + "adelbert.bauch@reilly.com", + "jerel.von@dach.biz", + "qtillman@krajcik.com", + "joyce.wuckert@mayert.com", + "tillman03@terry.com", + "jeremie.altenwerth@yahoo.com", + "pemmerich@yahoo.com", + "gpouros@hessel.biz", + "percy.jaskolski@hotmail.com", + "apaucek@hotmail.com", + "hessel.gideon@yahoo.com", + "sydney31@nolan.org", + "freda.tromp@hotmail.com", + "leonie.lemke@maggio.com", + "agustina50@hotmail.com", + "graham.bertha@hotmail.com", + "alessandra68@kuphal.com", + "mraz.cory@yahoo.com" +}; +} diff --git a/src/main/java/DataGenerators/UserGen.java b/src/main/java/DataGenerators/UserGen.java new file mode 100644 index 0000000..1b600ce --- /dev/null +++ b/src/main/java/DataGenerators/UserGen.java @@ -0,0 +1,34 @@ +package DataGenerators; + +import java.util.Random; + +import static DataGenerators.DataLists.*; + +public class UserGen { + private static Random rand = new Random(); + + public static String getAFirstName() { + int index = rand.nextInt(names.length); + return names[index]; + } + + public static String getALastName() { + int index = rand.nextInt(names.length); + return names[index]; + } + + public static String getAPassword() { + int index = rand.nextInt(passwords.length); + return passwords[index]; + } + + public static String getAUsername() { + int index = rand.nextInt(usernames.length); + return usernames[index]; + } + + public static String getAEmail() { + int index = rand.nextInt(emails.length); + return emails[index]; + } +} diff --git a/src/main/java/Models/User.java b/src/main/java/Models/User.java new file mode 100644 index 0000000..093e347 --- /dev/null +++ b/src/main/java/Models/User.java @@ -0,0 +1,72 @@ +package Models; + +import javax.persistence.*; + +@Table(name = "USERS") +@Entity +public class User { + public User() { + } + + public User(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + } + + @Id + @Column(name = "USER_ID") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int ID; + public int getID() { + return ID; + } + public void setID(int ID) { + this.ID = ID; + } + + @Column(name = "FIRST_NAME") + private String firstName; + public String getFirstName() { + return firstName; + } + public void setFirstName(String username) { + this.firstName = username; + } + + @Column(name = "LAST_NAME") + private String lastName; + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + + @Column(name = "EMAIL") + private String email; + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "User {\n" + + "\tID: " + ID + "\n" + + "\tfirstName: " + firstName + '\n' + + "\tlastName: " + lastName + '\n' + + "\temail: " + email + '\n' + + '}'; + } + + @OneToOne + private UserInfo userInfo; + public UserInfo getUserInfo() { + return userInfo; + } + public void setUserInfo(UserInfo userInfo) { + this.userInfo = userInfo; + } +} diff --git a/src/main/java/Models/UserInfo.java b/src/main/java/Models/UserInfo.java new file mode 100644 index 0000000..935671f --- /dev/null +++ b/src/main/java/Models/UserInfo.java @@ -0,0 +1,54 @@ +package Models; + +import javax.persistence.*; + +@Entity +@Table(name = "USER_INFO") +public class UserInfo { + public UserInfo() { + + } + + public UserInfo(String username, String password, String email) { + this.username = username; + this.password = password; + this.email = email; + } + + @Id + @Column(name = "USERNAME") + private String username; + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + + @Column(name = "PASSWORD", nullable = false) + private String password; + public String getPassword(){ + return password; + } + public void setPassword(String password) { + this.password = password; + } + + @Column(name = "EMAIL") + private String email; + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + + @OneToOne(cascade = CascadeType.ALL) + private UserInfo userInfo; + public UserInfo getUserInfo() { + return userInfo; + } + public void setUserInfo(UserInfo userInfo) { + this.userInfo = userInfo; + } +} diff --git a/src/main/java/Services/UserService.java b/src/main/java/Services/UserService.java new file mode 100644 index 0000000..ef28ed2 --- /dev/null +++ b/src/main/java/Services/UserService.java @@ -0,0 +1,66 @@ +package Services; + +import Models.User; +import Models.UserInfo; +import org.hibernate.query.Query; +import org.json.JSONObject; +import org.springframework.stereotype.Service; + +import javax.transaction.Transaction; +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import static Util.CredentialValidator.*; + +@Service +public class UserService { + // Variables + boolean success; + + // Hibernate Variable + Query query; + Transaction tx; + + // Get All + public ArrayList allUsers(){ + ArrayList users = new ArrayList<>(); + + // Query for all users in database + + return users; + } + + // Register + public boolean registerUser(JSONObject registrationData){ + try { + String firstName, lastName, username, password, email; + firstName = registrationData.getString("firstName"); + lastName = registrationData.getString("lastName"); + username = registrationData.getString("username"); + password = registrationData.getString("password"); + email = registrationData.getString("email"); + + if (emailIsValid(email) && usernameIsValid(username) && passwordIsValid(password)) { + User user = new User(firstName, lastName); + UserInfo userInfo = new UserInfo(username, password, email); + + user.setUserInfo(userInfo); + + /*tx = getSession.startTransaction(); + getSession.save(user);*/ + + tx.commit(); + } else { + success = false; + } + } catch (Exception e) { + // if tx != null + // tx.rollback(); + success = false; + e.printStackTrace(); + } + + return success; + } +} diff --git a/src/main/java/Util/CORSFilter.java b/src/main/java/Util/CORSFilter.java deleted file mode 100644 index 1f1cf64..0000000 --- a/src/main/java/Util/CORSFilter.java +++ /dev/null @@ -1,60 +0,0 @@ -package Util; - -import javax.servlet.*; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -public class CORSFilter implements Filter { - - /** - * Default constructor. - */ - public CORSFilter() { - // TODO Auto-generated constructor stub - } - - /** - * @see Filter#init(FilterConfig) - */ - @Override - public void init(FilterConfig fConfig) throws ServletException { - // TODO Auto-generated method stub - } - - /** - * @see Filter#destroy() - */ - @Override - public void destroy() { - // TODO Auto-generated method stub - } - - - - /** - * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) - */ - public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) - throws IOException, ServletException { - - HttpServletRequest request = (HttpServletRequest) servletRequest; - System.out.println("CORSFilter HTTP Request: " + request.getMethod()); - - // Authorize (allow) all domains to consume the content - ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Origin", "*"); - ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Methods","*"); - ((HttpServletResponse) servletResponse).addHeader("Access-Control-Allow-Headers","*"); - - HttpServletResponse resp = (HttpServletResponse) servletResponse; - - // For HTTP OPTIONS verb/method reply with ACCEPTED status code -- per CORS handshake - if (request.getMethod().equals("OPTIONS")) { - resp.setStatus(HttpServletResponse.SC_ACCEPTED); - return; - } - - // pass the request along the filter chain - chain.doFilter(request, servletResponse); - } -} \ No newline at end of file diff --git a/src/main/java/Util/CredentialValidator.java b/src/main/java/Util/CredentialValidator.java new file mode 100644 index 0000000..72c8345 --- /dev/null +++ b/src/main/java/Util/CredentialValidator.java @@ -0,0 +1,31 @@ +package Util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class CredentialValidator { + // Registration Regex, Patterns, and Matcher + private static final String EMAIL_REGEX = "^(.+)@(.+)$"; + private static final String USERNAME_REGEX = "^[a-zA-Z0-9]\\w{5,20}$"; + private static final String PASSWORD_REGEX = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–[{}]:;',?/*~$^+=<>]).{8,20}$"; + private static final Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEX); + private static final Pattern USERNAME_PATTERN = Pattern.compile(USERNAME_REGEX); + private static final Pattern PASSWORD_PATTERN = Pattern.compile(PASSWORD_REGEX); + private static Matcher matcher; + + // Validation Methods + public static boolean emailIsValid (String email) { + matcher = EMAIL_PATTERN.matcher(email); + return matcher.matches(); + } + + public static boolean usernameIsValid(String username) { + matcher = USERNAME_PATTERN.matcher(username); + return matcher.matches(); + } + + public static boolean passwordIsValid(String password) { + matcher = PASSWORD_PATTERN.matcher(password); + return matcher.matches(); + } +} diff --git a/src/main/java/Util/DependencyLoaderListener.java b/src/main/java/Util/DependencyLoaderListener.java index 3cc1f4b..22bd277 100644 --- a/src/main/java/Util/DependencyLoaderListener.java +++ b/src/main/java/Util/DependencyLoaderListener.java @@ -10,6 +10,7 @@ * methods. Make sure you inform tomcat of this class by including it * in your deployment descriptor (web.xml) under the listener tag. */ + @WebListener public class DependencyLoaderListener implements ServletContextListener { @Override diff --git a/src/test/java/UserRegistrationTests/EmailValidatorTest.java b/src/test/java/UserRegistrationTests/EmailValidatorTest.java new file mode 100644 index 0000000..ff8308b --- /dev/null +++ b/src/test/java/UserRegistrationTests/EmailValidatorTest.java @@ -0,0 +1,7 @@ +package UserRegistrationTests; + +import org.junit.jupiter.api.Test; + +public class EmailValidatorTest { + +} diff --git a/src/test/java/UserRegistrationTests/PasswordValidatorTest.java b/src/test/java/UserRegistrationTests/PasswordValidatorTest.java new file mode 100644 index 0000000..63ccd00 --- /dev/null +++ b/src/test/java/UserRegistrationTests/PasswordValidatorTest.java @@ -0,0 +1,4 @@ +package UserRegistrationTests; + +public class PasswordValidatorTest { +} diff --git a/src/test/java/UserRegistrationTests/UsernameValidatorTest.java b/src/test/java/UserRegistrationTests/UsernameValidatorTest.java new file mode 100644 index 0000000..ae240a3 --- /dev/null +++ b/src/test/java/UserRegistrationTests/UsernameValidatorTest.java @@ -0,0 +1,4 @@ +package UserRegistrationTests; + +public class UsernameValidatorTest { +} From a6f3ff146119bd024e26e30163dda88f5371d309 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Mon, 1 Nov 2021 10:20:22 -0400 Subject: [PATCH 08/27] Update README.md --- README.md | 36 +++++++++++++++++++++++------------- 1 file changed, 23 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 4cf1f23..cbc7054 100644 --- a/README.md +++ b/README.md @@ -6,30 +6,40 @@ Team Vanquish Project 2 Implementation - [ ] Users are interfacing with an advanced UI built with Angular running in a browser - [ ] CRUD operations are supported for one or more domain objects via the web application's API endpoints - [ ] Client/Server communication is done with JSON in HTTP request and response bodies. -- [ ] 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) -- [ ] All Exceptions are caught and logged to a file +- [ ] All Exceptions are caught and logged to a file/database - [ ] 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 -## -- App Name Here -- -You will need to write a small paragraph describing your application. It should be 4-6 sentences and briefly cover the important points and features. +## -- 4TheMusic -- -### Minimum Viable Product -Your team will need to work with the trainer to come up with a satisfactory list of user stories for MVP as well as bonus stories. They should begin with "As a [stakeholder] I can... and describe what the user should be able to do. Aim for at least 2 different roles, user and administrator. Try to come up with 8 or so user stories for MVP. Carefully consider what your team can accomplish in 3 weeks and try not to set yourselves too great a task. +Our Music and concerts app, "4TheMusic" brings users together with their favorite artists, +while allowing premium users to gain insights from user trends and analytics. + +Users will be able to create and share playlists of their favorite songs and artists, +along with viewing songs by similar artists and genres. -* As a user, I can see... -* As a user, I can purchase... -* As a user, I can check... -* As an administrator, I can schedule... -* As an administrator, I can cancel... -* As an administrator, I can view... +Premium users (concert organizers, artists, tour managers, etc.) will be able to browse artists and see high-level, real-time analytics on +the users that like particular artists. + + +### Minimum Viable Product +* As a user, I can create a playlist. +* 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. +* 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. +* As a premium user, I can see a like/dislike ratio for a particular song. ### Bonus Stories -* As an administrator, I can... +* As a user, I can view a list of users who like the same songs. +* As a premium user, I can see a like/dislike ratio for an entire artist. ## Tech Stack You should be employing the following technologies in your project. From 01da59ffc48b6e3126757ab4a8c3fadbdaf6ffd3 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Mon, 1 Nov 2021 11:30:56 -0400 Subject: [PATCH 09/27] Updated .gitignore Added JWT and Jackson dependencies to pom.xml Added two classes to beans.xml Boiler plate RequestArgChecker and ServiceRequests added just in case they could be of use upon refactoring Made lists public in DataLists Deleted Email, Password, and Username Validator Tests and combined them into one Updated User to reflect UserInfo merge Combined UserInfo into User per team agreement Adding some potential methods to the UserService class Created Concert, Role, and Track classes Created Repositories to go with these new classes --- .gitignore | 2 + pom.xml | 66 +++++++++++++++++-- src/beans.xml | 2 + src/main/java/Controllers/UserController.java | 6 +- src/main/java/DataGenerators/DataLists.java | 38 ++++++----- src/main/java/DataGenerators/UserGen.java | 11 ++-- src/main/java/Models/Concert.java | 27 ++++++++ src/main/java/Models/Role.java | 62 +++++++++++++++++ src/main/java/Models/Track.java | 27 ++++++++ src/main/java/Models/User.java | 54 +++++++++++---- src/main/java/Models/UserInfo.java | 54 --------------- src/main/java/Repos/ConcertRepository.java | 10 +++ src/main/java/Repos/RoleRepository.java | 9 +++ src/main/java/Repos/TrackRepository.java | 10 +++ src/main/java/Repos/UserRepository.java | 9 +++ src/main/java/Services/UserService.java | 58 +++++++++++----- src/main/java/Util/CredentialValidator.java | 5 +- src/main/java/Util/JWTUtil.java | 2 + src/main/java/Util/RequestArgChecker.java | 3 + src/main/java/Util/ServiceRequests.java | 5 +- src/test/java/CredentialValidatorsTest.java | 20 ++++++ .../EmailValidatorTest.java | 7 -- .../PasswordValidatorTest.java | 4 -- .../UsernameValidatorTest.java | 4 -- 24 files changed, 361 insertions(+), 134 deletions(-) create mode 100644 src/main/java/Models/Concert.java create mode 100644 src/main/java/Models/Role.java create mode 100644 src/main/java/Models/Track.java delete mode 100644 src/main/java/Models/UserInfo.java create mode 100644 src/main/java/Repos/ConcertRepository.java create mode 100644 src/main/java/Repos/RoleRepository.java create mode 100644 src/main/java/Repos/TrackRepository.java create mode 100644 src/main/java/Repos/UserRepository.java create mode 100644 src/test/java/CredentialValidatorsTest.java delete mode 100644 src/test/java/UserRegistrationTests/EmailValidatorTest.java delete mode 100644 src/test/java/UserRegistrationTests/PasswordValidatorTest.java delete mode 100644 src/test/java/UserRegistrationTests/UsernameValidatorTest.java diff --git a/.gitignore b/.gitignore index efac0e9..93aa8dc 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,5 @@ hs_err_pid* # ignore any .properties files *.properties +/.jpb/ +/.mvn/ diff --git a/pom.xml b/pom.xml index a16d801..ace78df 100644 --- a/pom.xml +++ b/pom.xml @@ -10,7 +10,7 @@ com.revature.vanquish P2 - 0.0.1-SNAPSHOT + 0.0.1 war P2 Project 2 with Spring Boot Implementation @@ -21,37 +21,91 @@ 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.mariadb.jdbc - mariadb-java-client - runtime - org.springframework.boot spring-boot-starter-tomcat + 2.5.5 provided + org.springframework.boot spring-boot-starter-test + 2.5.5 test + com.vaadin.external.google android-json 0.0.20131108.vaadin1 compile + + + + com.fasterxml.jackson.core + jackson-databind + 2.13.0 + + + + + com.fasterxml.jackson.core + jackson-core + 2.13.0 + + + + + org.mariadb.jdbc + mariadb-java-client + 2.7.3 + runtime + + + + + org.json + json + 20210307 + + + + + io.jsonwebtoken + jjwt-api + 0.11.2 + + + + io.jsonwebtoken + jjwt-impl + 0.11.2 + runtime + + + + io.jsonwebtoken + jjwt-jackson + 0.11.2 + runtime + diff --git a/src/beans.xml b/src/beans.xml index 142def2..859882c 100644 --- a/src/beans.xml +++ b/src/beans.xml @@ -3,4 +3,6 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> + + \ No newline at end of file diff --git a/src/main/java/Controllers/UserController.java b/src/main/java/Controllers/UserController.java index 736512f..2812145 100644 --- a/src/main/java/Controllers/UserController.java +++ b/src/main/java/Controllers/UserController.java @@ -1,6 +1,7 @@ package Controllers; import Models.User; +import Services.UserService; import org.springframework.web.bind.annotation.*; @RestController @@ -9,10 +10,7 @@ public class UserController { @CrossOrigin @GetMapping("/{id}") public User retrieve(@PathVariable int id) { - User user = null; - - // User with this ID - // Query query = getSession().createQuery("from User where ID = :id", User.class); + User user = UserService.getByID(id); return user; } diff --git a/src/main/java/DataGenerators/DataLists.java b/src/main/java/DataGenerators/DataLists.java index cc338d7..d16a935 100644 --- a/src/main/java/DataGenerators/DataLists.java +++ b/src/main/java/DataGenerators/DataLists.java @@ -1,7 +1,10 @@ package DataGenerators; +import org.springframework.stereotype.Service; + +@Service public class DataLists { - static String[] names = { + public static String[] names = { "Chace", "Nielsen", "Leticia", "Allen", "Lyric", "Branch", @@ -13,24 +16,23 @@ public class DataLists { "Augustus", "James", "Rodolfo", "Patton", "Iyana", "Berry", - "Dawson", "Sheppard"}; + "Dawson", "Sheppard" + }; - static String[] passwords = { - "solo", "variable", - "treaty", "dismissal", - "possible", "quarrel", - "challenge", "compact", - "partner", "disorder", - "medieval", "soil", - "snuggle", "quotation", - "lamb", "accurate", - "embarrassment", "standard", - "investment", "low", - "include", "hay", - "opponent", "idempotent" + public static String[] passwords = { + "m]hQB7>d", "wRr^){3Q" , + "h@w/V[8k", "]tqWC_D4", + "kKL9?sx6", "WmHu{V9K", + "(@veR46w", ">?x&D2N9", + ">6J.yd7t", "6Qm@av{/", + "t(6_R8^{", "j)4A?[=h", + "!kZ%h[6b", "q7yS[gB{", + "_3$nJQ,r", "UCaH5[$S", + "D5p_,yVG", "J29a-j?@", + "DRyQp3}]", "n3cYM@B^" }; - static String[] usernames = { + public static String[] usernames = { "Aireril", "Alisomet", "Anostung", "Aspenbo", "AuthorPlatinum", "Astroboy", @@ -45,7 +47,7 @@ public class DataLists { "Pherietm", "Puffro" }; - static String[] emails = { + public static String[] emails = { "andre.kling@mills.com", "gayle.turcotte@connelly.biz", "adelbert.bauch@reilly.com", @@ -66,5 +68,5 @@ public class DataLists { "graham.bertha@hotmail.com", "alessandra68@kuphal.com", "mraz.cory@yahoo.com" -}; + }; } diff --git a/src/main/java/DataGenerators/UserGen.java b/src/main/java/DataGenerators/UserGen.java index 1b600ce..fdafc1c 100644 --- a/src/main/java/DataGenerators/UserGen.java +++ b/src/main/java/DataGenerators/UserGen.java @@ -6,29 +6,30 @@ public class UserGen { private static Random rand = new Random(); + private static int index; public static String getAFirstName() { - int index = rand.nextInt(names.length); + index = rand.nextInt(names.length); return names[index]; } public static String getALastName() { - int index = rand.nextInt(names.length); + index = rand.nextInt(names.length); return names[index]; } public static String getAPassword() { - int index = rand.nextInt(passwords.length); + index = rand.nextInt(passwords.length); return passwords[index]; } public static String getAUsername() { - int index = rand.nextInt(usernames.length); + index = rand.nextInt(usernames.length); return usernames[index]; } public static String getAEmail() { - int index = rand.nextInt(emails.length); + index = rand.nextInt(emails.length); return emails[index]; } } diff --git a/src/main/java/Models/Concert.java b/src/main/java/Models/Concert.java new file mode 100644 index 0000000..272872b --- /dev/null +++ b/src/main/java/Models/Concert.java @@ -0,0 +1,27 @@ +package Models; + +import javax.persistence.*; + +/** + * This class is used to declare the POJO, Concert + * @date 11/01/2021 + * @author + */ + +@Table(name = "CONCERTS") +@Entity +public class Concert { + public Concert() { + } + + @Id + @Column(name = "CONCERT_ID") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int ID; + public int getID() { + return ID; + } + public void setID(int ID) { + this.ID = ID; + } +} diff --git a/src/main/java/Models/Role.java b/src/main/java/Models/Role.java new file mode 100644 index 0000000..88d5eb0 --- /dev/null +++ b/src/main/java/Models/Role.java @@ -0,0 +1,62 @@ +package Models; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +/** + * This class is used to declare the POJO, Role + * @date 11/01/2021 + * @author + */ + +@Table(name = "ROLES") +@Entity(name = "ROLE") +public class Role{ + public Role(){ + users = new ArrayList<>(); + } + + public Role(int roleID) { + this.roleID = roleID; + users = new ArrayList<>(); + } + + @Id + @Column(name = "ROLE_ID", columnDefinition = "int default 0") + @GeneratedValue(strategy = GenerationType.AUTO) + private int roleID; + public int getRoleID() { + return roleID; + } + public void setRoleID(int roleID) { + this.roleID = roleID; + } + + @Column(name = "USER_ROLE") + private String userRole; + public String getUserRole() { + switch (roleID){ + case 0: + userRole = ("Basic"); + break; + case 1: + userRole = ("Premium"); + break; + } + return userRole; + } + public void setUserRole(String userRole) { + this.userRole = userRole; + } + + // A Role contains a list of users under that designated role + @OneToMany (cascade = CascadeType.ALL) + private List users; + public List getUserInfo() { + return users; + } + public void setUserInfo(List userRoles) { + this.users = users; + } +} diff --git a/src/main/java/Models/Track.java b/src/main/java/Models/Track.java new file mode 100644 index 0000000..c775ce4 --- /dev/null +++ b/src/main/java/Models/Track.java @@ -0,0 +1,27 @@ +package Models; + +import javax.persistence.*; + +/** + * This class is used to declare the POJO, Track + * @date 11/01/2021 + * @author + */ + +@Table(name = "TRACKS") +@Entity +public class Track { + public Track() { + } + + @Id + @Column(name = "TRACK_ID") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int ID; + public int getID() { + return ID; + } + public void setID(int ID) { + this.ID = ID; + } +} diff --git a/src/main/java/Models/User.java b/src/main/java/Models/User.java index 093e347..3fe7c0e 100644 --- a/src/main/java/Models/User.java +++ b/src/main/java/Models/User.java @@ -1,7 +1,14 @@ package Models; +import org.springframework.beans.factory.annotation.Autowired; import javax.persistence.*; +/** + * This class is used to declare the POJO, User + * @date 10/29/2021 + * @author + */ + @Table(name = "USERS") @Entity public class User { @@ -13,6 +20,14 @@ public User(String firstName, String lastName) { this.lastName = lastName; } + public User(String firstName, String lastName, String email, String username, String password) { + this.firstName = firstName; + this.lastName = lastName; + this.email = email; + this.username = username; + this.password = password; + } + @Id @Column(name = "USER_ID") @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -51,22 +66,33 @@ public void setEmail(String email) { this.email = email; } - @Override - public String toString() { - return "User {\n" + - "\tID: " + ID + "\n" + - "\tfirstName: " + firstName + '\n' + - "\tlastName: " + lastName + '\n' + - "\temail: " + email + '\n' + - '}'; + @Column(name = "USERNAME") + private String username; + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; } - @OneToOne - private UserInfo userInfo; - public UserInfo getUserInfo() { - return userInfo; + @Column(name = "PASSWORD", nullable = false) + private String password; + public String getPassword(){ + return password; } - public void setUserInfo(UserInfo userInfo) { - this.userInfo = userInfo; + public void setPassword(String password) { + this.password = password; + } + + @Override + public String toString() { + return "User: {\n" + + "ID: " + ID + + "firstName: " + firstName + ",\n" + + "lastName: " + lastName + ",\n" + + "email: " + email + ",\n" + + "username: " + username + ",\n" + + "password: " + password + "\n" + + '}'; } } diff --git a/src/main/java/Models/UserInfo.java b/src/main/java/Models/UserInfo.java deleted file mode 100644 index 935671f..0000000 --- a/src/main/java/Models/UserInfo.java +++ /dev/null @@ -1,54 +0,0 @@ -package Models; - -import javax.persistence.*; - -@Entity -@Table(name = "USER_INFO") -public class UserInfo { - public UserInfo() { - - } - - public UserInfo(String username, String password, String email) { - this.username = username; - this.password = password; - this.email = email; - } - - @Id - @Column(name = "USERNAME") - private String username; - public String getUsername() { - return username; - } - public void setUsername(String username) { - this.username = username; - } - - @Column(name = "PASSWORD", nullable = false) - private String password; - public String getPassword(){ - return password; - } - public void setPassword(String password) { - this.password = password; - } - - @Column(name = "EMAIL") - private String email; - public String getEmail() { - return email; - } - public void setEmail(String email) { - this.email = email; - } - - @OneToOne(cascade = CascadeType.ALL) - private UserInfo userInfo; - public UserInfo getUserInfo() { - return userInfo; - } - public void setUserInfo(UserInfo userInfo) { - this.userInfo = userInfo; - } -} diff --git a/src/main/java/Repos/ConcertRepository.java b/src/main/java/Repos/ConcertRepository.java new file mode 100644 index 0000000..c499b4a --- /dev/null +++ b/src/main/java/Repos/ConcertRepository.java @@ -0,0 +1,10 @@ +package Repos; + +import Models.Concert; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface ConcertRepository extends JpaRepository { + Optional findByID(int ID); +} \ No newline at end of file diff --git a/src/main/java/Repos/RoleRepository.java b/src/main/java/Repos/RoleRepository.java new file mode 100644 index 0000000..1dc1861 --- /dev/null +++ b/src/main/java/Repos/RoleRepository.java @@ -0,0 +1,9 @@ +package Repos; + +import Models.Role; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + +public interface RoleRepository extends JpaRepository { + Optional findByID(int ID); +} \ No newline at end of file diff --git a/src/main/java/Repos/TrackRepository.java b/src/main/java/Repos/TrackRepository.java new file mode 100644 index 0000000..1129d77 --- /dev/null +++ b/src/main/java/Repos/TrackRepository.java @@ -0,0 +1,10 @@ +package Repos; + +import Models.Track; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface TrackRepository extends JpaRepository { + Optional findByID(int ID); +} \ No newline at end of file diff --git a/src/main/java/Repos/UserRepository.java b/src/main/java/Repos/UserRepository.java new file mode 100644 index 0000000..48bdf11 --- /dev/null +++ b/src/main/java/Repos/UserRepository.java @@ -0,0 +1,9 @@ +package Repos; + +import Models.User; +import org.springframework.data.jpa.repository.JpaRepository; +import java.util.Optional; + +public interface UserRepository extends JpaRepository { + Optional findByID(int ID); +} \ No newline at end of file diff --git a/src/main/java/Services/UserService.java b/src/main/java/Services/UserService.java index ef28ed2..cccb362 100644 --- a/src/main/java/Services/UserService.java +++ b/src/main/java/Services/UserService.java @@ -1,29 +1,38 @@ package Services; import Models.User; -import Models.UserInfo; import org.hibernate.query.Query; import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; - import javax.transaction.Transaction; import java.util.ArrayList; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import static Util.CredentialValidator.*; +/** + * + * @date 10/29/2021 + * @author + */ + @Service public class UserService { // Variables - boolean success; + private static boolean success; + private static User user; // Hibernate Variable - Query query; - Transaction tx; + private static Query query; + private static Transaction tx; + + static { + user = new User(); + } // Get All - public ArrayList allUsers(){ + @Bean + public static ArrayList allUsers(){ ArrayList users = new ArrayList<>(); // Query for all users in database @@ -31,8 +40,29 @@ public ArrayList allUsers(){ return users; } + @Bean + public static User getByID(int ID){ + // User with this ID + // Query query = getSession().createQuery("from User where ID = :id", User.class); + // user = query.getFirstResult(); + + return user; + } + + public static boolean save(@Autowired User user){ + try{ + // getSession.save(user); + success = true; + } catch (Exception e) { + success = false; + e.printStackTrace(); + } + + return success; + } + // Register - public boolean registerUser(JSONObject registrationData){ + public static boolean registerUser(JSONObject registrationData){ try { String firstName, lastName, username, password, email; firstName = registrationData.getString("firstName"); @@ -42,10 +72,7 @@ public boolean registerUser(JSONObject registrationData){ email = registrationData.getString("email"); if (emailIsValid(email) && usernameIsValid(username) && passwordIsValid(password)) { - User user = new User(firstName, lastName); - UserInfo userInfo = new UserInfo(username, password, email); - - user.setUserInfo(userInfo); + User user = new User(); /*tx = getSession.startTransaction(); getSession.save(user);*/ @@ -55,8 +82,9 @@ public boolean registerUser(JSONObject registrationData){ success = false; } } catch (Exception e) { - // if tx != null + // if tx != null { // tx.rollback(); + // } success = false; e.printStackTrace(); } diff --git a/src/main/java/Util/CredentialValidator.java b/src/main/java/Util/CredentialValidator.java index 72c8345..e9bce18 100644 --- a/src/main/java/Util/CredentialValidator.java +++ b/src/main/java/Util/CredentialValidator.java @@ -1,13 +1,16 @@ package Util; +import org.springframework.stereotype.Service; + import java.util.regex.Matcher; import java.util.regex.Pattern; +@Service public class CredentialValidator { // Registration Regex, Patterns, and Matcher private static final String EMAIL_REGEX = "^(.+)@(.+)$"; private static final String USERNAME_REGEX = "^[a-zA-Z0-9]\\w{5,20}$"; - private static final String PASSWORD_REGEX = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–[{}]:;',?/*~$^+=<>]).{8,20}$"; + private static final String PASSWORD_REGEX = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–{}:;',?/*~$^+=<>]).{8,20}$"; private static final Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEX); private static final Pattern USERNAME_PATTERN = Pattern.compile(USERNAME_REGEX); private static final Pattern PASSWORD_PATTERN = Pattern.compile(PASSWORD_REGEX); diff --git a/src/main/java/Util/JWTUtil.java b/src/main/java/Util/JWTUtil.java index 1217707..90fc8cf 100644 --- a/src/main/java/Util/JWTUtil.java +++ b/src/main/java/Util/JWTUtil.java @@ -2,10 +2,12 @@ import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; +import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.security.Key; +@Service public class JWTUtil { private static Key key; diff --git a/src/main/java/Util/RequestArgChecker.java b/src/main/java/Util/RequestArgChecker.java index c6a9849..45821bd 100644 --- a/src/main/java/Util/RequestArgChecker.java +++ b/src/main/java/Util/RequestArgChecker.java @@ -1,10 +1,13 @@ package Util; +import org.springframework.stereotype.Service; + import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Enumeration; +@Service public class RequestArgChecker { private static String paramName, paramValue; private static String[] paramValues; diff --git a/src/main/java/Util/ServiceRequests.java b/src/main/java/Util/ServiceRequests.java index e867e34..973c4ab 100644 --- a/src/main/java/Util/ServiceRequests.java +++ b/src/main/java/Util/ServiceRequests.java @@ -1,6 +1,6 @@ package Util; -import Logging.MyLogger; +import org.springframework.stereotype.Service; import java.io.BufferedWriter; import java.io.File; @@ -13,6 +13,7 @@ /** * This class is used to record every request made in a single session. */ +@Service public abstract class ServiceRequests { // The request count for this session private static int requestCount = 0; @@ -36,7 +37,7 @@ public static void writeSummary(){ System.out.println("Request Summary has been written to designated to file."); } catch (IOException e) { - MyLogger.getMyLogger().writeLog(e.toString(), 3); + e.printStackTrace(); } } diff --git a/src/test/java/CredentialValidatorsTest.java b/src/test/java/CredentialValidatorsTest.java new file mode 100644 index 0000000..6231f11 --- /dev/null +++ b/src/test/java/CredentialValidatorsTest.java @@ -0,0 +1,20 @@ +import org.junit.jupiter.api.Test; +import java.util.Arrays; +import static DataGenerators.DataLists.*; + +public class CredentialValidatorsTest { + @Test + public void emailChecker() { + + } + + @Test + public void passwordChecker() { + + } + + @Test + public void usernameChecker() { + + } +} diff --git a/src/test/java/UserRegistrationTests/EmailValidatorTest.java b/src/test/java/UserRegistrationTests/EmailValidatorTest.java deleted file mode 100644 index ff8308b..0000000 --- a/src/test/java/UserRegistrationTests/EmailValidatorTest.java +++ /dev/null @@ -1,7 +0,0 @@ -package UserRegistrationTests; - -import org.junit.jupiter.api.Test; - -public class EmailValidatorTest { - -} diff --git a/src/test/java/UserRegistrationTests/PasswordValidatorTest.java b/src/test/java/UserRegistrationTests/PasswordValidatorTest.java deleted file mode 100644 index 63ccd00..0000000 --- a/src/test/java/UserRegistrationTests/PasswordValidatorTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package UserRegistrationTests; - -public class PasswordValidatorTest { -} diff --git a/src/test/java/UserRegistrationTests/UsernameValidatorTest.java b/src/test/java/UserRegistrationTests/UsernameValidatorTest.java deleted file mode 100644 index ae240a3..0000000 --- a/src/test/java/UserRegistrationTests/UsernameValidatorTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package UserRegistrationTests; - -public class UsernameValidatorTest { -} From 9f72838639fbd623eaa0eb189e5554651406cb30 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Mon, 1 Nov 2021 11:45:41 -0400 Subject: [PATCH 10/27] Delete beans.xml --- src/beans.xml | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 src/beans.xml diff --git a/src/beans.xml b/src/beans.xml deleted file mode 100644 index 859882c..0000000 --- a/src/beans.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - \ No newline at end of file From 633368edca6bb4328bedd259ae093600170f1467 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Mon, 1 Nov 2021 15:37:14 -0400 Subject: [PATCH 11/27] Update README.md --- README.md | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index cbc7054..73af86f 100644 --- a/README.md +++ b/README.md @@ -16,13 +16,14 @@ Team Vanquish Project 2 Implementation ## -- 4TheMusic -- -Our Music and concerts app, "4TheMusic" brings users together with their favorite artists, -while allowing premium users to gain insights from user trends and analytics. +"4TheMusic" is a social web service that brings music fans and concert-goers together with their favorite artists, +while allowing premium users to gain valuable insights from user trends and analytics. -Users will be able to create and share playlists of their favorite songs and artists, -along with viewing songs by similar artists and genres. +Users can create and share playlists of their favorite songs and artists, +along with viewing songs by similar artists and genres, and connecting to the social media accounts of their +favorite artists. -Premium users (concert organizers, artists, tour managers, etc.) will be able to browse artists and see high-level, real-time analytics on +Premium users (concert organizers, artists, tour managers, etc.) can browse artists and see high-level, real-time analytics on the users that like particular artists. From 7bcb8a101d952c3bd9565042b11ebda3902232eb Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Tue, 2 Nov 2021 01:09:59 -0400 Subject: [PATCH 12/27] A Few Changes Added more models Messing with Exceptions Deleted obsolete classes Messing with Repos and Configs --- .gitignore | 4 - src/main/java/Configs/PersistenceConfig.java | 3 + src/main/java/Configs/WebConfig.java | 20 +-- src/main/java/Controllers/UserController.java | 69 ++++++++++- src/main/java/DataGenerators/UserGen.java | 3 + .../Exceptions/AuthenticationException.java | 17 +++ .../Exceptions/UserDoesNotExistException.java | 17 +++ src/main/java/Models/Album.java | 59 +++++++++ src/main/java/Models/Artist.java | 75 +++++++++++ src/main/java/Models/Playlist.java | 37 ++++++ src/main/java/Models/Role.java | 62 ---------- src/main/java/Models/User.java | 35 +++++- src/main/java/Repos/ConcertRepository.java | 2 + src/main/java/Repos/RoleRepository.java | 9 -- src/main/java/Repos/TrackRepository.java | 2 + src/main/java/Repos/UserRepository.java | 7 ++ src/main/java/Service/UserRegistration.java | 59 +++++++++ src/main/java/Service/UserValidator.java | 37 ++++++ src/main/java/Services/UserService.java | 116 +++++++++++------- src/main/java/Servlets/HelloServlet.java | 30 ----- src/main/java/Servlets/PingServlet.java | 36 ------ src/main/java/Util/CredentialValidator.java | 34 ----- .../java/Util/DependencyLoaderListener.java | 27 ---- src/main/java/Util/JWTUtil.java | 41 ++++--- src/main/java/Util/RequestArgChecker.java | 58 --------- src/{ => main/resources}/beans.xml | 3 +- 26 files changed, 524 insertions(+), 338 deletions(-) create mode 100644 src/main/java/Exceptions/AuthenticationException.java create mode 100644 src/main/java/Exceptions/UserDoesNotExistException.java create mode 100644 src/main/java/Models/Album.java create mode 100644 src/main/java/Models/Artist.java create mode 100644 src/main/java/Models/Playlist.java delete mode 100644 src/main/java/Models/Role.java delete mode 100644 src/main/java/Repos/RoleRepository.java create mode 100644 src/main/java/Service/UserRegistration.java create mode 100644 src/main/java/Service/UserValidator.java delete mode 100644 src/main/java/Servlets/HelloServlet.java delete mode 100644 src/main/java/Servlets/PingServlet.java delete mode 100644 src/main/java/Util/CredentialValidator.java delete mode 100644 src/main/java/Util/DependencyLoaderListener.java delete mode 100644 src/main/java/Util/RequestArgChecker.java rename src/{ => main/resources}/beans.xml (78%) diff --git a/.gitignore b/.gitignore index 93aa8dc..1176c27 100644 --- a/.gitignore +++ b/.gitignore @@ -19,9 +19,6 @@ *.tar.gz *.rar -# Resources -src/main/resources - # IntelliJ \.idea @@ -31,4 +28,3 @@ hs_err_pid* # ignore any .properties files *.properties /.jpb/ -/.mvn/ diff --git a/src/main/java/Configs/PersistenceConfig.java b/src/main/java/Configs/PersistenceConfig.java index 128695f..6fb5659 100644 --- a/src/main/java/Configs/PersistenceConfig.java +++ b/src/main/java/Configs/PersistenceConfig.java @@ -10,7 +10,9 @@ */ import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @@ -18,4 +20,5 @@ public class PersistenceConfig { // Hibernate Variables // @Value("") + } diff --git a/src/main/java/Configs/WebConfig.java b/src/main/java/Configs/WebConfig.java index 2c79ff7..e372582 100644 --- a/src/main/java/Configs/WebConfig.java +++ b/src/main/java/Configs/WebConfig.java @@ -1,17 +1,23 @@ package Configs; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration public class WebConfig implements WebMvcConfigurer { - - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - .allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH") - .allowedHeaders("*") - .allowedOrigins("*"); + @Bean + public WebMvcConfigurer corsConfigurer() { + return new WebMvcConfigurer() { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH", "OPTION") + .allowedHeaders("*") + .allowedOrigins("*"); + } + }; } } diff --git a/src/main/java/Controllers/UserController.java b/src/main/java/Controllers/UserController.java index 2812145..c213a94 100644 --- a/src/main/java/Controllers/UserController.java +++ b/src/main/java/Controllers/UserController.java @@ -1,17 +1,80 @@ package Controllers; import Models.User; +import Service.UserRegistration; +import Repos.UserRepository; import Services.UserService; +import Util.JWTUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletResponse; +import javax.swing.text.html.Option; +import javax.validation.Valid; +import java.util.ArrayList; +import java.util.Optional; + +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; + +/** + * UserController + * Handles requests that involve the manipulating or retrieval of user data + * + * @Date 11/1/2021 + * @Author Vanquish + */ @RestController -@RequestMapping("/user") +@RequestMapping(value = "/user", produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE) public class UserController { - @CrossOrigin + private final UserService userService; + private final JWTUtil jwtUtil; + + @Autowired + public UserController(UserRepository userRepository, UserService userService, JWTUtil jwtUtil) { + this.userService = userService; + this.jwtUtil = jwtUtil; + } + + /** + * Receives ID from request, then returns a User object if they exist + * @param id ID Integer to distinguish user + * @return User Object + */ @GetMapping("/{id}") public User retrieve(@PathVariable int id) { - User user = UserService.getByID(id); + User user = userService.getByID(id); return user; } + + @GetMapping("") + public ResponseEntity> getAllUsers() { + ArrayList allUsers = userService.allUsers(); + + if (allUsers == null) + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + else if (allUsers.isEmpty()) + return new ResponseEntity<>(allUsers, HttpStatus.NO_CONTENT); + else + return new ResponseEntity<>(allUsers, HttpStatus.OK); + } + + @PostMapping(value = "/register", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) + public User registerUser(@RequestBody @Valid UserRegistration regData){ + return userService.registerUser(regData); + } + + @DeleteMapping("/{id}") + public ResponseEntity delete(@PathVariable("id") int id) { + Optional user = Optional.ofNullable(userService.getByID(id)); + + if (!user.isPresent()) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } + + userService.delete(id); + return new ResponseEntity<>(user.get(), HttpStatus.NO_CONTENT); + } } diff --git a/src/main/java/DataGenerators/UserGen.java b/src/main/java/DataGenerators/UserGen.java index fdafc1c..640f5d8 100644 --- a/src/main/java/DataGenerators/UserGen.java +++ b/src/main/java/DataGenerators/UserGen.java @@ -1,9 +1,12 @@ package DataGenerators; +import org.springframework.stereotype.Service; + import java.util.Random; import static DataGenerators.DataLists.*; +@Service public class UserGen { private static Random rand = new Random(); private static int index; diff --git a/src/main/java/Exceptions/AuthenticationException.java b/src/main/java/Exceptions/AuthenticationException.java new file mode 100644 index 0000000..c7e96a4 --- /dev/null +++ b/src/main/java/Exceptions/AuthenticationException.java @@ -0,0 +1,17 @@ +package Exceptions; + +/** + * Custom Runtime Exception + * + * @date + * @author + */ +public class AuthenticationException extends RuntimeException { + public AuthenticationException() { + super(); + } + + public AuthenticationException(String message) { + super(message); + } +} diff --git a/src/main/java/Exceptions/UserDoesNotExistException.java b/src/main/java/Exceptions/UserDoesNotExistException.java new file mode 100644 index 0000000..30f1490 --- /dev/null +++ b/src/main/java/Exceptions/UserDoesNotExistException.java @@ -0,0 +1,17 @@ +package Exceptions; + +/** + * Custom Runtime Exception + * + * @date + * @author + */ +public class UserDoesNotExistException extends RuntimeException { + public UserDoesNotExistException() { + super(); + } + + public UserDoesNotExistException(String message) { + super(message); + } +} diff --git a/src/main/java/Models/Album.java b/src/main/java/Models/Album.java new file mode 100644 index 0000000..cac4e80 --- /dev/null +++ b/src/main/java/Models/Album.java @@ -0,0 +1,59 @@ +package Models; + +import javax.persistence.*; +import java.sql.Date; +import java.util.List; + +@Table(name = "Albums") +@Entity +public class Album { + public Album() { + } + + @Id + @Column(name = "AlbumID") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int ID; + public int getID() { + return ID; + } + public void setID(int ID) { + this.ID = ID; + } + + @Column(name = "AlbumName") + private String name; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + @Column(name = "ReleaseDate") + private Date date; + public Date getDate() { + return date; + } + public void setDate(Date date) { + this.date = date; + } + + @ManyToOne + Artist artist; + public Artist getArtist() { + return artist; + } + public void setArtist(Artist artist) { + this.artist = artist; + } + + @OneToMany + List tracks; + public List getTracks() { + return tracks; + } + public void setTracks(List tracks) { + this.tracks = tracks; + } +} diff --git a/src/main/java/Models/Artist.java b/src/main/java/Models/Artist.java new file mode 100644 index 0000000..541af64 --- /dev/null +++ b/src/main/java/Models/Artist.java @@ -0,0 +1,75 @@ +package Models; + +import javax.persistence.*; +import java.util.List; + +@Table(name = "Artists") +@Entity +public class Artist { + public Artist() { + } + + public Artist(String name, int ID) { + this.name = name; + this.ID = ID; + } + + @Id + @Column(name = "id") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int ID; + public int getID() { + return ID; + } + + public void setID(int ID) { + this.ID = ID; + } + + @Column(name = "name") + private String name; + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + // One artist, many concerts + @OneToMany + List concerts; + public List getConcerts() { + return concerts; + } + public void setConcerts(List concerts) { + this.concerts = concerts; + } + + // One artist, many albums + @OneToMany(mappedBy = "artist") + List albums; + public List getAlbums() { + return albums; + } + public void setAlbums(List albums) { + this.albums = albums; + } + + // One artist, many tracks + @OneToMany + List tracks; + public List getTracks() { + return tracks; + } + public void setTracks(List tracks) { + this.tracks = tracks; + } + + @Override + public String toString() { + return "Artist {\n" + + "ID: " + ID + "\n" + + "name: " + name + "\n" + + '}'; + } +} diff --git a/src/main/java/Models/Playlist.java b/src/main/java/Models/Playlist.java new file mode 100644 index 0000000..4e2a309 --- /dev/null +++ b/src/main/java/Models/Playlist.java @@ -0,0 +1,37 @@ +package Models; + +import javax.persistence.*; + +/** + * This class is used to declare the POJO, Playlist + * @date 10/29/2021 + * @author + */ + +@Table(name = "PLAYLISTS") +@Entity +public class Playlist { + public Playlist() { + + } + + @Id + @Column(name = "PLAYLIST_ID") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int ID; + public int getID() { + return ID; + } + public void setID(int ID) { + this.ID = ID; + } + + @ManyToOne(cascade = CascadeType.ALL) + User user; + public User getUser() { + return user; + } + public void setUser(User user) { + this.user = user; + } +} diff --git a/src/main/java/Models/Role.java b/src/main/java/Models/Role.java deleted file mode 100644 index 88d5eb0..0000000 --- a/src/main/java/Models/Role.java +++ /dev/null @@ -1,62 +0,0 @@ -package Models; - -import javax.persistence.*; -import java.util.ArrayList; -import java.util.List; - -/** - * This class is used to declare the POJO, Role - * @date 11/01/2021 - * @author - */ - -@Table(name = "ROLES") -@Entity(name = "ROLE") -public class Role{ - public Role(){ - users = new ArrayList<>(); - } - - public Role(int roleID) { - this.roleID = roleID; - users = new ArrayList<>(); - } - - @Id - @Column(name = "ROLE_ID", columnDefinition = "int default 0") - @GeneratedValue(strategy = GenerationType.AUTO) - private int roleID; - public int getRoleID() { - return roleID; - } - public void setRoleID(int roleID) { - this.roleID = roleID; - } - - @Column(name = "USER_ROLE") - private String userRole; - public String getUserRole() { - switch (roleID){ - case 0: - userRole = ("Basic"); - break; - case 1: - userRole = ("Premium"); - break; - } - return userRole; - } - public void setUserRole(String userRole) { - this.userRole = userRole; - } - - // A Role contains a list of users under that designated role - @OneToMany (cascade = CascadeType.ALL) - private List users; - public List getUserInfo() { - return users; - } - public void setUserInfo(List userRoles) { - this.users = users; - } -} diff --git a/src/main/java/Models/User.java b/src/main/java/Models/User.java index 3fe7c0e..3d0dd31 100644 --- a/src/main/java/Models/User.java +++ b/src/main/java/Models/User.java @@ -1,7 +1,10 @@ package Models; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + import javax.persistence.*; +import java.util.List; /** * This class is used to declare the POJO, User @@ -13,11 +16,7 @@ @Entity public class User { public User() { - } - public User(String firstName, String lastName) { - this.firstName = firstName; - this.lastName = lastName; } public User(String firstName, String lastName, String email, String username, String password) { @@ -28,6 +27,12 @@ public User(String firstName, String lastName, String email, String username, St this.password = password; } + public User(String email, String username, String password) { + this.email = email; + this.username = username; + this.password = password; + } + @Id @Column(name = "USER_ID") @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -84,6 +89,28 @@ public void setPassword(String password) { this.password = password; } + @Enumerated + Role role; + public enum Role { + BASIC, + PREMIUM + } + public Role getRole() { + return role; + } + public void setRole(Role role) { + this.role = role; + } + + @OneToMany(mappedBy = "user") + List myPlaylists; + public List getMyPlaylists() { + return myPlaylists; + } + public void setMyPlaylists(List myPlaylists) { + this.myPlaylists = myPlaylists; + } + @Override public String toString() { return "User: {\n" + diff --git a/src/main/java/Repos/ConcertRepository.java b/src/main/java/Repos/ConcertRepository.java index c499b4a..027d91c 100644 --- a/src/main/java/Repos/ConcertRepository.java +++ b/src/main/java/Repos/ConcertRepository.java @@ -2,9 +2,11 @@ import Models.Concert; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; import java.util.Optional; +@Repository public interface ConcertRepository extends JpaRepository { Optional findByID(int ID); } \ No newline at end of file diff --git a/src/main/java/Repos/RoleRepository.java b/src/main/java/Repos/RoleRepository.java deleted file mode 100644 index 1dc1861..0000000 --- a/src/main/java/Repos/RoleRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package Repos; - -import Models.Role; -import org.springframework.data.jpa.repository.JpaRepository; -import java.util.Optional; - -public interface RoleRepository extends JpaRepository { - Optional findByID(int ID); -} \ No newline at end of file diff --git a/src/main/java/Repos/TrackRepository.java b/src/main/java/Repos/TrackRepository.java index 1129d77..6c233a1 100644 --- a/src/main/java/Repos/TrackRepository.java +++ b/src/main/java/Repos/TrackRepository.java @@ -2,9 +2,11 @@ import Models.Track; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; import java.util.Optional; +@Repository public interface TrackRepository extends JpaRepository { Optional findByID(int ID); } \ No newline at end of file diff --git a/src/main/java/Repos/UserRepository.java b/src/main/java/Repos/UserRepository.java index 48bdf11..179d63d 100644 --- a/src/main/java/Repos/UserRepository.java +++ b/src/main/java/Repos/UserRepository.java @@ -2,8 +2,15 @@ import Models.User; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + import java.util.Optional; +@Repository public interface UserRepository extends JpaRepository { + Optional getAllByID(); Optional findByID(int ID); + Optional findUserByFirstNameAndPassword(String firstName, String password); + Optional findUserByUsername(String username); + Optional findUserByFirstName(String username); } \ No newline at end of file diff --git a/src/main/java/Service/UserRegistration.java b/src/main/java/Service/UserRegistration.java new file mode 100644 index 0000000..c0c1c5b --- /dev/null +++ b/src/main/java/Service/UserRegistration.java @@ -0,0 +1,59 @@ +package Service; + +import org.hibernate.validator.constraints.Length; +import org.springframework.stereotype.Service; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; + +@Service +public class UserRegistration { + + @Length(min = 5, max = 20) + @NotNull(message = "Null, a username can not be.") + @Pattern(regexp = "^[a-zA-Z0-9]*$") + private String username; + + @Length(min = 8, max = 20) + @NotNull(message = "Come on. Your password should be strong, like Russian.") + @Pattern(regexp = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–{}:;',?/*~$^+=<>])$") + private String password; + + @Email(message = "This email is not valid >:(") + private String email; + + public UserRegistration() { + + } + + public UserRegistration(String username, String password, String email) { + this.username = username; + this.password = password; + this.email = email; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} \ No newline at end of file diff --git a/src/main/java/Service/UserValidator.java b/src/main/java/Service/UserValidator.java new file mode 100644 index 0000000..33e9bec --- /dev/null +++ b/src/main/java/Service/UserValidator.java @@ -0,0 +1,37 @@ +package Service; + + +import org.springframework.context.annotation.Bean; +import org.springframework.stereotype.Service; + +import javax.validation.Validation; +import javax.validation.Validator; +import javax.validation.ValidatorFactory; + +@Service +public class UserValidator { + ValidatorFactory factory; + Validator validator; + + @Bean + public void Validator(){ + factory = Validation.buildDefaultValidatorFactory(); + validator = factory.getValidator(); + } + + public ValidatorFactory getFactory() { + return factory; + } + + public void setFactory(ValidatorFactory factory) { + this.factory = factory; + } + + public Validator getValidator() { + return validator; + } + + public void setValidator(Validator validator) { + this.validator = validator; + } +} diff --git a/src/main/java/Services/UserService.java b/src/main/java/Services/UserService.java index cccb362..8ad808b 100644 --- a/src/main/java/Services/UserService.java +++ b/src/main/java/Services/UserService.java @@ -1,14 +1,13 @@ package Services; import Models.User; -import org.hibernate.query.Query; -import org.json.JSONObject; +import Service.UserRegistration; +import Exceptions.UserDoesNotExistException; +import Repos.UserRepository; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; -import javax.transaction.Transaction; +import javax.transaction.Transactional; import java.util.ArrayList; -import static Util.CredentialValidator.*; /** * @@ -17,22 +16,23 @@ */ @Service +@Transactional public class UserService { - // Variables - private static boolean success; - private static User user; + // Repository + private final UserRepository userRepository; - // Hibernate Variable - private static Query query; - private static Transaction tx; - - static { - user = new User(); + @Autowired + public UserService(UserRepository userRepository) { + this.userRepository = userRepository; } - // Get All - @Bean - public static ArrayList allUsers(){ + /** + * + * + * @return + * @author + */ + public ArrayList allUsers(){ ArrayList users = new ArrayList<>(); // Query for all users in database @@ -40,18 +40,27 @@ public static ArrayList allUsers(){ return users; } - @Bean - public static User getByID(int ID){ - // User with this ID - // Query query = getSession().createQuery("from User where ID = :id", User.class); - // user = query.getFirstResult(); - - return user; + /** + * + * @param ID + * @return + * @author + */ + public User getByID(int ID){ + return userRepository.findByID(ID) + .orElseThrow(UserDoesNotExistException::new); } - public static boolean save(@Autowired User user){ + /** + * + * @param user + * @return + */ + public boolean save(@Autowired User user){ + boolean success; + try{ - // getSession.save(user); + userRepository.save(user); success = true; } catch (Exception e) { success = false; @@ -61,34 +70,51 @@ public static boolean save(@Autowired User user){ return success; } - // Register - public static boolean registerUser(JSONObject registrationData){ - try { - String firstName, lastName, username, password, email; - firstName = registrationData.getString("firstName"); - lastName = registrationData.getString("lastName"); - username = registrationData.getString("username"); - password = registrationData.getString("password"); - email = registrationData.getString("email"); - - if (emailIsValid(email) && usernameIsValid(username) && passwordIsValid(password)) { - User user = new User(); - - /*tx = getSession.startTransaction(); - getSession.save(user);*/ + /** + * + * @param id + * @return + */ + public boolean delete(int id){ + boolean success; - tx.commit(); + try { + User user = getByID(id); + if (user != null) { + userRepository.delete(user); + success = true; } else { success = false; } } catch (Exception e) { - // if tx != null { - // tx.rollback(); - // } success = false; e.printStackTrace(); } return success; } + + /** + * + * @param userRegistrationData + * @return + */ + public User registerUser(UserRegistration userRegistrationData){ + User newUser = null; + String username, password, email; + + username = userRegistrationData.getUsername(); + email = userRegistrationData.getEmail(); + password = userRegistrationData.getPassword(); + + try { + newUser = new User(email, username, password); + newUser.setRole(User.Role.BASIC); + userRepository.save(newUser); + } catch (Exception e){ + + } + + return newUser; + } } diff --git a/src/main/java/Servlets/HelloServlet.java b/src/main/java/Servlets/HelloServlet.java deleted file mode 100644 index 4e94bc2..0000000 --- a/src/main/java/Servlets/HelloServlet.java +++ /dev/null @@ -1,30 +0,0 @@ -package Servlets; - -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.PrintWriter; - -@WebServlet(name = "HelloServlet", value = "/hello") -public class HelloServlet extends HttpServlet { - private String message; - - public void init() { - message = "Hello World!"; - } - - public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { - response.setContentType("text/html"); - - // Hello - PrintWriter out = response.getWriter(); - out.println(""); - out.println("

" + message + "

"); - out.println(""); - } - - public void destroy() { - } -} \ No newline at end of file diff --git a/src/main/java/Servlets/PingServlet.java b/src/main/java/Servlets/PingServlet.java deleted file mode 100644 index 1098b6c..0000000 --- a/src/main/java/Servlets/PingServlet.java +++ /dev/null @@ -1,36 +0,0 @@ -package Servlets; - -import org.json.JSONException; -import org.json.JSONObject; - -import javax.servlet.ServletException; -import javax.servlet.annotation.WebServlet; -import javax.servlet.http.HttpServlet; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -@WebServlet(name = "PingServlet", value = "/ping") -public class PingServlet extends HttpServlet { - @Override - protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - System.out.println(request.getRequestURI()); - response.setStatus(202); - response.setContentType("application/json"); - - JSONObject jObj = new JSONObject(); - - try { - jObj.put("response", "Pong!"); - } catch (JSONException e) { - e.printStackTrace(); - } - - response.getWriter().print(jObj); - } - - @Override - protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - - } -} diff --git a/src/main/java/Util/CredentialValidator.java b/src/main/java/Util/CredentialValidator.java deleted file mode 100644 index e9bce18..0000000 --- a/src/main/java/Util/CredentialValidator.java +++ /dev/null @@ -1,34 +0,0 @@ -package Util; - -import org.springframework.stereotype.Service; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -@Service -public class CredentialValidator { - // Registration Regex, Patterns, and Matcher - private static final String EMAIL_REGEX = "^(.+)@(.+)$"; - private static final String USERNAME_REGEX = "^[a-zA-Z0-9]\\w{5,20}$"; - private static final String PASSWORD_REGEX = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–{}:;',?/*~$^+=<>]).{8,20}$"; - private static final Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEX); - private static final Pattern USERNAME_PATTERN = Pattern.compile(USERNAME_REGEX); - private static final Pattern PASSWORD_PATTERN = Pattern.compile(PASSWORD_REGEX); - private static Matcher matcher; - - // Validation Methods - public static boolean emailIsValid (String email) { - matcher = EMAIL_PATTERN.matcher(email); - return matcher.matches(); - } - - public static boolean usernameIsValid(String username) { - matcher = USERNAME_PATTERN.matcher(username); - return matcher.matches(); - } - - public static boolean passwordIsValid(String password) { - matcher = PASSWORD_PATTERN.matcher(password); - return matcher.matches(); - } -} diff --git a/src/main/java/Util/DependencyLoaderListener.java b/src/main/java/Util/DependencyLoaderListener.java deleted file mode 100644 index 22bd277..0000000 --- a/src/main/java/Util/DependencyLoaderListener.java +++ /dev/null @@ -1,27 +0,0 @@ -package Util; - -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; -import javax.servlet.annotation.WebListener; - -/** - * This class is tied to the startup and shutdown of tomcat. Just implement - * the ServletContextListener and put whatever logic into the overridden - * methods. Make sure you inform tomcat of this class by including it - * in your deployment descriptor (web.xml) under the listener tag. - */ - -@WebListener -public class DependencyLoaderListener implements ServletContextListener { - @Override - public void contextInitialized(ServletContextEvent sce) { - System.out.println("Initializing Listener..."); - } - - @Override - public void contextDestroyed(ServletContextEvent sce) { - System.out.println("Closing Listener..."); - ServiceRequests.writeSummary(); - } -} - diff --git a/src/main/java/Util/JWTUtil.java b/src/main/java/Util/JWTUtil.java index 90fc8cf..cfb8a6a 100644 --- a/src/main/java/Util/JWTUtil.java +++ b/src/main/java/Util/JWTUtil.java @@ -1,47 +1,54 @@ package Util; +import Exceptions.AuthenticationException; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.springframework.stereotype.Service; - import javax.servlet.http.HttpServletRequest; import java.security.Key; +/** + * JWTUtil + * Class used for the creation/parsing of JWTs + */ @Service public class JWTUtil { - private static Key key; + private Key key; + private final Logger logger = LogManager.getLogger(); - private static void createKey(){ + private void createKey(){ key = Keys.secretKeyFor(SignatureAlgorithm.HS256); } - public static String createJWT(HttpServletRequest request){ + public String createJWT(HttpServletRequest request){ createKey(); - // Build the java web token - String jwt = Jwts.builder().setIssuer(request.getRequestURL().toString()) + // Build the java web token and return it + return Jwts.builder().setIssuer(request.getRequestURL().toString()) .setSubject(request.getParameter("username")) .signWith(key) .compact(); - - return jwt; } - public static boolean parseJWT(String jwsString) { - boolean parsed = false; - + public String parseJWT(String token) { try { - Jws jws = Jwts.parserBuilder() // Creates parser instance + Jws jwtClaim = Jwts.parserBuilder() // Creates parser instance .setSigningKey(key) // Specify the key to verify this jws signature .build() // Returns a new, thread-safe, parser - .parseClaimsJws(jwsString); // Parse the jws and return the original jws + .parseClaimsJws(token); // Parse the jws and return the original jws - parsed = true; - }catch (JwtException e){ + return jwtClaim.getBody().getSubject(); + } catch (JwtException e) { // JWT is invalid - e.printStackTrace(); + logger.info(String.format("Unauthorized user tried to barge their way in here! Don't worry, I caught this transgression. Error: %s", + e.getMessage())); + throw new AuthenticationException(); } + } - return parsed; + public Key getKey() { + return key; } } diff --git a/src/main/java/Util/RequestArgChecker.java b/src/main/java/Util/RequestArgChecker.java deleted file mode 100644 index 45821bd..0000000 --- a/src/main/java/Util/RequestArgChecker.java +++ /dev/null @@ -1,58 +0,0 @@ -package Util; - -import org.springframework.stereotype.Service; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.util.Enumeration; - -@Service -public class RequestArgChecker { - private static String paramName, paramValue; - private static String[] paramValues; - private static Enumeration parameterNames; - - public static String[] handleRequest(HttpServletRequest req, HttpServletResponse res) throws IOException { - String[] parameterAndArg = new String[2]; - parameterNames = req.getParameterNames(); - - while (parameterNames.hasMoreElements()) { - - paramName = parameterNames.nextElement(); - parameterAndArg[0] = paramName; - - paramValues = req.getParameterValues(paramName); - - if(paramValues.length > 1) { - for (String value : paramValues) { - paramValue = value; - System.out.println(paramValue); - } - } else { - parameterAndArg[1] = paramValues[0]; - } - } - - return parameterAndArg; - } - - public static void printRequestParam(HttpServletRequest req, HttpServletResponse res) throws IOException{ - res.setContentType("text/plain"); - - Enumeration parameterNames = req.getParameterNames(); - - while (parameterNames.hasMoreElements()) { - - String paramName = parameterNames.nextElement(); - System.out.println(paramName); - - String[] paramValues = req.getParameterValues(paramName); - for (int i = 0; i < paramValues.length; i++) { - String paramValue = paramValues[i]; - System.out.println(paramValue); - } - - } - } -} diff --git a/src/beans.xml b/src/main/resources/beans.xml similarity index 78% rename from src/beans.xml rename to src/main/resources/beans.xml index 859882c..b00d042 100644 --- a/src/beans.xml +++ b/src/main/resources/beans.xml @@ -3,6 +3,5 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - - + \ No newline at end of file From 93f29ac2aaa326201ca9d95e879c5e5efdf4f1c4 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Wed, 3 Nov 2021 17:36:16 -0400 Subject: [PATCH 13/27] A few changes A few model changes Filters created but not implemented yet Created UserInfo, UserDTO, LoginCredentialsDTO classes Moved everything into 'VanquishP2' package Repos and Services optimized per model Album Controller, Repo, and Service created --- HELP.md | 2 +- README.md | 2 +- pom.xml | 15 ++ src/main/java/Configs/PersistenceConfig.java | 24 ---- src/main/java/Models/Concert.java | 27 ---- src/main/java/Models/Playlist.java | 37 ----- src/main/java/Models/Track.java | 27 ---- src/main/java/Models/User.java | 125 ---------------- src/main/java/Services/UserService.java | 120 ---------------- src/main/java/Util/JWTUtil.java | 54 ------- .../Application/P2Application.java | 7 +- .../Application/ServletInitializer.java | 2 +- .../Beans/ModelServices/AlbumService.java | 55 +++++++ .../Beans/ModelServices/UserService.java | 134 ++++++++++++++++++ .../{ => VanquishP2/Beans}/Models/Album.java | 25 +++- .../{ => VanquishP2/Beans}/Models/Artist.java | 28 +++- .../java/VanquishP2/Beans/Models/Concert.java | 51 +++++++ .../VanquishP2/Beans/Models/Playlist.java | 60 ++++++++ .../java/VanquishP2/Beans/Models/Track.java | 66 +++++++++ .../java/VanquishP2/Beans/Models/User.java | 98 +++++++++++++ .../VanquishP2/Beans/Models/UserInfo.java | 79 +++++++++++ .../VanquishP2/Beans/Service/JWTUtil.java | 71 ++++++++++ .../java/VanquishP2/Beans/Service/Logger.java | 86 +++++++++++ .../Beans/Service}/ServiceRequests.java | 11 +- .../Beans/Service/ValidatorService.java} | 12 +- .../Configs/Filters/AuthenticationFilter.java | 54 +++++++ .../Configs/Filters/CORSFilter.java | 21 +++ .../VanquishP2/Configs/PersistenceConfig.java | 18 +++ .../{ => VanquishP2}/Configs/WebConfig.java | 3 +- .../Controllers/AlbumController.java | 76 ++++++++++ .../Controllers/AuthController.java | 41 ++++++ .../Controllers/HelloController.java | 2 +- .../Controllers/PingController.java | 2 +- .../Controllers/UserController.java | 44 +++--- .../VanquishP2/DTOs/LoginCredentialsDTO.java | 31 ++++ src/main/java/VanquishP2/DTOs/UserDTO.java | 15 ++ .../DTOs/UserRegistrationDTO.java} | 29 +++- .../DataGenerators/DataLists.java | 22 ++- .../DataGenerators/UserGen.java | 23 ++- .../AlbumDoesNotExistException.java | 17 +++ .../Exceptions/AuthenticationException.java | 4 +- .../Exceptions/UserDoesNotExistException.java | 4 +- .../VanquishP2/Repos/AlbumRepository.java | 14 ++ .../Repos/ConcertRepository.java | 4 +- .../Repos/TrackRepository.java | 4 +- .../VanquishP2/Repos/UserInfoRepository.java | 14 ++ .../Repos/UserRepository.java | 8 +- src/test/java/CredentialValidatorsTest.java | 14 +- target/classes/beans.xml | 7 + 49 files changed, 1187 insertions(+), 502 deletions(-) delete mode 100644 src/main/java/Configs/PersistenceConfig.java delete mode 100644 src/main/java/Models/Concert.java delete mode 100644 src/main/java/Models/Playlist.java delete mode 100644 src/main/java/Models/Track.java delete mode 100644 src/main/java/Models/User.java delete mode 100644 src/main/java/Services/UserService.java delete mode 100644 src/main/java/Util/JWTUtil.java rename src/main/java/{ => VanquishP2}/Application/P2Application.java (51%) rename src/main/java/{ => VanquishP2}/Application/ServletInitializer.java (92%) create mode 100644 src/main/java/VanquishP2/Beans/ModelServices/AlbumService.java create mode 100644 src/main/java/VanquishP2/Beans/ModelServices/UserService.java rename src/main/java/{ => VanquishP2/Beans}/Models/Album.java (65%) rename src/main/java/{ => VanquishP2/Beans}/Models/Artist.java (68%) create mode 100644 src/main/java/VanquishP2/Beans/Models/Concert.java create mode 100644 src/main/java/VanquishP2/Beans/Models/Playlist.java create mode 100644 src/main/java/VanquishP2/Beans/Models/Track.java create mode 100644 src/main/java/VanquishP2/Beans/Models/User.java create mode 100644 src/main/java/VanquishP2/Beans/Models/UserInfo.java create mode 100644 src/main/java/VanquishP2/Beans/Service/JWTUtil.java create mode 100644 src/main/java/VanquishP2/Beans/Service/Logger.java rename src/main/java/{Util => VanquishP2/Beans/Service}/ServiceRequests.java (81%) rename src/main/java/{Service/UserValidator.java => VanquishP2/Beans/Service/ValidatorService.java} (75%) create mode 100644 src/main/java/VanquishP2/Configs/Filters/AuthenticationFilter.java create mode 100644 src/main/java/VanquishP2/Configs/Filters/CORSFilter.java create mode 100644 src/main/java/VanquishP2/Configs/PersistenceConfig.java rename src/main/java/{ => VanquishP2}/Configs/WebConfig.java (88%) create mode 100644 src/main/java/VanquishP2/Controllers/AlbumController.java create mode 100644 src/main/java/VanquishP2/Controllers/AuthController.java rename src/main/java/{ => VanquishP2}/Controllers/HelloController.java (95%) rename src/main/java/{ => VanquishP2}/Controllers/PingController.java (95%) rename src/main/java/{ => VanquishP2}/Controllers/UserController.java (59%) create mode 100644 src/main/java/VanquishP2/DTOs/LoginCredentialsDTO.java create mode 100644 src/main/java/VanquishP2/DTOs/UserDTO.java rename src/main/java/{Service/UserRegistration.java => VanquishP2/DTOs/UserRegistrationDTO.java} (69%) rename src/main/java/{ => VanquishP2}/DataGenerators/DataLists.java (69%) rename src/main/java/{ => VanquishP2}/DataGenerators/UserGen.java (51%) create mode 100644 src/main/java/VanquishP2/Exceptions/AlbumDoesNotExistException.java rename src/main/java/{ => VanquishP2}/Exceptions/AuthenticationException.java (84%) rename src/main/java/{ => VanquishP2}/Exceptions/UserDoesNotExistException.java (84%) create mode 100644 src/main/java/VanquishP2/Repos/AlbumRepository.java rename src/main/java/{ => VanquishP2}/Repos/ConcertRepository.java (80%) rename src/main/java/{ => VanquishP2}/Repos/TrackRepository.java (80%) create mode 100644 src/main/java/VanquishP2/Repos/UserInfoRepository.java rename src/main/java/{ => VanquishP2}/Repos/UserRepository.java (60%) create mode 100644 target/classes/beans.xml diff --git a/HELP.md b/HELP.md index 49b7c00..35921b8 100644 --- a/HELP.md +++ b/HELP.md @@ -14,7 +14,7 @@ For further reference, please consider the following sections: The following guides illustrate how to use some features concretely: * [Accessing Data with JPA](https://spring.io/guides/gs/accessing-data-jpa/) -* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) +* [Building a RESTful Web VanquishP2.Beans.Service](https://spring.io/guides/gs/rest-service/) * [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) * [Building REST services with Spring](https://spring.io/guides/tutorials/bookmarks/) diff --git a/README.md b/README.md index 73af86f..cda6844 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ 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) -- [ ] All Exceptions are caught and logged to a file/database +- [ ] All VanquishP2.Exceptions are caught and logged to a file/database - [ ] 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 diff --git a/pom.xml b/pom.xml index ace78df..7802074 100644 --- a/pom.xml +++ b/pom.xml @@ -106,6 +106,21 @@ 0.11.2 runtime + + + + org.mockito + mockito-core + 4.0.0 + + + + + com.h2database + h2 + 1.4.200 + + diff --git a/src/main/java/Configs/PersistenceConfig.java b/src/main/java/Configs/PersistenceConfig.java deleted file mode 100644 index 6fb5659..0000000 --- a/src/main/java/Configs/PersistenceConfig.java +++ /dev/null @@ -1,24 +0,0 @@ -package Configs; - -/** - * DB Persistence Configuration - * - * @description This class contains all the session information for Hibernate to function - * within Spring - * @date 10/29/2021 - * @author Vanquish - */ - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -@Configuration -@EnableTransactionManagement -public class PersistenceConfig { - // Hibernate Variables - // @Value("") - -} diff --git a/src/main/java/Models/Concert.java b/src/main/java/Models/Concert.java deleted file mode 100644 index 272872b..0000000 --- a/src/main/java/Models/Concert.java +++ /dev/null @@ -1,27 +0,0 @@ -package Models; - -import javax.persistence.*; - -/** - * This class is used to declare the POJO, Concert - * @date 11/01/2021 - * @author - */ - -@Table(name = "CONCERTS") -@Entity -public class Concert { - public Concert() { - } - - @Id - @Column(name = "CONCERT_ID") - @GeneratedValue(strategy = GenerationType.IDENTITY) - private int ID; - public int getID() { - return ID; - } - public void setID(int ID) { - this.ID = ID; - } -} diff --git a/src/main/java/Models/Playlist.java b/src/main/java/Models/Playlist.java deleted file mode 100644 index 4e2a309..0000000 --- a/src/main/java/Models/Playlist.java +++ /dev/null @@ -1,37 +0,0 @@ -package Models; - -import javax.persistence.*; - -/** - * This class is used to declare the POJO, Playlist - * @date 10/29/2021 - * @author - */ - -@Table(name = "PLAYLISTS") -@Entity -public class Playlist { - public Playlist() { - - } - - @Id - @Column(name = "PLAYLIST_ID") - @GeneratedValue(strategy = GenerationType.IDENTITY) - private int ID; - public int getID() { - return ID; - } - public void setID(int ID) { - this.ID = ID; - } - - @ManyToOne(cascade = CascadeType.ALL) - User user; - public User getUser() { - return user; - } - public void setUser(User user) { - this.user = user; - } -} diff --git a/src/main/java/Models/Track.java b/src/main/java/Models/Track.java deleted file mode 100644 index c775ce4..0000000 --- a/src/main/java/Models/Track.java +++ /dev/null @@ -1,27 +0,0 @@ -package Models; - -import javax.persistence.*; - -/** - * This class is used to declare the POJO, Track - * @date 11/01/2021 - * @author - */ - -@Table(name = "TRACKS") -@Entity -public class Track { - public Track() { - } - - @Id - @Column(name = "TRACK_ID") - @GeneratedValue(strategy = GenerationType.IDENTITY) - private int ID; - public int getID() { - return ID; - } - public void setID(int ID) { - this.ID = ID; - } -} diff --git a/src/main/java/Models/User.java b/src/main/java/Models/User.java deleted file mode 100644 index 3d0dd31..0000000 --- a/src/main/java/Models/User.java +++ /dev/null @@ -1,125 +0,0 @@ -package Models; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import javax.persistence.*; -import java.util.List; - -/** - * This class is used to declare the POJO, User - * @date 10/29/2021 - * @author - */ - -@Table(name = "USERS") -@Entity -public class User { - public User() { - - } - - public User(String firstName, String lastName, String email, String username, String password) { - this.firstName = firstName; - this.lastName = lastName; - this.email = email; - this.username = username; - this.password = password; - } - - public User(String email, String username, String password) { - this.email = email; - this.username = username; - this.password = password; - } - - @Id - @Column(name = "USER_ID") - @GeneratedValue(strategy = GenerationType.IDENTITY) - private int ID; - public int getID() { - return ID; - } - public void setID(int ID) { - this.ID = ID; - } - - @Column(name = "FIRST_NAME") - private String firstName; - public String getFirstName() { - return firstName; - } - public void setFirstName(String username) { - this.firstName = username; - } - - @Column(name = "LAST_NAME") - private String lastName; - public String getLastName() { - return lastName; - } - public void setLastName(String lastName) { - this.lastName = lastName; - } - - @Column(name = "EMAIL") - private String email; - public String getEmail() { - return email; - } - public void setEmail(String email) { - this.email = email; - } - - @Column(name = "USERNAME") - private String username; - public String getUsername() { - return username; - } - public void setUsername(String username) { - this.username = username; - } - - @Column(name = "PASSWORD", nullable = false) - private String password; - public String getPassword(){ - return password; - } - public void setPassword(String password) { - this.password = password; - } - - @Enumerated - Role role; - public enum Role { - BASIC, - PREMIUM - } - public Role getRole() { - return role; - } - public void setRole(Role role) { - this.role = role; - } - - @OneToMany(mappedBy = "user") - List myPlaylists; - public List getMyPlaylists() { - return myPlaylists; - } - public void setMyPlaylists(List myPlaylists) { - this.myPlaylists = myPlaylists; - } - - @Override - public String toString() { - return "User: {\n" + - "ID: " + ID + - "firstName: " + firstName + ",\n" + - "lastName: " + lastName + ",\n" + - "email: " + email + ",\n" + - "username: " + username + ",\n" + - "password: " + password + "\n" + - '}'; - } -} diff --git a/src/main/java/Services/UserService.java b/src/main/java/Services/UserService.java deleted file mode 100644 index 8ad808b..0000000 --- a/src/main/java/Services/UserService.java +++ /dev/null @@ -1,120 +0,0 @@ -package Services; - -import Models.User; -import Service.UserRegistration; -import Exceptions.UserDoesNotExistException; -import Repos.UserRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import javax.transaction.Transactional; -import java.util.ArrayList; - -/** - * - * @date 10/29/2021 - * @author - */ - -@Service -@Transactional -public class UserService { - // Repository - private final UserRepository userRepository; - - @Autowired - public UserService(UserRepository userRepository) { - this.userRepository = userRepository; - } - - /** - * - * - * @return - * @author - */ - public ArrayList allUsers(){ - ArrayList users = new ArrayList<>(); - - // Query for all users in database - - return users; - } - - /** - * - * @param ID - * @return - * @author - */ - public User getByID(int ID){ - return userRepository.findByID(ID) - .orElseThrow(UserDoesNotExistException::new); - } - - /** - * - * @param user - * @return - */ - public boolean save(@Autowired User user){ - boolean success; - - try{ - userRepository.save(user); - success = true; - } catch (Exception e) { - success = false; - e.printStackTrace(); - } - - return success; - } - - /** - * - * @param id - * @return - */ - public boolean delete(int id){ - boolean success; - - try { - User user = getByID(id); - if (user != null) { - userRepository.delete(user); - success = true; - } else { - success = false; - } - } catch (Exception e) { - success = false; - e.printStackTrace(); - } - - return success; - } - - /** - * - * @param userRegistrationData - * @return - */ - public User registerUser(UserRegistration userRegistrationData){ - User newUser = null; - String username, password, email; - - username = userRegistrationData.getUsername(); - email = userRegistrationData.getEmail(); - password = userRegistrationData.getPassword(); - - try { - newUser = new User(email, username, password); - newUser.setRole(User.Role.BASIC); - userRepository.save(newUser); - } catch (Exception e){ - - } - - return newUser; - } -} diff --git a/src/main/java/Util/JWTUtil.java b/src/main/java/Util/JWTUtil.java deleted file mode 100644 index cfb8a6a..0000000 --- a/src/main/java/Util/JWTUtil.java +++ /dev/null @@ -1,54 +0,0 @@ -package Util; - -import Exceptions.AuthenticationException; -import io.jsonwebtoken.*; -import io.jsonwebtoken.security.Keys; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.springframework.stereotype.Service; -import javax.servlet.http.HttpServletRequest; -import java.security.Key; - -/** - * JWTUtil - * Class used for the creation/parsing of JWTs - */ -@Service -public class JWTUtil { - private Key key; - private final Logger logger = LogManager.getLogger(); - - private void createKey(){ - key = Keys.secretKeyFor(SignatureAlgorithm.HS256); - } - - public String createJWT(HttpServletRequest request){ - createKey(); - - // Build the java web token and return it - return Jwts.builder().setIssuer(request.getRequestURL().toString()) - .setSubject(request.getParameter("username")) - .signWith(key) - .compact(); - } - - public String parseJWT(String token) { - try { - Jws jwtClaim = Jwts.parserBuilder() // Creates parser instance - .setSigningKey(key) // Specify the key to verify this jws signature - .build() // Returns a new, thread-safe, parser - .parseClaimsJws(token); // Parse the jws and return the original jws - - return jwtClaim.getBody().getSubject(); - } catch (JwtException e) { - // JWT is invalid - logger.info(String.format("Unauthorized user tried to barge their way in here! Don't worry, I caught this transgression. Error: %s", - e.getMessage())); - throw new AuthenticationException(); - } - } - - public Key getKey() { - return key; - } -} diff --git a/src/main/java/Application/P2Application.java b/src/main/java/VanquishP2/Application/P2Application.java similarity index 51% rename from src/main/java/Application/P2Application.java rename to src/main/java/VanquishP2/Application/P2Application.java index 530bbe9..c73e364 100644 --- a/src/main/java/Application/P2Application.java +++ b/src/main/java/VanquishP2/Application/P2Application.java @@ -1,9 +1,12 @@ -package Application; +package VanquishP2.Application; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.ComponentScan; -@SpringBootApplication +@SpringBootApplication(scanBasePackages = "VanquishP2") +@EntityScan("VanquishP2") public class P2Application { public static void main(String[] args) { diff --git a/src/main/java/Application/ServletInitializer.java b/src/main/java/VanquishP2/Application/ServletInitializer.java similarity index 92% rename from src/main/java/Application/ServletInitializer.java rename to src/main/java/VanquishP2/Application/ServletInitializer.java index 31c43b5..6993336 100644 --- a/src/main/java/Application/ServletInitializer.java +++ b/src/main/java/VanquishP2/Application/ServletInitializer.java @@ -1,4 +1,4 @@ -package Application; +package VanquishP2.Application; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; diff --git a/src/main/java/VanquishP2/Beans/ModelServices/AlbumService.java b/src/main/java/VanquishP2/Beans/ModelServices/AlbumService.java new file mode 100644 index 0000000..41c511f --- /dev/null +++ b/src/main/java/VanquishP2/Beans/ModelServices/AlbumService.java @@ -0,0 +1,55 @@ +package VanquishP2.Beans.ModelServices; + +import VanquishP2.Exceptions.AlbumDoesNotExistException; +import VanquishP2.Beans.Models.Album; +import VanquishP2.Repos.AlbumRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import javax.transaction.Transactional; +import java.util.List; +import java.util.stream.Collectors; + +/** + * AlbumService + * The middle man, or service, that connects to the persistence layer for everything Album related + * + * @date 10/29/2021 + * @author Kollier Martin + */ + +@Service +@Transactional +public class AlbumService { + private final AlbumRepository albumRepository; + + @Autowired + public AlbumService(AlbumRepository albumRepository) { + this.albumRepository = albumRepository; + } + + public List getAll() { + return albumRepository.findAll(); + } + + public Album getByID(int id) throws AlbumDoesNotExistException { + return albumRepository.findByID(id) + .orElseThrow(AlbumDoesNotExistException::new); + } + + public Album getByName(String name) throws AlbumDoesNotExistException { + return albumRepository.getAlbumByName(name) + .orElseThrow(AlbumDoesNotExistException::new); + } + + public List getTwentyAlbums() { + return albumRepository.findAll().stream().filter(a -> a.getID() <= 20).collect(Collectors.toList()); + } + + public void delete(int id) throws AlbumDoesNotExistException { + albumRepository.delete(getByID(id)); + } + + public void save(Album album) { + albumRepository.save(album); + } +} diff --git a/src/main/java/VanquishP2/Beans/ModelServices/UserService.java b/src/main/java/VanquishP2/Beans/ModelServices/UserService.java new file mode 100644 index 0000000..80bc981 --- /dev/null +++ b/src/main/java/VanquishP2/Beans/ModelServices/UserService.java @@ -0,0 +1,134 @@ +package VanquishP2.Beans.ModelServices; + +import VanquishP2.Beans.Models.User; +import VanquishP2.Beans.Models.UserInfo; +import VanquishP2.Beans.Service.Logger; +import VanquishP2.DTOs.UserRegistrationDTO; +import VanquishP2.Exceptions.AuthenticationException; +import VanquishP2.Exceptions.UserDoesNotExistException; +import VanquishP2.Repos.UserInfoRepository; +import VanquishP2.Repos.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import javax.transaction.Transactional; +import java.util.List; +import java.util.Optional; + +/** + * + * @date 10/29/2021 + * @author + */ + +@Service +@Transactional +public class UserService { + private final UserRepository userRepository; + private final UserInfoRepository userInfoRepository; + private final String exceptionError = "User: %s does not exist."; + + @Autowired + public UserService(UserRepository userRepository, + UserInfoRepository userInfoRepository) { + this.userRepository = userRepository; + this.userInfoRepository = userInfoRepository; + } + + /** + * + * + * @return + * @author + */ + public List getAllUsers(){ + return userRepository.findAll(); + } + + /** + * + * @param ID + * @return + * @author + */ + public User getByID(int ID) { + User user = null; + + try { + user = userRepository.findByID(ID) + .orElseThrow(() -> new UserDoesNotExistException(String.format(exceptionError, ID))); + } catch (UserDoesNotExistException e) { + Logger.getFileLogger().writeLog(e.getMessage(), 3); + } + + return user; + } + + /** + * + * @param firstName + * @return + * @author + */ + public User getByFirstName(String firstName) throws UserDoesNotExistException { + return userRepository.findUserByFirstName(firstName) + .orElseThrow(() -> new UserDoesNotExistException(String.format(exceptionError, firstName))); + } + + /** + * + * @param user + * @return + */ + public void save(@Autowired User user) { + userRepository.save(user); + } + + /** + * + * @param username + * @param password + * @return + * @throws AuthenticationException + */ + public Optional authenticate(String username, String password) throws AuthenticationException { + Optional user = Optional.ofNullable(userInfoRepository.findUserByUsernameAndPassword(username, password).get().getUser()); + + if (!user.isPresent()) { + throw new AuthenticationException("Either you can't spell or your caps lock is on! Try again."); + } + return Optional.ofNullable(userInfoRepository.findUserByUsernameAndPassword(username, password).get().getUser()); + } + + /** + * + * @param id + * @return + */ + public void delete(int id) throws UserDoesNotExistException { + userRepository.deleteByID(id); + } + + /** + * + * @param userRegistrationDTOData + * @return + */ + public User registerUser(UserRegistrationDTO userRegistrationDTOData, User.Role role) { + User newUser; + UserInfo newUserInfo; + + newUserInfo = new UserInfo(userRegistrationDTOData); + newUserInfo.setUsername(userRegistrationDTOData.getUsername()); + newUserInfo.setEmail(userRegistrationDTOData.getEmail()); + newUserInfo.setPassword(userRegistrationDTOData.getPassword()); + + newUser = new User(userRegistrationDTOData); + newUser.setRole(role); + newUser.setUserInfo(newUserInfo); + + userInfoRepository.save(newUserInfo); + userRepository.save(newUser); + + return newUser; + } +} diff --git a/src/main/java/Models/Album.java b/src/main/java/VanquishP2/Beans/Models/Album.java similarity index 65% rename from src/main/java/Models/Album.java rename to src/main/java/VanquishP2/Beans/Models/Album.java index cac4e80..55aaba1 100644 --- a/src/main/java/Models/Album.java +++ b/src/main/java/VanquishP2/Beans/Models/Album.java @@ -1,23 +1,34 @@ -package Models; +package VanquishP2.Beans.Models; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; +import java.io.Serializable; import java.sql.Date; +import java.util.ArrayList; import java.util.List; -@Table(name = "Albums") +/** + * This class is used to declare the POJO, Album + * @date 10/29/2021 + * @author Kollier Martin + */ + +@Table(name = "ALBUMS") @Entity -public class Album { +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +public class Album implements Serializable { public Album() { + tracks = new ArrayList<>(); } @Id @Column(name = "AlbumID") @GeneratedValue(strategy = GenerationType.IDENTITY) - private int ID; - public int getID() { + private Integer ID; + public Integer getID() { return ID; } - public void setID(int ID) { + public void setID(Integer ID) { this.ID = ID; } @@ -56,4 +67,6 @@ public List getTracks() { public void setTracks(List tracks) { this.tracks = tracks; } + + } diff --git a/src/main/java/Models/Artist.java b/src/main/java/VanquishP2/Beans/Models/Artist.java similarity index 68% rename from src/main/java/Models/Artist.java rename to src/main/java/VanquishP2/Beans/Models/Artist.java index 541af64..db2ddcc 100644 --- a/src/main/java/Models/Artist.java +++ b/src/main/java/VanquishP2/Beans/Models/Artist.java @@ -1,21 +1,37 @@ -package Models; +package VanquishP2.Beans.Models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; +import java.util.ArrayList; import java.util.List; -@Table(name = "Artists") +/** + * This class is used to declare the POJO, Artist + * @date 10/29/2021 + * @author Kollier Martin + */ + +@Table(name = "ARTISTS") @Entity +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) public class Artist { public Artist() { + tracks = new ArrayList<>(); + albums = new ArrayList<>(); + concerts = new ArrayList<>(); } public Artist(String name, int ID) { this.name = name; this.ID = ID; + tracks = new ArrayList<>(); + albums = new ArrayList<>(); + concerts = new ArrayList<>(); } @Id - @Column(name = "id") + @Column(name = "ArtistID") @GeneratedValue(strategy = GenerationType.IDENTITY) private int ID; public int getID() { @@ -26,7 +42,7 @@ public void setID(int ID) { this.ID = ID; } - @Column(name = "name") + @Column(name = "Name") private String name; public String getName() { return name; @@ -35,8 +51,8 @@ public void setName(String name) { this.name = name; } - // One artist, many concerts - @OneToMany + // Many artists, many concerts + @ManyToMany List concerts; public List getConcerts() { return concerts; diff --git a/src/main/java/VanquishP2/Beans/Models/Concert.java b/src/main/java/VanquishP2/Beans/Models/Concert.java new file mode 100644 index 0000000..5b1f16c --- /dev/null +++ b/src/main/java/VanquishP2/Beans/Models/Concert.java @@ -0,0 +1,51 @@ +package VanquishP2.Beans.Models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +/** + * This class is used to declare the POJO, Concert + * @date 11/01/2021 + * @author Kollier Martin + */ + +@Table(name = "CONCERTS") +@Entity +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +public class Concert { + public Concert() { + artists = new ArrayList<>(); + } + + @Id + @Column(name = "ConcertID") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer ID; + public Integer getID() { + return ID; + } + public void setID(Integer ID) { + this.ID = ID; + } + + @Column(name = "Location") + private String location; + public String getLocation() { + return location; + } + public void setLocation(String location) { + this.location = location; + } + + @ManyToMany(mappedBy = "concerts") + List artists; + public List getArtists() { + return artists; + } + public void setArtists(List artists) { + this.artists = artists; + } +} diff --git a/src/main/java/VanquishP2/Beans/Models/Playlist.java b/src/main/java/VanquishP2/Beans/Models/Playlist.java new file mode 100644 index 0000000..cf06c5a --- /dev/null +++ b/src/main/java/VanquishP2/Beans/Models/Playlist.java @@ -0,0 +1,60 @@ +package VanquishP2.Beans.Models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +/** + * This class is used to declare the POJO, Playlist + * @date 10/29/2021 + * @author Kollier Martin + */ + +@Table(name = "PLAYLISTS") +@Entity +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +public class Playlist { + public Playlist() { + tracks = new ArrayList<>(); + } + + @Id + @Column(name = "PlaylistID") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer ID; + public Integer getID() { + return ID; + } + public void setID(Integer ID) { + this.ID = ID; + } + + @Column(name = "PlaylistName") + private String playlistName; + public String getPlaylistName() { + return playlistName; + } + public void setPlaylistName(String playlistName) { + this.playlistName = playlistName; + } + + @ManyToOne(cascade = CascadeType.ALL) + User user; + public User getUser() { + return user; + } + public void setUser(User user) { + this.user = user; + } + + @OneToMany(cascade = CascadeType.ALL, mappedBy = "playlist") + List tracks; + public List getTracks() { + return tracks; + } + public void setTracks(List tracks) { + this.tracks = tracks; + } +} diff --git a/src/main/java/VanquishP2/Beans/Models/Track.java b/src/main/java/VanquishP2/Beans/Models/Track.java new file mode 100644 index 0000000..53f2736 --- /dev/null +++ b/src/main/java/VanquishP2/Beans/Models/Track.java @@ -0,0 +1,66 @@ +package VanquishP2.Beans.Models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import javax.persistence.*; + +/** + * This class is used to declare the POJO, Track + * @date 11/01/2021 + * @author Kollier Martin + */ + +@Table(name = "TRACKS") +@Entity +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +public class Track { + public Track() { + } + + @Id + @Column(name = "TrackID") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer ID; + public Integer getID() { + return ID; + } + public void setID(Integer ID) { + this.ID = ID; + } + + @Column(name = "TrackName") + private String trackName; + public String getTrackName() { + return trackName; + } + public void setTrackName(String trackName) { + this.trackName = trackName; + } + + @Column(name = "Duration") + private String duration; + public String getDuration() { + return duration; + } + public void setDuration(String duration) { + this.duration = duration; + } + + @ManyToOne + private Artist artist; + public Artist getArtist() { + return artist; + } + public void setArtist(Artist artist) { + this.artist = artist; + } + + @ManyToOne + private Playlist playlist; + public Playlist getPlaylist() { + return playlist; + } + public void setPlaylist(Playlist playlist) { + this.playlist = playlist; + } +} diff --git a/src/main/java/VanquishP2/Beans/Models/User.java b/src/main/java/VanquishP2/Beans/Models/User.java new file mode 100644 index 0000000..50fa899 --- /dev/null +++ b/src/main/java/VanquishP2/Beans/Models/User.java @@ -0,0 +1,98 @@ +package VanquishP2.Beans.Models; + +import VanquishP2.DTOs.UserRegistrationDTO; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +/** + * This class is used to declare the POJO, User + * @date 10/29/2021 + * @author Kollier Martin + */ + +@Table(name = "USERS") +@Entity +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +public class User { + public User() { + myPlaylists = new ArrayList<>(); + } + + public User(UserRegistrationDTO registration) { + this.firstName = registration.getFirstName(); + this.lastName = registration.getLastName(); + myPlaylists = new ArrayList<>(); + } + + @Id + @Column(name = "UserID") + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer ID; + public Integer getID() { + return ID; + } + public void setID(Integer ID) { + this.ID = ID; + } + + @Column(name = "FirstName") + private String firstName; + public String getFirstName() { + return firstName; + } + public void setFirstName(String username) { + this.firstName = username; + } + + @Column(name = "LastName") + private String lastName; + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + + @Enumerated + Role role; + public enum Role { + BASIC, + PREMIUM + } + public Role getRole() { + return role; + } + public void setRole(Role role) { + this.role = role; + } + + @OneToMany(mappedBy = "user") + List myPlaylists; + public List getMyPlaylists() { + return myPlaylists; + } + public void setMyPlaylists(List myPlaylists) { + this.myPlaylists = myPlaylists; + } + + @OneToOne(mappedBy = "user") + UserInfo userInfo; + public UserInfo getUserInfo() { + return userInfo; + } + public void setUserInfo(UserInfo userInfo) { + this.userInfo = userInfo; + } + + @Override + public String toString() { + return "User: {\n" + + "ID: " + ID + + "firstName: " + firstName + ",\n" + + "lastName: " + lastName + ",\n" + + '}'; + } +} diff --git a/src/main/java/VanquishP2/Beans/Models/UserInfo.java b/src/main/java/VanquishP2/Beans/Models/UserInfo.java new file mode 100644 index 0000000..122a912 --- /dev/null +++ b/src/main/java/VanquishP2/Beans/Models/UserInfo.java @@ -0,0 +1,79 @@ +package VanquishP2.Beans.Models; + +import VanquishP2.DTOs.UserRegistrationDTO; +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import javax.persistence.*; + +/** + * This class is used to declare the POJO, UserInfo + * @date 10/29/2021 + * @author Kollier Martin + */ + +@Table(name = "USERINFOS") +@Entity +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +public class UserInfo { + public UserInfo() { + + } + + public UserInfo(String email, String username, String password) { + this.email = email; + this.username = username; + this.password = password; + } + + public UserInfo(UserRegistrationDTO registration) { + this.username = registration.getUsername(); + this.password = registration.getPassword(); + this.email = registration.getEmail(); + } + + @Id + @Column(name = "InfoID") + private int ID; + public int getID() { + return ID; + } + public void setID(int ID) { + this.ID = ID; + } + + @Column(name = "Email") + private String email; + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + + @Column(name = "Username") + private String username; + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + + @Column(name = "Password", nullable = false) + private String password; + public String getPassword(){ + return password; + } + public void setPassword(String password) { + this.password = password; + } + + @OneToOne + User user; + public User getUser() { + return user; + } + public void setUser(User user) { + this.user = user; + } +} diff --git a/src/main/java/VanquishP2/Beans/Service/JWTUtil.java b/src/main/java/VanquishP2/Beans/Service/JWTUtil.java new file mode 100644 index 0000000..fc05a96 --- /dev/null +++ b/src/main/java/VanquishP2/Beans/Service/JWTUtil.java @@ -0,0 +1,71 @@ +package VanquishP2.Beans.Service; + +import VanquishP2.Beans.Models.User; +import VanquishP2.Exceptions.AuthenticationException; +import io.jsonwebtoken.*; +import io.jsonwebtoken.security.Keys; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.security.Key; +import java.sql.Date; + +/** + * JWTUtil + * Class used for the creation/parsing of JWTs + */ +@Service +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 void JWTUtil (){ + createKey(); + } + + private void createKey(){ + key = Keys.secretKeyFor(SignatureAlgorithm.HS256); + } + + public String createJWT(User user){ + // Build the java web token and return it + return Jwts.builder() + .setIssuer("Vanquish") + .setSubject(user.getUserInfo().getUsername()) + .signWith(key) + .setExpiration(new Date(System.currentTimeMillis() + expiration)) + .compact(); + } + + public Jws 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); + } + + public String getHeader() { + return header; + } + + public String getPrefix() { + return prefix; + } + + public int getExpiration() { + return expiration; + } + + public Key getSigningKey() { + return key; + } +} diff --git a/src/main/java/VanquishP2/Beans/Service/Logger.java b/src/main/java/VanquishP2/Beans/Service/Logger.java new file mode 100644 index 0000000..cb5c22d --- /dev/null +++ b/src/main/java/VanquishP2/Beans/Service/Logger.java @@ -0,0 +1,86 @@ +package VanquishP2.Beans.Service; + +import org.springframework.stereotype.Service; +import java.io.FileWriter; +import java.io.IOException; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +@Service +public class Logger { + private static Logger logger; + private static int threshold; //would like to enumerate thresholds and devise something that checks inequality + private static boolean printToConsole; + private static boolean printToConsoleTemp; + + private Logger() { + printToConsole = false; + printToConsoleTemp = false; + threshold = 3; + } + + public static Logger getFileLogger() { + if (logger == null) { + logger = new Logger(); + } + return logger; + } + + public void writeLog(String message, int level) { + try (FileWriter fileWriter = new FileWriter(getLogFileName(), true)) { + String logEntry = formatLogEntry(message); + + if (level >= threshold) { + fileWriter.write(logEntry); + } + + if (printToConsole || printToConsoleTemp) { + System.out.println(logEntry); + printToConsoleTemp = false; + + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + + private String getLogFileName() { + String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); + return today + ".log"; + } + + private String formatLogEntry(String message) { + StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); + String stackInfo = stackTraceElements[3].toString(); + String timestamp = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); + return String.format("%s [%s] %s%n", timestamp, stackInfo, message); + } + + public Logger console() { + printToConsoleTemp = true; + return logger; + } + + public Logger threshold(int th) { + threshold = th; + return logger; + } + + public static boolean isPrintToConsole() { + return printToConsole; + } + + public static void setPrintToConsole(boolean printToConsole) { + Logger.printToConsole = printToConsole; + } + + public static int getThreshold() { + return threshold; + } + + public static void setThreshold(int threshold) { + Logger.threshold = threshold; + } +} diff --git a/src/main/java/Util/ServiceRequests.java b/src/main/java/VanquishP2/Beans/Service/ServiceRequests.java similarity index 81% rename from src/main/java/Util/ServiceRequests.java rename to src/main/java/VanquishP2/Beans/Service/ServiceRequests.java index 973c4ab..950644e 100644 --- a/src/main/java/Util/ServiceRequests.java +++ b/src/main/java/VanquishP2/Beans/Service/ServiceRequests.java @@ -1,7 +1,6 @@ -package Util; +package VanquishP2.Beans.Service; import org.springframework.stereotype.Service; - import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; @@ -24,7 +23,7 @@ public static void writeSummary(){ Date date = new Date(System.currentTimeMillis()); try{ - File file = new File("D:\\Programming Files\\Revature\\Erika-Kollier\\src\\main\\resources\\logs\\requestLog.log"); + File file = new File("requestLog.log"); FileWriter fileWriter = new FileWriter(file); BufferedWriter out = new BufferedWriter(fileWriter); @@ -37,14 +36,14 @@ public static void writeSummary(){ System.out.println("Request Summary has been written to designated to file."); } catch (IOException e) { - e.printStackTrace(); + Logger.getFileLogger().writeLog(e.getMessage(), 2); } } - public static void addRequest(String requestInfo, Date date){ + public static void addRequest(String requestInfo){ SimpleDateFormat formatter= new SimpleDateFormat("HH:mm:ss z"); requestCount++; - requestLog.add(requestInfo + " " + formatter.format(date)); + requestLog.add(requestInfo + " " + formatter.format(new Date(System.currentTimeMillis()))); } } diff --git a/src/main/java/Service/UserValidator.java b/src/main/java/VanquishP2/Beans/Service/ValidatorService.java similarity index 75% rename from src/main/java/Service/UserValidator.java rename to src/main/java/VanquishP2/Beans/Service/ValidatorService.java index 33e9bec..d716988 100644 --- a/src/main/java/Service/UserValidator.java +++ b/src/main/java/VanquishP2/Beans/Service/ValidatorService.java @@ -1,19 +1,15 @@ -package Service; +package VanquishP2.Beans.Service; - -import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Service; - import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; @Service -public class UserValidator { +public class ValidatorService { ValidatorFactory factory; Validator validator; - @Bean public void Validator(){ factory = Validation.buildDefaultValidatorFactory(); validator = factory.getValidator(); @@ -27,11 +23,11 @@ public void setFactory(ValidatorFactory factory) { this.factory = factory; } - public Validator getValidator() { + public javax.validation.Validator getValidator() { return validator; } - public void setValidator(Validator validator) { + public void setValidator(javax.validation.Validator validator) { this.validator = validator; } } diff --git a/src/main/java/VanquishP2/Configs/Filters/AuthenticationFilter.java b/src/main/java/VanquishP2/Configs/Filters/AuthenticationFilter.java new file mode 100644 index 0000000..1d76b59 --- /dev/null +++ b/src/main/java/VanquishP2/Configs/Filters/AuthenticationFilter.java @@ -0,0 +1,54 @@ +package VanquishP2.Configs.Filters; + +import VanquishP2.Beans.Service.JWTUtil; +import VanquishP2.Beans.Service.Logger; +import VanquishP2.Exceptions.AuthenticationException; +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jws; +import org.springframework.context.ApplicationContext; +import org.springframework.web.context.support.WebApplicationContextUtils; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/*@Component*/ +public class AuthenticationFilter implements Filter { + private JWTUtil jwtUtil; + private String errMessage = "Unauthorized user tried to barge their way in here! Don't worry, I caught this transgression. Error: %s"; + + + @Override + public void init(FilterConfig cfg) { + ApplicationContext container = WebApplicationContextUtils.getRequiredWebApplicationContext(cfg.getServletContext()); + this.jwtUtil = container.getBean(JWTUtil.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 req) { + + try { + String header = req.getHeader(jwtUtil.getHeader()); + if (header == null || !header.startsWith(jwtUtil.getPrefix())) { + Logger.getFileLogger().writeLog("Request originates from an unauthenticated source.", 3); + return; + } + + String token = header.replaceAll(jwtUtil.getPrefix(), ""); + + Jws jwtClaims = jwtUtil.parseJWT(token); + + } catch (AuthenticationException e) { + Logger.getFileLogger().writeLog(String.format(errMessage, e.getMessage()), 3); + } + } +} diff --git a/src/main/java/VanquishP2/Configs/Filters/CORSFilter.java b/src/main/java/VanquishP2/Configs/Filters/CORSFilter.java new file mode 100644 index 0000000..5d432e8 --- /dev/null +++ b/src/main/java/VanquishP2/Configs/Filters/CORSFilter.java @@ -0,0 +1,21 @@ +package VanquishP2.Configs.Filters; + +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/*@Component*/ +public class CORSFilter extends OncePerRequestFilter { + + @Override + protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) throws ServletException, IOException { + resp.setHeader("Access-Control-Allow-Origin", "*"); + resp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PATCH"); + resp.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); + chain.doFilter(req, resp); + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Configs/PersistenceConfig.java b/src/main/java/VanquishP2/Configs/PersistenceConfig.java new file mode 100644 index 0000000..fe485a5 --- /dev/null +++ b/src/main/java/VanquishP2/Configs/PersistenceConfig.java @@ -0,0 +1,18 @@ +package VanquishP2.Configs; + +/** + * DB Persistence Configuration + * + * @description This class contains all the session information for Hibernate to function + * within Spring + * @date 10/29/2021 + * @author Vanquish + */ + +/*@Configuration +@EnableTransactionManagement*/ +public class PersistenceConfig { + // Hibernate Variables + // @Value("") + +} diff --git a/src/main/java/Configs/WebConfig.java b/src/main/java/VanquishP2/Configs/WebConfig.java similarity index 88% rename from src/main/java/Configs/WebConfig.java rename to src/main/java/VanquishP2/Configs/WebConfig.java index e372582..86b7821 100644 --- a/src/main/java/Configs/WebConfig.java +++ b/src/main/java/VanquishP2/Configs/WebConfig.java @@ -1,10 +1,9 @@ -package Configs; +package VanquishP2.Configs; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration public class WebConfig implements WebMvcConfigurer { diff --git a/src/main/java/VanquishP2/Controllers/AlbumController.java b/src/main/java/VanquishP2/Controllers/AlbumController.java new file mode 100644 index 0000000..cafa869 --- /dev/null +++ b/src/main/java/VanquishP2/Controllers/AlbumController.java @@ -0,0 +1,76 @@ +package VanquishP2.Controllers; + +import VanquishP2.Beans.Models.Album; +import VanquishP2.Beans.ModelServices.AlbumService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; +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 + * + * @Date 11/3/2021 + * @Author Kollier Martin + */ + +@RestController +@RequestMapping(value = "/album", produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE) +public class AlbumController { + private final AlbumService albumService; + + @Autowired + public AlbumController(AlbumService albumService) { + this.albumService = albumService; + } + + @GetMapping("") + public ResponseEntity> getAllAlbums() { + List allAlbums = albumService.getAll(); + + if (allAlbums == null) + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + else if (allAlbums.isEmpty()) + return new ResponseEntity<>(allAlbums, HttpStatus.NO_CONTENT); + else + return new ResponseEntity<>(allAlbums, HttpStatus.OK); + } + + /** + * Receives ID from request, then returns an Album object if they exist + * @param id ID Integer to distinguish album + * @return Album Object + */ + @GetMapping("/{id}") + @ResponseStatus(HttpStatus.ACCEPTED) + public Album retrieve(@PathVariable int id) { + return albumService.getByID(id); + } + + /** + * Receives name from request, then returns an Album object if they exist + * @param name Name String to distinguish album + * @return Album Object + */ + @GetMapping("/{name}") + @ResponseStatus(HttpStatus.ACCEPTED) + public Album retrieve(@PathVariable String name) { + return albumService.getByName(name); + } + + @DeleteMapping("{/id}") + public ResponseEntity remove(@PathVariable int id) { + Optional album = Optional.ofNullable(albumService.getByID(id)); + + if (!album.isPresent()) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } else { + albumService.delete(id); + return new ResponseEntity<>(album.get(), HttpStatus.NO_CONTENT); + } + } +} diff --git a/src/main/java/VanquishP2/Controllers/AuthController.java b/src/main/java/VanquishP2/Controllers/AuthController.java new file mode 100644 index 0000000..755db09 --- /dev/null +++ b/src/main/java/VanquishP2/Controllers/AuthController.java @@ -0,0 +1,41 @@ +package VanquishP2.Controllers; + +import VanquishP2.Beans.ModelServices.UserService; +import VanquishP2.Beans.Models.User; +import VanquishP2.Beans.Service.JWTUtil; +import VanquishP2.DTOs.LoginCredentialsDTO; +import VanquishP2.DTOs.UserDTO; +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 java.util.Optional; + +import static org.springframework.http.MediaType.*; + +@RestController +@RequestMapping("/authenticate") +public class AuthController { + + private JWTUtil jwtUtil; + private UserService userService; + + @Autowired + public AuthController (JWTUtil jwtUtil, UserService userService) { + this.userService = userService; + } + + @PostMapping(consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) + public UserDTO authenticate(@RequestBody LoginCredentialsDTO credentials, HttpServletResponse response) { + Optional user = userService.authenticate(credentials.getUsername(), credentials.getPassword()); + String jwt = jwtUtil.createJWT(user.get()); + response.setHeader(jwtUtil.getHeader(), jwt); + + return new UserDTO(user.get()); + } + +} diff --git a/src/main/java/Controllers/HelloController.java b/src/main/java/VanquishP2/Controllers/HelloController.java similarity index 95% rename from src/main/java/Controllers/HelloController.java rename to src/main/java/VanquishP2/Controllers/HelloController.java index 4672f25..2d63cea 100644 --- a/src/main/java/Controllers/HelloController.java +++ b/src/main/java/VanquishP2/Controllers/HelloController.java @@ -1,4 +1,4 @@ -package Controllers; +package VanquishP2.Controllers; import org.json.JSONException; import org.json.JSONObject; diff --git a/src/main/java/Controllers/PingController.java b/src/main/java/VanquishP2/Controllers/PingController.java similarity index 95% rename from src/main/java/Controllers/PingController.java rename to src/main/java/VanquishP2/Controllers/PingController.java index 6ddcd62..b450c08 100644 --- a/src/main/java/Controllers/PingController.java +++ b/src/main/java/VanquishP2/Controllers/PingController.java @@ -1,4 +1,4 @@ -package Controllers; +package VanquishP2.Controllers; import org.json.JSONException; import org.json.JSONObject; diff --git a/src/main/java/Controllers/UserController.java b/src/main/java/VanquishP2/Controllers/UserController.java similarity index 59% rename from src/main/java/Controllers/UserController.java rename to src/main/java/VanquishP2/Controllers/UserController.java index c213a94..96eec21 100644 --- a/src/main/java/Controllers/UserController.java +++ b/src/main/java/VanquishP2/Controllers/UserController.java @@ -1,20 +1,15 @@ -package Controllers; +package VanquishP2.Controllers; -import Models.User; -import Service.UserRegistration; -import Repos.UserRepository; -import Services.UserService; -import Util.JWTUtil; +import VanquishP2.Beans.Models.User; +import VanquishP2.DTOs.UserRegistrationDTO; +import VanquishP2.Beans.ModelServices.UserService; +import VanquishP2.Beans.Service.JWTUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import javax.servlet.http.HttpServletResponse; -import javax.swing.text.html.Option; import javax.validation.Valid; -import java.util.ArrayList; -import java.util.Optional; - +import java.util.List; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; /** @@ -32,7 +27,7 @@ public class UserController { private final JWTUtil jwtUtil; @Autowired - public UserController(UserRepository userRepository, UserService userService, JWTUtil jwtUtil) { + public UserController(UserService userService, JWTUtil jwtUtil) { this.userService = userService; this.jwtUtil = jwtUtil; } @@ -44,14 +39,12 @@ public UserController(UserRepository userRepository, UserService userService, JW */ @GetMapping("/{id}") public User retrieve(@PathVariable int id) { - User user = userService.getByID(id); - - return user; + return userService.getByID(id); } @GetMapping("") - public ResponseEntity> getAllUsers() { - ArrayList allUsers = userService.allUsers(); + public ResponseEntity> getAllUsers() { + List allUsers = userService.getAllUsers(); if (allUsers == null) return new ResponseEntity<>(HttpStatus.NOT_FOUND); @@ -61,20 +54,25 @@ else if (allUsers.isEmpty()) return new ResponseEntity<>(allUsers, HttpStatus.OK); } - @PostMapping(value = "/register", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) - public User registerUser(@RequestBody @Valid UserRegistration regData){ - return userService.registerUser(regData); + @PostMapping(value = "/register/basic", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) + public User registerBasicUser(@RequestBody @Valid UserRegistrationDTO regData){ + return userService.registerUser(regData, User.Role.BASIC); + } + + @PostMapping(value = "/register/premium", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) + public User registerPremiumUser(@RequestBody @Valid UserRegistrationDTO regData){ + return userService.registerUser(regData, User.Role.PREMIUM); } @DeleteMapping("/{id}") public ResponseEntity delete(@PathVariable("id") int id) { - Optional user = Optional.ofNullable(userService.getByID(id)); + User user = userService.getByID(id); - if (!user.isPresent()) { + if (user == null) { return new ResponseEntity<>(HttpStatus.NOT_FOUND); } userService.delete(id); - return new ResponseEntity<>(user.get(), HttpStatus.NO_CONTENT); + return new ResponseEntity<>(user, HttpStatus.NO_CONTENT); } } diff --git a/src/main/java/VanquishP2/DTOs/LoginCredentialsDTO.java b/src/main/java/VanquishP2/DTOs/LoginCredentialsDTO.java new file mode 100644 index 0000000..0037d9b --- /dev/null +++ b/src/main/java/VanquishP2/DTOs/LoginCredentialsDTO.java @@ -0,0 +1,31 @@ +package VanquishP2.DTOs; + +public class LoginCredentialsDTO { + + private String username; + private String password; + + public LoginCredentialsDTO(String username, String password) { + this.username = username; + this.password = password; + } + + public LoginCredentialsDTO() { + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/DTOs/UserDTO.java b/src/main/java/VanquishP2/DTOs/UserDTO.java new file mode 100644 index 0000000..a2164c2 --- /dev/null +++ b/src/main/java/VanquishP2/DTOs/UserDTO.java @@ -0,0 +1,15 @@ +package VanquishP2.DTOs; + +import VanquishP2.Beans.Models.Track; +import VanquishP2.Beans.Models.User; + +import java.util.List; + +public class UserDTO { + List favoriteTracks; + User user; + + public UserDTO(User user) { + this.user = user; + } +} diff --git a/src/main/java/Service/UserRegistration.java b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java similarity index 69% rename from src/main/java/Service/UserRegistration.java rename to src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java index c0c1c5b..9329603 100644 --- a/src/main/java/Service/UserRegistration.java +++ b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java @@ -1,14 +1,11 @@ -package Service; +package VanquishP2.DTOs; import org.hibernate.validator.constraints.Length; -import org.springframework.stereotype.Service; - import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; -@Service -public class UserRegistration { +public class UserRegistrationDTO { @Length(min = 5, max = 20) @NotNull(message = "Null, a username can not be.") @@ -23,11 +20,13 @@ public class UserRegistration { @Email(message = "This email is not valid >:(") private String email; - public UserRegistration() { + private String firstName, lastName; + + public UserRegistrationDTO() { } - public UserRegistration(String username, String password, String email) { + public UserRegistrationDTO(String username, String password, String email) { this.username = username; this.password = password; this.email = email; @@ -56,4 +55,20 @@ public String getEmail() { public void setEmail(String email) { this.email = email; } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } } \ No newline at end of file diff --git a/src/main/java/DataGenerators/DataLists.java b/src/main/java/VanquishP2/DataGenerators/DataLists.java similarity index 69% rename from src/main/java/DataGenerators/DataLists.java rename to src/main/java/VanquishP2/DataGenerators/DataLists.java index d16a935..aea523f 100644 --- a/src/main/java/DataGenerators/DataLists.java +++ b/src/main/java/VanquishP2/DataGenerators/DataLists.java @@ -1,8 +1,15 @@ -package DataGenerators; +package VanquishP2.DataGenerators; +import org.hibernate.validator.constraints.Length; import org.springframework.stereotype.Service; +import org.springframework.validation.annotation.Validated; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; @Service +@Validated public class DataLists { public static String[] names = { "Chace", "Nielsen", @@ -19,7 +26,11 @@ public class DataLists { "Dawson", "Sheppard" }; - public static String[] passwords = { + public static @Length(min = 8, max = 20) + @NotNull(message = "*Crickets*.. That's an empty password!") + @Pattern(regexp = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–{}:;',?/*~$^+=<>])$", + message = "Come on. Your password should be strong, like Russian.") + String[] passwords = { "m]hQB7>d", "wRr^){3Q" , "h@w/V[8k", "]tqWC_D4", "kKL9?sx6", "WmHu{V9K", @@ -32,7 +43,10 @@ public class DataLists { "DRyQp3}]", "n3cYM@B^" }; - public static String[] usernames = { + public static @Length(min = 5, max = 20) + @NotNull(message = "Null, a username can not be.") + @Pattern(regexp = "^[a-zA-Z0-9]*$", message = "Username does not follow constraints!") + String[] usernames = { "Aireril", "Alisomet", "Anostung", "Aspenbo", "AuthorPlatinum", "Astroboy", @@ -47,7 +61,7 @@ public class DataLists { "Pherietm", "Puffro" }; - public static String[] emails = { + public static @Email(message = "Email is incorrectly formatted.") String[] emails = { "andre.kling@mills.com", "gayle.turcotte@connelly.biz", "adelbert.bauch@reilly.com", diff --git a/src/main/java/DataGenerators/UserGen.java b/src/main/java/VanquishP2/DataGenerators/UserGen.java similarity index 51% rename from src/main/java/DataGenerators/UserGen.java rename to src/main/java/VanquishP2/DataGenerators/UserGen.java index 640f5d8..a0a31bd 100644 --- a/src/main/java/DataGenerators/UserGen.java +++ b/src/main/java/VanquishP2/DataGenerators/UserGen.java @@ -1,15 +1,30 @@ -package DataGenerators; +package VanquishP2.DataGenerators; -import org.springframework.stereotype.Service; +import VanquishP2.Beans.Models.User; +import VanquishP2.Beans.Models.UserInfo; +import VanquishP2.DTOs.UserRegistrationDTO; +import VanquishP2.Repos.UserRepository; +import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; import java.util.Random; -import static DataGenerators.DataLists.*; +import static VanquishP2.DataGenerators.DataLists.*; -@Service +@Component public class UserGen { private static Random rand = new Random(); private static int index; + private UserRepository userRepository; + private UserRegistrationDTO userRegistrationDTO; + + @PostConstruct + private void populate() { + userRegistrationDTO = new UserRegistrationDTO(getAUsername(), getAPassword(), getAEmail()); + User user = new User(userRegistrationDTO); + UserInfo userInfo; + userRepository.save(user); + } public static String getAFirstName() { index = rand.nextInt(names.length); diff --git a/src/main/java/VanquishP2/Exceptions/AlbumDoesNotExistException.java b/src/main/java/VanquishP2/Exceptions/AlbumDoesNotExistException.java new file mode 100644 index 0000000..b0bf982 --- /dev/null +++ b/src/main/java/VanquishP2/Exceptions/AlbumDoesNotExistException.java @@ -0,0 +1,17 @@ +package VanquishP2.Exceptions; + +/** + * Custom Runtime Exception + * + * @date 11/1/2021 + * @author + */ +public class AlbumDoesNotExistException extends RuntimeException{ + public AlbumDoesNotExistException() { + super(); + } + + public AlbumDoesNotExistException(String message) { + super(message); + } +} diff --git a/src/main/java/Exceptions/AuthenticationException.java b/src/main/java/VanquishP2/Exceptions/AuthenticationException.java similarity index 84% rename from src/main/java/Exceptions/AuthenticationException.java rename to src/main/java/VanquishP2/Exceptions/AuthenticationException.java index c7e96a4..e157a65 100644 --- a/src/main/java/Exceptions/AuthenticationException.java +++ b/src/main/java/VanquishP2/Exceptions/AuthenticationException.java @@ -1,9 +1,9 @@ -package Exceptions; +package VanquishP2.Exceptions; /** * Custom Runtime Exception * - * @date + * @date 11/1/2021 * @author */ public class AuthenticationException extends RuntimeException { diff --git a/src/main/java/Exceptions/UserDoesNotExistException.java b/src/main/java/VanquishP2/Exceptions/UserDoesNotExistException.java similarity index 84% rename from src/main/java/Exceptions/UserDoesNotExistException.java rename to src/main/java/VanquishP2/Exceptions/UserDoesNotExistException.java index 30f1490..f091d59 100644 --- a/src/main/java/Exceptions/UserDoesNotExistException.java +++ b/src/main/java/VanquishP2/Exceptions/UserDoesNotExistException.java @@ -1,9 +1,9 @@ -package Exceptions; +package VanquishP2.Exceptions; /** * Custom Runtime Exception * - * @date + * @date 11/1/2021 * @author */ public class UserDoesNotExistException extends RuntimeException { diff --git a/src/main/java/VanquishP2/Repos/AlbumRepository.java b/src/main/java/VanquishP2/Repos/AlbumRepository.java new file mode 100644 index 0000000..d89fe44 --- /dev/null +++ b/src/main/java/VanquishP2/Repos/AlbumRepository.java @@ -0,0 +1,14 @@ +package VanquishP2.Repos; + +import VanquishP2.Beans.Models.Album; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface AlbumRepository extends JpaRepository { + Optional getAlbumByName(String name); + Optional getAlbumByArtist(String artist); + Optional findByID(Integer id); +} \ No newline at end of file diff --git a/src/main/java/Repos/ConcertRepository.java b/src/main/java/VanquishP2/Repos/ConcertRepository.java similarity index 80% rename from src/main/java/Repos/ConcertRepository.java rename to src/main/java/VanquishP2/Repos/ConcertRepository.java index 027d91c..3477dd9 100644 --- a/src/main/java/Repos/ConcertRepository.java +++ b/src/main/java/VanquishP2/Repos/ConcertRepository.java @@ -1,6 +1,6 @@ -package Repos; +package VanquishP2.Repos; -import Models.Concert; +import VanquishP2.Beans.Models.Concert; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/Repos/TrackRepository.java b/src/main/java/VanquishP2/Repos/TrackRepository.java similarity index 80% rename from src/main/java/Repos/TrackRepository.java rename to src/main/java/VanquishP2/Repos/TrackRepository.java index 6c233a1..11e4735 100644 --- a/src/main/java/Repos/TrackRepository.java +++ b/src/main/java/VanquishP2/Repos/TrackRepository.java @@ -1,6 +1,6 @@ -package Repos; +package VanquishP2.Repos; -import Models.Track; +import VanquishP2.Beans.Models.Track; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/VanquishP2/Repos/UserInfoRepository.java b/src/main/java/VanquishP2/Repos/UserInfoRepository.java new file mode 100644 index 0000000..9358859 --- /dev/null +++ b/src/main/java/VanquishP2/Repos/UserInfoRepository.java @@ -0,0 +1,14 @@ +package VanquishP2.Repos; + +import VanquishP2.Beans.Models.UserInfo; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.Optional; + +@Repository +public interface UserInfoRepository extends JpaRepository { + Optional findUserByUsernameAndPassword(String username, String password); + + Optional findByUsername(String username); +} \ No newline at end of file diff --git a/src/main/java/Repos/UserRepository.java b/src/main/java/VanquishP2/Repos/UserRepository.java similarity index 60% rename from src/main/java/Repos/UserRepository.java rename to src/main/java/VanquishP2/Repos/UserRepository.java index 179d63d..f6a1e92 100644 --- a/src/main/java/Repos/UserRepository.java +++ b/src/main/java/VanquishP2/Repos/UserRepository.java @@ -1,6 +1,6 @@ -package Repos; +package VanquishP2.Repos; -import Models.User; +import VanquishP2.Beans.Models.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -8,9 +8,7 @@ @Repository public interface UserRepository extends JpaRepository { - Optional getAllByID(); Optional findByID(int ID); - Optional findUserByFirstNameAndPassword(String firstName, String password); - Optional findUserByUsername(String username); Optional findUserByFirstName(String username); + void deleteByID(Integer ID); } \ No newline at end of file diff --git a/src/test/java/CredentialValidatorsTest.java b/src/test/java/CredentialValidatorsTest.java index 6231f11..c3eae54 100644 --- a/src/test/java/CredentialValidatorsTest.java +++ b/src/test/java/CredentialValidatorsTest.java @@ -1,8 +1,18 @@ +import VanquishP2.Beans.Service.ValidatorService; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import java.util.Arrays; -import static DataGenerators.DataLists.*; +import org.junit.jupiter.api.TestInstance; +import static org.mockito.Mockito.mock; +@TestInstance(TestInstance.Lifecycle.PER_CLASS) public class CredentialValidatorsTest { + ValidatorService mockValidator = mock(ValidatorService.class); + + @BeforeAll + void setup(){ + mockValidator = new ValidatorService(); + } + @Test public void emailChecker() { diff --git a/target/classes/beans.xml b/target/classes/beans.xml new file mode 100644 index 0000000..b00d042 --- /dev/null +++ b/target/classes/beans.xml @@ -0,0 +1,7 @@ + + + + + \ No newline at end of file From 2c20ff5d0b180ee90abdf5ec473d832123f3926d Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Wed, 3 Nov 2021 20:37:11 -0400 Subject: [PATCH 14/27] A working commit that creates tables --- HELP.md | 2 +- .../Configs/Filters/AuthenticationFilter.java | 6 ++--- .../Beans}/Configs/Filters/CORSFilter.java | 2 +- .../Beans}/Configs/PersistenceConfig.java | 2 +- .../Beans}/Configs/WebConfig.java | 8 +++---- .../Beans/ModelServices/AlbumService.java | 6 ++--- .../Beans/ModelServices/UserService.java | 12 +++++----- .../{ => Application}/Beans/Models/Album.java | 4 +++- .../Beans/Models/Artist.java | 3 ++- .../Beans/Models/Concert.java | 3 ++- .../Beans/Models/Playlist.java | 3 ++- .../{ => Application}/Beans/Models/Track.java | 3 ++- .../{ => Application}/Beans/Models/User.java | 3 ++- .../Beans/Models/UserInfo.java | 3 ++- .../Beans}/Repos/AlbumRepository.java | 5 ++--- .../Beans}/Repos/ConcertRepository.java | 4 ++-- .../Beans}/Repos/TrackRepository.java | 4 ++-- .../Beans}/Repos/UserInfoRepository.java | 4 ++-- .../Beans}/Repos/UserRepository.java | 4 ++-- .../Beans/Service/JWTUtil.java | 4 ++-- .../Beans/Service/Logger.java | 2 +- .../Beans/Service/ServiceRequests.java | 2 +- .../Beans/Service/ValidatorService.java | 2 +- .../VanquishP2/Application/P2Application.java | 3 +-- .../Controllers/AlbumController.java | 4 ++-- .../Controllers/AuthController.java | 6 ++--- .../Controllers/UserController.java | 6 ++--- src/main/java/VanquishP2/DTOs/UserDTO.java | 4 ++-- .../VanquishP2/DataGenerators/DataLists.java | 4 ---- .../VanquishP2/DataGenerators/UserGen.java | 22 +++++++++++++------ src/main/resources/beans.xml | 1 - src/test/java/CredentialValidatorsTest.java | 2 +- target/classes/beans.xml | 1 - 33 files changed, 75 insertions(+), 69 deletions(-) rename src/main/java/VanquishP2/{ => Application/Beans}/Configs/Filters/AuthenticationFilter.java (92%) rename src/main/java/VanquishP2/{ => Application/Beans}/Configs/Filters/CORSFilter.java (93%) rename src/main/java/VanquishP2/{ => Application/Beans}/Configs/PersistenceConfig.java (87%) rename src/main/java/VanquishP2/{ => Application/Beans}/Configs/WebConfig.java (79%) rename src/main/java/VanquishP2/{ => Application}/Beans/ModelServices/AlbumService.java (90%) rename src/main/java/VanquishP2/{ => Application}/Beans/ModelServices/UserService.java (91%) rename src/main/java/VanquishP2/{ => Application}/Beans/Models/Album.java (93%) rename src/main/java/VanquishP2/{ => Application}/Beans/Models/Artist.java (95%) rename src/main/java/VanquishP2/{ => Application}/Beans/Models/Concert.java (92%) rename src/main/java/VanquishP2/{ => Application}/Beans/Models/Playlist.java (93%) rename src/main/java/VanquishP2/{ => Application}/Beans/Models/Track.java (93%) rename src/main/java/VanquishP2/{ => Application}/Beans/Models/User.java (96%) rename src/main/java/VanquishP2/{ => Application}/Beans/Models/UserInfo.java (94%) rename src/main/java/VanquishP2/{ => Application/Beans}/Repos/AlbumRepository.java (73%) rename src/main/java/VanquishP2/{ => Application/Beans}/Repos/ConcertRepository.java (73%) rename src/main/java/VanquishP2/{ => Application/Beans}/Repos/TrackRepository.java (73%) rename src/main/java/VanquishP2/{ => Application/Beans}/Repos/UserInfoRepository.java (79%) rename src/main/java/VanquishP2/{ => Application/Beans}/Repos/UserRepository.java (79%) rename src/main/java/VanquishP2/{ => Application}/Beans/Service/JWTUtil.java (94%) rename src/main/java/VanquishP2/{ => Application}/Beans/Service/Logger.java (98%) rename src/main/java/VanquishP2/{ => Application}/Beans/Service/ServiceRequests.java (97%) rename src/main/java/VanquishP2/{ => Application}/Beans/Service/ValidatorService.java (94%) diff --git a/HELP.md b/HELP.md index 35921b8..4a11be0 100644 --- a/HELP.md +++ b/HELP.md @@ -14,7 +14,7 @@ For further reference, please consider the following sections: The following guides illustrate how to use some features concretely: * [Accessing Data with JPA](https://spring.io/guides/gs/accessing-data-jpa/) -* [Building a RESTful Web VanquishP2.Beans.Service](https://spring.io/guides/gs/rest-service/) +* [Building a RESTful Web VanquishP2.Application.Beans.Service](https://spring.io/guides/gs/rest-service/) * [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) * [Building REST services with Spring](https://spring.io/guides/tutorials/bookmarks/) diff --git a/src/main/java/VanquishP2/Configs/Filters/AuthenticationFilter.java b/src/main/java/VanquishP2/Application/Beans/Configs/Filters/AuthenticationFilter.java similarity index 92% rename from src/main/java/VanquishP2/Configs/Filters/AuthenticationFilter.java rename to src/main/java/VanquishP2/Application/Beans/Configs/Filters/AuthenticationFilter.java index 1d76b59..c9a4296 100644 --- a/src/main/java/VanquishP2/Configs/Filters/AuthenticationFilter.java +++ b/src/main/java/VanquishP2/Application/Beans/Configs/Filters/AuthenticationFilter.java @@ -1,7 +1,7 @@ -package VanquishP2.Configs.Filters; +package VanquishP2.Application.Beans.Configs.Filters; -import VanquishP2.Beans.Service.JWTUtil; -import VanquishP2.Beans.Service.Logger; +import VanquishP2.Application.Beans.Service.JWTUtil; +import VanquishP2.Application.Beans.Service.Logger; import VanquishP2.Exceptions.AuthenticationException; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jws; diff --git a/src/main/java/VanquishP2/Configs/Filters/CORSFilter.java b/src/main/java/VanquishP2/Application/Beans/Configs/Filters/CORSFilter.java similarity index 93% rename from src/main/java/VanquishP2/Configs/Filters/CORSFilter.java rename to src/main/java/VanquishP2/Application/Beans/Configs/Filters/CORSFilter.java index 5d432e8..01580c4 100644 --- a/src/main/java/VanquishP2/Configs/Filters/CORSFilter.java +++ b/src/main/java/VanquishP2/Application/Beans/Configs/Filters/CORSFilter.java @@ -1,4 +1,4 @@ -package VanquishP2.Configs.Filters; +package VanquishP2.Application.Beans.Configs.Filters; import org.springframework.web.filter.OncePerRequestFilter; diff --git a/src/main/java/VanquishP2/Configs/PersistenceConfig.java b/src/main/java/VanquishP2/Application/Beans/Configs/PersistenceConfig.java similarity index 87% rename from src/main/java/VanquishP2/Configs/PersistenceConfig.java rename to src/main/java/VanquishP2/Application/Beans/Configs/PersistenceConfig.java index fe485a5..72939bc 100644 --- a/src/main/java/VanquishP2/Configs/PersistenceConfig.java +++ b/src/main/java/VanquishP2/Application/Beans/Configs/PersistenceConfig.java @@ -1,4 +1,4 @@ -package VanquishP2.Configs; +package VanquishP2.Application.Beans.Configs; /** * DB Persistence Configuration diff --git a/src/main/java/VanquishP2/Configs/WebConfig.java b/src/main/java/VanquishP2/Application/Beans/Configs/WebConfig.java similarity index 79% rename from src/main/java/VanquishP2/Configs/WebConfig.java rename to src/main/java/VanquishP2/Application/Beans/Configs/WebConfig.java index 86b7821..e710d13 100644 --- a/src/main/java/VanquishP2/Configs/WebConfig.java +++ b/src/main/java/VanquishP2/Application/Beans/Configs/WebConfig.java @@ -1,13 +1,11 @@ -package VanquishP2.Configs; +package VanquishP2.Application.Beans.Configs; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -@Configuration +//@Configuration public class WebConfig implements WebMvcConfigurer { - @Bean + //@Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurer() { @Override diff --git a/src/main/java/VanquishP2/Beans/ModelServices/AlbumService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java similarity index 90% rename from src/main/java/VanquishP2/Beans/ModelServices/AlbumService.java rename to src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java index 41c511f..3a2b748 100644 --- a/src/main/java/VanquishP2/Beans/ModelServices/AlbumService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java @@ -1,8 +1,8 @@ -package VanquishP2.Beans.ModelServices; +package VanquishP2.Application.Beans.ModelServices; import VanquishP2.Exceptions.AlbumDoesNotExistException; -import VanquishP2.Beans.Models.Album; -import VanquishP2.Repos.AlbumRepository; +import VanquishP2.Application.Beans.Models.Album; +import VanquishP2.Application.Beans.Repos.AlbumRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.transaction.Transactional; diff --git a/src/main/java/VanquishP2/Beans/ModelServices/UserService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java similarity index 91% rename from src/main/java/VanquishP2/Beans/ModelServices/UserService.java rename to src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java index 80bc981..1174118 100644 --- a/src/main/java/VanquishP2/Beans/ModelServices/UserService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java @@ -1,13 +1,13 @@ -package VanquishP2.Beans.ModelServices; +package VanquishP2.Application.Beans.ModelServices; -import VanquishP2.Beans.Models.User; -import VanquishP2.Beans.Models.UserInfo; -import VanquishP2.Beans.Service.Logger; +import VanquishP2.Application.Beans.Models.User; +import VanquishP2.Application.Beans.Models.UserInfo; +import VanquishP2.Application.Beans.Service.Logger; import VanquishP2.DTOs.UserRegistrationDTO; import VanquishP2.Exceptions.AuthenticationException; import VanquishP2.Exceptions.UserDoesNotExistException; -import VanquishP2.Repos.UserInfoRepository; -import VanquishP2.Repos.UserRepository; +import VanquishP2.Application.Beans.Repos.UserInfoRepository; +import VanquishP2.Application.Beans.Repos.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.transaction.Transactional; diff --git a/src/main/java/VanquishP2/Beans/Models/Album.java b/src/main/java/VanquishP2/Application/Beans/Models/Album.java similarity index 93% rename from src/main/java/VanquishP2/Beans/Models/Album.java rename to src/main/java/VanquishP2/Application/Beans/Models/Album.java index 55aaba1..b8c3e11 100644 --- a/src/main/java/VanquishP2/Beans/Models/Album.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Album.java @@ -1,6 +1,8 @@ -package VanquishP2.Beans.Models; +package VanquishP2.Application.Beans.Models; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.springframework.stereotype.Component; + import javax.persistence.*; import java.io.Serializable; import java.sql.Date; diff --git a/src/main/java/VanquishP2/Beans/Models/Artist.java b/src/main/java/VanquishP2/Application/Beans/Models/Artist.java similarity index 95% rename from src/main/java/VanquishP2/Beans/Models/Artist.java rename to src/main/java/VanquishP2/Application/Beans/Models/Artist.java index db2ddcc..0769558 100644 --- a/src/main/java/VanquishP2/Beans/Models/Artist.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Artist.java @@ -1,6 +1,7 @@ -package VanquishP2.Beans.Models; +package VanquishP2.Application.Beans.Models; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.springframework.stereotype.Component; import javax.persistence.*; import java.util.ArrayList; diff --git a/src/main/java/VanquishP2/Beans/Models/Concert.java b/src/main/java/VanquishP2/Application/Beans/Models/Concert.java similarity index 92% rename from src/main/java/VanquishP2/Beans/Models/Concert.java rename to src/main/java/VanquishP2/Application/Beans/Models/Concert.java index 5b1f16c..2a7b705 100644 --- a/src/main/java/VanquishP2/Beans/Models/Concert.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Concert.java @@ -1,6 +1,7 @@ -package VanquishP2.Beans.Models; +package VanquishP2.Application.Beans.Models; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.springframework.stereotype.Component; import javax.persistence.*; import java.util.ArrayList; diff --git a/src/main/java/VanquishP2/Beans/Models/Playlist.java b/src/main/java/VanquishP2/Application/Beans/Models/Playlist.java similarity index 93% rename from src/main/java/VanquishP2/Beans/Models/Playlist.java rename to src/main/java/VanquishP2/Application/Beans/Models/Playlist.java index cf06c5a..c9b1dc2 100644 --- a/src/main/java/VanquishP2/Beans/Models/Playlist.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Playlist.java @@ -1,6 +1,7 @@ -package VanquishP2.Beans.Models; +package VanquishP2.Application.Beans.Models; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.springframework.stereotype.Component; import javax.persistence.*; import java.util.ArrayList; diff --git a/src/main/java/VanquishP2/Beans/Models/Track.java b/src/main/java/VanquishP2/Application/Beans/Models/Track.java similarity index 93% rename from src/main/java/VanquishP2/Beans/Models/Track.java rename to src/main/java/VanquishP2/Application/Beans/Models/Track.java index 53f2736..097de73 100644 --- a/src/main/java/VanquishP2/Beans/Models/Track.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Track.java @@ -1,6 +1,7 @@ -package VanquishP2.Beans.Models; +package VanquishP2.Application.Beans.Models; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.springframework.stereotype.Component; import javax.persistence.*; diff --git a/src/main/java/VanquishP2/Beans/Models/User.java b/src/main/java/VanquishP2/Application/Beans/Models/User.java similarity index 96% rename from src/main/java/VanquishP2/Beans/Models/User.java rename to src/main/java/VanquishP2/Application/Beans/Models/User.java index 50fa899..8a3ee41 100644 --- a/src/main/java/VanquishP2/Beans/Models/User.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/User.java @@ -1,7 +1,8 @@ -package VanquishP2.Beans.Models; +package VanquishP2.Application.Beans.Models; import VanquishP2.DTOs.UserRegistrationDTO; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.springframework.stereotype.Component; import javax.persistence.*; import java.util.ArrayList; diff --git a/src/main/java/VanquishP2/Beans/Models/UserInfo.java b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java similarity index 94% rename from src/main/java/VanquishP2/Beans/Models/UserInfo.java rename to src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java index 122a912..9a70ad5 100644 --- a/src/main/java/VanquishP2/Beans/Models/UserInfo.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java @@ -1,7 +1,8 @@ -package VanquishP2.Beans.Models; +package VanquishP2.Application.Beans.Models; import VanquishP2.DTOs.UserRegistrationDTO; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import org.springframework.stereotype.Component; import javax.persistence.*; diff --git a/src/main/java/VanquishP2/Repos/AlbumRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java similarity index 73% rename from src/main/java/VanquishP2/Repos/AlbumRepository.java rename to src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java index d89fe44..351c0cf 100644 --- a/src/main/java/VanquishP2/Repos/AlbumRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java @@ -1,6 +1,6 @@ -package VanquishP2.Repos; +package VanquishP2.Application.Beans.Repos; -import VanquishP2.Beans.Models.Album; +import VanquishP2.Application.Beans.Models.Album; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -9,6 +9,5 @@ @Repository public interface AlbumRepository extends JpaRepository { Optional getAlbumByName(String name); - Optional getAlbumByArtist(String artist); Optional findByID(Integer id); } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Repos/ConcertRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/ConcertRepository.java similarity index 73% rename from src/main/java/VanquishP2/Repos/ConcertRepository.java rename to src/main/java/VanquishP2/Application/Beans/Repos/ConcertRepository.java index 3477dd9..a389367 100644 --- a/src/main/java/VanquishP2/Repos/ConcertRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/ConcertRepository.java @@ -1,6 +1,6 @@ -package VanquishP2.Repos; +package VanquishP2.Application.Beans.Repos; -import VanquishP2.Beans.Models.Concert; +import VanquishP2.Application.Beans.Models.Concert; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/VanquishP2/Repos/TrackRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/TrackRepository.java similarity index 73% rename from src/main/java/VanquishP2/Repos/TrackRepository.java rename to src/main/java/VanquishP2/Application/Beans/Repos/TrackRepository.java index 11e4735..dbd44bf 100644 --- a/src/main/java/VanquishP2/Repos/TrackRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/TrackRepository.java @@ -1,6 +1,6 @@ -package VanquishP2.Repos; +package VanquishP2.Application.Beans.Repos; -import VanquishP2.Beans.Models.Track; +import VanquishP2.Application.Beans.Models.Track; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/VanquishP2/Repos/UserInfoRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java similarity index 79% rename from src/main/java/VanquishP2/Repos/UserInfoRepository.java rename to src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java index 9358859..fe38af1 100644 --- a/src/main/java/VanquishP2/Repos/UserInfoRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java @@ -1,6 +1,6 @@ -package VanquishP2.Repos; +package VanquishP2.Application.Beans.Repos; -import VanquishP2.Beans.Models.UserInfo; +import VanquishP2.Application.Beans.Models.UserInfo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/VanquishP2/Repos/UserRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java similarity index 79% rename from src/main/java/VanquishP2/Repos/UserRepository.java rename to src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java index f6a1e92..b80c651 100644 --- a/src/main/java/VanquishP2/Repos/UserRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java @@ -1,6 +1,6 @@ -package VanquishP2.Repos; +package VanquishP2.Application.Beans.Repos; -import VanquishP2.Beans.Models.User; +import VanquishP2.Application.Beans.Models.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/src/main/java/VanquishP2/Beans/Service/JWTUtil.java b/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java similarity index 94% rename from src/main/java/VanquishP2/Beans/Service/JWTUtil.java rename to src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java index fc05a96..4123d58 100644 --- a/src/main/java/VanquishP2/Beans/Service/JWTUtil.java +++ b/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java @@ -1,6 +1,6 @@ -package VanquishP2.Beans.Service; +package VanquishP2.Application.Beans.Service; -import VanquishP2.Beans.Models.User; +import VanquishP2.Application.Beans.Models.User; import VanquishP2.Exceptions.AuthenticationException; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; diff --git a/src/main/java/VanquishP2/Beans/Service/Logger.java b/src/main/java/VanquishP2/Application/Beans/Service/Logger.java similarity index 98% rename from src/main/java/VanquishP2/Beans/Service/Logger.java rename to src/main/java/VanquishP2/Application/Beans/Service/Logger.java index cb5c22d..859d2d6 100644 --- a/src/main/java/VanquishP2/Beans/Service/Logger.java +++ b/src/main/java/VanquishP2/Application/Beans/Service/Logger.java @@ -1,4 +1,4 @@ -package VanquishP2.Beans.Service; +package VanquishP2.Application.Beans.Service; import org.springframework.stereotype.Service; import java.io.FileWriter; diff --git a/src/main/java/VanquishP2/Beans/Service/ServiceRequests.java b/src/main/java/VanquishP2/Application/Beans/Service/ServiceRequests.java similarity index 97% rename from src/main/java/VanquishP2/Beans/Service/ServiceRequests.java rename to src/main/java/VanquishP2/Application/Beans/Service/ServiceRequests.java index 950644e..05bae35 100644 --- a/src/main/java/VanquishP2/Beans/Service/ServiceRequests.java +++ b/src/main/java/VanquishP2/Application/Beans/Service/ServiceRequests.java @@ -1,4 +1,4 @@ -package VanquishP2.Beans.Service; +package VanquishP2.Application.Beans.Service; import org.springframework.stereotype.Service; import java.io.BufferedWriter; diff --git a/src/main/java/VanquishP2/Beans/Service/ValidatorService.java b/src/main/java/VanquishP2/Application/Beans/Service/ValidatorService.java similarity index 94% rename from src/main/java/VanquishP2/Beans/Service/ValidatorService.java rename to src/main/java/VanquishP2/Application/Beans/Service/ValidatorService.java index d716988..8ad703a 100644 --- a/src/main/java/VanquishP2/Beans/Service/ValidatorService.java +++ b/src/main/java/VanquishP2/Application/Beans/Service/ValidatorService.java @@ -1,4 +1,4 @@ -package VanquishP2.Beans.Service; +package VanquishP2.Application.Beans.Service; import org.springframework.stereotype.Service; import javax.validation.Validation; diff --git a/src/main/java/VanquishP2/Application/P2Application.java b/src/main/java/VanquishP2/Application/P2Application.java index c73e364..e2b5f1e 100644 --- a/src/main/java/VanquishP2/Application/P2Application.java +++ b/src/main/java/VanquishP2/Application/P2Application.java @@ -3,10 +3,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; -import org.springframework.context.annotation.ComponentScan; @SpringBootApplication(scanBasePackages = "VanquishP2") -@EntityScan("VanquishP2") +@EntityScan("VanquishP2.Application.Beans.Models") public class P2Application { public static void main(String[] args) { diff --git a/src/main/java/VanquishP2/Controllers/AlbumController.java b/src/main/java/VanquishP2/Controllers/AlbumController.java index cafa869..1ed7adb 100644 --- a/src/main/java/VanquishP2/Controllers/AlbumController.java +++ b/src/main/java/VanquishP2/Controllers/AlbumController.java @@ -1,7 +1,7 @@ package VanquishP2.Controllers; -import VanquishP2.Beans.Models.Album; -import VanquishP2.Beans.ModelServices.AlbumService; +import VanquishP2.Application.Beans.Models.Album; +import VanquishP2.Application.Beans.ModelServices.AlbumService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/VanquishP2/Controllers/AuthController.java b/src/main/java/VanquishP2/Controllers/AuthController.java index 755db09..0dde0b4 100644 --- a/src/main/java/VanquishP2/Controllers/AuthController.java +++ b/src/main/java/VanquishP2/Controllers/AuthController.java @@ -1,8 +1,8 @@ package VanquishP2.Controllers; -import VanquishP2.Beans.ModelServices.UserService; -import VanquishP2.Beans.Models.User; -import VanquishP2.Beans.Service.JWTUtil; +import VanquishP2.Application.Beans.ModelServices.UserService; +import VanquishP2.Application.Beans.Models.User; +import VanquishP2.Application.Beans.Service.JWTUtil; import VanquishP2.DTOs.LoginCredentialsDTO; import VanquishP2.DTOs.UserDTO; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/VanquishP2/Controllers/UserController.java b/src/main/java/VanquishP2/Controllers/UserController.java index 96eec21..e4930b3 100644 --- a/src/main/java/VanquishP2/Controllers/UserController.java +++ b/src/main/java/VanquishP2/Controllers/UserController.java @@ -1,9 +1,9 @@ package VanquishP2.Controllers; -import VanquishP2.Beans.Models.User; +import VanquishP2.Application.Beans.Models.User; import VanquishP2.DTOs.UserRegistrationDTO; -import VanquishP2.Beans.ModelServices.UserService; -import VanquishP2.Beans.Service.JWTUtil; +import VanquishP2.Application.Beans.ModelServices.UserService; +import VanquishP2.Application.Beans.Service.JWTUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/src/main/java/VanquishP2/DTOs/UserDTO.java b/src/main/java/VanquishP2/DTOs/UserDTO.java index a2164c2..9584d75 100644 --- a/src/main/java/VanquishP2/DTOs/UserDTO.java +++ b/src/main/java/VanquishP2/DTOs/UserDTO.java @@ -1,7 +1,7 @@ package VanquishP2.DTOs; -import VanquishP2.Beans.Models.Track; -import VanquishP2.Beans.Models.User; +import VanquishP2.Application.Beans.Models.Track; +import VanquishP2.Application.Beans.Models.User; import java.util.List; diff --git a/src/main/java/VanquishP2/DataGenerators/DataLists.java b/src/main/java/VanquishP2/DataGenerators/DataLists.java index aea523f..c4a3224 100644 --- a/src/main/java/VanquishP2/DataGenerators/DataLists.java +++ b/src/main/java/VanquishP2/DataGenerators/DataLists.java @@ -1,15 +1,11 @@ package VanquishP2.DataGenerators; import org.hibernate.validator.constraints.Length; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; -@Service -@Validated public class DataLists { public static String[] names = { "Chace", "Nielsen", diff --git a/src/main/java/VanquishP2/DataGenerators/UserGen.java b/src/main/java/VanquishP2/DataGenerators/UserGen.java index a0a31bd..e5ee83b 100644 --- a/src/main/java/VanquishP2/DataGenerators/UserGen.java +++ b/src/main/java/VanquishP2/DataGenerators/UserGen.java @@ -1,29 +1,37 @@ package VanquishP2.DataGenerators; -import VanquishP2.Beans.Models.User; -import VanquishP2.Beans.Models.UserInfo; +import VanquishP2.Application.Beans.ModelServices.UserService; +import VanquishP2.Application.Beans.Models.User; +import VanquishP2.Application.Beans.Models.UserInfo; import VanquishP2.DTOs.UserRegistrationDTO; -import VanquishP2.Repos.UserRepository; +import VanquishP2.Application.Beans.Repos.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.util.Random; import static VanquishP2.DataGenerators.DataLists.*; -@Component +//@Service public class UserGen { private static Random rand = new Random(); private static int index; - private UserRepository userRepository; + private final UserService userService; private UserRegistrationDTO userRegistrationDTO; - @PostConstruct + //@Autowired + public UserGen(UserService userService) { + this.userService = userService; + } + + //@PostConstruct private void populate() { userRegistrationDTO = new UserRegistrationDTO(getAUsername(), getAPassword(), getAEmail()); User user = new User(userRegistrationDTO); UserInfo userInfo; - userRepository.save(user); + userService.save(user); } public static String getAFirstName() { diff --git a/src/main/resources/beans.xml b/src/main/resources/beans.xml index b00d042..142def2 100644 --- a/src/main/resources/beans.xml +++ b/src/main/resources/beans.xml @@ -3,5 +3,4 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - \ No newline at end of file diff --git a/src/test/java/CredentialValidatorsTest.java b/src/test/java/CredentialValidatorsTest.java index c3eae54..bf50d59 100644 --- a/src/test/java/CredentialValidatorsTest.java +++ b/src/test/java/CredentialValidatorsTest.java @@ -1,4 +1,4 @@ -import VanquishP2.Beans.Service.ValidatorService; +import VanquishP2.Application.Beans.Service.ValidatorService; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; diff --git a/target/classes/beans.xml b/target/classes/beans.xml index b00d042..142def2 100644 --- a/target/classes/beans.xml +++ b/target/classes/beans.xml @@ -3,5 +3,4 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - \ No newline at end of file From b4b04ddbdbc2eb24d32d6af67900936245f94d5b Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Wed, 3 Nov 2021 23:10:02 -0400 Subject: [PATCH 15/27] Group Agreement Created Genre and Location Updated all existing classes to match the group standard Updated Repos, Services, and Controller to match --- .../Beans/ModelServices/AlbumService.java | 4 +- .../Beans/ModelServices/UserService.java | 16 ++--- .../Application/Beans/Models/Album.java | 38 ++++++++--- .../Application/Beans/Models/Artist.java | 26 ++++--- .../Application/Beans/Models/Concert.java | 12 +++- .../Application/Beans/Models/Genre.java | 59 ++++++++++++++++ .../Application/Beans/Models/Location.java | 67 +++++++++++++++++++ .../Application/Beans/Models/Playlist.java | 31 ++++++--- .../Application/Beans/Models/Track.java | 33 ++++++++- .../Application/Beans/Models/User.java | 47 ++++++------- .../Application/Beans/Models/UserInfo.java | 50 ++++++++++++-- .../Beans/Repos/AlbumRepository.java | 2 +- .../Beans/Repos/UserInfoRepository.java | 1 - .../Beans/Repos/UserRepository.java | 3 +- .../Controllers/AlbumController.java | 2 +- .../VanquishP2/DTOs/UserRegistrationDTO.java | 7 ++ .../VanquishP2/DataGenerators/UserGen.java | 7 +- 17 files changed, 322 insertions(+), 83 deletions(-) create mode 100644 src/main/java/VanquishP2/Application/Beans/Models/Genre.java create mode 100644 src/main/java/VanquishP2/Application/Beans/Models/Location.java diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java index 3a2b748..68503da 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java @@ -36,8 +36,8 @@ public Album getByID(int id) throws AlbumDoesNotExistException { .orElseThrow(AlbumDoesNotExistException::new); } - public Album getByName(String name) throws AlbumDoesNotExistException { - return albumRepository.getAlbumByName(name) + public Album getByTitle(String title) throws AlbumDoesNotExistException { + return albumRepository.getAlbumByAlbumTitle(title) .orElseThrow(AlbumDoesNotExistException::new); } diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java index 1174118..3708e33 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java @@ -65,13 +65,13 @@ public User getByID(int ID) { /** * - * @param firstName + * @param userInfo * @return * @author */ - public User getByFirstName(String firstName) throws UserDoesNotExistException { - return userRepository.findUserByFirstName(firstName) - .orElseThrow(() -> new UserDoesNotExistException(String.format(exceptionError, firstName))); + public User getByFirstName(UserInfo userInfo) throws UserDoesNotExistException { + return userRepository.findUserByUserInfo(userInfo) + .orElseThrow(() -> new UserDoesNotExistException(String.format(exceptionError, userInfo))); } /** @@ -118,13 +118,7 @@ public User registerUser(UserRegistrationDTO userRegistrationDTOData, User.Role UserInfo newUserInfo; newUserInfo = new UserInfo(userRegistrationDTOData); - newUserInfo.setUsername(userRegistrationDTOData.getUsername()); - newUserInfo.setEmail(userRegistrationDTOData.getEmail()); - newUserInfo.setPassword(userRegistrationDTOData.getPassword()); - - newUser = new User(userRegistrationDTOData); - newUser.setRole(role); - newUser.setUserInfo(newUserInfo); + newUser = new User(role, newUserInfo); userInfoRepository.save(newUserInfo); userRepository.save(newUser); diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Album.java b/src/main/java/VanquishP2/Application/Beans/Models/Album.java index b8c3e11..47fe9e2 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/Album.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Album.java @@ -1,7 +1,6 @@ package VanquishP2.Application.Beans.Models; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.springframework.stereotype.Component; import javax.persistence.*; import java.io.Serializable; @@ -17,7 +16,7 @@ @Table(name = "ALBUMS") @Entity -@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, ignoreUnknown = true) public class Album implements Serializable { public Album() { tracks = new ArrayList<>(); @@ -34,13 +33,13 @@ public void setID(Integer ID) { this.ID = ID; } - @Column(name = "AlbumName") - private String name; - public String getName() { - return name; + @Column(name = "AlbumTitle") + private String albumTitle; + public String getAlbumTitle() { + return albumTitle; } - public void setName(String name) { - this.name = name; + public void setAlbumTitle(String albumTitle) { + this.albumTitle = albumTitle; } @Column(name = "ReleaseDate") @@ -53,7 +52,7 @@ public void setDate(Date date) { } @ManyToOne - Artist artist; + private Artist artist; public Artist getArtist() { return artist; } @@ -62,7 +61,7 @@ public void setArtist(Artist artist) { } @OneToMany - List tracks; + private List tracks; public List getTracks() { return tracks; } @@ -70,5 +69,24 @@ public void setTracks(List tracks) { this.tracks = tracks; } + @ManyToMany + private List albumGenres; + public List getAlbumGenres() { + return albumGenres; + } + public void setAlbumGenres(List albumGenres) { + this.albumGenres = albumGenres; + } + @Override + public String toString() { + return "Album {\n" + + "ID: " + ID + ",\n" + + "albumTitle: " + albumTitle + ",\n" + + "date: " + date + ",\n" + + "artist: " + artist + ",\n" + + "tracks: " + tracks + ",\n" + + "albumGenres: " + albumGenres + ",\n" + + '}'; + } } diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Artist.java b/src/main/java/VanquishP2/Application/Beans/Models/Artist.java index 0769558..078170a 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/Artist.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Artist.java @@ -1,7 +1,6 @@ package VanquishP2.Application.Beans.Models; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.springframework.stereotype.Component; import javax.persistence.*; import java.util.ArrayList; @@ -15,7 +14,7 @@ @Table(name = "ARTISTS") @Entity -@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, ignoreUnknown = true) public class Artist { public Artist() { tracks = new ArrayList<>(); @@ -23,9 +22,8 @@ public Artist() { concerts = new ArrayList<>(); } - public Artist(String name, int ID) { + public Artist(String name) { this.name = name; - this.ID = ID; tracks = new ArrayList<>(); albums = new ArrayList<>(); concerts = new ArrayList<>(); @@ -52,7 +50,15 @@ public void setName(String name) { this.name = name; } - // Many artists, many concerts + @Column(name = "Picture") + private String imageURL; + public String getImageURL() { + return imageURL; + } + public void setImageURL(String imageURL) { + this.imageURL = imageURL; + } + @ManyToMany List concerts; public List getConcerts() { @@ -62,7 +68,6 @@ public void setConcerts(List concerts) { this.concerts = concerts; } - // One artist, many albums @OneToMany(mappedBy = "artist") List albums; public List getAlbums() { @@ -72,7 +77,6 @@ public void setAlbums(List albums) { this.albums = albums; } - // One artist, many tracks @OneToMany List tracks; public List getTracks() { @@ -85,8 +89,12 @@ public void setTracks(List tracks) { @Override public String toString() { return "Artist {\n" + - "ID: " + ID + "\n" + - "name: " + name + "\n" + + "ID: " + ID + ",\n" + + "name: " + name + ",\n" + + "imageURL: " + imageURL + ",\n" + + "concerts: " + concerts + ",\n" + + "albums: " + albums + ",\n" + + "tracks: " + tracks + ",\n" + '}'; } } diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Concert.java b/src/main/java/VanquishP2/Application/Beans/Models/Concert.java index 2a7b705..bb47d98 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/Concert.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Concert.java @@ -1,7 +1,6 @@ package VanquishP2.Application.Beans.Models; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.springframework.stereotype.Component; import javax.persistence.*; import java.util.ArrayList; @@ -15,7 +14,7 @@ @Table(name = "CONCERTS") @Entity -@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, ignoreUnknown = true) public class Concert { public Concert() { artists = new ArrayList<>(); @@ -49,4 +48,13 @@ public List getArtists() { public void setArtists(List artists) { this.artists = artists; } + + @Override + public String toString() { + return "Concert {\n" + + "ID: " + ID + ",\n" + + "location: " + location + ",\n" + + "artists: " + artists + ",\n" + + '}'; + } } diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Genre.java b/src/main/java/VanquishP2/Application/Beans/Models/Genre.java new file mode 100644 index 0000000..999e5d3 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/Models/Genre.java @@ -0,0 +1,59 @@ +package VanquishP2.Application.Beans.Models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Table(name = "GENRES") +@Entity +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +public class Genre { + public Genre() { + genreOfAlbums = new ArrayList<>(); + } + + public Genre(Integer genreID, String genreName, String imageURL) { + this.genreID = genreID; + this.genreName = genreName; + this.imageURL = imageURL; + } + + @Id + @Column + private Integer genreID; + public Integer getGenreID() { + return genreID; + } + public void setGenreID(Integer genreID) { + this.genreID = genreID; + } + + @Column + private String genreName; + public String getGenreName() { + return genreName; + } + public void setGenreName(String genreName) { + this.genreName = genreName; + } + + @Column + private String imageURL; + public String getImageURL() { + return imageURL; + } + public void setImageURL(String imageURL) { + this.imageURL = imageURL; + } + + @ManyToMany(mappedBy = "albumGenres") + private List genreOfAlbums; + public List getGenreOfAlbums() { + return genreOfAlbums; + } + public void setGenreOfAlbums(List genreOfAlbums) { + this.genreOfAlbums = genreOfAlbums; + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Location.java b/src/main/java/VanquishP2/Application/Beans/Models/Location.java new file mode 100644 index 0000000..8aa026b --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/Models/Location.java @@ -0,0 +1,67 @@ +package VanquishP2.Application.Beans.Models; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import javax.persistence.*; + +@Table(name = "LOCATIONS") +@Entity +@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +public class Location { + public Location(Integer locationID, String city, String state) { + this.locationID = locationID; + this.city = city; + this.state = state; + } + + public Location() { + + } + + @Id + @Column + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer locationID; + public Integer getLocationID() { + return locationID; + } + public void setLocationID(Integer location_id) { + this.locationID = location_id; + } + + @Column + private String city; + public String getCity() { + return city; + } + public void setCity(String city) { + this.city = city; + } + + @Column + private String state; + public String getState() { + return state; + } + public void setState(String state) { + this.state = state; + } + + @OneToOne + private UserInfo userInfo; + public UserInfo getUserInfo() { + return userInfo; + } + public void setUserInfo(UserInfo userInfo) { + this.userInfo = userInfo; + } + + @Override + public String toString() { + return "Location {\n" + + "locationID: " + locationID + ",\n" + + "city: " + city + ",\n" + + "state: " + state + ",\n" + + "userInfo: " + userInfo + ",\n" + + '}'; + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Playlist.java b/src/main/java/VanquishP2/Application/Beans/Models/Playlist.java index c9b1dc2..1111134 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/Playlist.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Playlist.java @@ -1,7 +1,6 @@ package VanquishP2.Application.Beans.Models; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.springframework.stereotype.Component; import javax.persistence.*; import java.util.ArrayList; @@ -15,10 +14,16 @@ @Table(name = "PLAYLISTS") @Entity -@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, ignoreUnknown = true) public class Playlist { public Playlist() { - tracks = new ArrayList<>(); + trackList = new ArrayList<>(); + } + + public Playlist(String playlistName, User user, List trackList) { + this.playlistName = playlistName; + this.user = user; + this.trackList = trackList; } @Id @@ -51,11 +56,21 @@ public void setUser(User user) { } @OneToMany(cascade = CascadeType.ALL, mappedBy = "playlist") - List tracks; - public List getTracks() { - return tracks; + List trackList; + public List getTrackList() { + return trackList; + } + public void setTrackList(List tracks) { + this.trackList = tracks; } - public void setTracks(List tracks) { - this.tracks = tracks; + + @Override + public String toString() { + return "Playlist {\n" + + "ID: " + ID + ",\n" + + "playlistName: " + playlistName + ",\n" + + "user: " + user + ",\n" + + "tracks: " + trackList + ",\n" + + '}'; } } diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Track.java b/src/main/java/VanquishP2/Application/Beans/Models/Track.java index 097de73..f68d9ba 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/Track.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Track.java @@ -1,7 +1,6 @@ package VanquishP2.Application.Beans.Models; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.springframework.stereotype.Component; import javax.persistence.*; @@ -13,9 +12,16 @@ @Table(name = "TRACKS") @Entity -@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, ignoreUnknown = true) public class Track { public Track() { + + } + + public Track(String trackName, String duration, Artist artist) { + this.trackName = trackName; + this.duration = duration; + this.artist = artist; } @Id @@ -29,7 +35,7 @@ public void setID(Integer ID) { this.ID = ID; } - @Column(name = "TrackName") + @Column(name = "Title") private String trackName; public String getTrackName() { return trackName; @@ -56,6 +62,15 @@ public void setArtist(Artist artist) { this.artist = artist; } + @ManyToOne + private User user; + public User getUser() { + return user; + } + public void setUser(User user) { + this.user = user; + } + @ManyToOne private Playlist playlist; public Playlist getPlaylist() { @@ -64,4 +79,16 @@ public Playlist getPlaylist() { public void setPlaylist(Playlist playlist) { this.playlist = playlist; } + + @Override + public String toString() { + return "Track {\n" + + "ID: " + ID + ",\n" + + "trackName: " + trackName + ",\n" + + "duration: " + duration + ",\n" + + "artist: " + artist + ",\n" + + "user: " + user + ",\n" + + "playlist: " + playlist + ",\n" + + '}'; + } } diff --git a/src/main/java/VanquishP2/Application/Beans/Models/User.java b/src/main/java/VanquishP2/Application/Beans/Models/User.java index 8a3ee41..38fada9 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/User.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/User.java @@ -16,16 +16,16 @@ @Table(name = "USERS") @Entity -@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, ignoreUnknown = true) public class User { public User() { myPlaylists = new ArrayList<>(); } - public User(UserRegistrationDTO registration) { - this.firstName = registration.getFirstName(); - this.lastName = registration.getLastName(); - myPlaylists = new ArrayList<>(); + public User(Role role, UserInfo userInfo) { + this.role = role; + this.myPlaylists = new ArrayList<>(); + this.userInfo = userInfo; } @Id @@ -39,24 +39,6 @@ public void setID(Integer ID) { this.ID = ID; } - @Column(name = "FirstName") - private String firstName; - public String getFirstName() { - return firstName; - } - public void setFirstName(String username) { - this.firstName = username; - } - - @Column(name = "LastName") - private String lastName; - public String getLastName() { - return lastName; - } - public void setLastName(String lastName) { - this.lastName = lastName; - } - @Enumerated Role role; public enum Role { @@ -79,6 +61,15 @@ public void setMyPlaylists(List myPlaylists) { this.myPlaylists = myPlaylists; } + @OneToMany(mappedBy = "user") + List favorites; + public List getFavorites() { + return favorites; + } + public void setFavorites(List favorites) { + this.favorites = favorites; + } + @OneToOne(mappedBy = "user") UserInfo userInfo; public UserInfo getUserInfo() { @@ -90,10 +81,12 @@ public void setUserInfo(UserInfo userInfo) { @Override public String toString() { - return "User: {\n" + - "ID: " + ID + - "firstName: " + firstName + ",\n" + - "lastName: " + lastName + ",\n" + + return "User {\n" + + "ID: " + ID + ",\n" + + "role: " + role + ",\n" + + "myPlaylists: " + myPlaylists + ",\n" + + "favorites: " + favorites + ",\n" + + "userInfo: " + userInfo + ",\n" + '}'; } } diff --git a/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java index 9a70ad5..fa4d566 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java @@ -2,7 +2,6 @@ import VanquishP2.DTOs.UserRegistrationDTO; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.springframework.stereotype.Component; import javax.persistence.*; @@ -12,9 +11,9 @@ * @author Kollier Martin */ -@Table(name = "USERINFOS") +@Table(name = "USERINFO") @Entity -@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) +@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, ignoreUnknown = true) public class UserInfo { public UserInfo() { @@ -27,13 +26,15 @@ public UserInfo(String email, String username, String password) { } public UserInfo(UserRegistrationDTO registration) { + this.firstName = registration.getFirstName(); + this.lastName = registration.getLastName(); this.username = registration.getUsername(); this.password = registration.getPassword(); this.email = registration.getEmail(); } @Id - @Column(name = "InfoID") + @Column(name = "UserInfoID") private int ID; public int getID() { return ID; @@ -42,6 +43,24 @@ public void setID(int ID) { this.ID = ID; } + @Column(name = "FirstName") + private String firstName; + public String getFirstName() { + return firstName; + } + public void setFirstName(String username) { + this.firstName = username; + } + + @Column(name = "LastName") + private String lastName; + public String getLastName() { + return lastName; + } + public void setLastName(String lastName) { + this.lastName = lastName; + } + @Column(name = "Email") private String email; public String getEmail() { @@ -69,6 +88,15 @@ public void setPassword(String password) { this.password = password; } + @OneToOne(mappedBy = "userInfo") + private Location location; + public Location getLocation() { + return location; + } + public void setLocation(Location location) { + this.location = location; + } + @OneToOne User user; public User getUser() { @@ -77,4 +105,18 @@ public User getUser() { public void setUser(User user) { this.user = user; } + + @Override + public String toString() { + return "UserInfo {\n" + + "ID: " + ID + ",\n" + + "firstName: " + firstName + ",\n" + + "lastName: " + lastName + ",\n" + + "email: " + email + ",\n" + + "username: " + username + ",\n" + + "password: " + password + ",\n" + + "location: " + location + ",\n" + + "user: " + user + ",\n" + + '}'; + } } diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java index 351c0cf..39debd7 100644 --- a/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java @@ -8,6 +8,6 @@ @Repository public interface AlbumRepository extends JpaRepository { - Optional getAlbumByName(String name); + Optional getAlbumByAlbumTitle(String name); Optional findByID(Integer id); } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java index fe38af1..a475445 100644 --- a/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java @@ -9,6 +9,5 @@ @Repository public interface UserInfoRepository extends JpaRepository { Optional findUserByUsernameAndPassword(String username, String password); - Optional findByUsername(String username); } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java index b80c651..41642d0 100644 --- a/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java @@ -1,6 +1,7 @@ package VanquishP2.Application.Beans.Repos; import VanquishP2.Application.Beans.Models.User; +import VanquishP2.Application.Beans.Models.UserInfo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -9,6 +10,6 @@ @Repository public interface UserRepository extends JpaRepository { Optional findByID(int ID); - Optional findUserByFirstName(String username); + Optional findUserByUserInfo(UserInfo userInfo); void deleteByID(Integer ID); } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Controllers/AlbumController.java b/src/main/java/VanquishP2/Controllers/AlbumController.java index 1ed7adb..0ccde38 100644 --- a/src/main/java/VanquishP2/Controllers/AlbumController.java +++ b/src/main/java/VanquishP2/Controllers/AlbumController.java @@ -59,7 +59,7 @@ public Album retrieve(@PathVariable int id) { @GetMapping("/{name}") @ResponseStatus(HttpStatus.ACCEPTED) public Album retrieve(@PathVariable String name) { - return albumService.getByName(name); + return albumService.getByTitle(name); } @DeleteMapping("{/id}") diff --git a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java index 9329603..8279c46 100644 --- a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java +++ b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java @@ -26,6 +26,13 @@ public UserRegistrationDTO() { } + public UserRegistrationDTO(String firstName, String lastName, + String username, String password, String email) { + this.username = username; + this.password = password; + this.email = email; + } + public UserRegistrationDTO(String username, String password, String email) { this.username = username; this.password = password; diff --git a/src/main/java/VanquishP2/DataGenerators/UserGen.java b/src/main/java/VanquishP2/DataGenerators/UserGen.java index e5ee83b..f07ea24 100644 --- a/src/main/java/VanquishP2/DataGenerators/UserGen.java +++ b/src/main/java/VanquishP2/DataGenerators/UserGen.java @@ -28,9 +28,10 @@ public UserGen(UserService userService) { //@PostConstruct private void populate() { - userRegistrationDTO = new UserRegistrationDTO(getAUsername(), getAPassword(), getAEmail()); - User user = new User(userRegistrationDTO); - UserInfo userInfo; + userRegistrationDTO = new UserRegistrationDTO(getAFirstName(), getALastName(), + getAUsername(), getAPassword(), getAEmail()); + UserInfo userInfo = new UserInfo(userRegistrationDTO); + User user = new User(User.Role.BASIC, userInfo); userService.save(user); } From 2be99da099111ef38cce20d6e85869bd0e66ddbd Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Thu, 4 Nov 2021 21:16:08 -0400 Subject: [PATCH 16/27] Sprint Push User and Service: Repo, Controller, Service UserRegistrationDTO pushed to match location --- .../Beans/ModelServices/AlbumService.java | 39 +++++++++-- .../Beans/ModelServices/UserService.java | 67 ++++++++----------- .../Beans/Repos/AlbumRepository.java | 2 + .../Beans/Repos/UserRepository.java | 1 - .../Controllers/AlbumController.java | 30 ++++++++- .../Controllers/UserController.java | 17 ++++- .../VanquishP2/DTOs/UserRegistrationDTO.java | 7 +- 7 files changed, 115 insertions(+), 48 deletions(-) diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java index 68503da..bdc6949 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -27,28 +28,58 @@ public AlbumService(AlbumRepository albumRepository) { this.albumRepository = albumRepository; } + /** + * Get all Albums + * @return List of Albums + */ public List getAll() { return albumRepository.findAll(); } + /** + * Fetch Album by its ID + * @param id Album ID + * @return Album Object + * @throws AlbumDoesNotExistException Album does not exist in DB + */ public Album getByID(int id) throws AlbumDoesNotExistException { return albumRepository.findByID(id) .orElseThrow(AlbumDoesNotExistException::new); } + /** + * Fetch Album by its Title + * @param title Album Title + * @return Album Object + * @throws AlbumDoesNotExistException Album does not exist in DB + */ public Album getByTitle(String title) throws AlbumDoesNotExistException { return albumRepository.getAlbumByAlbumTitle(title) .orElseThrow(AlbumDoesNotExistException::new); } - public List getTwentyAlbums() { - return albumRepository.findAll().stream().filter(a -> a.getID() <= 20).collect(Collectors.toList()); - } - + /** + * Delete album by ID + * @param id Album ID + * @throws AlbumDoesNotExistException Album does not exist in DB + */ public void delete(int id) throws AlbumDoesNotExistException { albumRepository.delete(getByID(id)); } + /** + * Delete album by album + * @param album Album object + * @throws AlbumDoesNotExistException Album does not exist in DB + */ + public void delete(Optional album) throws AlbumDoesNotExistException { + albumRepository.delete(album.get()); + } + + /** + * This method saves an album to the DB + * @param album Album object that we'll be saving to the DB + */ public void save(Album album) { albumRepository.save(album); } diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java index 3708e33..40a50cf 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java @@ -4,7 +4,6 @@ import VanquishP2.Application.Beans.Models.UserInfo; import VanquishP2.Application.Beans.Service.Logger; import VanquishP2.DTOs.UserRegistrationDTO; -import VanquishP2.Exceptions.AuthenticationException; import VanquishP2.Exceptions.UserDoesNotExistException; import VanquishP2.Application.Beans.Repos.UserInfoRepository; import VanquishP2.Application.Beans.Repos.UserRepository; @@ -12,12 +11,12 @@ import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.util.List; -import java.util.Optional; /** + * This service bean is used to talk to its designated repository and handle data retrieval * * @date 10/29/2021 - * @author + * @author Kollier Martin */ @Service @@ -35,20 +34,17 @@ public UserService(UserRepository userRepository, } /** - * - * - * @return - * @author + * This method fetches all Users in the DB + * @return List of users present in DB */ public List getAllUsers(){ return userRepository.findAll(); } /** - * - * @param ID - * @return - * @author + * This method fetches User by ID + * @param ID User ID + * @return User object */ public User getByID(int ID) { User user = null; @@ -64,14 +60,21 @@ public User getByID(int ID) { } /** - * - * @param userInfo - * @return - * @author + * This method fetches a User based on UserInfo + * @param userInfo UserInfo object + * @return User object */ - public User getByFirstName(UserInfo userInfo) throws UserDoesNotExistException { - return userRepository.findUserByUserInfo(userInfo) - .orElseThrow(() -> new UserDoesNotExistException(String.format(exceptionError, userInfo))); + public User getByUserInfo(UserInfo userInfo) { + User user = null; + + try { + user = userRepository.findUserByUserInfo(userInfo) + .orElseThrow(() -> new UserDoesNotExistException(String.format(exceptionError, userInfo))); + } catch (UserDoesNotExistException e) { + Logger.getFileLogger().writeLog(e.getMessage(), 3); + } + + return user; } /** @@ -79,26 +82,10 @@ public User getByFirstName(UserInfo userInfo) throws UserDoesNotExistException { * @param user * @return */ - public void save(@Autowired User user) { + public void save(User user) { userRepository.save(user); } - /** - * - * @param username - * @param password - * @return - * @throws AuthenticationException - */ - public Optional authenticate(String username, String password) throws AuthenticationException { - Optional user = Optional.ofNullable(userInfoRepository.findUserByUsernameAndPassword(username, password).get().getUser()); - - if (!user.isPresent()) { - throw new AuthenticationException("Either you can't spell or your caps lock is on! Try again."); - } - return Optional.ofNullable(userInfoRepository.findUserByUsernameAndPassword(username, password).get().getUser()); - } - /** * * @param id @@ -110,19 +97,21 @@ public void delete(int id) throws UserDoesNotExistException { /** * - * @param userRegistrationDTOData + * @param data * @return */ - public User registerUser(UserRegistrationDTO userRegistrationDTOData, User.Role role) { + public User registerUser(UserRegistrationDTO data, User.Role role) { User newUser; UserInfo newUserInfo; - newUserInfo = new UserInfo(userRegistrationDTOData); + newUserInfo = new UserInfo(data); newUser = new User(role, newUserInfo); - userInfoRepository.save(newUserInfo); userRepository.save(newUser); + newUserInfo.setUser(newUser); + userInfoRepository.save(newUserInfo); + return newUser; } } diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java index 39debd7..cd4fd9d 100644 --- a/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java @@ -8,6 +8,8 @@ @Repository public interface AlbumRepository extends JpaRepository { + void deleteByID(Integer integer); + void deleteByAlbumTitle(String title); Optional getAlbumByAlbumTitle(String name); Optional findByID(Integer id); } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java index 41642d0..47bf584 100644 --- a/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java @@ -4,7 +4,6 @@ import VanquishP2.Application.Beans.Models.UserInfo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; - import java.util.Optional; @Repository diff --git a/src/main/java/VanquishP2/Controllers/AlbumController.java b/src/main/java/VanquishP2/Controllers/AlbumController.java index 0ccde38..2a7558e 100644 --- a/src/main/java/VanquishP2/Controllers/AlbumController.java +++ b/src/main/java/VanquishP2/Controllers/AlbumController.java @@ -14,8 +14,8 @@ * AlbumController * Handles requests that involve the manipulating or retrieval of album data * - * @Date 11/3/2021 - * @Author Kollier Martin + * @date 11/3/2021 + * @author Kollier Martin */ @RestController @@ -28,6 +28,10 @@ public AlbumController(AlbumService albumService) { this.albumService = albumService; } + /** + * This functions returns all albums cached into DB + * @return ResponseEntity with HttpStatus and/or content + */ @GetMapping("") public ResponseEntity> getAllAlbums() { List allAlbums = albumService.getAll(); @@ -62,6 +66,11 @@ public Album retrieve(@PathVariable String name) { return albumService.getByTitle(name); } + /** + * Deletes an Album from the DB, if it exists + * @param id Album ID + * @return ResponseEntity depending on success or failure + */ @DeleteMapping("{/id}") public ResponseEntity remove(@PathVariable int id) { Optional album = Optional.ofNullable(albumService.getByID(id)); @@ -73,4 +82,21 @@ public ResponseEntity remove(@PathVariable int id) { return new ResponseEntity<>(album.get(), HttpStatus.NO_CONTENT); } } + + /** + * Deletes an Album from the DB, if it exists + * @param title Album title + * @return ResponseEntity depending on success or failure + */ + @DeleteMapping("{/title}") + public ResponseEntity remove(@PathVariable String title) { + Optional album = Optional.ofNullable(albumService.getByTitle(title)); + + if (!album.isPresent()) { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + } else { + albumService.delete(album); + return new ResponseEntity<>(album.get(), HttpStatus.NO_CONTENT); + } + } } diff --git a/src/main/java/VanquishP2/Controllers/UserController.java b/src/main/java/VanquishP2/Controllers/UserController.java index e4930b3..0e97ee7 100644 --- a/src/main/java/VanquishP2/Controllers/UserController.java +++ b/src/main/java/VanquishP2/Controllers/UserController.java @@ -17,7 +17,7 @@ * Handles requests that involve the manipulating or retrieval of user data * * @Date 11/1/2021 - * @Author Vanquish + * @Author Kollier Martin */ @RestController @@ -54,16 +54,31 @@ else if (allUsers.isEmpty()) return new ResponseEntity<>(allUsers, HttpStatus.OK); } + /** + * + * @param regData + * @return + */ @PostMapping(value = "/register/basic", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) public User registerBasicUser(@RequestBody @Valid UserRegistrationDTO regData){ return userService.registerUser(regData, User.Role.BASIC); } + /** + * + * @param regData + * @return + */ @PostMapping(value = "/register/premium", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) public User registerPremiumUser(@RequestBody @Valid UserRegistrationDTO regData){ return userService.registerUser(regData, User.Role.PREMIUM); } + /** + * + * @param id + * @return + */ @DeleteMapping("/{id}") public ResponseEntity delete(@PathVariable("id") int id) { User user = userService.getByID(id); diff --git a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java index 8279c46..ae06342 100644 --- a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java +++ b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java @@ -1,5 +1,6 @@ package VanquishP2.DTOs; +import VanquishP2.Application.Beans.Models.Location; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; @@ -21,13 +22,17 @@ public class UserRegistrationDTO { private String email; private String firstName, lastName; + private Location location; public UserRegistrationDTO() { } public UserRegistrationDTO(String firstName, String lastName, - String username, String password, String email) { + String username, String password, String email, Location location) { + this.firstName = firstName; + this.lastName = lastName; + this.location = location; this.username = username; this.password = password; this.email = email; From 9f3ec62a281ccd6747af894e256ea9aee33fb845 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Thu, 4 Nov 2021 22:24:44 -0400 Subject: [PATCH 17/27] Team Update Added their files into my repo, refactored a little --- pom.xml | 10 ++- .../Beans/ModelServices/APIClientService.java | 26 ++++++ .../Beans/ModelServices/ArtistService.java | 29 ++++++ .../Beans/ModelServices/ConcertService.java | 40 +++++++++ .../Beans/ModelServices/GenreService.java | 26 ++++++ .../Beans/ModelServices/LocationService.java | 47 ++++++++++ .../Beans/ModelServices/PlaylistService.java | 24 +++++ .../Beans/ModelServices/TrackService.java | 31 +++++++ .../Beans/ModelServices/UserInfoService.java | 90 +++++++++++++++++++ .../Application/Beans/Models/Location.java | 18 ++-- .../Application/Beans/Models/User.java | 6 +- .../Application/Beans/Models/UserInfo.java | 4 +- .../Beans/Repos/ArtistRepository.java | 10 +++ .../Beans/Repos/GenreRepository.java | 10 +++ .../Beans/Repos/LocationRepository.java | 9 ++ .../Beans/Repos/PlaylistRepository.java | 11 +++ .../Beans/Repos/UserInfoRepository.java | 1 + .../Application/Beans/Service/JWTUtil.java | 6 +- .../Controllers/ArtistController.java | 33 +++++++ .../Controllers/AuthController.java | 20 ++--- .../Controllers/ConcertController.java | 51 +++++++++++ .../Controllers/GenreController.java | 34 +++++++ .../Controllers/LocationController.java | 52 +++++++++++ .../Controllers/PlaylistController.java | 31 +++++++ .../Controllers/TrackController.java | 34 +++++++ .../Controllers/UserInfoController.java | 57 ++++++++++++ src/main/java/VanquishP2/DTOs/UserDTO.java | 15 ---- .../java/VanquishP2/DTOs/UserInfoDTO.java | 11 +++ .../VanquishP2/DTOs/UserRegistrationDTO.java | 15 ++++ .../VanquishP2/DataGenerators/DataLists.java | 26 ++++++ .../VanquishP2/DataGenerators/UserGen.java | 46 +++++++--- .../AlbumDoesNotExistException.java | 4 +- .../Exceptions/AuthenticationException.java | 2 +- .../Exceptions/UserDoesNotExistException.java | 2 +- 34 files changed, 770 insertions(+), 61 deletions(-) create mode 100644 src/main/java/VanquishP2/Application/Beans/ModelServices/APIClientService.java create mode 100644 src/main/java/VanquishP2/Application/Beans/ModelServices/ArtistService.java create mode 100644 src/main/java/VanquishP2/Application/Beans/ModelServices/ConcertService.java create mode 100644 src/main/java/VanquishP2/Application/Beans/ModelServices/GenreService.java create mode 100644 src/main/java/VanquishP2/Application/Beans/ModelServices/LocationService.java create mode 100644 src/main/java/VanquishP2/Application/Beans/ModelServices/PlaylistService.java create mode 100644 src/main/java/VanquishP2/Application/Beans/ModelServices/TrackService.java create mode 100644 src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java create mode 100644 src/main/java/VanquishP2/Application/Beans/Repos/ArtistRepository.java create mode 100644 src/main/java/VanquishP2/Application/Beans/Repos/GenreRepository.java create mode 100644 src/main/java/VanquishP2/Application/Beans/Repos/LocationRepository.java create mode 100644 src/main/java/VanquishP2/Application/Beans/Repos/PlaylistRepository.java create mode 100644 src/main/java/VanquishP2/Controllers/ArtistController.java create mode 100644 src/main/java/VanquishP2/Controllers/ConcertController.java create mode 100644 src/main/java/VanquishP2/Controllers/GenreController.java create mode 100644 src/main/java/VanquishP2/Controllers/LocationController.java create mode 100644 src/main/java/VanquishP2/Controllers/PlaylistController.java create mode 100644 src/main/java/VanquishP2/Controllers/TrackController.java create mode 100644 src/main/java/VanquishP2/Controllers/UserInfoController.java delete mode 100644 src/main/java/VanquishP2/DTOs/UserDTO.java create mode 100644 src/main/java/VanquishP2/DTOs/UserInfoDTO.java diff --git a/pom.xml b/pom.xml index 7802074..3153b1c 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,6 @@ org.springframework.boot spring-boot-starter-data-jpa - 2.5.5 @@ -33,7 +32,6 @@ org.springframework.boot spring-boot-starter-web - 2.5.5 @@ -46,7 +44,6 @@ org.springframework.boot spring-boot-starter-test - 2.5.5 test @@ -120,8 +117,13 @@ h2 1.4.200 + + com.squareup.okhttp3 + okhttp + 4.9.2 + - + diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/APIClientService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/APIClientService.java new file mode 100644 index 0000000..90f3979 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/APIClientService.java @@ -0,0 +1,26 @@ +package VanquishP2.Application.Beans.ModelServices; + +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.IOException; + +public class APIClientService { + private static OkHttpClient apiClient = new OkHttpClient(); + + public static String get(String url) { + Request req = new Request.Builder().url(url).build(); + + try(Response response = apiClient.newCall(req).execute()) + { + return response.body().string(); + } + catch(IOException e) + { + //TODO: Set up file logger or AOP logging and invoke here instead of stack trace. + e.printStackTrace(); + } + return null; + } +} diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/ArtistService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/ArtistService.java new file mode 100644 index 0000000..83bb630 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/ArtistService.java @@ -0,0 +1,29 @@ +package VanquishP2.Application.Beans.ModelServices; +import VanquishP2.Application.Beans.Repos.ArtistRepository; +import VanquishP2.Application.Beans.Models.Artist; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class ArtistService { + private final ArtistRepository artistRepository; + + @Autowired + public ArtistService(ArtistRepository artistRepository) { + this.artistRepository = artistRepository; + } + + public void save(Artist artist){ + artistRepository.save(artist); + } + + public Artist getArtist(Integer id){ + return artistRepository.getById(id); + } + + public Artist getArtistByName(String name){ + return artistRepository.findByName(name); + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/ConcertService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/ConcertService.java new file mode 100644 index 0000000..d174b99 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/ConcertService.java @@ -0,0 +1,40 @@ +package VanquishP2.Application.Beans.ModelServices; + +import VanquishP2.Application.Beans.Models.Concert; +import VanquishP2.Application.Beans.Repos.ConcertRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional +public class ConcertService { + private final ConcertRepository concertRepository; + + @Autowired + public ConcertService(ConcertRepository concertRepository) { + this.concertRepository = concertRepository; + } + + public void save(Concert concert){ + concertRepository.save(concert); + } + + public Concert getConcert(Integer id){ + return concertRepository.getById(id); + } + + public List getConcertList(){ + return concertRepository.findAll(); + } + + public void deleteConcert(Concert concert) { + concertRepository.delete(concert); + } + + public void deleteAllConcerts() { + concertRepository.deleteAll(); + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/GenreService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/GenreService.java new file mode 100644 index 0000000..3d462d3 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/GenreService.java @@ -0,0 +1,26 @@ +package VanquishP2.Application.Beans.ModelServices; + +import VanquishP2.Application.Beans.Models.Genre; +import VanquishP2.Application.Beans.Repos.GenreRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class GenreService { + private final GenreRepository repo; + + @Autowired + public GenreService(GenreRepository repo){ + this.repo = repo; + } + + public void save(Genre genre){ + repo.save(genre); + } + + public Genre getGenre(Integer id){ + return repo.getById(id); + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/LocationService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/LocationService.java new file mode 100644 index 0000000..d7b81c4 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/LocationService.java @@ -0,0 +1,47 @@ +package VanquishP2.Application.Beans.ModelServices; + + +import VanquishP2.Application.Beans.Models.Location; +import VanquishP2.Application.Beans.Repos.LocationRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class LocationService { + private final LocationRepository locationRepository; + + @Autowired + public LocationService(LocationRepository locationRepository){ + this.locationRepository = locationRepository; + } + + public Location saveLocation(Location location){ + locationRepository.save(location); + return locationRepository.getById(location.getLocationID()); + } + + public Location getLocationById(Integer id){ + return locationRepository.getById(id); + } + + public void save(Location location) { + locationRepository.save(location); + } + + public void deleteLocationById(Integer id){ + locationRepository.delete(locationRepository.getById(id)); + } + + public void deleteLocation(Location location){ + locationRepository.delete(location); + } + + /** + * To reset DB data if necessary + */ + public void deleteAllLocations(){ + locationRepository.deleteAll(); + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/PlaylistService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/PlaylistService.java new file mode 100644 index 0000000..d370473 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/PlaylistService.java @@ -0,0 +1,24 @@ +package VanquishP2.Application.Beans.ModelServices; + +import VanquishP2.Application.Beans.Models.Playlist; +import VanquishP2.Application.Beans.Repos.PlaylistRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class PlaylistService { + private PlaylistRepository repo; + + @Autowired + public PlaylistService(PlaylistRepository repo){ + this.repo = repo; + } + public void save(Playlist playlist){ + repo.save(playlist); + } + public Playlist getPlaylist_name (Integer playlist_id){ + return repo.getById(playlist_id); + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/TrackService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/TrackService.java new file mode 100644 index 0000000..79fcaf0 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/TrackService.java @@ -0,0 +1,31 @@ +package VanquishP2.Application.Beans.ModelServices; + +import VanquishP2.Application.Beans.Models.Track; +import VanquishP2.Application.Beans.Repos.TrackRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class TrackService { + private final TrackRepository repo; + + @Autowired + public TrackService(TrackRepository repo){ + this.repo = repo; + } + + public void save(Track track){ + repo.save(track); + } + + public Track getTrack(Integer id){ + return repo.getById(id); + } + + public boolean trackExists(Integer id) + { + return repo.existsById(id); + } +} diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java new file mode 100644 index 0000000..0cfa06e --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java @@ -0,0 +1,90 @@ +package VanquishP2.Application.Beans.ModelServices; + +import VanquishP2.Application.Beans.Models.UserInfo; +import VanquishP2.Application.Beans.Repos.UserInfoRepository; +import VanquishP2.Exceptions.UserDoesNotExistException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; + +@Service +@Transactional +public class UserInfoService { + private final UserInfoRepository userInfoRepository; + private final String exceptionError = "User: %s does not exist."; + + @Autowired + public UserInfoService(UserInfoRepository userInfoRepository) { + this.userInfoRepository = userInfoRepository; + } + + public UserInfo saveUserInfo(UserInfo userInfo){ + userInfoRepository.save(userInfo); + return userInfoRepository.getById(userInfo.getID()); + } + + public UserInfo getUserInfoById(Integer id){ + return userInfoRepository.getById(id); + } + + public String getEmailById(Integer id){ + UserInfo info = userInfoRepository.getById(id); + return info.getEmail(); + } + + public String getUsernameById(Integer id){ + UserInfo info = userInfoRepository.getById(id); + return info.getUsername(); + } + + public String getPasswordById(Integer id){ + UserInfo info = userInfoRepository.getById(id); + return info.getPassword(); + } + + public List getLoginById(Integer id){ + UserInfo info = userInfoRepository.getById(id); + List login = new LinkedList<>(); + login.add(info.getUsername()); + login.add(info.getPassword()); + return login; + } + + public UserInfo getByFirstName(String firstName) { + return userInfoRepository.findByFirstName(firstName).get(); + } + + public Optional authenticate(String username, String password){ + Optional userInfo = userInfoRepository.findUserByUsernameAndPassword(username, password); + + try { + if (!userInfo.isPresent()) { + throw new UserDoesNotExistException(exceptionError); + } + } catch (UserDoesNotExistException e) { + // log + e.printStackTrace(); + } + + return userInfo; + } + + public void save(UserInfo userInfo) { + userInfoRepository.save(userInfo); + } + + public void deleteUserInfo(UserInfo info){ + userInfoRepository.delete(info); + } + + /** + * To reset DB data if necessary + */ + public void deleteAllInfo(){ + userInfoRepository.deleteAll(); + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Location.java b/src/main/java/VanquishP2/Application/Beans/Models/Location.java index 8aa026b..59973a3 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/Location.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Location.java @@ -2,13 +2,13 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; +import java.util.List; @Table(name = "LOCATIONS") @Entity @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) public class Location { - public Location(Integer locationID, String city, String state) { - this.locationID = locationID; + public Location(String city, String state) { this.city = city; this.state = state; } @@ -46,13 +46,13 @@ public void setState(String state) { this.state = state; } - @OneToOne - private UserInfo userInfo; - public UserInfo getUserInfo() { - return userInfo; + @OneToMany(mappedBy = "location") + private List userLocations; + public List getUserInfo() { + return userLocations; } - public void setUserInfo(UserInfo userInfo) { - this.userInfo = userInfo; + public void setUserInfo(List userLocations) { + this.userLocations = userLocations; } @Override @@ -61,7 +61,7 @@ public String toString() { "locationID: " + locationID + ",\n" + "city: " + city + ",\n" + "state: " + state + ",\n" + - "userInfo: " + userInfo + ",\n" + + "userLocations: " + userLocations + ",\n" + '}'; } } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Models/User.java b/src/main/java/VanquishP2/Application/Beans/Models/User.java index 38fada9..16133de 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/User.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/User.java @@ -19,12 +19,16 @@ @JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, ignoreUnknown = true) public class User { public User() { - myPlaylists = new ArrayList<>(); + this.role = Role.BASIC; + this.myPlaylists = new ArrayList<>(); + this.favorites = new ArrayList<>(); + this.userInfo = null; } public User(Role role, UserInfo userInfo) { this.role = role; this.myPlaylists = new ArrayList<>(); + this.favorites = new ArrayList<>(); this.userInfo = userInfo; } diff --git a/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java index fa4d566..2695656 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java @@ -26,6 +26,7 @@ public UserInfo(String email, String username, String password) { } public UserInfo(UserRegistrationDTO registration) { + this.location = registration.getLocation(); this.firstName = registration.getFirstName(); this.lastName = registration.getLastName(); this.username = registration.getUsername(); @@ -35,6 +36,7 @@ public UserInfo(UserRegistrationDTO registration) { @Id @Column(name = "UserInfoID") + @GeneratedValue(strategy = GenerationType.IDENTITY) private int ID; public int getID() { return ID; @@ -88,7 +90,7 @@ public void setPassword(String password) { this.password = password; } - @OneToOne(mappedBy = "userInfo") + @ManyToOne private Location location; public Location getLocation() { return location; diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/ArtistRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/ArtistRepository.java new file mode 100644 index 0000000..2737ae8 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/Repos/ArtistRepository.java @@ -0,0 +1,10 @@ +package VanquishP2.Application.Beans.Repos; + +import VanquishP2.Application.Beans.Models.Artist; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ArtistRepository extends JpaRepository { + Artist findByName(String name); +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/GenreRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/GenreRepository.java new file mode 100644 index 0000000..a1d1d58 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/Repos/GenreRepository.java @@ -0,0 +1,10 @@ +package VanquishP2.Application.Beans.Repos; + +import VanquishP2.Application.Beans.Models.Genre; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface GenreRepository extends JpaRepository { + +} diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/LocationRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/LocationRepository.java new file mode 100644 index 0000000..4eb858d --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/Repos/LocationRepository.java @@ -0,0 +1,9 @@ +package VanquishP2.Application.Beans.Repos; + +import VanquishP2.Application.Beans.Models.Location; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface LocationRepository extends JpaRepository { +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/PlaylistRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/PlaylistRepository.java new file mode 100644 index 0000000..d0853c7 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/Repos/PlaylistRepository.java @@ -0,0 +1,11 @@ +package VanquishP2.Application.Beans.Repos; + + +import VanquishP2.Application.Beans.Models.Playlist; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PlaylistRepository extends JpaRepository { + +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java index a475445..44167dd 100644 --- a/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java @@ -10,4 +10,5 @@ public interface UserInfoRepository extends JpaRepository { Optional findUserByUsernameAndPassword(String username, String password); Optional findByUsername(String username); + Optional findByFirstName(String firstName); } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java b/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java index 4123d58..0a9dff5 100644 --- a/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java +++ b/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java @@ -1,6 +1,6 @@ package VanquishP2.Application.Beans.Service; -import VanquishP2.Application.Beans.Models.User; +import VanquishP2.Application.Beans.Models.UserInfo; import VanquishP2.Exceptions.AuthenticationException; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; @@ -36,11 +36,11 @@ private void createKey(){ key = Keys.secretKeyFor(SignatureAlgorithm.HS256); } - public String createJWT(User user){ + public String createJWT(UserInfo userInfo){ // Build the java web token and return it return Jwts.builder() .setIssuer("Vanquish") - .setSubject(user.getUserInfo().getUsername()) + .setSubject(userInfo.getUsername()) .signWith(key) .setExpiration(new Date(System.currentTimeMillis() + expiration)) .compact(); diff --git a/src/main/java/VanquishP2/Controllers/ArtistController.java b/src/main/java/VanquishP2/Controllers/ArtistController.java new file mode 100644 index 0000000..61f55d3 --- /dev/null +++ b/src/main/java/VanquishP2/Controllers/ArtistController.java @@ -0,0 +1,33 @@ +package VanquishP2.Controllers; + +import VanquishP2.Application.Beans.ModelServices.ArtistService; +import VanquishP2.Application.Beans.Models.Artist; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/4TheMusic") +public class ArtistController { + + private final ArtistService artistService; + + @Autowired + public ArtistController(ArtistService artistService) { + this.artistService = artistService; + } + + @PostMapping(path = "/artist", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.CREATED) + public Artist saveArtist(@RequestBody Artist artist) { + artistService.save(artist); + return artistService.getArtist(artist.getID()); + } + + @GetMapping(path = "/artist/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.OK) + public Artist getArtistById(@PathVariable("id") Integer id) { + return artistService.getArtist(id); + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Controllers/AuthController.java b/src/main/java/VanquishP2/Controllers/AuthController.java index 0dde0b4..a601b59 100644 --- a/src/main/java/VanquishP2/Controllers/AuthController.java +++ b/src/main/java/VanquishP2/Controllers/AuthController.java @@ -1,10 +1,10 @@ package VanquishP2.Controllers; -import VanquishP2.Application.Beans.ModelServices.UserService; -import VanquishP2.Application.Beans.Models.User; +import VanquishP2.Application.Beans.ModelServices.UserInfoService; +import VanquishP2.Application.Beans.Models.UserInfo; import VanquishP2.Application.Beans.Service.JWTUtil; import VanquishP2.DTOs.LoginCredentialsDTO; -import VanquishP2.DTOs.UserDTO; +import VanquishP2.DTOs.UserInfoDTO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -22,20 +22,20 @@ public class AuthController { private JWTUtil jwtUtil; - private UserService userService; + private final UserInfoService userInfoService; @Autowired - public AuthController (JWTUtil jwtUtil, UserService userService) { - this.userService = userService; + public AuthController (JWTUtil jwtUtil, UserInfoService userInfoService) { + this.userInfoService = userInfoService; } @PostMapping(consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) - public UserDTO authenticate(@RequestBody LoginCredentialsDTO credentials, HttpServletResponse response) { - Optional user = userService.authenticate(credentials.getUsername(), credentials.getPassword()); - String jwt = jwtUtil.createJWT(user.get()); + public UserInfoDTO authenticate(@RequestBody LoginCredentialsDTO credentials, HttpServletResponse response) { + Optional userInfo = userInfoService.authenticate(credentials.getUsername(), credentials.getPassword()); + String jwt = jwtUtil.createJWT(userInfo.get()); response.setHeader(jwtUtil.getHeader(), jwt); - return new UserDTO(user.get()); + return new UserInfoDTO(userInfo.get()); } } diff --git a/src/main/java/VanquishP2/Controllers/ConcertController.java b/src/main/java/VanquishP2/Controllers/ConcertController.java new file mode 100644 index 0000000..0f2e7d1 --- /dev/null +++ b/src/main/java/VanquishP2/Controllers/ConcertController.java @@ -0,0 +1,51 @@ +package VanquishP2.Controllers; + +import VanquishP2.Application.Beans.ModelServices.ConcertService; +import VanquishP2.Application.Beans.Models.Concert; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/4TheMusic") +public class ConcertController { + + private final ConcertService concertService; + + @Autowired + public ConcertController(ConcertService concertService) { + this.concertService = concertService; + } + + @PostMapping(path = "/concert", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.CREATED) + public Concert saveConcert(@RequestBody Concert concert){ + concertService.save(concert); + return concertService.getConcert(concert.getID()); + } + + @GetMapping(path = "/concert/all", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.ACCEPTED) + public List concertList(){ + return concertService.getConcertList(); + } + + @GetMapping(path = "/concert/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.OK) + public Concert getConcertById(@PathVariable("id") Integer id){ + return concertService.getConcert(id); + } + + @DeleteMapping(value = "/concert/{id}") + @ResponseStatus(HttpStatus.OK) + public void deleteLocation(@PathVariable ("id") Integer id){ + if(id>0){ + concertService.deleteConcert(concertService.getConcert(id)); + }else{ + concertService.deleteAllConcerts(); + } + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Controllers/GenreController.java b/src/main/java/VanquishP2/Controllers/GenreController.java new file mode 100644 index 0000000..4178add --- /dev/null +++ b/src/main/java/VanquishP2/Controllers/GenreController.java @@ -0,0 +1,34 @@ +package VanquishP2.Controllers; + +import VanquishP2.Application.Beans.ModelServices.GenreService; +import VanquishP2.Application.Beans.Models.Genre; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping(value = "/4TheMusic") +public class GenreController { + private final GenreService genreService; + + @Autowired + public GenreController(GenreService genreService) + { + this.genreService = genreService; + } + + @PostMapping(value = "/genre", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.CREATED) + public Genre saveGenre(@RequestBody Genre genre){ + genreService.save(genre); + return genreService.getGenre(genre.getGenreID()); + } + + @GetMapping(value = "/genre/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.OK) + public Genre getGenre(@PathVariable ("id") Integer id){ + return genreService.getGenre(id); + } + +} diff --git a/src/main/java/VanquishP2/Controllers/LocationController.java b/src/main/java/VanquishP2/Controllers/LocationController.java new file mode 100644 index 0000000..11d15af --- /dev/null +++ b/src/main/java/VanquishP2/Controllers/LocationController.java @@ -0,0 +1,52 @@ +package VanquishP2.Controllers; + + +import VanquishP2.Application.Beans.ModelServices.LocationService; +import VanquishP2.Application.Beans.Models.Location; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/4TheMusic") +public class LocationController { + private final LocationService locationService; + + @Autowired + public LocationController(LocationService locationService) { + this.locationService = locationService; + } + + @GetMapping(value = "/location/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.OK) + public Location getLocation(@PathVariable ("id") Integer id){ + return locationService.getLocationById(id); + } + + @PostMapping(value = "/location", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.CREATED) + public Location saveLocation(@RequestBody Location location){ + locationService.saveLocation(location); + return locationService.getLocationById(location.getLocationID()); + } + + @PutMapping(value = "/location", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.OK) + public Location updateLocation(@RequestBody Location location){ + Location updatedLocation = locationService.getLocationById(location.getLocationID()); + updatedLocation.setCity(location.getCity()); + updatedLocation.setState(location.getState()); + return locationService.saveLocation(updatedLocation); + } + + @DeleteMapping(value = "/location/{id}") + @ResponseStatus(HttpStatus.OK) + public void deleteLocation(@PathVariable ("id") Integer id){ + if(id>0){ + locationService.deleteLocation(locationService.getLocationById(id)); + }else{ + locationService.deleteAllLocations(); + } + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Controllers/PlaylistController.java b/src/main/java/VanquishP2/Controllers/PlaylistController.java new file mode 100644 index 0000000..e2d5496 --- /dev/null +++ b/src/main/java/VanquishP2/Controllers/PlaylistController.java @@ -0,0 +1,31 @@ +package VanquishP2.Controllers; + +import VanquishP2.Application.Beans.ModelServices.PlaylistService; +import VanquishP2.Application.Beans.Models.Playlist; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +@RestController +public class PlaylistController { + private final PlaylistService playlistService; + + @Autowired + public PlaylistController(PlaylistService playlistService){ + this.playlistService = playlistService; + } + + @PostMapping(value = "/Playlist_Name", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.CREATED) + public Playlist savePlaylist_name(@RequestBody Playlist playlist){ + playlistService.save(playlist); + return playlistService.getPlaylist_name(playlist.getID()); + } + + @GetMapping(value = "/playlist_name/{playlist_id}", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.OK) + public Playlist getPlaylistById(@PathVariable("id") Integer id){ + return playlistService.getPlaylist_name(id); + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Controllers/TrackController.java b/src/main/java/VanquishP2/Controllers/TrackController.java new file mode 100644 index 0000000..80e3959 --- /dev/null +++ b/src/main/java/VanquishP2/Controllers/TrackController.java @@ -0,0 +1,34 @@ +package VanquishP2.Controllers; + + +import VanquishP2.Application.Beans.ModelServices.TrackService; +import VanquishP2.Application.Beans.Models.Track; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping(value = "/4TheMusic") +public class TrackController { + private final TrackService trackService; + + @Autowired + public TrackController(TrackService trackService) { + this.trackService = trackService; + } + + @PostMapping(value = "/track", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.CREATED) + public Track saveTrack(@RequestBody Track track){ + trackService.save(track); + return trackService.getTrack(track.getID()); + } + + @GetMapping(value = "/track/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + //@GetMapping(value = "/track?id=x", produces = MediaType.APPLICATION_JSON_VALUE) -> @RequestParam + @ResponseStatus(value = HttpStatus.OK) + public Track getTrackById(@PathVariable ("id") Integer id){ + return trackService.getTrack(id); + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Controllers/UserInfoController.java b/src/main/java/VanquishP2/Controllers/UserInfoController.java new file mode 100644 index 0000000..5a5e09f --- /dev/null +++ b/src/main/java/VanquishP2/Controllers/UserInfoController.java @@ -0,0 +1,57 @@ +package VanquishP2.Controllers; + + +import VanquishP2.Application.Beans.ModelServices.UserInfoService; +import VanquishP2.Application.Beans.Models.UserInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping(value = "/4TheMusic") +public class UserInfoController { + private final UserInfoService userInfoService; + + @Autowired + public UserInfoController(UserInfoService userInfoService) { + this.userInfoService = userInfoService; + } + + @GetMapping(value = "/userinfo/{id}", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.OK) + public UserInfo getUserInfoById(@PathVariable ("id") Integer id){ + return userInfoService.getUserInfoById(id); + } + + @PostMapping(value = "/userinfo", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.CREATED) + public UserInfo saveUserInfo(@RequestBody UserInfo userInfo){ + return userInfoService.saveUserInfo(userInfo); + } + + @PutMapping(value = "/userinfo", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.OK) + public UserInfo updateUserInfo(@RequestBody UserInfo userInfo){ + UserInfo updatedInfo = userInfoService.getUserInfoById(userInfo.getID()); + updatedInfo.setEmail(userInfo.getEmail()); + updatedInfo.setPassword(userInfo.getPassword()); + updatedInfo.setFirstName(userInfo.getFirstName()); + updatedInfo.setLastName(userInfo.getLastName()); + updatedInfo.setUser(userInfo.getUser()); + updatedInfo.setLocation(userInfo.getLocation()); + updatedInfo.setUsername(userInfo.getUsername()); + userInfoService.saveUserInfo(updatedInfo); + return userInfoService.getUserInfoById(updatedInfo.getID()); + } + + @DeleteMapping(value = "/userinfo/{id}",produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.OK) + public void deleteUserInfoById(@PathVariable ("id") Integer id){ + if(id>0){ + userInfoService.deleteUserInfo(userInfoService.getUserInfoById(id)); + }else{ + userInfoService.deleteAllInfo(); + } + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/DTOs/UserDTO.java b/src/main/java/VanquishP2/DTOs/UserDTO.java deleted file mode 100644 index 9584d75..0000000 --- a/src/main/java/VanquishP2/DTOs/UserDTO.java +++ /dev/null @@ -1,15 +0,0 @@ -package VanquishP2.DTOs; - -import VanquishP2.Application.Beans.Models.Track; -import VanquishP2.Application.Beans.Models.User; - -import java.util.List; - -public class UserDTO { - List favoriteTracks; - User user; - - public UserDTO(User user) { - this.user = user; - } -} diff --git a/src/main/java/VanquishP2/DTOs/UserInfoDTO.java b/src/main/java/VanquishP2/DTOs/UserInfoDTO.java new file mode 100644 index 0000000..ce43a61 --- /dev/null +++ b/src/main/java/VanquishP2/DTOs/UserInfoDTO.java @@ -0,0 +1,11 @@ +package VanquishP2.DTOs; + +import VanquishP2.Application.Beans.Models.UserInfo; + +public class UserInfoDTO { + UserInfo user; + + public UserInfoDTO(UserInfo userInfo) { + this.user = userInfo; + } +} diff --git a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java index ae06342..b722509 100644 --- a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java +++ b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java @@ -6,6 +6,13 @@ import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; +/** + * UserRegistrationDTO + * The DTO for User Registration + * + * @date 10/29/2021 + * @author Kollier Martin + */ public class UserRegistrationDTO { @Length(min = 5, max = 20) @@ -83,4 +90,12 @@ public String getLastName() { public void setLastName(String lastName) { this.lastName = lastName; } + + public Location getLocation() { + return location; + } + + public void setLocation(Location location) { + this.location = location; + } } \ No newline at end of file diff --git a/src/main/java/VanquishP2/DataGenerators/DataLists.java b/src/main/java/VanquishP2/DataGenerators/DataLists.java index c4a3224..9b0e38b 100644 --- a/src/main/java/VanquishP2/DataGenerators/DataLists.java +++ b/src/main/java/VanquishP2/DataGenerators/DataLists.java @@ -7,6 +7,32 @@ import javax.validation.constraints.Pattern; public class DataLists { + public static String[] states = { + "Freeport", + "Alcoa", + "Fayetteville", + "Vail", + "Pekin", + "Ishpeming", + "Puyallup", + "Houlton", + "Rome", + "Pampa", + }; + + public static String[] cities = { + "Nacogdoches", + "Queens", + "Elgin", + "West Lafayette", + "Cushing", + "Payson", + "South Hadley", + "Daytona Beach", + "Meriden", + "Randolph", + }; + public static String[] names = { "Chace", "Nielsen", "Leticia", "Allen", diff --git a/src/main/java/VanquishP2/DataGenerators/UserGen.java b/src/main/java/VanquishP2/DataGenerators/UserGen.java index f07ea24..903932b 100644 --- a/src/main/java/VanquishP2/DataGenerators/UserGen.java +++ b/src/main/java/VanquishP2/DataGenerators/UserGen.java @@ -1,38 +1,56 @@ package VanquishP2.DataGenerators; +import VanquishP2.Application.Beans.ModelServices.LocationService; +import VanquishP2.Application.Beans.ModelServices.UserInfoService; import VanquishP2.Application.Beans.ModelServices.UserService; +import VanquishP2.Application.Beans.Models.Location; import VanquishP2.Application.Beans.Models.User; import VanquishP2.Application.Beans.Models.UserInfo; import VanquishP2.DTOs.UserRegistrationDTO; -import VanquishP2.Application.Beans.Repos.UserRepository; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; import org.springframework.stereotype.Service; - import javax.annotation.PostConstruct; import java.util.Random; - import static VanquishP2.DataGenerators.DataLists.*; -//@Service +@Service public class UserGen { private static Random rand = new Random(); private static int index; private final UserService userService; - private UserRegistrationDTO userRegistrationDTO; + private final UserInfoService userInfoService; + private final LocationService locationService; - //@Autowired - public UserGen(UserService userService) { + @Autowired + public UserGen(UserService userService, UserInfoService userInfoService, LocationService locationService) { + this.locationService = locationService; + this.userInfoService = userInfoService; this.userService = userService; } - //@PostConstruct + @PostConstruct private void populate() { - userRegistrationDTO = new UserRegistrationDTO(getAFirstName(), getALastName(), - getAUsername(), getAPassword(), getAEmail()); - UserInfo userInfo = new UserInfo(userRegistrationDTO); - User user = new User(User.Role.BASIC, userInfo); - userService.save(user); + for (int i = 0; i < 20; i++) { + UserRegistrationDTO userRegistrationDTO = new UserRegistrationDTO(getAFirstName(), getALastName(), + getAUsername(), getAPassword(), getAEmail(), getALocation()); + + UserInfo userInfo = new UserInfo(userRegistrationDTO); + locationService.save(userRegistrationDTO.getLocation()); + userInfoService.save(userInfo); + + User user = new User(User.Role.BASIC, userInfo); + userService.save(user); + + userInfo = userInfoService.getByFirstName(userInfo.getFirstName()); + userInfo.setUser(user); + userInfoService.save(userInfo); + } + } + + public static Location getALocation() { + Random rand = new Random(); + int index = rand.nextInt(cities.length); + return new Location(cities[index], states[index]); } public static String getAFirstName() { diff --git a/src/main/java/VanquishP2/Exceptions/AlbumDoesNotExistException.java b/src/main/java/VanquishP2/Exceptions/AlbumDoesNotExistException.java index b0bf982..5e3018f 100644 --- a/src/main/java/VanquishP2/Exceptions/AlbumDoesNotExistException.java +++ b/src/main/java/VanquishP2/Exceptions/AlbumDoesNotExistException.java @@ -4,9 +4,9 @@ * Custom Runtime Exception * * @date 11/1/2021 - * @author + * @author Kollier Martin */ -public class AlbumDoesNotExistException extends RuntimeException{ +public class AlbumDoesNotExistException extends RuntimeException{ public AlbumDoesNotExistException() { super(); } diff --git a/src/main/java/VanquishP2/Exceptions/AuthenticationException.java b/src/main/java/VanquishP2/Exceptions/AuthenticationException.java index e157a65..d49429e 100644 --- a/src/main/java/VanquishP2/Exceptions/AuthenticationException.java +++ b/src/main/java/VanquishP2/Exceptions/AuthenticationException.java @@ -4,7 +4,7 @@ * Custom Runtime Exception * * @date 11/1/2021 - * @author + * @author Kollier Martin */ public class AuthenticationException extends RuntimeException { public AuthenticationException() { diff --git a/src/main/java/VanquishP2/Exceptions/UserDoesNotExistException.java b/src/main/java/VanquishP2/Exceptions/UserDoesNotExistException.java index f091d59..392bebd 100644 --- a/src/main/java/VanquishP2/Exceptions/UserDoesNotExistException.java +++ b/src/main/java/VanquishP2/Exceptions/UserDoesNotExistException.java @@ -4,7 +4,7 @@ * Custom Runtime Exception * * @date 11/1/2021 - * @author + * @author Kollier Martin */ public class UserDoesNotExistException extends RuntimeException { public UserDoesNotExistException() { From 13e4bef79dbd94752fb0c445c523d67ff82bb218 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Tue, 9 Nov 2021 13:51:42 -0500 Subject: [PATCH 18/27] Feature Update Tested all classes and their need for JSONIgnores The only class that needs it is UserInfo as it will infinitely recurse on data retrieval Added Cascade to User and Location for UserInfo object @OneToOne(cascade = CascadeType.REMOVE) User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } @ManyToOne(cascade = CascadeType.REMOVE) private Location location; public Location getLocation() { return location; } public void setLocation(Location location) { this.location = location; } // Kollier took out setLocation and setUser until we get the Front End together UserInfoController AuthFilter, CORSFilter, JWTUtil, Login, and Registration work Update UserRegistration DTO to take a city and state Changed UserRegistration to include location saving Deleted Validator, Extra Controllers, and Spare Configs DataList has been deleted and merged into DataGen Implemented Deezer Package from Team --- .../Beans/Configs/PersistenceConfig.java | 18 --- .../Application/Beans/Configs/WebConfig.java | 20 --- .../Filters/AuthenticationFilter.java | 37 +++-- .../{Configs => }/Filters/CORSFilter.java | 7 +- .../Beans/ModelServices/AlbumService.java | 2 +- .../Beans/ModelServices/UserInfoService.java | 50 +++++-- .../Beans/ModelServices/UserService.java | 21 ++- .../Application/Beans/Models/Album.java | 34 +++-- .../Application/Beans/Models/Artist.java | 17 ++- .../Application/Beans/Models/Genre.java | 25 +++- .../Application/Beans/Models/Playlist.java | 2 +- .../Application/Beans/Models/Track.java | 73 +++++++--- .../Application/Beans/Models/User.java | 36 +++-- .../Application/Beans/Models/UserInfo.java | 10 +- .../Beans/Repos/AlbumRepository.java | 4 +- .../Beans/Repos/TrackRepository.java | 2 +- .../Beans/Repos/UserInfoRepository.java | 2 +- .../APIClientService.java | 2 +- .../Application/Beans/Service/JWTUtil.java | 32 +++-- .../Beans/Service/ValidatorService.java | 33 ----- .../VanquishP2/Application/P2Application.java | 3 + .../Controllers/AuthController.java | 41 ------ .../Controllers/AuthenticationController.java | 82 +++++++++++ .../Controllers/HelloController.java | 24 ---- .../Controllers/PingController.java | 24 ---- .../Controllers/PlaylistController.java | 4 +- .../Controllers/TrackController.java | 3 +- .../Controllers/UserController.java | 46 ++---- .../Controllers/UserInfoController.java | 25 +++- .../VanquishP2/DTOs/LoginCredentialsDTO.java | 8 ++ .../java/VanquishP2/DTOs/PrincipalDTO.java | 51 +++++++ .../java/VanquishP2/DTOs/UserInfoDTO.java | 8 +- .../VanquishP2/DTOs/UserRegistrationDTO.java | 46 ++++-- .../VanquishP2/DataGenerators/DataLists.java | 108 -------------- .../VanquishP2/DataGenerators/UserGen.java | 136 ++++++++++++++++-- .../java/VanquishP2/Deezer/AlbumSearch.java | 46 ++++++ .../java/VanquishP2/Deezer/ArtistSearch.java | 74 ++++++++++ .../Deezer/JSONObjectToModelConverter.java | 90 ++++++++++++ .../Deezer/JSONStringToModelConverter.java | 84 +++++++++++ .../java/VanquishP2/Deezer/TrackSearch.java | 65 +++++++++ src/test/java/CredentialValidatorsTest.java | 30 ---- 41 files changed, 947 insertions(+), 478 deletions(-) delete mode 100644 src/main/java/VanquishP2/Application/Beans/Configs/PersistenceConfig.java delete mode 100644 src/main/java/VanquishP2/Application/Beans/Configs/WebConfig.java rename src/main/java/VanquishP2/Application/Beans/{Configs => }/Filters/AuthenticationFilter.java (52%) rename src/main/java/VanquishP2/Application/Beans/{Configs => }/Filters/CORSFilter.java (83%) rename src/main/java/VanquishP2/Application/Beans/{ModelServices => Service}/APIClientService.java (92%) delete mode 100644 src/main/java/VanquishP2/Application/Beans/Service/ValidatorService.java delete mode 100644 src/main/java/VanquishP2/Controllers/AuthController.java create mode 100644 src/main/java/VanquishP2/Controllers/AuthenticationController.java delete mode 100644 src/main/java/VanquishP2/Controllers/HelloController.java delete mode 100644 src/main/java/VanquishP2/Controllers/PingController.java create mode 100644 src/main/java/VanquishP2/DTOs/PrincipalDTO.java delete mode 100644 src/main/java/VanquishP2/DataGenerators/DataLists.java create mode 100644 src/main/java/VanquishP2/Deezer/AlbumSearch.java create mode 100644 src/main/java/VanquishP2/Deezer/ArtistSearch.java create mode 100644 src/main/java/VanquishP2/Deezer/JSONObjectToModelConverter.java create mode 100644 src/main/java/VanquishP2/Deezer/JSONStringToModelConverter.java create mode 100644 src/main/java/VanquishP2/Deezer/TrackSearch.java delete mode 100644 src/test/java/CredentialValidatorsTest.java diff --git a/src/main/java/VanquishP2/Application/Beans/Configs/PersistenceConfig.java b/src/main/java/VanquishP2/Application/Beans/Configs/PersistenceConfig.java deleted file mode 100644 index 72939bc..0000000 --- a/src/main/java/VanquishP2/Application/Beans/Configs/PersistenceConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package VanquishP2.Application.Beans.Configs; - -/** - * DB Persistence Configuration - * - * @description This class contains all the session information for Hibernate to function - * within Spring - * @date 10/29/2021 - * @author Vanquish - */ - -/*@Configuration -@EnableTransactionManagement*/ -public class PersistenceConfig { - // Hibernate Variables - // @Value("") - -} diff --git a/src/main/java/VanquishP2/Application/Beans/Configs/WebConfig.java b/src/main/java/VanquishP2/Application/Beans/Configs/WebConfig.java deleted file mode 100644 index e710d13..0000000 --- a/src/main/java/VanquishP2/Application/Beans/Configs/WebConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package VanquishP2.Application.Beans.Configs; - -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -//@Configuration -public class WebConfig implements WebMvcConfigurer { - //@Bean - public WebMvcConfigurer corsConfigurer() { - return new WebMvcConfigurer() { - @Override - public void addCorsMappings(CorsRegistry registry) { - registry.addMapping("/**") - .allowedMethods("HEAD", "GET", "PUT", "POST", "DELETE", "PATCH", "OPTION") - .allowedHeaders("*") - .allowedOrigins("*"); - } - }; - } -} diff --git a/src/main/java/VanquishP2/Application/Beans/Configs/Filters/AuthenticationFilter.java b/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java similarity index 52% rename from src/main/java/VanquishP2/Application/Beans/Configs/Filters/AuthenticationFilter.java rename to src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java index c9a4296..84a8ac3 100644 --- a/src/main/java/VanquishP2/Application/Beans/Configs/Filters/AuthenticationFilter.java +++ b/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java @@ -1,11 +1,12 @@ -package VanquishP2.Application.Beans.Configs.Filters; +package VanquishP2.Application.Beans.Filters; import VanquishP2.Application.Beans.Service.JWTUtil; +import VanquishP2.DTOs.PrincipalDTO; import VanquishP2.Application.Beans.Service.Logger; import VanquishP2.Exceptions.AuthenticationException; import io.jsonwebtoken.Claims; -import io.jsonwebtoken.Jws; import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; import org.springframework.web.context.support.WebApplicationContextUtils; import javax.servlet.*; @@ -13,42 +14,50 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; -/*@Component*/ +/** + * 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 JWTUtil jwtUtil; - private String errMessage = "Unauthorized user tried to barge their way in here! Don't worry, I caught this transgression. Error: %s"; - + private final String errMessage = "Unauthorized user tried to barge their way in here! Don't worry, I caught this transgression. Error: %s"; @Override - public void init(FilterConfig cfg) { - ApplicationContext container = WebApplicationContextUtils.getRequiredWebApplicationContext(cfg.getServletContext()); + public void init(FilterConfig config) { + ApplicationContext container = WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext()); this.jwtUtil = container.getBean(JWTUtil.class); } @Override - public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) - throws ServletException, IOException { + 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 req) { + private void parseToken(HttpServletRequest request) { try { - String header = req.getHeader(jwtUtil.getHeader()); + String header = request.getHeader(jwtUtil.getHeader()); + if (header == null || !header.startsWith(jwtUtil.getPrefix())) { - Logger.getFileLogger().writeLog("Request originates from an unauthenticated source.", 3); + Logger.getFileLogger().writeLog(errMessage, 3); return; } String token = header.replaceAll(jwtUtil.getPrefix(), ""); - Jws jwtClaims = jwtUtil.parseJWT(token); + Claims jwtClaims = jwtUtil.parseJWT(token); + PrincipalDTO principalDTO = new PrincipalDTO(jwtClaims); + request.setAttribute("principal", principalDTO); } catch (AuthenticationException e) { - Logger.getFileLogger().writeLog(String.format(errMessage, e.getMessage()), 3); + Logger.getFileLogger().writeLog(("Uh oh... Authentication Filter has a message: " + e.getMessage()), 3); } } } diff --git a/src/main/java/VanquishP2/Application/Beans/Configs/Filters/CORSFilter.java b/src/main/java/VanquishP2/Application/Beans/Filters/CORSFilter.java similarity index 83% rename from src/main/java/VanquishP2/Application/Beans/Configs/Filters/CORSFilter.java rename to src/main/java/VanquishP2/Application/Beans/Filters/CORSFilter.java index 01580c4..1c5ba4a 100644 --- a/src/main/java/VanquishP2/Application/Beans/Configs/Filters/CORSFilter.java +++ b/src/main/java/VanquishP2/Application/Beans/Filters/CORSFilter.java @@ -1,5 +1,6 @@ -package VanquishP2.Application.Beans.Configs.Filters; +package VanquishP2.Application.Beans.Filters; +import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; import javax.servlet.FilterChain; @@ -8,13 +9,13 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; -/*@Component*/ +@Component public class CORSFilter extends OncePerRequestFilter { @Override protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) throws ServletException, IOException { resp.setHeader("Access-Control-Allow-Origin", "*"); - resp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PATCH"); + resp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, PATCH"); resp.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); chain.doFilter(req, resp); } diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java index bdc6949..e8cf5a0 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java @@ -43,7 +43,7 @@ public List getAll() { * @throws AlbumDoesNotExistException Album does not exist in DB */ public Album getByID(int id) throws AlbumDoesNotExistException { - return albumRepository.findByID(id) + return albumRepository.findByAlbumID(id) .orElseThrow(AlbumDoesNotExistException::new); } diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java index 0cfa06e..1da9f93 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java @@ -1,7 +1,9 @@ package VanquishP2.Application.Beans.ModelServices; +import VanquishP2.Application.Beans.Models.User; import VanquishP2.Application.Beans.Models.UserInfo; import VanquishP2.Application.Beans.Repos.UserInfoRepository; +import VanquishP2.Application.Beans.Service.Logger; import VanquishP2.Exceptions.UserDoesNotExistException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -58,21 +60,6 @@ public UserInfo getByFirstName(String firstName) { return userInfoRepository.findByFirstName(firstName).get(); } - public Optional authenticate(String username, String password){ - Optional userInfo = userInfoRepository.findUserByUsernameAndPassword(username, password); - - try { - if (!userInfo.isPresent()) { - throw new UserDoesNotExistException(exceptionError); - } - } catch (UserDoesNotExistException e) { - // log - e.printStackTrace(); - } - - return userInfo; - } - public void save(UserInfo userInfo) { userInfoRepository.save(userInfo); } @@ -87,4 +74,37 @@ public void deleteUserInfo(UserInfo info){ public void deleteAllInfo(){ userInfoRepository.deleteAll(); } + + /** + * This method fetches all User Info in the DB + * @author Kollier Martin + * @date 11/8/2021 + * @return List of users present in DB + */ + public List getAll() { + return userInfoRepository.findAll(); + } + + /** + * Authenticate User + * @date 11/8/2021 + * @author Kollier Martin + * @param username Username + * @param password Password + * @return User Info, either null or not null + */ + public Optional authenticate(String username, String password){ + Optional userInfo = Optional.empty(); + + try { + userInfo = userInfoRepository.findByUsernameAndPassword(username, password); + if (!userInfo.isPresent()) { + throw new UserDoesNotExistException(exceptionError); + } + } catch (UserDoesNotExistException e) { + Logger.getFileLogger().writeLog(e.getMessage(), 3); + } + + return userInfo; + } } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java index 40a50cf..d23833c 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java @@ -1,7 +1,9 @@ package VanquishP2.Application.Beans.ModelServices; +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.Service.Logger; import VanquishP2.DTOs.UserRegistrationDTO; import VanquishP2.Exceptions.UserDoesNotExistException; @@ -24,13 +26,16 @@ public class UserService { private final UserRepository userRepository; private final UserInfoRepository userInfoRepository; + private final LocationRepository locationRepository; private final String exceptionError = "User: %s does not exist."; @Autowired public UserService(UserRepository userRepository, - UserInfoRepository userInfoRepository) { + UserInfoRepository userInfoRepository, + LocationRepository locationRepository) { this.userRepository = userRepository; this.userInfoRepository = userInfoRepository; + this.locationRepository = locationRepository; } /** @@ -78,7 +83,7 @@ public User getByUserInfo(UserInfo userInfo) { } /** - * + * Persist User to DB * @param user * @return */ @@ -87,7 +92,7 @@ public void save(User user) { } /** - * + * Delete User by ID * @param id * @return */ @@ -96,19 +101,23 @@ public void delete(int id) throws UserDoesNotExistException { } /** - * - * @param data - * @return + * Register New User + * @param data UserRegistration data to persist + * @return The new persisted Object */ public User registerUser(UserRegistrationDTO data, User.Role role) { User newUser; UserInfo newUserInfo; + Location userLocation; + userLocation = new Location(data.getCity(), data.getState()); newUserInfo = new UserInfo(data); newUser = new User(role, newUserInfo); + locationRepository.save(userLocation); userRepository.save(newUser); + newUserInfo.setLocation(userLocation); newUserInfo.setUser(newUser); userInfoRepository.save(newUserInfo); diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Album.java b/src/main/java/VanquishP2/Application/Beans/Models/Album.java index 47fe9e2..e0a992c 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/Album.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Album.java @@ -4,7 +4,6 @@ import javax.persistence.*; import java.io.Serializable; -import java.sql.Date; import java.util.ArrayList; import java.util.List; @@ -24,13 +23,12 @@ public Album() { @Id @Column(name = "AlbumID") - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer ID; - public Integer getID() { - return ID; + private Integer albumID; + public Integer getAlbumID() { + return albumID; } - public void setID(Integer ID) { - this.ID = ID; + public void setAlbumID(Integer ID) { + this.albumID = ID; } @Column(name = "AlbumTitle") @@ -43,11 +41,11 @@ public void setAlbumTitle(String albumTitle) { } @Column(name = "ReleaseDate") - private Date date; - public Date getDate() { + private String date; + public String getDate() { return date; } - public void setDate(Date date) { + public void setDate(String date) { this.date = date; } @@ -69,24 +67,24 @@ public void setTracks(List tracks) { this.tracks = tracks; } - @ManyToMany - private List albumGenres; - public List getAlbumGenres() { - return albumGenres; + @ManyToOne + private Genre genre; + public Genre getGenre() { + return genre; } - public void setAlbumGenres(List albumGenres) { - this.albumGenres = albumGenres; + public void setGenre(Genre genre) { + this.genre = genre; } @Override public String toString() { return "Album {\n" + - "ID: " + ID + ",\n" + + "ID: " + albumID + ",\n" + "albumTitle: " + albumTitle + ",\n" + "date: " + date + ",\n" + "artist: " + artist + ",\n" + "tracks: " + tracks + ",\n" + - "albumGenres: " + albumGenres + ",\n" + + "genre: " + genre + ",\n" + '}'; } } diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Artist.java b/src/main/java/VanquishP2/Application/Beans/Models/Artist.java index 078170a..7083cb7 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/Artist.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Artist.java @@ -29,16 +29,21 @@ public Artist(String name) { concerts = new ArrayList<>(); } + public Artist(String name, int artistID, String imageURL) { + this.name = name; + this.artistID = artistID; + this.imageURL = imageURL; + } + @Id @Column(name = "ArtistID") @GeneratedValue(strategy = GenerationType.IDENTITY) - private int ID; + private int artistID; public int getID() { - return ID; + return artistID; } - - public void setID(int ID) { - this.ID = ID; + public void setID(int artistID) { + this.artistID = artistID; } @Column(name = "Name") @@ -89,7 +94,7 @@ public void setTracks(List tracks) { @Override public String toString() { return "Artist {\n" + - "ID: " + ID + ",\n" + + "artistID: " + artistID + ",\n" + "name: " + name + ",\n" + "imageURL: " + imageURL + ",\n" + "concerts: " + concerts + ",\n" + diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Genre.java b/src/main/java/VanquishP2/Application/Beans/Models/Genre.java index 999e5d3..70b65ae 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/Genre.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Genre.java @@ -11,10 +11,11 @@ @JsonIgnoreProperties({"hibernateLazyInitializer", "handler"}) public class Genre { public Genre() { - genreOfAlbums = new ArrayList<>(); + albumsOfGenre = new ArrayList<>(); } public Genre(Integer genreID, String genreName, String imageURL) { + albumsOfGenre = new ArrayList<>(); this.genreID = genreID; this.genreName = genreName; this.imageURL = imageURL; @@ -48,12 +49,22 @@ public void setImageURL(String imageURL) { this.imageURL = imageURL; } - @ManyToMany(mappedBy = "albumGenres") - private List genreOfAlbums; - public List getGenreOfAlbums() { - return genreOfAlbums; + @OneToMany + private List albumsOfGenre; + public List getAlbumsOfGenre() { + return albumsOfGenre; } - public void setGenreOfAlbums(List genreOfAlbums) { - this.genreOfAlbums = genreOfAlbums; + public void setAlbumsOfGenre(List albumsOfGenre) { + this.albumsOfGenre = albumsOfGenre; + } + + @Override + public String toString() { + return "Genre {\n" + + "genreID: " + genreID + ",\n" + + "genreName: " + genreName + ",\n" + + "imageURL: " + imageURL + ",\n" + + "albumsOfGenre: " + albumsOfGenre + ",\n" + + '}'; } } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Playlist.java b/src/main/java/VanquishP2/Application/Beans/Models/Playlist.java index 1111134..2a3953e 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/Playlist.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Playlist.java @@ -55,7 +55,7 @@ public void setUser(User user) { this.user = user; } - @OneToMany(cascade = CascadeType.ALL, mappedBy = "playlist") + @ManyToMany List trackList; public List getTrackList() { return trackList; diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Track.java b/src/main/java/VanquishP2/Application/Beans/Models/Track.java index f68d9ba..d758f6d 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/Track.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Track.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import javax.persistence.*; +import java.util.List; /** * This class is used to declare the POJO, Track @@ -18,8 +19,13 @@ public Track() { } - public Track(String trackName, String duration, Artist artist) { - this.trackName = trackName; + public Track(Integer id, String title) { + this.trackID = id; + this.title = title; + } + + public Track(String title, String duration, Artist artist) { + this.title = title; this.duration = duration; this.artist = artist; } @@ -27,21 +33,21 @@ public Track(String trackName, String duration, Artist artist) { @Id @Column(name = "TrackID") @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer ID; - public Integer getID() { - return ID; + private Integer trackID; + public Integer getTrackID() { + return trackID; } - public void setID(Integer ID) { - this.ID = ID; + public void setTrackID(Integer ID) { + this.trackID = ID; } @Column(name = "Title") - private String trackName; - public String getTrackName() { - return trackName; + private String title; + public String getTitle() { + return title; } - public void setTrackName(String trackName) { - this.trackName = trackName; + public void setTitle(String title) { + this.title = title; } @Column(name = "Duration") @@ -72,23 +78,50 @@ public void setUser(User user) { } @ManyToOne - private Playlist playlist; - public Playlist getPlaylist() { - return playlist; + Album album; + public Album getAlbum() { + return album; + } + public void setAlbum(Album album) { + this.album = album; + } + + @ManyToMany(mappedBy = "trackList") + private List playlists; + public List getPlaylists() { + return playlists; + } + public void setPlaylists(List playlists) { + this.playlists = playlists; + } + + @ManyToMany(mappedBy = "likedTracks") + private List userLikes; + public List getUserLikes() { + return userLikes; + } + public void setUserLikes(List userLikes) { + this.userLikes = userLikes; + } + + @ManyToMany(mappedBy = "dislikedTracks") + private List userDislikes; + public List getUserDislikes() { + return userDislikes; } - public void setPlaylist(Playlist playlist) { - this.playlist = playlist; + public void setUserDislikes(List userDislikes) { + this.userDislikes = userDislikes; } @Override public String toString() { return "Track {\n" + - "ID: " + ID + ",\n" + - "trackName: " + trackName + ",\n" + + "ID: " + trackID + ",\n" + + "title: " + title + ",\n" + "duration: " + duration + ",\n" + "artist: " + artist + ",\n" + "user: " + user + ",\n" + - "playlist: " + playlist + ",\n" + + "playlists: " + playlists + ",\n" + '}'; } } diff --git a/src/main/java/VanquishP2/Application/Beans/Models/User.java b/src/main/java/VanquishP2/Application/Beans/Models/User.java index 16133de..6e96a83 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/User.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/User.java @@ -1,8 +1,6 @@ package VanquishP2.Application.Beans.Models; -import VanquishP2.DTOs.UserRegistrationDTO; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import org.springframework.stereotype.Component; import javax.persistence.*; import java.util.ArrayList; @@ -16,18 +14,23 @@ @Table(name = "USERS") @Entity -@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, ignoreUnknown = true) +@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, + ignoreUnknown = true) public class User { public User() { this.role = Role.BASIC; this.myPlaylists = new ArrayList<>(); this.favorites = new ArrayList<>(); + this.likedTracks = new ArrayList<>(); + this.dislikedTracks = new ArrayList<>(); this.userInfo = null; } public User(Role role, UserInfo userInfo) { this.role = role; this.myPlaylists = new ArrayList<>(); + this.likedTracks = new ArrayList<>(); + this.dislikedTracks = new ArrayList<>(); this.favorites = new ArrayList<>(); this.userInfo = userInfo; } @@ -44,7 +47,7 @@ public void setID(Integer ID) { } @Enumerated - Role role; + private Role role; public enum Role { BASIC, PREMIUM @@ -57,7 +60,7 @@ public void setRole(Role role) { } @OneToMany(mappedBy = "user") - List myPlaylists; + private List myPlaylists; public List getMyPlaylists() { return myPlaylists; } @@ -66,7 +69,7 @@ public void setMyPlaylists(List myPlaylists) { } @OneToMany(mappedBy = "user") - List favorites; + private List favorites; public List getFavorites() { return favorites; } @@ -75,7 +78,7 @@ public void setFavorites(List favorites) { } @OneToOne(mappedBy = "user") - UserInfo userInfo; + private UserInfo userInfo; public UserInfo getUserInfo() { return userInfo; } @@ -83,6 +86,24 @@ public void setUserInfo(UserInfo userInfo) { this.userInfo = userInfo; } + @ManyToMany + private List likedTracks; + public List getLikedTracks() { + return likedTracks; + } + public void setLikedTracks(List likedTracks) { + this.likedTracks = likedTracks; + } + + @ManyToMany + private List dislikedTracks; + public List getDislikedTracks() { + return dislikedTracks; + } + public void setDislikedTracks(List dislikedTracks) { + this.dislikedTracks = dislikedTracks; + } + @Override public String toString() { return "User {\n" + @@ -90,7 +111,6 @@ public String toString() { "role: " + role + ",\n" + "myPlaylists: " + myPlaylists + ",\n" + "favorites: " + favorites + ",\n" + - "userInfo: " + userInfo + ",\n" + '}'; } } diff --git a/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java index 2695656..2996c81 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java @@ -13,7 +13,8 @@ @Table(name = "USERINFO") @Entity -@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"}, ignoreUnknown = true) +@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler", "location", "user"}, + ignoreUnknown = true) public class UserInfo { public UserInfo() { @@ -26,7 +27,7 @@ public UserInfo(String email, String username, String password) { } public UserInfo(UserRegistrationDTO registration) { - this.location = registration.getLocation(); + this.location = new Location(registration.getCity(), registration.getState()); this.firstName = registration.getFirstName(); this.lastName = registration.getLastName(); this.username = registration.getUsername(); @@ -90,7 +91,7 @@ public void setPassword(String password) { this.password = password; } - @ManyToOne + @ManyToOne(cascade = CascadeType.REMOVE) private Location location; public Location getLocation() { return location; @@ -99,7 +100,7 @@ public void setLocation(Location location) { this.location = location; } - @OneToOne + @OneToOne(cascade = CascadeType.REMOVE) User user; public User getUser() { return user; @@ -118,7 +119,6 @@ public String toString() { "username: " + username + ",\n" + "password: " + password + ",\n" + "location: " + location + ",\n" + - "user: " + user + ",\n" + '}'; } } diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java index cd4fd9d..00cb5dc 100644 --- a/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/AlbumRepository.java @@ -8,8 +8,8 @@ @Repository public interface AlbumRepository extends JpaRepository { - void deleteByID(Integer integer); + void deleteByAlbumID(Integer integer); void deleteByAlbumTitle(String title); Optional getAlbumByAlbumTitle(String name); - Optional findByID(Integer id); + Optional findByAlbumID(Integer id); } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/TrackRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/TrackRepository.java index dbd44bf..174897d 100644 --- a/src/main/java/VanquishP2/Application/Beans/Repos/TrackRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/TrackRepository.java @@ -8,5 +8,5 @@ @Repository public interface TrackRepository extends JpaRepository { - Optional findByID(int ID); + Optional findByTrackID(int ID); } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java index 44167dd..8d0063d 100644 --- a/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/UserInfoRepository.java @@ -8,7 +8,7 @@ @Repository public interface UserInfoRepository extends JpaRepository { - Optional findUserByUsernameAndPassword(String username, String password); + Optional findByUsernameAndPassword(String username, String password); Optional findByUsername(String username); Optional findByFirstName(String firstName); } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/APIClientService.java b/src/main/java/VanquishP2/Application/Beans/Service/APIClientService.java similarity index 92% rename from src/main/java/VanquishP2/Application/Beans/ModelServices/APIClientService.java rename to src/main/java/VanquishP2/Application/Beans/Service/APIClientService.java index 90f3979..0647197 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/APIClientService.java +++ b/src/main/java/VanquishP2/Application/Beans/Service/APIClientService.java @@ -1,4 +1,4 @@ -package VanquishP2.Application.Beans.ModelServices; +package VanquishP2.Application.Beans.Service; import okhttp3.OkHttpClient; import okhttp3.Request; diff --git a/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java b/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java index 0a9dff5..959c3a2 100644 --- a/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java +++ b/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java @@ -5,16 +5,18 @@ import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - +import org.springframework.context.annotation.PropertySource; +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 */ -@Service +@Component public class JWTUtil { @Value("${jwt.header}") @@ -28,7 +30,7 @@ public class JWTUtil { private Key key; - public void JWTUtil (){ + public JWTUtil(){ createKey(); } @@ -37,7 +39,6 @@ private void createKey(){ } public String createJWT(UserInfo userInfo){ - // Build the java web token and return it return Jwts.builder() .setIssuer("Vanquish") .setSubject(userInfo.getUsername()) @@ -46,11 +47,12 @@ public String createJWT(UserInfo userInfo){ .compact(); } - public Jws parseJWT(String token) throws AuthenticationException { + 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); + .parseClaimsJws(token) + .getBody(); } public String getHeader() { @@ -65,7 +67,21 @@ public int getExpiration() { return expiration; } - public Key getSigningKey() { + 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/main/java/VanquishP2/Application/Beans/Service/ValidatorService.java b/src/main/java/VanquishP2/Application/Beans/Service/ValidatorService.java deleted file mode 100644 index 8ad703a..0000000 --- a/src/main/java/VanquishP2/Application/Beans/Service/ValidatorService.java +++ /dev/null @@ -1,33 +0,0 @@ -package VanquishP2.Application.Beans.Service; - -import org.springframework.stereotype.Service; -import javax.validation.Validation; -import javax.validation.Validator; -import javax.validation.ValidatorFactory; - -@Service -public class ValidatorService { - ValidatorFactory factory; - Validator validator; - - public void Validator(){ - factory = Validation.buildDefaultValidatorFactory(); - validator = factory.getValidator(); - } - - public ValidatorFactory getFactory() { - return factory; - } - - public void setFactory(ValidatorFactory factory) { - this.factory = factory; - } - - public javax.validation.Validator getValidator() { - return validator; - } - - public void setValidator(javax.validation.Validator validator) { - this.validator = validator; - } -} diff --git a/src/main/java/VanquishP2/Application/P2Application.java b/src/main/java/VanquishP2/Application/P2Application.java index e2b5f1e..85d0acd 100644 --- a/src/main/java/VanquishP2/Application/P2Application.java +++ b/src/main/java/VanquishP2/Application/P2Application.java @@ -3,9 +3,12 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.domain.EntityScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; @SpringBootApplication(scanBasePackages = "VanquishP2") @EntityScan("VanquishP2.Application.Beans.Models") +@PropertySource(value = "classpath:application.properties") public class P2Application { public static void main(String[] args) { diff --git a/src/main/java/VanquishP2/Controllers/AuthController.java b/src/main/java/VanquishP2/Controllers/AuthController.java deleted file mode 100644 index a601b59..0000000 --- a/src/main/java/VanquishP2/Controllers/AuthController.java +++ /dev/null @@ -1,41 +0,0 @@ -package VanquishP2.Controllers; - -import VanquishP2.Application.Beans.ModelServices.UserInfoService; -import VanquishP2.Application.Beans.Models.UserInfo; -import VanquishP2.Application.Beans.Service.JWTUtil; -import VanquishP2.DTOs.LoginCredentialsDTO; -import VanquishP2.DTOs.UserInfoDTO; -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 java.util.Optional; - -import static org.springframework.http.MediaType.*; - -@RestController -@RequestMapping("/authenticate") -public class AuthController { - - private JWTUtil jwtUtil; - private final UserInfoService userInfoService; - - @Autowired - public AuthController (JWTUtil jwtUtil, UserInfoService userInfoService) { - this.userInfoService = userInfoService; - } - - @PostMapping(consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) - public UserInfoDTO authenticate(@RequestBody LoginCredentialsDTO credentials, HttpServletResponse response) { - Optional userInfo = userInfoService.authenticate(credentials.getUsername(), credentials.getPassword()); - String jwt = jwtUtil.createJWT(userInfo.get()); - response.setHeader(jwtUtil.getHeader(), jwt); - - return new UserInfoDTO(userInfo.get()); - } - -} diff --git a/src/main/java/VanquishP2/Controllers/AuthenticationController.java b/src/main/java/VanquishP2/Controllers/AuthenticationController.java new file mode 100644 index 0000000..aecaccd --- /dev/null +++ b/src/main/java/VanquishP2/Controllers/AuthenticationController.java @@ -0,0 +1,82 @@ +package VanquishP2.Controllers; + +import VanquishP2.Application.Beans.ModelServices.UserInfoService; +import VanquishP2.Application.Beans.ModelServices.UserService; +import VanquishP2.Application.Beans.Models.User; +import VanquishP2.Application.Beans.Models.UserInfo; +import VanquishP2.Application.Beans.Service.JWTUtil; +import VanquishP2.DTOs.LoginCredentialsDTO; +import VanquishP2.DTOs.UserRegistrationDTO; +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; +import static org.springframework.http.MediaType.*; + +/** + * + */ +@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) { + Optional userInfo = userInfoService.authenticate(credentials.getUsername(), credentials.getPassword()); + + if (userInfo.isPresent()) { + String jwt = jwtUtil.createJWT(userInfo.get()); + response.setHeader(jwtUtil.getHeader(), jwt); + } + + return userInfo.get(); + } + + /** + * 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; + } + + /** + * Register Premium 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 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; + } +} diff --git a/src/main/java/VanquishP2/Controllers/HelloController.java b/src/main/java/VanquishP2/Controllers/HelloController.java deleted file mode 100644 index 2d63cea..0000000 --- a/src/main/java/VanquishP2/Controllers/HelloController.java +++ /dev/null @@ -1,24 +0,0 @@ -package VanquishP2.Controllers; - -import org.json.JSONException; -import org.json.JSONObject; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping(name = "HelloServlet", value = "/hello") -public class HelloController { - JSONObject jObj = new JSONObject(); - - @CrossOrigin - public String helloWorld(){ - try { - jObj.put("Response", "Hello World!"); - } catch (JSONException e) { - e.printStackTrace(); - } - - return jObj.toString(); - } -} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Controllers/PingController.java b/src/main/java/VanquishP2/Controllers/PingController.java deleted file mode 100644 index b450c08..0000000 --- a/src/main/java/VanquishP2/Controllers/PingController.java +++ /dev/null @@ -1,24 +0,0 @@ -package VanquishP2.Controllers; - -import org.json.JSONException; -import org.json.JSONObject; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping(name = "PingServlet", value = "/ping") -public class PingController { - JSONObject jObj = new JSONObject(); - - @CrossOrigin - public String pong(){ - try { - jObj.put("Response", "pong!"); - } catch (JSONException e) { - e.printStackTrace(); - } - - return jObj.toString(); - } -} diff --git a/src/main/java/VanquishP2/Controllers/PlaylistController.java b/src/main/java/VanquishP2/Controllers/PlaylistController.java index e2d5496..2a3317b 100644 --- a/src/main/java/VanquishP2/Controllers/PlaylistController.java +++ b/src/main/java/VanquishP2/Controllers/PlaylistController.java @@ -25,7 +25,9 @@ public Playlist savePlaylist_name(@RequestBody Playlist playlist){ @GetMapping(value = "/playlist_name/{playlist_id}", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(value = HttpStatus.OK) - public Playlist getPlaylistById(@PathVariable("id") Integer id){ + public Playlist getPlaylistById(@PathVariable("playlist_id") Integer id){ return playlistService.getPlaylist_name(id); } + + } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Controllers/TrackController.java b/src/main/java/VanquishP2/Controllers/TrackController.java index 80e3959..e284f02 100644 --- a/src/main/java/VanquishP2/Controllers/TrackController.java +++ b/src/main/java/VanquishP2/Controllers/TrackController.java @@ -22,11 +22,10 @@ public TrackController(TrackService trackService) { @ResponseStatus(value = HttpStatus.CREATED) public Track saveTrack(@RequestBody Track track){ trackService.save(track); - return trackService.getTrack(track.getID()); + return trackService.getTrack(track.getTrackID()); } @GetMapping(value = "/track/{id}", produces = MediaType.APPLICATION_JSON_VALUE) - //@GetMapping(value = "/track?id=x", produces = MediaType.APPLICATION_JSON_VALUE) -> @RequestParam @ResponseStatus(value = HttpStatus.OK) public Track getTrackById(@PathVariable ("id") Integer id){ return trackService.getTrack(id); diff --git a/src/main/java/VanquishP2/Controllers/UserController.java b/src/main/java/VanquishP2/Controllers/UserController.java index 0e97ee7..1e94a5a 100644 --- a/src/main/java/VanquishP2/Controllers/UserController.java +++ b/src/main/java/VanquishP2/Controllers/UserController.java @@ -16,20 +16,18 @@ * UserController * Handles requests that involve the manipulating or retrieval of user data * - * @Date 11/1/2021 - * @Author Kollier Martin + * @date 11/1/2021 + * @author Kollier Martin */ @RestController -@RequestMapping(value = "/user", produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE) +@RequestMapping(value = "/4TheMusic", produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE) public class UserController { private final UserService userService; - private final JWTUtil jwtUtil; @Autowired - public UserController(UserService userService, JWTUtil jwtUtil) { + public UserController(UserService userService) { this.userService = userService; - this.jwtUtil = jwtUtil; } /** @@ -37,12 +35,16 @@ public UserController(UserService userService, JWTUtil jwtUtil) { * @param id ID Integer to distinguish user * @return User Object */ - @GetMapping("/{id}") + @GetMapping("/user/{id}") public User retrieve(@PathVariable int id) { return userService.getByID(id); } - @GetMapping("") + /** + * Get all users in DB + * @return List of Registered Users + */ + @GetMapping("/user/all") public ResponseEntity> getAllUsers() { List allUsers = userService.getAllUsers(); @@ -55,31 +57,11 @@ else if (allUsers.isEmpty()) } /** - * - * @param regData - * @return - */ - @PostMapping(value = "/register/basic", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) - public User registerBasicUser(@RequestBody @Valid UserRegistrationDTO regData){ - return userService.registerUser(regData, User.Role.BASIC); - } - - /** - * - * @param regData - * @return - */ - @PostMapping(value = "/register/premium", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) - public User registerPremiumUser(@RequestBody @Valid UserRegistrationDTO regData){ - return userService.registerUser(regData, User.Role.PREMIUM); - } - - /** - * - * @param id - * @return + * Delete user by ID + * @param id User ID + * @return Response Entity */ - @DeleteMapping("/{id}") + @DeleteMapping("/user/{id}") public ResponseEntity delete(@PathVariable("id") int id) { User user = userService.getByID(id); diff --git a/src/main/java/VanquishP2/Controllers/UserInfoController.java b/src/main/java/VanquishP2/Controllers/UserInfoController.java index 5a5e09f..8d4c3e0 100644 --- a/src/main/java/VanquishP2/Controllers/UserInfoController.java +++ b/src/main/java/VanquishP2/Controllers/UserInfoController.java @@ -6,8 +6,11 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequestMapping(value = "/4TheMusic") public class UserInfoController { @@ -30,7 +33,8 @@ public UserInfo saveUserInfo(@RequestBody UserInfo userInfo){ return userInfoService.saveUserInfo(userInfo); } - @PutMapping(value = "/userinfo", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + // Kollier took out setLocation and setUser until we get the Front End together + @PutMapping(value = "/userinfo/update", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(value = HttpStatus.OK) public UserInfo updateUserInfo(@RequestBody UserInfo userInfo){ UserInfo updatedInfo = userInfoService.getUserInfoById(userInfo.getID()); @@ -38,8 +42,6 @@ public UserInfo updateUserInfo(@RequestBody UserInfo userInfo){ updatedInfo.setPassword(userInfo.getPassword()); updatedInfo.setFirstName(userInfo.getFirstName()); updatedInfo.setLastName(userInfo.getLastName()); - updatedInfo.setUser(userInfo.getUser()); - updatedInfo.setLocation(userInfo.getLocation()); updatedInfo.setUsername(userInfo.getUsername()); userInfoService.saveUserInfo(updatedInfo); return userInfoService.getUserInfoById(updatedInfo.getID()); @@ -54,4 +56,21 @@ public void deleteUserInfoById(@PathVariable ("id") Integer id){ userInfoService.deleteAllInfo(); } } + + /** + * Get all users in DB + * @return List of Registered Users + * @author Kollier Martin + */ + @GetMapping("/userinfo/all") + public ResponseEntity> getAllUsers() { + List allUsers = userInfoService.getAll(); + + if (allUsers == null) + return new ResponseEntity<>(HttpStatus.NOT_FOUND); + else if (allUsers.isEmpty()) + return new ResponseEntity<>(allUsers, HttpStatus.NO_CONTENT); + else + return new ResponseEntity<>(allUsers, HttpStatus.OK); + } } \ No newline at end of file diff --git a/src/main/java/VanquishP2/DTOs/LoginCredentialsDTO.java b/src/main/java/VanquishP2/DTOs/LoginCredentialsDTO.java index 0037d9b..148e717 100644 --- a/src/main/java/VanquishP2/DTOs/LoginCredentialsDTO.java +++ b/src/main/java/VanquishP2/DTOs/LoginCredentialsDTO.java @@ -28,4 +28,12 @@ public String getPassword() { public void setPassword(String password) { this.password = password; } + + @Override + public String toString() { + return "LoginCredentialsDTO {\n" + + "username: " + username + ",\n" + + "password: " + password + ",\n" + + '}'; + } } \ No newline at end of file diff --git a/src/main/java/VanquishP2/DTOs/PrincipalDTO.java b/src/main/java/VanquishP2/DTOs/PrincipalDTO.java new file mode 100644 index 0000000..dc044fd --- /dev/null +++ b/src/main/java/VanquishP2/DTOs/PrincipalDTO.java @@ -0,0 +1,51 @@ +package VanquishP2.DTOs; + +import VanquishP2.Application.Beans.Models.User; +import io.jsonwebtoken.Claims; + +/** + * Custom Authentication Principal + * Used for validation of user + * @author Kollier Martin + * @date 11/8/2021 + */ +public class PrincipalDTO { + + private int userID; + private String username; + private User.Role role; + + /** + * Parameterized Constructor + * @param jwtClaims Claims object that includes an authorized user's information + */ + public PrincipalDTO(Claims jwtClaims) { + this.userID = Integer.parseInt(jwtClaims.getId()); + this.username = jwtClaims.getSubject(); + this.role = User.Role.valueOf(jwtClaims.get("role", String.class)); + } + + public int getUserID() { + return userID; + } + + public void setUserID(int userID) { + this.userID = userID; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public User.Role getRole() { + return role; + } + + public void setRole(User.Role role) { + this.role = role; + } +} diff --git a/src/main/java/VanquishP2/DTOs/UserInfoDTO.java b/src/main/java/VanquishP2/DTOs/UserInfoDTO.java index ce43a61..730ec7a 100644 --- a/src/main/java/VanquishP2/DTOs/UserInfoDTO.java +++ b/src/main/java/VanquishP2/DTOs/UserInfoDTO.java @@ -3,9 +3,11 @@ import VanquishP2.Application.Beans.Models.UserInfo; public class UserInfoDTO { - UserInfo user; + UserInfo userInfo; public UserInfoDTO(UserInfo userInfo) { - this.user = userInfo; + this.userInfo = userInfo; } -} + + +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java index b722509..7a41c9a 100644 --- a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java +++ b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java @@ -17,29 +17,30 @@ public class UserRegistrationDTO { @Length(min = 5, max = 20) @NotNull(message = "Null, a username can not be.") - @Pattern(regexp = "^[a-zA-Z0-9]*$") + @Pattern(message = "Username is not valid for the supreme overlord. Try again.", + regexp = "^[a-zA-Z0-9]*$") private String username; - @Length(min = 8, max = 20) - @NotNull(message = "Come on. Your password should be strong, like Russian.") - @Pattern(regexp = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–{}:;',?/*~$^+=<>])$") + @NotNull(message = "*crickets*. There's no password here.") + @Pattern(message = "Come on. Your password should be strong, like Russian.", + regexp = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$") private String password; @Email(message = "This email is not valid >:(") private String email; private String firstName, lastName; - private Location location; + private String city, state; public UserRegistrationDTO() { - } public UserRegistrationDTO(String firstName, String lastName, - String username, String password, String email, Location location) { + String username, String password, String email, String city, String state) { this.firstName = firstName; this.lastName = lastName; - this.location = location; + this.city = city; + this.state = state; this.username = username; this.password = password; this.email = email; @@ -91,11 +92,32 @@ public void setLastName(String lastName) { this.lastName = lastName; } - public Location getLocation() { - return location; + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; } - public void setLocation(Location location) { - this.location = location; + @Override + public String toString() { + return "UserRegistrationDTO {\n" + + "username: " + username + ",\n" + + "password: " + password + ",\n" + + "email: " + email + ",\n" + + "firstName: " + firstName + ",\n" + + "lastName: " + lastName + ",\n" + + "city: " + city + ",\n" + + "state: " + state + ",\n" + + '}'; } } \ No newline at end of file diff --git a/src/main/java/VanquishP2/DataGenerators/DataLists.java b/src/main/java/VanquishP2/DataGenerators/DataLists.java deleted file mode 100644 index 9b0e38b..0000000 --- a/src/main/java/VanquishP2/DataGenerators/DataLists.java +++ /dev/null @@ -1,108 +0,0 @@ -package VanquishP2.DataGenerators; - -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.Email; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; - -public class DataLists { - public static String[] states = { - "Freeport", - "Alcoa", - "Fayetteville", - "Vail", - "Pekin", - "Ishpeming", - "Puyallup", - "Houlton", - "Rome", - "Pampa", - }; - - public static String[] cities = { - "Nacogdoches", - "Queens", - "Elgin", - "West Lafayette", - "Cushing", - "Payson", - "South Hadley", - "Daytona Beach", - "Meriden", - "Randolph", - }; - - public static String[] names = { - "Chace", "Nielsen", - "Leticia", "Allen", - "Lyric", "Branch", - "Cooper", "Malone", - "Kasen", "Hardy", - "Keira", "Poole", - "Braedon", "Wood", - "Porter", "Gentry", - "Augustus", "James", - "Rodolfo", "Patton", - "Iyana", "Berry", - "Dawson", "Sheppard" - }; - - public static @Length(min = 8, max = 20) - @NotNull(message = "*Crickets*.. That's an empty password!") - @Pattern(regexp = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–{}:;',?/*~$^+=<>])$", - message = "Come on. Your password should be strong, like Russian.") - String[] passwords = { - "m]hQB7>d", "wRr^){3Q" , - "h@w/V[8k", "]tqWC_D4", - "kKL9?sx6", "WmHu{V9K", - "(@veR46w", ">?x&D2N9", - ">6J.yd7t", "6Qm@av{/", - "t(6_R8^{", "j)4A?[=h", - "!kZ%h[6b", "q7yS[gB{", - "_3$nJQ,r", "UCaH5[$S", - "D5p_,yVG", "J29a-j?@", - "DRyQp3}]", "n3cYM@B^" - }; - - public static @Length(min = 5, max = 20) - @NotNull(message = "Null, a username can not be.") - @Pattern(regexp = "^[a-zA-Z0-9]*$", message = "Username does not follow constraints!") - String[] usernames = { - "Aireril", "Alisomet", - "Anostung", "Aspenbo", - "AuthorPlatinum", "Astroboy", - "Bigg2free", "Bookwood", - "Bucklippe", "Chwiredu", - "Clubbieli", "Conveonsu", - "FreshTary", "HiVibrant", - "Katrien", "Leadessl", - "Litachet", "Manpsler", - "MoLight", "Nonpactel", - "Onitypema", "Perachet", - "Pherietm", "Puffro" - }; - - public static @Email(message = "Email is incorrectly formatted.") String[] emails = { - "andre.kling@mills.com", - "gayle.turcotte@connelly.biz", - "adelbert.bauch@reilly.com", - "jerel.von@dach.biz", - "qtillman@krajcik.com", - "joyce.wuckert@mayert.com", - "tillman03@terry.com", - "jeremie.altenwerth@yahoo.com", - "pemmerich@yahoo.com", - "gpouros@hessel.biz", - "percy.jaskolski@hotmail.com", - "apaucek@hotmail.com", - "hessel.gideon@yahoo.com", - "sydney31@nolan.org", - "freda.tromp@hotmail.com", - "leonie.lemke@maggio.com", - "agustina50@hotmail.com", - "graham.bertha@hotmail.com", - "alessandra68@kuphal.com", - "mraz.cory@yahoo.com" - }; -} diff --git a/src/main/java/VanquishP2/DataGenerators/UserGen.java b/src/main/java/VanquishP2/DataGenerators/UserGen.java index 903932b..04968ae 100644 --- a/src/main/java/VanquishP2/DataGenerators/UserGen.java +++ b/src/main/java/VanquishP2/DataGenerators/UserGen.java @@ -7,35 +7,38 @@ import VanquishP2.Application.Beans.Models.User; import VanquishP2.Application.Beans.Models.UserInfo; import VanquishP2.DTOs.UserRegistrationDTO; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import javax.annotation.PostConstruct; +import org.hibernate.validator.constraints.Length; +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; import java.util.Random; -import static VanquishP2.DataGenerators.DataLists.*; -@Service +import static VanquishP2.DataGenerators.UserGen.DataLists.*; + + +//@Service public class UserGen { - private static Random rand = new Random(); + private final static Random rand = new Random(); private static int index; private final UserService userService; private final UserInfoService userInfoService; private final LocationService locationService; - @Autowired + //@Autowired public UserGen(UserService userService, UserInfoService userInfoService, LocationService locationService) { this.locationService = locationService; this.userInfoService = userInfoService; this.userService = userService; } - @PostConstruct + //@PostConstruct private void populate() { for (int i = 0; i < 20; i++) { UserRegistrationDTO userRegistrationDTO = new UserRegistrationDTO(getAFirstName(), getALastName(), - getAUsername(), getAPassword(), getAEmail(), getALocation()); + getAUsername(), getAPassword(), getAEmail(), getACity(), getAState()); UserInfo userInfo = new UserInfo(userRegistrationDTO); - locationService.save(userRegistrationDTO.getLocation()); + locationService.save(new Location(userRegistrationDTO.getCity(), userRegistrationDTO.getState())); userInfoService.save(userInfo); User user = new User(User.Role.BASIC, userInfo); @@ -53,6 +56,18 @@ public static Location getALocation() { return new Location(cities[index], states[index]); } + public static String getACity(){ + Random rand = new Random(); + int index = rand.nextInt(cities.length); + return cities[index]; + } + + public static String getAState(){ + Random rand = new Random(); + int index = rand.nextInt(cities.length); + return states[index]; + } + public static String getAFirstName() { index = rand.nextInt(names.length); return names[index]; @@ -77,4 +92,105 @@ public static String getAEmail() { index = rand.nextInt(emails.length); return emails[index]; } + + static class DataLists { + public static String[] states = { + "Freeport", + "Alcoa", + "Fayetteville", + "Vail", + "Pekin", + "Ishpeming", + "Puyallup", + "Houlton", + "Rome", + "Pampa", + }; + + public static String[] cities = { + "Nacogdoches", + "Queens", + "Elgin", + "West Lafayette", + "Cushing", + "Payson", + "South Hadley", + "Daytona Beach", + "Meriden", + "Randolph", + }; + + public static String[] names = { + "Chace", "Nielsen", + "Leticia", "Allen", + "Lyric", "Branch", + "Cooper", "Malone", + "Kasen", "Hardy", + "Keira", "Poole", + "Braedon", "Wood", + "Porter", "Gentry", + "Augustus", "James", + "Rodolfo", "Patton", + "Iyana", "Berry", + "Dawson", "Sheppard" + }; + + public static @Length(min = 8, max = 20) + @NotNull(message = "*Crickets*.. That's an empty password!") + @Pattern(regexp = "^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])(?=.*[!@#&()–{}:;',?/*~$^+=<>])$", + message = "Come on. Your password should be strong, like Russian.") + String[] passwords = { + "m]hQB7>d", "wRr^){3Q", + "h@w/V[8k", "]tqWC_D4", + "kKL9?sx6", "WmHu{V9K", + "(@veR46w", ">?x&D2N9", + ">6J.yd7t", "6Qm@av{/", + "t(6_R8^{", "j)4A?[=h", + "!kZ%h[6b", "q7yS[gB{", + "_3$nJQ,r", "UCaH5[$S", + "D5p_,yVG", "J29a-j?@", + "DRyQp3}]", "n3cYM@B^" + }; + + public static @Length(min = 5, max = 20) + @NotNull(message = "Null, a username can not be.") + @Pattern(regexp = "^[a-zA-Z0-9]*$", message = "Username does not follow constraints!") + String[] usernames = { + "Aireril", "Alisomet", + "Anostung", "Aspenbo", + "AuthorPlatinum", "Astroboy", + "Bigg2free", "Bookwood", + "Bucklippe", "Chwiredu", + "Clubbieli", "Conveonsu", + "FreshTary", "HiVibrant", + "Katrien", "Leadessl", + "Litachet", "Manpsler", + "MoLight", "Nonpactel", + "Onitypema", "Perachet", + "Pherietm", "Puffro" + }; + + public static @Email(message = "Email is incorrectly formatted.") String[] emails = { + "andre.kling@mills.com", + "gayle.turcotte@connelly.biz", + "adelbert.bauch@reilly.com", + "jerel.von@dach.biz", + "qtillman@krajcik.com", + "joyce.wuckert@mayert.com", + "tillman03@terry.com", + "jeremie.altenwerth@yahoo.com", + "pemmerich@yahoo.com", + "gpouros@hessel.biz", + "percy.jaskolski@hotmail.com", + "apaucek@hotmail.com", + "hessel.gideon@yahoo.com", + "sydney31@nolan.org", + "freda.tromp@hotmail.com", + "leonie.lemke@maggio.com", + "agustina50@hotmail.com", + "graham.bertha@hotmail.com", + "alessandra68@kuphal.com", + "mraz.cory@yahoo.com" + }; + } } diff --git a/src/main/java/VanquishP2/Deezer/AlbumSearch.java b/src/main/java/VanquishP2/Deezer/AlbumSearch.java new file mode 100644 index 0000000..ca55ab5 --- /dev/null +++ b/src/main/java/VanquishP2/Deezer/AlbumSearch.java @@ -0,0 +1,46 @@ +package VanquishP2.Deezer; + +import VanquishP2.Application.Beans.Service.APIClientService; +import VanquishP2.Application.Beans.Models.Album; +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) throws JSONException { + List albumSearch = new ArrayList<>(); + + String urlStart = "https://api.deezer.com/search/album?q=" + albumTitle + "&index="; + for(int i = 0; i < numberOfResults; i++){ + //This limits the results of our get request to 1 result per request + String url = urlStart + i + "&limit=1"; + + //This sends the request and assigns the response to a String + String jsonResponse = APIClientService.get(url); + + //This section gets the artist data from the response + JSONObject jsonObject = new JSONObject(jsonResponse); + + //data is NOT a string, it is a JSONArray with 1 JSONObject in it... + JSONArray data = jsonObject.getJSONArray("data"); + + if(data.length() == 0){ + return albumSearch; + } + JSONObject jsonData = data.getJSONObject(0); + + int id = jsonData.getInt("id"); + + String newUrl = "https://api.deezer.com/album/" + id; + String stringJsonAlbum = APIClientService.get(newUrl); + + Album resultAlbum = JSONStringToModelConverter.albumConverter(stringJsonAlbum); + + albumSearch.add(resultAlbum); + } + return albumSearch; + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Deezer/ArtistSearch.java b/src/main/java/VanquishP2/Deezer/ArtistSearch.java new file mode 100644 index 0000000..cd9ce56 --- /dev/null +++ b/src/main/java/VanquishP2/Deezer/ArtistSearch.java @@ -0,0 +1,74 @@ +package VanquishP2.Deezer; + +import VanquishP2.Application.Beans.Service.APIClientService; +import VanquishP2.Application.Beans.Models.Album; +import VanquishP2.Application.Beans.Models.Artist; +import VanquishP2.Application.Beans.Models.Track; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +public class ArtistSearch { + + 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="; + for(int i = 0; i < numberOfResults; i++){ + //This limits the results of our get request to 1 result per request + String url = urlStart + i + "&limit=1"; + + //This sends the request and assigns the response to a String + String jsonResponse = APIClientService.get(url); + + //This section gets the artist data from the response + JSONObject jsonObject = new JSONObject(jsonResponse); + + //data is NOT a string, it is a JSONArray with 1 JSONObject in it... + JSONArray data = jsonObject.getJSONArray("data"); + if(data.length() == 0){ + return artistSearch; + } + + JSONObject jsonData = data.getJSONObject(0); + + int id = jsonData.getInt("id"); + + String newUrl = "https://api.deezer.com/artist/" + id; + String stringJsonArtist = APIClientService.get(newUrl); + + Artist resultArtist = JSONStringToModelConverter.artistConverter(stringJsonArtist); + + artistSearch.add(resultArtist); + } + return artistSearch; + } + + 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; + + String stringJsonTracks = APIClientService.get(request); + JSONObject jsonObject = new JSONObject(stringJsonTracks); + + JSONArray data = jsonObject.getJSONArray("data"); + for(int i = 0; i < data.length(); i++){ + + JSONObject jsonTrack = data.getJSONObject(i); + JSONObject jsonAlbum = jsonTrack.getJSONObject("album"); + int albumID = jsonAlbum.getInt("id"); + + String albumRequest = "https://api.deezer.com/album/" + albumID; + String albumJsonString = APIClientService.get(albumRequest); + Album album = JSONStringToModelConverter.albumConverter(albumJsonString); + + Track track = JSONObjectToModelConverter.topTrackConverter(jsonTrack, artist, album); + topTracks.add(track); + } + return topTracks; + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Deezer/JSONObjectToModelConverter.java b/src/main/java/VanquishP2/Deezer/JSONObjectToModelConverter.java new file mode 100644 index 0000000..0d18d8c --- /dev/null +++ b/src/main/java/VanquishP2/Deezer/JSONObjectToModelConverter.java @@ -0,0 +1,90 @@ +package VanquishP2.Deezer; + +import VanquishP2.Application.Beans.Models.Album; +import VanquishP2.Application.Beans.Models.Artist; +import VanquishP2.Application.Beans.Models.Genre; +import VanquishP2.Application.Beans.Models.Track; +import VanquishP2.Application.Beans.Service.APIClientService; +import org.json.JSONException; +import org.json.JSONObject; + +public class JSONObjectToModelConverter { + public static Track trackConverter(JSONObject jsonObject) throws JSONException { + + int trackID = jsonObject.getInt("id"); + String title = jsonObject.getString("title"); + + //This gets the artist JSONObject and pulls data from it + JSONObject artistJson = jsonObject.getJSONObject("artist"); + int artistId = artistJson.getInt("id"); + String name = artistJson.getString("name"); + String pictureUrl = artistJson.getString("picture_medium"); + Artist artist = new Artist(name,artistId,pictureUrl); + + JSONObject albumJson = jsonObject.getJSONObject("album"); + int albumID = albumJson.getInt("id"); + String albumTitle = albumJson.getString("title"); + String releaseDate = albumJson.getString("release_date"); + + Album album = new Album(); + album.setAlbumID(albumID); + album.setAlbumTitle(albumTitle); + album.setDate(releaseDate); + + Track track = new Track(); + track.setTrackID(trackID); + track.setTitle(title); + track.setAlbum(album); + track.setArtist(artist); + return track; + } + + public static Artist artistConverter(JSONObject jsonObject) throws JSONException { + int artistId = jsonObject.getInt("id"); + String name = jsonObject.getString("name"); + String pictureUrl = jsonObject.getString("picture_medium"); + + return new Artist(name, artistId, pictureUrl); + } + + public static Album albumConverter(JSONObject jsonObject) throws JSONException { + int albumID = jsonObject.getInt("id"); + String title = jsonObject.getString("title"); + String releaseDate = jsonObject.getString("release_date"); + + int genre_id = jsonObject.getInt("genre_id"); + + //GET from deezer the Genre by the ID + String genreJsonString = "https://api.deezer.com/genre/"+genre_id; + String genre_json_response = APIClientService.get(genreJsonString); + + //call genreConverter here + Genre genre = genreConverter(genre_json_response); + + Album album = new Album(); + album.setAlbumID(albumID); + album.setAlbumTitle(title); + album.setDate(releaseDate); + album.setGenre(genre); + + return album; + } + + public static Genre genreConverter(String json) throws JSONException { + JSONObject jsonObject = new JSONObject(json); + int genre_id = jsonObject.getInt("id"); + String name = jsonObject.getString("name"); + String pictureUrl = jsonObject.getString("picture_medium"); + + return new Genre(genre_id,name,pictureUrl); + } + + public static Track topTrackConverter(JSONObject jsonTrack, Artist artist, Album album) throws JSONException { + int trackID = jsonTrack.getInt("id"); + String title = jsonTrack.getString("title"); + Track track = new Track(trackID, title); + track.setArtist(artist); + track.setAlbum(album); + return track; + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Deezer/JSONStringToModelConverter.java b/src/main/java/VanquishP2/Deezer/JSONStringToModelConverter.java new file mode 100644 index 0000000..f6d148b --- /dev/null +++ b/src/main/java/VanquishP2/Deezer/JSONStringToModelConverter.java @@ -0,0 +1,84 @@ +package VanquishP2.Deezer; + +import VanquishP2.Application.Beans.Service.APIClientService; +import VanquishP2.Application.Beans.Models.Album; +import VanquishP2.Application.Beans.Models.Artist; +import VanquishP2.Application.Beans.Models.Genre; +import VanquishP2.Application.Beans.Models.Track; +import org.json.JSONException; +import org.json.JSONObject; + +public class JSONStringToModelConverter { + + public static Track trackConverter(String json) throws JSONException { + + JSONObject jsonObject = new JSONObject(json); + int track_id = jsonObject.getInt("id"); + String title = jsonObject.getString("title"); + + //This gets the artist JSONObject and pulls data from it + JSONObject artistJson = jsonObject.getJSONObject("artist"); + int artist_id = artistJson.getInt("id"); + String name = artistJson.getString("name"); + String pictureUrl = artistJson.getString("picture_medium"); + Artist artist = new Artist(name,artist_id,pictureUrl); + + JSONObject albumJson = jsonObject.getJSONObject("album"); + int album_id = albumJson.getInt("id"); + String album_title = albumJson.getString("title"); + String release_date = albumJson.getString("release_date"); + + Album album = new Album(); + album.setAlbumID(album_id); + album.setAlbumTitle(title); + album.setDate(release_date); + + Track track = new Track(); + track.setTrackID(track_id); + track.setTitle(title); + track.setAlbum(album); + track.setArtist(artist); + return track; + } + + public static Artist artistConverter(String json) throws JSONException { + JSONObject jsonObject = new JSONObject(json); + int artistID = jsonObject.getInt("id"); + String name = jsonObject.getString("name"); + String pictureUrl = jsonObject.getString("picture_medium"); + + return new Artist(name, artistID, pictureUrl); + } + + public static Album albumConverter(String json) throws JSONException { + JSONObject jsonObject = new JSONObject(json); + int album_id = jsonObject.getInt("id"); + String title = jsonObject.getString("title"); + String releaseDate = jsonObject.getString("release_date"); + + int genre_id = jsonObject.getInt("genre_id"); + //GET from deezer the Genre by the ID + String genreJsonString = "https://api.deezer.com/genre/"+genre_id; + String genre_json_response = APIClientService.get(genreJsonString); + + //call genreConverter here + Genre genre = genreConverter(genre_json_response); + + Album album = new Album(); + album.setAlbumID(album_id); + album.setAlbumTitle(title); + album.setDate(releaseDate); + album.setGenre(genre); + + return album; + } + + public static Genre genreConverter(String json) throws JSONException { + JSONObject jsonObject = new JSONObject(json); + int genre_id = jsonObject.getInt("id"); + String name = jsonObject.getString("name"); + String pictureUrl = jsonObject.getString("picture_medium"); + + return new Genre(genre_id,name,pictureUrl); + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Deezer/TrackSearch.java b/src/main/java/VanquishP2/Deezer/TrackSearch.java new file mode 100644 index 0000000..5acee9b --- /dev/null +++ b/src/main/java/VanquishP2/Deezer/TrackSearch.java @@ -0,0 +1,65 @@ +package VanquishP2.Deezer; + +import VanquishP2.Application.Beans.Service.APIClientService; +import VanquishP2.Application.Beans.Models.Track; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.util.ArrayList; +import java.util.List; + +public class TrackSearch { + + 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="; + for(int i=0;i Date: Tue, 9 Nov 2021 13:54:51 -0500 Subject: [PATCH 19/27] Feature Update Patch Removed city and state logic, fixed Location logic and reimplemented it --- .../Beans/ModelServices/UserService.java | 6 ++--- .../Application/Beans/Models/UserInfo.java | 2 +- .../VanquishP2/DTOs/UserRegistrationDTO.java | 27 +++++++------------ .../VanquishP2/DataGenerators/UserGen.java | 4 +-- 4 files changed, 14 insertions(+), 25 deletions(-) diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java index d23833c..d8865c1 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java @@ -108,16 +108,14 @@ public void delete(int id) throws UserDoesNotExistException { public User registerUser(UserRegistrationDTO data, User.Role role) { User newUser; UserInfo newUserInfo; - Location userLocation; - userLocation = new Location(data.getCity(), data.getState()); newUserInfo = new UserInfo(data); newUser = new User(role, newUserInfo); - locationRepository.save(userLocation); + locationRepository.save(data.getLocation()); userRepository.save(newUser); - newUserInfo.setLocation(userLocation); + newUserInfo.setLocation(data.getLocation()); newUserInfo.setUser(newUser); userInfoRepository.save(newUserInfo); diff --git a/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java index 2996c81..4ef73b2 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java @@ -27,7 +27,7 @@ public UserInfo(String email, String username, String password) { } public UserInfo(UserRegistrationDTO registration) { - this.location = new Location(registration.getCity(), registration.getState()); + this.location = registration.getLocation(); this.firstName = registration.getFirstName(); this.lastName = registration.getLastName(); this.username = registration.getUsername(); diff --git a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java index 7a41c9a..3f26c95 100644 --- a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java +++ b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java @@ -30,17 +30,17 @@ public class UserRegistrationDTO { private String email; private String firstName, lastName; - private String city, state; + private Location location; public UserRegistrationDTO() { + } public UserRegistrationDTO(String firstName, String lastName, - String username, String password, String email, String city, String state) { + String username, String password, String email, Location location) { this.firstName = firstName; this.lastName = lastName; - this.city = city; - this.state = state; + this.location = location; this.username = username; this.password = password; this.email = email; @@ -92,20 +92,12 @@ public void setLastName(String lastName) { this.lastName = lastName; } - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getState() { - return state; + public Location getLocation() { + return location; } - public void setState(String state) { - this.state = state; + public void setLocation(Location location) { + this.location = location; } @Override @@ -116,8 +108,7 @@ public String toString() { "email: " + email + ",\n" + "firstName: " + firstName + ",\n" + "lastName: " + lastName + ",\n" + - "city: " + city + ",\n" + - "state: " + state + ",\n" + + "location: " + location + ",\n" + '}'; } } \ No newline at end of file diff --git a/src/main/java/VanquishP2/DataGenerators/UserGen.java b/src/main/java/VanquishP2/DataGenerators/UserGen.java index 04968ae..96e8fcb 100644 --- a/src/main/java/VanquishP2/DataGenerators/UserGen.java +++ b/src/main/java/VanquishP2/DataGenerators/UserGen.java @@ -35,10 +35,10 @@ public UserGen(UserService userService, UserInfoService userInfoService, Locatio private void populate() { for (int i = 0; i < 20; i++) { UserRegistrationDTO userRegistrationDTO = new UserRegistrationDTO(getAFirstName(), getALastName(), - getAUsername(), getAPassword(), getAEmail(), getACity(), getAState()); + getAUsername(), getAPassword(), getAEmail(), getALocation()); UserInfo userInfo = new UserInfo(userRegistrationDTO); - locationService.save(new Location(userRegistrationDTO.getCity(), userRegistrationDTO.getState())); + locationService.save(userInfo.getLocation()); userInfoService.save(userInfo); User user = new User(User.Role.BASIC, userInfo); From 1aed1a1facda7ad28ff9d14029234ff35c06ba25 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Tue, 9 Nov 2021 14:04:18 -0500 Subject: [PATCH 20/27] Location Stuff Added getAll() for Location --- .../Application/Beans/ModelServices/LocationService.java | 7 +++++++ .../java/VanquishP2/Controllers/LocationController.java | 9 +++++++++ 2 files changed, 16 insertions(+) diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/LocationService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/LocationService.java index d7b81c4..f80cae2 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/LocationService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/LocationService.java @@ -7,6 +7,8 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.List; + @Service @Transactional public class LocationService { @@ -22,6 +24,11 @@ public Location saveLocation(Location location){ return locationRepository.getById(location.getLocationID()); } + // Kollier added this + public List getAll(){ + return locationRepository.findAll(); + } + public Location getLocationById(Integer id){ return locationRepository.getById(id); } diff --git a/src/main/java/VanquishP2/Controllers/LocationController.java b/src/main/java/VanquishP2/Controllers/LocationController.java index 11d15af..8e9a7c9 100644 --- a/src/main/java/VanquishP2/Controllers/LocationController.java +++ b/src/main/java/VanquishP2/Controllers/LocationController.java @@ -8,6 +8,8 @@ import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; +import java.util.List; + @RestController @RequestMapping("/4TheMusic") public class LocationController { @@ -18,6 +20,13 @@ public LocationController(LocationService locationService) { this.locationService = locationService; } + // Kollier added this + @GetMapping(value = "/location/all", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.OK) + public List getLocation(){ + return locationService.getAll(); + } + @GetMapping(value = "/location/{id}", produces = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.OK) public Location getLocation(@PathVariable ("id") Integer id){ From c8eb4578bee23ca6cad473576a8200510ce8ca87 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Wed, 10 Nov 2021 18:10:53 -0500 Subject: [PATCH 21/27] Logger Implementation Database logger is now implemented --- .../Beans/Filters/AuthenticationFilter.java | 10 ++- .../Beans/ModelServices/AlbumService.java | 1 - .../Beans/ModelServices/LoggerService.java | 44 ++++++++++ .../Beans/ModelServices/UserInfoService.java | 8 +- .../Beans/ModelServices/UserService.java | 11 +-- .../Application/Beans/Models/Logger.java | 54 ++++++++++++ .../Application/Beans/Repos/LoggerRepo.java | 10 +++ .../Beans/Service/APIClientService.java | 2 +- .../Application/Beans/Service/Logger.java | 86 ------------------- .../Beans/Service/ServiceRequests.java | 19 ++-- .../Controllers/UserController.java | 4 +- 11 files changed, 140 insertions(+), 109 deletions(-) create mode 100644 src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java create mode 100644 src/main/java/VanquishP2/Application/Beans/Models/Logger.java create mode 100644 src/main/java/VanquishP2/Application/Beans/Repos/LoggerRepo.java delete mode 100644 src/main/java/VanquishP2/Application/Beans/Service/Logger.java diff --git a/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java b/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java index 84a8ac3..af110f4 100644 --- a/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java +++ b/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java @@ -2,7 +2,7 @@ import VanquishP2.Application.Beans.Service.JWTUtil; import VanquishP2.DTOs.PrincipalDTO; -import VanquishP2.Application.Beans.Service.Logger; +import VanquishP2.Application.Beans.ModelServices.LoggerService; import VanquishP2.Exceptions.AuthenticationException; import io.jsonwebtoken.Claims; import org.springframework.context.ApplicationContext; @@ -23,13 +23,14 @@ @Component public class AuthenticationFilter implements Filter { + private LoggerService loggerService; private JWTUtil jwtUtil; - private final String errMessage = "Unauthorized user tried to barge their way in here! Don't worry, I caught this transgression. Error: %s"; @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 @@ -41,12 +42,13 @@ public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain } 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())) { - Logger.getFileLogger().writeLog(errMessage, 3); + loggerService.writeLog(errMessage, 3); return; } @@ -57,7 +59,7 @@ private void parseToken(HttpServletRequest request) { request.setAttribute("principal", principalDTO); } catch (AuthenticationException e) { - Logger.getFileLogger().writeLog(("Uh oh... Authentication Filter has a message: " + e.getMessage()), 3); + loggerService.writeLog(("Uh oh... Authentication Filter has a message: " + e.getMessage()), 3); } } } diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java index e8cf5a0..38ace6b 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java @@ -8,7 +8,6 @@ import javax.transaction.Transactional; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; /** * AlbumService diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java new file mode 100644 index 0000000..9a09150 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java @@ -0,0 +1,44 @@ +package VanquishP2.Application.Beans.ModelServices; + +import VanquishP2.Application.Beans.Repos.LoggerRepo; +import VanquishP2.Application.Beans.Models.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.text.SimpleDateFormat; + +@Service +@Transactional +public class LoggerService { + private final LoggerRepo repo; + + @Autowired + public LoggerService(LoggerRepo repo) { + this.repo = repo; + } + + public void writeLog(String message, int level) { + Logger logger = new Logger(getCurrentDateTime(), formatLogEntry(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/VanquishP2/Application/Beans/ModelServices/UserInfoService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java index 1da9f93..ffe1c66 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java @@ -1,9 +1,7 @@ package VanquishP2.Application.Beans.ModelServices; -import VanquishP2.Application.Beans.Models.User; import VanquishP2.Application.Beans.Models.UserInfo; import VanquishP2.Application.Beans.Repos.UserInfoRepository; -import VanquishP2.Application.Beans.Service.Logger; import VanquishP2.Exceptions.UserDoesNotExistException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -16,12 +14,14 @@ @Service @Transactional public class UserInfoService { + private final LoggerService loggerService; private final UserInfoRepository userInfoRepository; private final String exceptionError = "User: %s does not exist."; @Autowired - public UserInfoService(UserInfoRepository userInfoRepository) { + public UserInfoService(UserInfoRepository userInfoRepository, LoggerService loggerService) { this.userInfoRepository = userInfoRepository; + this.loggerService = loggerService; } public UserInfo saveUserInfo(UserInfo userInfo){ @@ -102,7 +102,7 @@ public Optional authenticate(String username, String password){ throw new UserDoesNotExistException(exceptionError); } } catch (UserDoesNotExistException e) { - Logger.getFileLogger().writeLog(e.getMessage(), 3); + loggerService.writeLog(e.getMessage(), 3); } return userInfo; diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java index d8865c1..2af6fe8 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java @@ -1,10 +1,8 @@ package VanquishP2.Application.Beans.ModelServices; -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.Service.Logger; import VanquishP2.DTOs.UserRegistrationDTO; import VanquishP2.Exceptions.UserDoesNotExistException; import VanquishP2.Application.Beans.Repos.UserInfoRepository; @@ -24,6 +22,7 @@ @Service @Transactional public class UserService { + private final LoggerService loggerService; private final UserRepository userRepository; private final UserInfoRepository userInfoRepository; private final LocationRepository locationRepository; @@ -32,10 +31,12 @@ public class UserService { @Autowired public UserService(UserRepository userRepository, UserInfoRepository userInfoRepository, - LocationRepository locationRepository) { + LocationRepository locationRepository, + LoggerService loggerService) { this.userRepository = userRepository; this.userInfoRepository = userInfoRepository; this.locationRepository = locationRepository; + this.loggerService = loggerService; } /** @@ -58,7 +59,7 @@ public User getByID(int ID) { user = userRepository.findByID(ID) .orElseThrow(() -> new UserDoesNotExistException(String.format(exceptionError, ID))); } catch (UserDoesNotExistException e) { - Logger.getFileLogger().writeLog(e.getMessage(), 3); + } return user; @@ -76,7 +77,7 @@ public User getByUserInfo(UserInfo userInfo) { user = userRepository.findUserByUserInfo(userInfo) .orElseThrow(() -> new UserDoesNotExistException(String.format(exceptionError, userInfo))); } catch (UserDoesNotExistException e) { - Logger.getFileLogger().writeLog(e.getMessage(), 3); + loggerService.writeLog(e.getMessage(), 3); } return user; diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Logger.java b/src/main/java/VanquishP2/Application/Beans/Models/Logger.java new file mode 100644 index 0000000..3722b51 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/Models/Logger.java @@ -0,0 +1,54 @@ +package VanquishP2.Application.Beans.Models; + +import javax.persistence.*; + +@Entity +public class Logger { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + public Integer getId() { + return id; + } + public void setId(Integer id) { + this.id = id; + } + + @Column + private Integer warningLevel; + public Integer getWarningLevel() { + return warningLevel; + } + public void setWarningLevel(Integer warningLevel) { + this.warningLevel = warningLevel; + } + + @Column + private String dataTime; + public String getDataTime() { + return dataTime; + } + public void setDataTime(String dataTime) { + this.dataTime = dataTime; + } + + @Column(columnDefinition = "varchar(20000)") + private String message; + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } + + public Logger() { + + } + + public Logger(String dataTime, String message, Integer warningLevel) { + this.dataTime = dataTime; + this.message = message; + this.warningLevel = warningLevel; + } + +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/LoggerRepo.java b/src/main/java/VanquishP2/Application/Beans/Repos/LoggerRepo.java new file mode 100644 index 0000000..64e2a03 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/Repos/LoggerRepo.java @@ -0,0 +1,10 @@ +package VanquishP2.Application.Beans.Repos; + +import VanquishP2.Application.Beans.Models.Logger; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface LoggerRepo extends JpaRepository{ + +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/Service/APIClientService.java b/src/main/java/VanquishP2/Application/Beans/Service/APIClientService.java index 0647197..b9806ad 100644 --- a/src/main/java/VanquishP2/Application/Beans/Service/APIClientService.java +++ b/src/main/java/VanquishP2/Application/Beans/Service/APIClientService.java @@ -7,7 +7,7 @@ import java.io.IOException; public class APIClientService { - private static OkHttpClient apiClient = new OkHttpClient(); + private static final OkHttpClient apiClient = new OkHttpClient(); public static String get(String url) { Request req = new Request.Builder().url(url).build(); diff --git a/src/main/java/VanquishP2/Application/Beans/Service/Logger.java b/src/main/java/VanquishP2/Application/Beans/Service/Logger.java deleted file mode 100644 index 859d2d6..0000000 --- a/src/main/java/VanquishP2/Application/Beans/Service/Logger.java +++ /dev/null @@ -1,86 +0,0 @@ -package VanquishP2.Application.Beans.Service; - -import org.springframework.stereotype.Service; -import java.io.FileWriter; -import java.io.IOException; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -@Service -public class Logger { - private static Logger logger; - private static int threshold; //would like to enumerate thresholds and devise something that checks inequality - private static boolean printToConsole; - private static boolean printToConsoleTemp; - - private Logger() { - printToConsole = false; - printToConsoleTemp = false; - threshold = 3; - } - - public static Logger getFileLogger() { - if (logger == null) { - logger = new Logger(); - } - return logger; - } - - public void writeLog(String message, int level) { - try (FileWriter fileWriter = new FileWriter(getLogFileName(), true)) { - String logEntry = formatLogEntry(message); - - if (level >= threshold) { - fileWriter.write(logEntry); - } - - if (printToConsole || printToConsoleTemp) { - System.out.println(logEntry); - printToConsoleTemp = false; - - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - - private String getLogFileName() { - String today = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); - return today + ".log"; - } - - private String formatLogEntry(String message) { - StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); - String stackInfo = stackTraceElements[3].toString(); - String timestamp = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME); - return String.format("%s [%s] %s%n", timestamp, stackInfo, message); - } - - public Logger console() { - printToConsoleTemp = true; - return logger; - } - - public Logger threshold(int th) { - threshold = th; - return logger; - } - - public static boolean isPrintToConsole() { - return printToConsole; - } - - public static void setPrintToConsole(boolean printToConsole) { - Logger.printToConsole = printToConsole; - } - - public static int getThreshold() { - return threshold; - } - - public static void setThreshold(int threshold) { - Logger.threshold = threshold; - } -} diff --git a/src/main/java/VanquishP2/Application/Beans/Service/ServiceRequests.java b/src/main/java/VanquishP2/Application/Beans/Service/ServiceRequests.java index 05bae35..060a5cb 100644 --- a/src/main/java/VanquishP2/Application/Beans/Service/ServiceRequests.java +++ b/src/main/java/VanquishP2/Application/Beans/Service/ServiceRequests.java @@ -1,6 +1,9 @@ package VanquishP2.Application.Beans.Service; +import VanquishP2.Application.Beans.ModelServices.LoggerService; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; + import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; @@ -15,10 +18,16 @@ @Service public abstract class ServiceRequests { // The request count for this session - private static int requestCount = 0; - private static ArrayList requestLog = new ArrayList<>(); + private int requestCount = 0; + private final ArrayList requestLog = new ArrayList<>(); + private final LoggerService loggerService; + + @Autowired + public ServiceRequests(LoggerService loggerService) { + this.loggerService = loggerService; + } - public static void writeSummary(){ + public void writeSummary(){ SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z"); Date date = new Date(System.currentTimeMillis()); @@ -36,11 +45,11 @@ public static void writeSummary(){ System.out.println("Request Summary has been written to designated to file."); } catch (IOException e) { - Logger.getFileLogger().writeLog(e.getMessage(), 2); + loggerService.writeLog(e.getMessage(), 2); } } - public static void addRequest(String requestInfo){ + public void addRequest(String requestInfo){ SimpleDateFormat formatter= new SimpleDateFormat("HH:mm:ss z"); requestCount++; diff --git a/src/main/java/VanquishP2/Controllers/UserController.java b/src/main/java/VanquishP2/Controllers/UserController.java index 1e94a5a..fac7f88 100644 --- a/src/main/java/VanquishP2/Controllers/UserController.java +++ b/src/main/java/VanquishP2/Controllers/UserController.java @@ -1,14 +1,12 @@ package VanquishP2.Controllers; import VanquishP2.Application.Beans.Models.User; -import VanquishP2.DTOs.UserRegistrationDTO; import VanquishP2.Application.Beans.ModelServices.UserService; -import VanquishP2.Application.Beans.Service.JWTUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import javax.validation.Valid; + import java.util.List; import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; From fcf4fe6699a72adc05e764cf5f2547eeba57a9a0 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Wed, 10 Nov 2021 18:15:23 -0500 Subject: [PATCH 22/27] Update HELP.md --- HELP.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HELP.md b/HELP.md index 4a11be0..49b7c00 100644 --- a/HELP.md +++ b/HELP.md @@ -14,7 +14,7 @@ For further reference, please consider the following sections: The following guides illustrate how to use some features concretely: * [Accessing Data with JPA](https://spring.io/guides/gs/accessing-data-jpa/) -* [Building a RESTful Web VanquishP2.Application.Beans.Service](https://spring.io/guides/gs/rest-service/) +* [Building a RESTful Web Service](https://spring.io/guides/gs/rest-service/) * [Serving Web Content with Spring MVC](https://spring.io/guides/gs/serving-web-content/) * [Building REST services with Spring](https://spring.io/guides/tutorials/bookmarks/) From 45b2c95650936dbd13fa39b2120c77bdf5146c43 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Fri, 12 Nov 2021 18:16:45 -0500 Subject: [PATCH 23/27] Dummy Commit. Unfinished Methods --- pom.xml | 9 +- .../Beans/Aspects/LoggerAspect.java | 64 +++++++++ .../Beans/Filters/AuthenticationFilter.java | 8 +- .../Application/Beans/Filters/CORSFilter.java | 2 +- .../ModelServices/LikeDislikeService.java | 57 ++++++++ .../Beans/ModelServices/LoggerService.java | 9 +- .../Beans/ModelServices/UserService.java | 1 + .../Application/Beans/Models/UserInfo.java | 11 ++ .../Application/Beans/Service/JWTUtil.java | 1 - .../Application/Config/FilterConfig.java | 31 +++++ .../VanquishP2/Application/P2Application.java | 1 - .../Controllers/AlbumController.java | 12 +- .../Controllers/AuthenticationController.java | 6 +- .../Controllers/LikeDislikeController.java | 102 +++++++++++++++ .../DTOs/RegistrationNoLocationDTO.java | 122 ++++++++++++++++++ .../java/VanquishP2/DTOs/UserInfoDTO.java | 13 -- .../VanquishP2/DTOs/UserRegistrationDTO.java | 20 ++- src/test/java/Models/UserDBTest.java | 50 +++++++ 18 files changed, 485 insertions(+), 34 deletions(-) create mode 100644 src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java create mode 100644 src/main/java/VanquishP2/Application/Beans/ModelServices/LikeDislikeService.java create mode 100644 src/main/java/VanquishP2/Application/Config/FilterConfig.java create mode 100644 src/main/java/VanquishP2/Controllers/LikeDislikeController.java create mode 100644 src/main/java/VanquishP2/DTOs/RegistrationNoLocationDTO.java delete mode 100644 src/main/java/VanquishP2/DTOs/UserInfoDTO.java create mode 100644 src/test/java/Models/UserDBTest.java diff --git a/pom.xml b/pom.xml index 3153b1c..804653e 100644 --- a/pom.xml +++ b/pom.xml @@ -117,13 +117,20 @@ h2 1.4.200 + com.squareup.okhttp3 okhttp 4.9.2 + + junit + junit + 4.13.2 + test + - + 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..3a07f0e --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java @@ -0,0 +1,64 @@ +/* +package VanquishP2.Application.Beans.Aspects; + +import VanquishP2.Application.Beans.Models.Logger; +import VanquishP2.Application.Beans.Service.JWTUtil; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Arrays; + +*/ +/** + * LoggerAspect + * Logs all method calls and exceptions for all classes except filters. + * + * @author Kollier Martin + *//* + + +@Aspect +@Component +public class LoggerAspect { + private ApplicationContext context; + private final Logger logger = container.getBean(JWTUtil.class); + + @PostConstruct + private void init(ApplicationContext context){ + this.context = context; + context.getBean(Logger.class); + } + + @Pointcut("within(VanquishP2.*) && !within(VanquishP2.Application.Beans.Filters.*)") + public void logAll() {} + + @Before("logAll()") + public void logMethodStart(JoinPoint jp) { + String methodSig = extractMethodSignature(jp); + String argStr = Arrays.toString(jp.getArgs()); + logger.info("{} invoked at {}", methodSig, System.currentTimeMillis()); + logger.info("Input arguments: {}", argStr); + } + + @AfterReturning(pointcut = "logAll()", returning = "returnedObj") + public void logMethodReturn(JoinPoint jp, Object returnedObj) { + String methodSig = extractMethodSignature(jp); + logger.info("{} successfully returned at {}", methodSig, System.currentTimeMillis()); + logger.info("Object returned: {}", returnedObj); + } + + @AfterThrowing(pointcut = "logAll()", throwing = "e") + public void logMethodException(JoinPoint jp, Throwable e) { + String methodSig = extractMethodSignature(jp); + logger.warn("{} was thrown in method {} at {} with message: {}", e.getClass().getSimpleName(), methodSig, System.currentTimeMillis(), e.getMessage()); + } + + private String extractMethodSignature(JoinPoint jp) { + return jp.getTarget().getClass().toString() + "." + jp.getSignature().getName(); + } +} +*/ diff --git a/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java b/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java index af110f4..ee2cd96 100644 --- a/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java +++ b/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java @@ -37,7 +37,13 @@ public void init(FilterConfig config) { public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; - parseToken(request); + + if (!request.getRequestURI().equals("4TheMusic/login") + || !request.getRequestURI().equals("4TheMusic/register/basic") + || !request.getRequestURI().equals("4TheMusic/register/premium")) { + parseToken(request); + } + chain.doFilter(request, response); } diff --git a/src/main/java/VanquishP2/Application/Beans/Filters/CORSFilter.java b/src/main/java/VanquishP2/Application/Beans/Filters/CORSFilter.java index 1c5ba4a..4a68eea 100644 --- a/src/main/java/VanquishP2/Application/Beans/Filters/CORSFilter.java +++ b/src/main/java/VanquishP2/Application/Beans/Filters/CORSFilter.java @@ -16,7 +16,7 @@ public class CORSFilter extends OncePerRequestFilter { protected void doFilterInternal(HttpServletRequest req, HttpServletResponse resp, FilterChain chain) throws ServletException, IOException { resp.setHeader("Access-Control-Allow-Origin", "*"); resp.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, PATCH"); - resp.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization"); + resp.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Authentication"); chain.doFilter(req, resp); } } \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/LikeDislikeService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/LikeDislikeService.java new file mode 100644 index 0000000..71c7c67 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/LikeDislikeService.java @@ -0,0 +1,57 @@ +package VanquishP2.Application.Beans.ModelServices; + +import VanquishP2.Application.Beans.Models.Track; +import VanquishP2.Application.Beans.Models.User; +import VanquishP2.Application.Beans.Models.UserInfo; +import VanquishP2.Application.Beans.Repos.TrackRepository; +import VanquishP2.Application.Beans.Repos.UserInfoRepository; +import VanquishP2.Application.Beans.Repos.UserRepository; +import VanquishP2.Exceptions.UserDoesNotExistException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Optional; + +@Service +@Transactional +public class LikeDislikeService { + private final TrackRepository trackRepository; + private final UserRepository userRepository; + private final UserInfoRepository userInfoRepository; + private final String exceptionError = "User: %s does not exist."; + + @Autowired + public LikeDislikeService(TrackRepository trackRepository, UserRepository userRepository, UserInfoRepository userInfoRepository){ + this.trackRepository = trackRepository; + this.userRepository = userRepository; + this.userInfoRepository = userInfoRepository; + } + + public void saveTrack(Track track){ + trackRepository.save(track); + } + + public Track getTrack(Integer id){ + return trackRepository.getById(id); + } + + public void saveUser(User user) + { + userRepository.save(user); + } + + public User getUser(Integer id) + { + return userRepository.getById(id); + } + + public Optional getUserByUsername(String username) + { + Optional optionalUserInfo = userInfoRepository.findByUsername(username); + return optionalUserInfo + .map(userInfo -> userRepository.findUserByUserInfo(userInfo) + .orElseThrow(() -> new UserDoesNotExistException(String.format(exceptionError, username)))); + + } +} \ No newline at end of file diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java index 9a09150..1344a3b 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java @@ -26,18 +26,13 @@ public void writeLog(String message, int level) { } private String getCurrentDateTime() { - SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + 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(); - StringBuilder stackTrace = new StringBuilder(); - - for(StackTraceElement element : stackTraceElements) { - stackTrace.append("\n").append(element); - } - + String stackTrace = stackTraceElements[stackTraceElements.length - 1].toString(); return String.format("[%s] %s%n", stackTrace, message); } diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java index 2af6fe8..af34f06 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java @@ -1,5 +1,6 @@ package VanquishP2.Application.Beans.ModelServices; +import VanquishP2.Application.Beans.Models.Location; import VanquishP2.Application.Beans.Models.User; import VanquishP2.Application.Beans.Models.UserInfo; import VanquishP2.Application.Beans.Repos.LocationRepository; diff --git a/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java index 4ef73b2..0307237 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java @@ -26,6 +26,17 @@ public UserInfo(String email, String username, String password) { this.password = password; } + public UserInfo(Location location, String firstName, String lastName, String username, String password, String email, User user) + { + this.location = location; + this.firstName = firstName; + this.lastName = lastName; + this.username = username; + this.password = password; + this.email = email; + this.user = user; + } + public UserInfo(UserRegistrationDTO registration) { this.location = registration.getLocation(); this.firstName = registration.getFirstName(); diff --git a/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java b/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java index 959c3a2..9331015 100644 --- a/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java +++ b/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java @@ -5,7 +5,6 @@ import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; import java.security.Key; import java.sql.Date; diff --git a/src/main/java/VanquishP2/Application/Config/FilterConfig.java b/src/main/java/VanquishP2/Application/Config/FilterConfig.java new file mode 100644 index 0000000..aff6c34 --- /dev/null +++ b/src/main/java/VanquishP2/Application/Config/FilterConfig.java @@ -0,0 +1,31 @@ +package VanquishP2.Application.Config; + +import VanquishP2.Application.Beans.Filters.AuthenticationFilter; +import VanquishP2.Application.Beans.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 authRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); + filterRegistrationBean.setFilter(new AuthenticationFilter()); + filterRegistrationBean.setUrlPatterns(Collections.singletonList("/*")); + return filterRegistrationBean; + } + + @Bean + @SuppressWarnings({"rawtypes, unchecked"}) + public FilterRegistrationBean corsRegistrationBean() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); + filterRegistrationBean.setFilter(new CORSFilter()); + filterRegistrationBean.setUrlPatterns(Collections.singletonList("/*")); + return filterRegistrationBean; + } +} diff --git a/src/main/java/VanquishP2/Application/P2Application.java b/src/main/java/VanquishP2/Application/P2Application.java index 85d0acd..77a62a7 100644 --- a/src/main/java/VanquishP2/Application/P2Application.java +++ b/src/main/java/VanquishP2/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.annotation.Configuration; import org.springframework.context.annotation.PropertySource; @SpringBootApplication(scanBasePackages = "VanquishP2") diff --git a/src/main/java/VanquishP2/Controllers/AlbumController.java b/src/main/java/VanquishP2/Controllers/AlbumController.java index 2a7558e..5cffd87 100644 --- a/src/main/java/VanquishP2/Controllers/AlbumController.java +++ b/src/main/java/VanquishP2/Controllers/AlbumController.java @@ -19,7 +19,7 @@ */ @RestController -@RequestMapping(value = "/album", produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE) +@RequestMapping(value = "/4TheMusic", produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE) public class AlbumController { private final AlbumService albumService; @@ -32,7 +32,7 @@ public AlbumController(AlbumService albumService) { * This functions returns all albums cached into DB * @return ResponseEntity with HttpStatus and/or content */ - @GetMapping("") + @GetMapping("/album/all") public ResponseEntity> getAllAlbums() { List allAlbums = albumService.getAll(); @@ -49,7 +49,7 @@ else if (allAlbums.isEmpty()) * @param id ID Integer to distinguish album * @return Album Object */ - @GetMapping("/{id}") + @GetMapping("/album/{id}") @ResponseStatus(HttpStatus.ACCEPTED) public Album retrieve(@PathVariable int id) { return albumService.getByID(id); @@ -60,7 +60,7 @@ public Album retrieve(@PathVariable int id) { * @param name Name String to distinguish album * @return Album Object */ - @GetMapping("/{name}") + @GetMapping("/album/{name}") @ResponseStatus(HttpStatus.ACCEPTED) public Album retrieve(@PathVariable String name) { return albumService.getByTitle(name); @@ -71,7 +71,7 @@ public Album retrieve(@PathVariable String name) { * @param id Album ID * @return ResponseEntity depending on success or failure */ - @DeleteMapping("{/id}") + @DeleteMapping("/album{/id}") public ResponseEntity remove(@PathVariable int id) { Optional album = Optional.ofNullable(albumService.getByID(id)); @@ -88,7 +88,7 @@ public ResponseEntity remove(@PathVariable int id) { * @param title Album title * @return ResponseEntity depending on success or failure */ - @DeleteMapping("{/title}") + @DeleteMapping("/album/{title}") public ResponseEntity remove(@PathVariable String title) { Optional album = Optional.ofNullable(albumService.getByTitle(title)); diff --git a/src/main/java/VanquishP2/Controllers/AuthenticationController.java b/src/main/java/VanquishP2/Controllers/AuthenticationController.java index aecaccd..fb8e155 100644 --- a/src/main/java/VanquishP2/Controllers/AuthenticationController.java +++ b/src/main/java/VanquishP2/Controllers/AuthenticationController.java @@ -7,6 +7,8 @@ import VanquishP2.Application.Beans.Service.JWTUtil; import VanquishP2.DTOs.LoginCredentialsDTO; import VanquishP2.DTOs.UserRegistrationDTO; +import jdk.nashorn.api.scripting.JSObject; +import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -43,6 +45,7 @@ public AuthenticationController(JWTUtil jwtUtil, UserInfoService userInfoService */ @PostMapping(value = "/login", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE) public UserInfo authenticate(@RequestBody LoginCredentialsDTO credentials, HttpServletResponse response) { + System.out.println(credentials); Optional userInfo = userInfoService.authenticate(credentials.getUsername(), credentials.getPassword()); if (userInfo.isPresent()) { @@ -60,7 +63,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); + User user = userService.registerUser(regData, User.Role.PREMIUM); String jwt = jwtUtil.createJWT(user.getUserInfo()); response.setHeader(jwtUtil.getHeader(), jwt); return user; @@ -73,7 +76,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); diff --git a/src/main/java/VanquishP2/Controllers/LikeDislikeController.java b/src/main/java/VanquishP2/Controllers/LikeDislikeController.java new file mode 100644 index 0000000..6ab5c65 --- /dev/null +++ b/src/main/java/VanquishP2/Controllers/LikeDislikeController.java @@ -0,0 +1,102 @@ +package VanquishP2.Controllers; + +import VanquishP2.Application.Beans.ModelServices.LikeDislikeService; +import VanquishP2.Application.Beans.Models.Track; +import VanquishP2.Application.Beans.Models.User; +import VanquishP2.Application.Beans.Service.JWTUtil; +import VanquishP2.Exceptions.UserDoesNotExistException; +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.Optional; + +@RestController +@RequestMapping(value = "/4TheMusic") +public class LikeDislikeController { + private final LikeDislikeService likeDislikeService; + private final JWTUtil jwtUtil; + + @Autowired + public LikeDislikeController(JWTUtil jwtUtil, LikeDislikeService likeDislikeService) { + this.jwtUtil = jwtUtil; + this.likeDislikeService = likeDislikeService; + } + + @PostMapping(value = "/like", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.OK) + public Track likeTrack(@RequestBody Track track, HttpServletResponse response) throws UserDoesNotExistException { + String username = jwtUtil.parseJWT(response.getHeader(jwtUtil.getHeader())).getSubject(); + + Optional user = likeDislikeService.getUserByUsername(username); + + if(user.isPresent()) + { + Track serviceTrack = likeDislikeService.getTrack(track.getTrackID()); + if(serviceTrack != null) + { + serviceTrack.getUserLikes().add(user.get()); + likeDislikeService.saveTrack(serviceTrack); + } + else + { + track.getUserLikes().add(user.get()); + likeDislikeService.saveTrack(track); + } + + user.get().getLikedTracks().add(likeDislikeService.getTrack(track.getTrackID())); + likeDislikeService.saveUser(user.get()); + } + + return likeDislikeService.getTrack(track.getTrackID()); + } + + @PostMapping(value = "/dislike", produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value = HttpStatus.OK) + public Track dislikeTrack(@RequestBody Track track, HttpServletResponse response) throws UserDoesNotExistException{ + String username = jwtUtil.parseJWT(response.getHeader(jwtUtil.getHeader())).getSubject(); + Optional user = likeDislikeService.getUserByUsername(username); + + if(user.isPresent()) + { + User presentUser = new User(user.get().getRole(), user.get().getUserInfo()); + Track database = likeDislikeService.getTrack(track.getTrackID()); + if(database != null) + { + database.getUserDislikes().add(presentUser); + likeDislikeService.saveTrack(database); + } + else + { + track.getUserDislikes().add(presentUser); + likeDislikeService.saveTrack(track); + } + + presentUser.getDislikedTracks().add(likeDislikeService.getTrack(track.getTrackID())); + likeDislikeService.saveUser(presentUser); + } + + return likeDislikeService.getTrack(track.getTrackID()); + } + + @GetMapping(value="/track/ratio", produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(value=HttpStatus.OK) + public String likeDislikeRatio(@RequestBody Track track) + { + Integer id = track.getTrackID(); + + Track currentTrack = likeDislikeService.getTrack(id); + if(currentTrack == null) + { + return "0/0"; + } + else + { + int trackLikes = currentTrack.getUserLikes().size(); + int trackDislikes = currentTrack.getUserDislikes().size(); + return "Likes: " + trackLikes + " Dislikes: " + trackDislikes; + } + } +} diff --git a/src/main/java/VanquishP2/DTOs/RegistrationNoLocationDTO.java b/src/main/java/VanquishP2/DTOs/RegistrationNoLocationDTO.java new file mode 100644 index 0000000..4b67600 --- /dev/null +++ b/src/main/java/VanquishP2/DTOs/RegistrationNoLocationDTO.java @@ -0,0 +1,122 @@ +package VanquishP2.DTOs; + +import VanquishP2.Application.Beans.Models.Location; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Pattern; + +/** + * UserRegistrationDTO + * The DTO for User Registration + * + * @date 10/29/2021 + * @author Kollier Martin + */ +public class RegistrationNoLocationDTO { + + @Length(min = 5, max = 20) + @NotNull(message = "Null, a username can not be.") + @Pattern(message = "Username is not valid for the supreme overlord. Try again.", + regexp = "^[a-zA-Z0-9]*$") + private String username; + + @NotNull(message = "*crickets*. There's no password here.") + @Pattern(message = "Come on. Your password should be strong, like Russian.", + regexp = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$") + private String password; + + @Email(message = "This email is not valid >:(") + private String email; + + private String firstName, lastName, city, state; + + public RegistrationNoLocationDTO() { + + } + + public RegistrationNoLocationDTO(String firstName, String lastName, + String username, String password, String email, String city, String state) { + this.firstName = firstName; + this.lastName = lastName; + this.username = username; + this.password = password; + this.email = email; + } + + public RegistrationNoLocationDTO(String username, String password, String email) { + this.username = username; + this.password = password; + this.email = email; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + + @Override + public String toString() { + return "RegistrationNoLocationDTO {\n" + + "username: " + username + ",\n" + + "password: " + password + ",\n" + + "email: " + email + ",\n" + + "firstName: " + firstName + ",\n" + + "lastName: " + lastName + ",\n" + + "city: " + city + ",\n" + + "state: " + state + ",\n" + + '}'; + } +} diff --git a/src/main/java/VanquishP2/DTOs/UserInfoDTO.java b/src/main/java/VanquishP2/DTOs/UserInfoDTO.java deleted file mode 100644 index 730ec7a..0000000 --- a/src/main/java/VanquishP2/DTOs/UserInfoDTO.java +++ /dev/null @@ -1,13 +0,0 @@ -package VanquishP2.DTOs; - -import VanquishP2.Application.Beans.Models.UserInfo; - -public class UserInfoDTO { - UserInfo userInfo; - - public UserInfoDTO(UserInfo userInfo) { - this.userInfo = userInfo; - } - - -} \ No newline at end of file diff --git a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java index 3f26c95..3955c57 100644 --- a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java +++ b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java @@ -1,6 +1,7 @@ package VanquishP2.DTOs; import VanquishP2.Application.Beans.Models.Location; +import com.fasterxml.jackson.annotation.JsonIgnore; import org.hibernate.validator.constraints.Length; import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; @@ -29,7 +30,8 @@ public class UserRegistrationDTO { @Email(message = "This email is not valid >:(") private String email; - private String firstName, lastName; + private String firstName, lastName, city, state; + private Location location; public UserRegistrationDTO() { @@ -92,6 +94,22 @@ public void setLastName(String lastName) { this.lastName = lastName; } + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getState() { + return state; + } + + public void setState(String state) { + this.state = state; + } + public Location getLocation() { return location; } diff --git a/src/test/java/Models/UserDBTest.java b/src/test/java/Models/UserDBTest.java new file mode 100644 index 0000000..8dc605e --- /dev/null +++ b/src/test/java/Models/UserDBTest.java @@ -0,0 +1,50 @@ +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", + new Location("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()); + } +} From e02aa7d6699206f5c4f7e28b65e429c2b6d2e690 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Fri, 12 Nov 2021 18:22:52 -0500 Subject: [PATCH 24/27] Backend Registration Changes Files Changed: UserService UserInfo UserRegistrationDTO Registration no longer takes a Location object --- .../Beans/ModelServices/UserService.java | 6 +- .../Application/Beans/Models/UserInfo.java | 2 +- .../DTOs/RegistrationNoLocationDTO.java | 122 ------------------ .../VanquishP2/DTOs/UserRegistrationDTO.java | 16 +-- .../VanquishP2/DataGenerators/UserGen.java | 8 +- src/test/java/Models/UserDBTest.java | 4 +- 6 files changed, 11 insertions(+), 147 deletions(-) delete mode 100644 src/main/java/VanquishP2/DTOs/RegistrationNoLocationDTO.java diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java index af34f06..9a48f6f 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java @@ -110,14 +110,16 @@ public void delete(int id) throws UserDoesNotExistException { public User registerUser(UserRegistrationDTO data, User.Role role) { User newUser; UserInfo newUserInfo; + Location location; + location = new Location(data.getCity(), data.getState()); newUserInfo = new UserInfo(data); newUser = new User(role, newUserInfo); - locationRepository.save(data.getLocation()); + locationRepository.save(location); userRepository.save(newUser); - newUserInfo.setLocation(data.getLocation()); + newUserInfo.setLocation(location); newUserInfo.setUser(newUser); userInfoRepository.save(newUserInfo); diff --git a/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java index 0307237..cf962c2 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/UserInfo.java @@ -38,7 +38,7 @@ public UserInfo(Location location, String firstName, String lastName, String use } public UserInfo(UserRegistrationDTO registration) { - this.location = registration.getLocation(); + this.location = new Location(registration.getCity(), registration.getState()); this.firstName = registration.getFirstName(); this.lastName = registration.getLastName(); this.username = registration.getUsername(); diff --git a/src/main/java/VanquishP2/DTOs/RegistrationNoLocationDTO.java b/src/main/java/VanquishP2/DTOs/RegistrationNoLocationDTO.java deleted file mode 100644 index 4b67600..0000000 --- a/src/main/java/VanquishP2/DTOs/RegistrationNoLocationDTO.java +++ /dev/null @@ -1,122 +0,0 @@ -package VanquishP2.DTOs; - -import VanquishP2.Application.Beans.Models.Location; -import org.hibernate.validator.constraints.Length; - -import javax.validation.constraints.Email; -import javax.validation.constraints.NotNull; -import javax.validation.constraints.Pattern; - -/** - * UserRegistrationDTO - * The DTO for User Registration - * - * @date 10/29/2021 - * @author Kollier Martin - */ -public class RegistrationNoLocationDTO { - - @Length(min = 5, max = 20) - @NotNull(message = "Null, a username can not be.") - @Pattern(message = "Username is not valid for the supreme overlord. Try again.", - regexp = "^[a-zA-Z0-9]*$") - private String username; - - @NotNull(message = "*crickets*. There's no password here.") - @Pattern(message = "Come on. Your password should be strong, like Russian.", - regexp = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[a-zA-Z]).{8,}$") - private String password; - - @Email(message = "This email is not valid >:(") - private String email; - - private String firstName, lastName, city, state; - - public RegistrationNoLocationDTO() { - - } - - public RegistrationNoLocationDTO(String firstName, String lastName, - String username, String password, String email, String city, String state) { - this.firstName = firstName; - this.lastName = lastName; - this.username = username; - this.password = password; - this.email = email; - } - - public RegistrationNoLocationDTO(String username, String password, String email) { - this.username = username; - this.password = password; - this.email = email; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public String getFirstName() { - return firstName; - } - - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getCity() { - return city; - } - - public void setCity(String city) { - this.city = city; - } - - public String getState() { - return state; - } - - public void setState(String state) { - this.state = state; - } - - @Override - public String toString() { - return "RegistrationNoLocationDTO {\n" + - "username: " + username + ",\n" + - "password: " + password + ",\n" + - "email: " + email + ",\n" + - "firstName: " + firstName + ",\n" + - "lastName: " + lastName + ",\n" + - "city: " + city + ",\n" + - "state: " + state + ",\n" + - '}'; - } -} diff --git a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java index 3955c57..c19b40d 100644 --- a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java +++ b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java @@ -32,17 +32,14 @@ public class UserRegistrationDTO { private String firstName, lastName, city, state; - private Location location; - public UserRegistrationDTO() { } public UserRegistrationDTO(String firstName, String lastName, - String username, String password, String email, Location location) { + String username, String password, String email, String city, String state) { this.firstName = firstName; this.lastName = lastName; - this.location = location; this.username = username; this.password = password; this.email = email; @@ -110,14 +107,6 @@ public void setState(String state) { this.state = state; } - public Location getLocation() { - return location; - } - - public void setLocation(Location location) { - this.location = location; - } - @Override public String toString() { return "UserRegistrationDTO {\n" + @@ -126,7 +115,8 @@ public String toString() { "email: " + email + ",\n" + "firstName: " + firstName + ",\n" + "lastName: " + lastName + ",\n" + - "location: " + location + ",\n" + + "city: " + city + ",\n" + + "state: " + state + ",\n" + '}'; } } \ No newline at end of file diff --git a/src/main/java/VanquishP2/DataGenerators/UserGen.java b/src/main/java/VanquishP2/DataGenerators/UserGen.java index 96e8fcb..2476ba5 100644 --- a/src/main/java/VanquishP2/DataGenerators/UserGen.java +++ b/src/main/java/VanquishP2/DataGenerators/UserGen.java @@ -35,7 +35,7 @@ public UserGen(UserService userService, UserInfoService userInfoService, Locatio private void populate() { for (int i = 0; i < 20; i++) { UserRegistrationDTO userRegistrationDTO = new UserRegistrationDTO(getAFirstName(), getALastName(), - getAUsername(), getAPassword(), getAEmail(), getALocation()); + getAUsername(), getAPassword(), getAEmail(), getACity(), getAState()); UserInfo userInfo = new UserInfo(userRegistrationDTO); locationService.save(userInfo.getLocation()); @@ -50,12 +50,6 @@ private void populate() { } } - public static Location getALocation() { - Random rand = new Random(); - int index = rand.nextInt(cities.length); - return new Location(cities[index], states[index]); - } - public static String getACity(){ Random rand = new Random(); int index = rand.nextInt(cities.length); diff --git a/src/test/java/Models/UserDBTest.java b/src/test/java/Models/UserDBTest.java index 8dc605e..0b056d9 100644 --- a/src/test/java/Models/UserDBTest.java +++ b/src/test/java/Models/UserDBTest.java @@ -37,8 +37,8 @@ public void goodSave(){ "KMART23", "3t3styG=5!", "astronomical@space.net", - new Location("Mars", - "Milky Way"))); + "Mars", + "Milky Way")); userInfoRepository.save(userInfo); From 2b57620e8283c22df5eb2a1b035e8fb85e4eeb41 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Fri, 12 Nov 2021 21:23:39 -0500 Subject: [PATCH 25/27] AuthenticationController Added ResponseEntity returns and logic --- .../Controllers/AuthenticationController.java | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/src/main/java/VanquishP2/Controllers/AuthenticationController.java b/src/main/java/VanquishP2/Controllers/AuthenticationController.java index fb8e155..a4ce103 100644 --- a/src/main/java/VanquishP2/Controllers/AuthenticationController.java +++ b/src/main/java/VanquishP2/Controllers/AuthenticationController.java @@ -10,6 +10,10 @@ import jdk.nashorn.api.scripting.JSObject; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -44,16 +48,17 @@ public AuthenticationController(JWTUtil jwtUtil, UserInfoService userInfoService * @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 ResponseEntity authenticate(@RequestBody LoginCredentialsDTO credentials, HttpServletResponse response) { System.out.println(credentials); Optional userInfo = userInfoService.authenticate(credentials.getUsername(), credentials.getPassword()); if (userInfo.isPresent()) { String jwt = jwtUtil.createJWT(userInfo.get()); response.setHeader(jwtUtil.getHeader(), jwt); + return new ResponseEntity<>(userInfo.get(), HttpStatus.OK); + } else { + return new ResponseEntity<>(HttpStatus.NOT_FOUND); } - - return userInfo.get(); } /** @@ -62,11 +67,16 @@ public UserInfo authenticate(@RequestBody LoginCredentialsDTO credentials, HttpS * @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.PREMIUM); + public ResponseEntity registerBasicUser(@RequestBody @Valid UserRegistrationDTO regData) { + User user = userService.registerUser(regData, User.Role.BASIC); String jwt = jwtUtil.createJWT(user.getUserInfo()); - response.setHeader(jwtUtil.getHeader(), jwt); - return user; + + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.add(jwtUtil.getHeader(), jwt); + + return ResponseEntity.ok() + .headers(responseHeaders) + .body(user); } /** @@ -75,10 +85,15 @@ 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 ResponseEntity registerPremiumUser(@RequestBody @Valid UserRegistrationDTO regData){ User user = userService.registerUser(regData, User.Role.PREMIUM); String jwt = jwtUtil.createJWT(user.getUserInfo()); - response.setHeader(jwtUtil.getHeader(), jwt); - return user; + + HttpHeaders responseHeaders = new HttpHeaders(); + responseHeaders.add(jwtUtil.getHeader(), jwt); + + return ResponseEntity.ok() + .headers(responseHeaders) + .body(user); } } From cffe20c712252527e9f8d7e571969ca158645733 Mon Sep 17 00:00:00 2001 From: Kollier Martin Date: Sun, 14 Nov 2021 21:09:37 -0500 Subject: [PATCH 26/27] Updates Logger completed and code refactored to match --- .../Beans/Aspects/LoggerAspect.java | 47 +++++++------------ .../Beans/Filters/AuthenticationFilter.java | 25 ++++------ .../Beans/ModelServices/LoggerService.java | 10 +--- .../Beans/ModelServices/UserInfoService.java | 21 ++++----- .../Beans/ModelServices/UserService.java | 32 +++++-------- .../Beans/Service/ServiceRequests.java | 35 +++++--------- 6 files changed, 57 insertions(+), 113 deletions(-) diff --git a/src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java b/src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java index 3a07f0e..f5c75c2 100644 --- a/src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java +++ b/src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java @@ -1,64 +1,49 @@ -/* package VanquishP2.Application.Beans.Aspects; -import VanquishP2.Application.Beans.Models.Logger; -import VanquishP2.Application.Beans.Service.JWTUtil; +import VanquishP2.Application.Beans.ModelServices.LoggerService; import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; -import javax.annotation.PostConstruct; -import java.util.Arrays; - -*/ /** * LoggerAspect * Logs all method calls and exceptions for all classes except filters. * * @author Kollier Martin - *//* + */ @Aspect @Component public class LoggerAspect { - private ApplicationContext context; - private final Logger logger = container.getBean(JWTUtil.class); + private final LoggerService loggerService; - @PostConstruct - private void init(ApplicationContext context){ - this.context = context; - context.getBean(Logger.class); + public LoggerAspect(LoggerService loggerService) { + this.loggerService = loggerService; } - @Pointcut("within(VanquishP2.*) && !within(VanquishP2.Application.Beans.Filters.*)") - public void logAll() {} + @Pointcut("within(VanquishP2.*.*.*.*)") + public void logAll() { - @Before("logAll()") - public void logMethodStart(JoinPoint jp) { - String methodSig = extractMethodSignature(jp); - String argStr = Arrays.toString(jp.getArgs()); - logger.info("{} invoked at {}", methodSig, System.currentTimeMillis()); - logger.info("Input arguments: {}", argStr); } - @AfterReturning(pointcut = "logAll()", returning = "returnedObj") - public void logMethodReturn(JoinPoint jp, Object returnedObj) { - String methodSig = extractMethodSignature(jp); - logger.info("{} successfully returned at {}", methodSig, System.currentTimeMillis()); - logger.info("Object returned: {}", returnedObj); + @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); - logger.warn("{} was thrown in method {} at {} with message: {}", e.getClass().getSimpleName(), methodSig, System.currentTimeMillis(), e.getMessage()); + 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/Filters/AuthenticationFilter.java b/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java index ee2cd96..d754006 100644 --- a/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java +++ b/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java @@ -23,14 +23,12 @@ @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 @@ -38,34 +36,29 @@ public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; - if (!request.getRequestURI().equals("4TheMusic/login") - || !request.getRequestURI().equals("4TheMusic/register/basic") - || !request.getRequestURI().equals("4TheMusic/register/premium")) { + if (!request.getRequestURI().equals("/4TheMusic/login") + && !request.getRequestURI().equals("/4TheMusic/register/basic") + && !request.getRequestURI().equals("/4TheMusic/register/premium") + && !request.getRequestURI().equals("/4TheMusic/user/all")) { parseToken(request); } chain.doFilter(request, response); } - private void parseToken(HttpServletRequest request) { + private void parseToken(HttpServletRequest request) throws AuthenticationException { 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 header = request.getHeader(jwtUtil.getHeader()); + if (header == null || !header.startsWith(jwtUtil.getPrefix())) { + throw new AuthenticationException(errMessage); + } else { 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/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); - } } diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java index ffe1c66..9441dde 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserInfoService.java @@ -14,14 +14,12 @@ @Service @Transactional public class UserInfoService { - private final LoggerService loggerService; private final UserInfoRepository userInfoRepository; private final String exceptionError = "User: %s does not exist."; @Autowired - public UserInfoService(UserInfoRepository userInfoRepository, LoggerService loggerService) { + public UserInfoService(UserInfoRepository userInfoRepository) { this.userInfoRepository = userInfoRepository; - this.loggerService = loggerService; } public UserInfo saveUserInfo(UserInfo userInfo){ @@ -93,16 +91,13 @@ public List getAll() { * @param password Password * @return User Info, either null or not null */ - public Optional authenticate(String username, String password){ - Optional userInfo = Optional.empty(); - - try { - userInfo = userInfoRepository.findByUsernameAndPassword(username, password); - if (!userInfo.isPresent()) { - throw new UserDoesNotExistException(exceptionError); - } - } catch (UserDoesNotExistException e) { - loggerService.writeLog(e.getMessage(), 3); + public Optional authenticate(String username, String password) throws UserDoesNotExistException { + Optional userInfo; + + userInfo = userInfoRepository.findByUsernameAndPassword(username, password); + + if (!userInfo.isPresent()) { + throw new UserDoesNotExistException(exceptionError); } return userInfo; diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java index 9a48f6f..3508948 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java @@ -23,7 +23,6 @@ @Service @Transactional public class UserService { - private final LoggerService loggerService; private final UserRepository userRepository; private final UserInfoRepository userInfoRepository; private final LocationRepository locationRepository; @@ -32,12 +31,10 @@ public class UserService { @Autowired public UserService(UserRepository userRepository, UserInfoRepository userInfoRepository, - LocationRepository locationRepository, - LoggerService loggerService) { + LocationRepository locationRepository) { this.userRepository = userRepository; this.userInfoRepository = userInfoRepository; this.locationRepository = locationRepository; - this.loggerService = loggerService; } /** @@ -53,15 +50,12 @@ public List getAllUsers(){ * @param ID User ID * @return User object */ - public User getByID(int ID) { - User user = null; + public User getByID(int ID) throws UserDoesNotExistException { + User user; - try { - user = userRepository.findByID(ID) - .orElseThrow(() -> new UserDoesNotExistException(String.format(exceptionError, ID))); - } catch (UserDoesNotExistException e) { + user = userRepository.findByID(ID) + .orElseThrow(() -> new UserDoesNotExistException(String.format(exceptionError, ID))); - } return user; } @@ -72,22 +66,18 @@ public User getByID(int ID) { * @return User object */ public User getByUserInfo(UserInfo userInfo) { - User user = null; + User user; - try { - user = userRepository.findUserByUserInfo(userInfo) + user = userRepository.findUserByUserInfo(userInfo) .orElseThrow(() -> new UserDoesNotExistException(String.format(exceptionError, userInfo))); - } catch (UserDoesNotExistException e) { - loggerService.writeLog(e.getMessage(), 3); - } return user; } /** * Persist User to DB - * @param user - * @return + * @param user User Object + * @return Persisted User Object */ public void save(User user) { userRepository.save(user); @@ -95,8 +85,8 @@ public void save(User user) { /** * Delete User by ID - * @param id - * @return + * @param id User ID + * @return User of the specific ID */ public void delete(int id) throws UserDoesNotExistException { userRepository.deleteByID(id); diff --git a/src/main/java/VanquishP2/Application/Beans/Service/ServiceRequests.java b/src/main/java/VanquishP2/Application/Beans/Service/ServiceRequests.java index 060a5cb..7ec3bed 100644 --- a/src/main/java/VanquishP2/Application/Beans/Service/ServiceRequests.java +++ b/src/main/java/VanquishP2/Application/Beans/Service/ServiceRequests.java @@ -1,7 +1,5 @@ package VanquishP2.Application.Beans.Service; -import VanquishP2.Application.Beans.ModelServices.LoggerService; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.BufferedWriter; @@ -14,39 +12,30 @@ /** * This class is used to record every request made in a single session. + * + * @author Kollier Martin */ @Service public abstract class ServiceRequests { - // The request count for this session private int requestCount = 0; private final ArrayList requestLog = new ArrayList<>(); - private final LoggerService loggerService; - @Autowired - public ServiceRequests(LoggerService loggerService) { - this.loggerService = loggerService; - } - - public void writeSummary(){ + public void writeSummary() throws IOException { SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss z"); Date date = new Date(System.currentTimeMillis()); - try{ - File file = new File("requestLog.log"); - FileWriter fileWriter = new FileWriter(file); - BufferedWriter out = new BufferedWriter(fileWriter); + File file = new File("requestLog.log"); + FileWriter fileWriter = new FileWriter(file); + BufferedWriter out = new BufferedWriter(fileWriter); - out.write("There were " + requestCount + " requests in session: " + formatter.format(date)); + out.write("There were " + requestCount + " requests in session: " + formatter.format(date)); + out.newLine(); + for (String request : requestLog) { + out.write(request); out.newLine(); - for (String request : requestLog) { - out.write(request); - out.newLine(); - } - - System.out.println("Request Summary has been written to designated to file."); - } catch (IOException e) { - loggerService.writeLog(e.getMessage(), 2); } + + System.out.println("Request Summary has been written to designated to file."); } public void addRequest(String requestInfo){ From aee3155cccbd4489996217d4189b0570dcf0a833 Mon Sep 17 00:00:00 2001 From: kollier-martin Date: Mon, 15 Nov 2021 15:56:36 -0500 Subject: [PATCH 27/27] Optimization Pass #1 Optimizing methods for efficient execution --- .../VanquishP2/Application/Beans/Aspects/LoggerAspect.java | 5 ++++- .../Application/Beans/Filters/AuthenticationFilter.java | 1 - .../Application/Beans/ModelServices/AlbumService.java | 3 ++- .../Application/Beans/ModelServices/ArtistService.java | 3 ++- .../Beans/ModelServices/LikeDislikeService.java | 2 +- .../Application/Beans/ModelServices/LoggerService.java | 2 +- .../Application/Beans/ModelServices/UserService.java | 5 +++-- .../java/VanquishP2/Application/Beans/Models/Location.java | 1 + .../VanquishP2/Application/Beans/Repos/UserRepository.java | 1 + .../java/VanquishP2/Application/Beans/Service/JWTUtil.java | 5 ++++- src/main/java/VanquishP2/Controllers/AlbumController.java | 4 +++- .../VanquishP2/Controllers/AuthenticationController.java | 7 +++---- src/main/java/VanquishP2/Controllers/UserController.java | 3 ++- src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java | 5 +++-- src/main/java/VanquishP2/DataGenerators/UserGen.java | 2 +- src/main/java/VanquishP2/Deezer/AlbumSearch.java | 2 +- src/main/java/VanquishP2/Deezer/ArtistSearch.java | 2 +- .../java/VanquishP2/Deezer/JSONStringToModelConverter.java | 2 +- src/main/java/VanquishP2/Deezer/TrackSearch.java | 2 +- 19 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java b/src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java index f5c75c2..04a5a79 100644 --- a/src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java +++ b/src/main/java/VanquishP2/Application/Beans/Aspects/LoggerAspect.java @@ -3,7 +3,10 @@ import VanquishP2.Application.Beans.ModelServices.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/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java b/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java index d754006..2c5fb7d 100644 --- a/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java +++ b/src/main/java/VanquishP2/Application/Beans/Filters/AuthenticationFilter.java @@ -2,7 +2,6 @@ import VanquishP2.Application.Beans.Service.JWTUtil; import VanquishP2.DTOs.PrincipalDTO; -import VanquishP2.Application.Beans.ModelServices.LoggerService; import VanquishP2.Exceptions.AuthenticationException; import io.jsonwebtoken.Claims; import org.springframework.context.ApplicationContext; diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java index 38ace6b..7137cd9 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/AlbumService.java @@ -1,10 +1,11 @@ package VanquishP2.Application.Beans.ModelServices; -import VanquishP2.Exceptions.AlbumDoesNotExistException; import VanquishP2.Application.Beans.Models.Album; import VanquishP2.Application.Beans.Repos.AlbumRepository; +import VanquishP2.Exceptions.AlbumDoesNotExistException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; + import javax.transaction.Transactional; import java.util.List; import java.util.Optional; diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/ArtistService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/ArtistService.java index 83bb630..1497cb9 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/ArtistService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/ArtistService.java @@ -1,6 +1,7 @@ package VanquishP2.Application.Beans.ModelServices; -import VanquishP2.Application.Beans.Repos.ArtistRepository; + import VanquishP2.Application.Beans.Models.Artist; +import VanquishP2.Application.Beans.Repos.ArtistRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/LikeDislikeService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/LikeDislikeService.java index 71c7c67..322916c 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/LikeDislikeService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/LikeDislikeService.java @@ -46,7 +46,7 @@ public User getUser(Integer id) return userRepository.getById(id); } - public Optional getUserByUsername(String username) + public Optional getUserByUsername(String username) throws UserDoesNotExistException { Optional optionalUserInfo = userInfoRepository.findByUsername(username); return optionalUserInfo diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java index 9b440f2..37756f7 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/LoggerService.java @@ -1,7 +1,7 @@ package VanquishP2.Application.Beans.ModelServices; -import VanquishP2.Application.Beans.Repos.LoggerRepo; import VanquishP2.Application.Beans.Models.Logger; +import VanquishP2.Application.Beans.Repos.LoggerRepo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; diff --git a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java index 3508948..85623ec 100644 --- a/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java +++ b/src/main/java/VanquishP2/Application/Beans/ModelServices/UserService.java @@ -4,12 +4,13 @@ import VanquishP2.Application.Beans.Models.User; import VanquishP2.Application.Beans.Models.UserInfo; import VanquishP2.Application.Beans.Repos.LocationRepository; -import VanquishP2.DTOs.UserRegistrationDTO; -import VanquishP2.Exceptions.UserDoesNotExistException; import VanquishP2.Application.Beans.Repos.UserInfoRepository; import VanquishP2.Application.Beans.Repos.UserRepository; +import VanquishP2.DTOs.UserRegistrationDTO; +import VanquishP2.Exceptions.UserDoesNotExistException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; + import javax.transaction.Transactional; import java.util.List; diff --git a/src/main/java/VanquishP2/Application/Beans/Models/Location.java b/src/main/java/VanquishP2/Application/Beans/Models/Location.java index 59973a3..c6a6f72 100644 --- a/src/main/java/VanquishP2/Application/Beans/Models/Location.java +++ b/src/main/java/VanquishP2/Application/Beans/Models/Location.java @@ -1,6 +1,7 @@ package VanquishP2.Application.Beans.Models; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; + import javax.persistence.*; import java.util.List; diff --git a/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java b/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java index 47bf584..41642d0 100644 --- a/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java +++ b/src/main/java/VanquishP2/Application/Beans/Repos/UserRepository.java @@ -4,6 +4,7 @@ import VanquishP2.Application.Beans.Models.UserInfo; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; + import java.util.Optional; @Repository diff --git a/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java b/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java index 9331015..cac77e4 100644 --- a/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java +++ b/src/main/java/VanquishP2/Application/Beans/Service/JWTUtil.java @@ -2,10 +2,13 @@ import VanquishP2.Application.Beans.Models.UserInfo; import VanquishP2.Exceptions.AuthenticationException; -import io.jsonwebtoken.*; +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; diff --git a/src/main/java/VanquishP2/Controllers/AlbumController.java b/src/main/java/VanquishP2/Controllers/AlbumController.java index 5cffd87..85567b4 100644 --- a/src/main/java/VanquishP2/Controllers/AlbumController.java +++ b/src/main/java/VanquishP2/Controllers/AlbumController.java @@ -1,13 +1,15 @@ package VanquishP2.Controllers; -import VanquishP2.Application.Beans.Models.Album; import VanquishP2.Application.Beans.ModelServices.AlbumService; +import VanquishP2.Application.Beans.Models.Album; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; + import java.util.List; import java.util.Optional; + import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; /** diff --git a/src/main/java/VanquishP2/Controllers/AuthenticationController.java b/src/main/java/VanquishP2/Controllers/AuthenticationController.java index a4ce103..064d986 100644 --- a/src/main/java/VanquishP2/Controllers/AuthenticationController.java +++ b/src/main/java/VanquishP2/Controllers/AuthenticationController.java @@ -7,21 +7,20 @@ import VanquishP2.Application.Beans.Service.JWTUtil; import VanquishP2.DTOs.LoginCredentialsDTO; import VanquishP2.DTOs.UserRegistrationDTO; -import jdk.nashorn.api.scripting.JSObject; -import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; 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; -import static org.springframework.http.MediaType.*; + +import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; /** * diff --git a/src/main/java/VanquishP2/Controllers/UserController.java b/src/main/java/VanquishP2/Controllers/UserController.java index fac7f88..81bf200 100644 --- a/src/main/java/VanquishP2/Controllers/UserController.java +++ b/src/main/java/VanquishP2/Controllers/UserController.java @@ -1,13 +1,14 @@ package VanquishP2.Controllers; -import VanquishP2.Application.Beans.Models.User; import VanquishP2.Application.Beans.ModelServices.UserService; +import VanquishP2.Application.Beans.Models.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; + import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE; /** diff --git a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java index c19b40d..787d810 100644 --- a/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java +++ b/src/main/java/VanquishP2/DTOs/UserRegistrationDTO.java @@ -1,8 +1,7 @@ package VanquishP2.DTOs; -import VanquishP2.Application.Beans.Models.Location; -import com.fasterxml.jackson.annotation.JsonIgnore; import org.hibernate.validator.constraints.Length; + import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; @@ -43,6 +42,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/main/java/VanquishP2/DataGenerators/UserGen.java b/src/main/java/VanquishP2/DataGenerators/UserGen.java index 2476ba5..eb25fe0 100644 --- a/src/main/java/VanquishP2/DataGenerators/UserGen.java +++ b/src/main/java/VanquishP2/DataGenerators/UserGen.java @@ -3,11 +3,11 @@ import VanquishP2.Application.Beans.ModelServices.LocationService; import VanquishP2.Application.Beans.ModelServices.UserInfoService; import VanquishP2.Application.Beans.ModelServices.UserService; -import VanquishP2.Application.Beans.Models.Location; import VanquishP2.Application.Beans.Models.User; import VanquishP2.Application.Beans.Models.UserInfo; import VanquishP2.DTOs.UserRegistrationDTO; import org.hibernate.validator.constraints.Length; + import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; import javax.validation.constraints.Pattern; diff --git a/src/main/java/VanquishP2/Deezer/AlbumSearch.java b/src/main/java/VanquishP2/Deezer/AlbumSearch.java index ca55ab5..e51ee3e 100644 --- a/src/main/java/VanquishP2/Deezer/AlbumSearch.java +++ b/src/main/java/VanquishP2/Deezer/AlbumSearch.java @@ -1,7 +1,7 @@ package VanquishP2.Deezer; -import VanquishP2.Application.Beans.Service.APIClientService; import VanquishP2.Application.Beans.Models.Album; +import VanquishP2.Application.Beans.Service.APIClientService; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; diff --git a/src/main/java/VanquishP2/Deezer/ArtistSearch.java b/src/main/java/VanquishP2/Deezer/ArtistSearch.java index cd9ce56..45771c0 100644 --- a/src/main/java/VanquishP2/Deezer/ArtistSearch.java +++ b/src/main/java/VanquishP2/Deezer/ArtistSearch.java @@ -1,9 +1,9 @@ package VanquishP2.Deezer; -import VanquishP2.Application.Beans.Service.APIClientService; import VanquishP2.Application.Beans.Models.Album; import VanquishP2.Application.Beans.Models.Artist; import VanquishP2.Application.Beans.Models.Track; +import VanquishP2.Application.Beans.Service.APIClientService; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; diff --git a/src/main/java/VanquishP2/Deezer/JSONStringToModelConverter.java b/src/main/java/VanquishP2/Deezer/JSONStringToModelConverter.java index f6d148b..996b686 100644 --- a/src/main/java/VanquishP2/Deezer/JSONStringToModelConverter.java +++ b/src/main/java/VanquishP2/Deezer/JSONStringToModelConverter.java @@ -1,10 +1,10 @@ package VanquishP2.Deezer; -import VanquishP2.Application.Beans.Service.APIClientService; import VanquishP2.Application.Beans.Models.Album; import VanquishP2.Application.Beans.Models.Artist; import VanquishP2.Application.Beans.Models.Genre; import VanquishP2.Application.Beans.Models.Track; +import VanquishP2.Application.Beans.Service.APIClientService; import org.json.JSONException; import org.json.JSONObject; diff --git a/src/main/java/VanquishP2/Deezer/TrackSearch.java b/src/main/java/VanquishP2/Deezer/TrackSearch.java index 5acee9b..978940c 100644 --- a/src/main/java/VanquishP2/Deezer/TrackSearch.java +++ b/src/main/java/VanquishP2/Deezer/TrackSearch.java @@ -1,7 +1,7 @@ package VanquishP2.Deezer; -import VanquishP2.Application.Beans.Service.APIClientService; import VanquishP2.Application.Beans.Models.Track; +import VanquishP2.Application.Beans.Service.APIClientService; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject;