diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..a2b7aa3f3d --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.iml +target/ +.idea/ +Config.java diff --git a/migration.sql b/migration.sql new file mode 100644 index 0000000000..a70d2eab38 --- /dev/null +++ b/migration.sql @@ -0,0 +1,22 @@ +USE adlister_db; + +DROP TABLE IF EXISTS ads; +DROP TABLE IF EXISTS users; + +CREATE TABLE users ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + username VARCHAR(240) NOT NULL, + email VARCHAR(240) NOT NULL, + password VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE ads ( + id INT UNSIGNED NOT NULL AUTO_INCREMENT, + user_id INT UNSIGNED NOT NULL, + title VARCHAR(240) NOT NULL, + description TEXT NOT NULL, + PRIMARY KEY (id), + FOREIGN KEY (user_id) REFERENCES users(id) + ON DELETE CASCADE +); diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000..aa004087cd --- /dev/null +++ b/pom.xml @@ -0,0 +1,44 @@ + + + 4.0.0 + + com.codeup.adlister + adlister + 1.0-SNAPSHOT + war + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.0 + + 1.8 + 1.8 + + + + + + + + javax.servlet + javax.servlet-api + 3.0.1 + + + jstl + jstl + 1.2 + + + mysql + mysql-connector-java + 6.0.5 + + + + \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/controllers/AdsIndexServlet.java b/src/main/java/com/codeup/adlister/controllers/AdsIndexServlet.java new file mode 100644 index 0000000000..1763081228 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/AdsIndexServlet.java @@ -0,0 +1,18 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; + +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 = "controllers.AdsIndexServlet", urlPatterns = "/ads") +public class AdsIndexServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.setAttribute("ads", DaoFactory.getAdsDao().all()); + request.getRequestDispatcher("/WEB-INF/ads/index.jsp").forward(request, response); + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/CounterServlet.java b/src/main/java/com/codeup/adlister/controllers/CounterServlet.java new file mode 100644 index 0000000000..f66c52d7aa --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/CounterServlet.java @@ -0,0 +1,17 @@ +package com.codeup.adlister.controllers; + +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 = "controllers.CounterServlet", urlPatterns = "/count") +public class CounterServlet extends HttpServlet { + private int counter = 0; + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + counter += 1; + response.getWriter().println("

The count is " + counter + ".

"); + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java new file mode 100644 index 0000000000..5fd38ad79d --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java @@ -0,0 +1,29 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.Ad; + +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 = "controllers.CreateAdServlet", urlPatterns = "/ads/create") +public class CreateAdServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.getRequestDispatcher("/WEB-INF/ads/create.jsp") + .forward(request, response); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + Ad ad = new Ad( + 1, // for now we'll hardcode the user id + request.getParameter("title"), + request.getParameter("description") + ); + DaoFactory.getAdsDao().insert(ad); + response.sendRedirect("/ads"); + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java b/src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java new file mode 100644 index 0000000000..4ab9b9da70 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/HelloWorldServlet.java @@ -0,0 +1,14 @@ +package com.codeup.adlister.controllers; + +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 = "controllers.HelloWorldServlet", urlPatterns = "/") +public class HelloWorldServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + response.getWriter().println("

Hello, World!

"); + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/LoginServlet.java b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java new file mode 100644 index 0000000000..8e320d737f --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java @@ -0,0 +1,37 @@ +package com.codeup.adlister.controllers; + +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 = "controllers.LoginServlet", urlPatterns = "/login") +public class LoginServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession().getAttribute("user") != null) { + response.sendRedirect("/profile"); + return; + } + request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + String username = request.getParameter("username"); + String password = request.getParameter("password"); + + // TODO: find a record in your database that matches the submitted password + // TODO: make sure we find a user with that username + // TODO: check the submitted password against what you have in your database + boolean validAttempt = false; + + if (validAttempt) { + // TODO: store the logged in user object in the session, instead of just the username + request.getSession().setAttribute("user", username); + response.sendRedirect("/profile"); + } else { + response.sendRedirect("/login"); + } + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/LogoutServlet.java b/src/main/java/com/codeup/adlister/controllers/LogoutServlet.java new file mode 100644 index 0000000000..e88f9d5241 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/LogoutServlet.java @@ -0,0 +1,16 @@ +package com.codeup.adlister.controllers; + +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 = "controllers.LogoutServlet", urlPatterns = "/logout") +public class LogoutServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { + request.getSession().removeAttribute("user"); + request.getSession().invalidate(); + response.sendRedirect("/login"); + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java new file mode 100644 index 0000000000..f0fbfff3a9 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java @@ -0,0 +1,20 @@ +package com.codeup.adlister.controllers; + +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@WebServlet(name = "controllers.RegisterServlet", urlPatterns = "/register") +public class RegisterServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) { + // TODO: show the registration form + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) { + // TODO: ensure the submitted information is valid + // TODO: create a new user based off of the submitted information + // TODO: if a user was successfully created, send them to their profile + } +} +// \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/controllers/ViewProfileServlet.java b/src/main/java/com/codeup/adlister/controllers/ViewProfileServlet.java new file mode 100644 index 0000000000..e1b8941067 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/ViewProfileServlet.java @@ -0,0 +1,19 @@ +package com.codeup.adlister.controllers; + +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 = "controllers.ViewProfileServlet", urlPatterns = "/profile") +public class ViewProfileServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession().getAttribute("user") == null) { + response.sendRedirect("/login"); + return; + } + request.getRequestDispatcher("/WEB-INF/profile.jsp").forward(request, response); + } +} diff --git a/src/main/java/com/codeup/adlister/dao/Ads.java b/src/main/java/com/codeup/adlister/dao/Ads.java new file mode 100644 index 0000000000..79dc59f484 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/Ads.java @@ -0,0 +1,12 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.Ad; + +import java.util.List; + +public interface Ads { + // get a list of all the ads + List all(); + // insert a new ad and return the new ad's id + Long insert(Ad ad); +} diff --git a/src/main/java/com/codeup/adlister/dao/DaoFactory.java b/src/main/java/com/codeup/adlister/dao/DaoFactory.java new file mode 100644 index 0000000000..05f2dafc28 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/DaoFactory.java @@ -0,0 +1,13 @@ +package com.codeup.adlister.dao; + +public class DaoFactory { + private static Ads adsDao; + private static Config config = new Config(); + + public static Ads getAdsDao() { + if (adsDao == null) { + adsDao = new MySQLAdsDao(config); + } + return adsDao; + } +} diff --git a/src/main/java/com/codeup/adlister/dao/ListAdsDao.java b/src/main/java/com/codeup/adlister/dao/ListAdsDao.java new file mode 100644 index 0000000000..8d3baaa369 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/ListAdsDao.java @@ -0,0 +1,58 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.Ad; + +import java.util.ArrayList; +import java.util.List; + +public class ListAdsDao implements Ads { + private List ads; + + public List all() { + if (ads == null) { + ads = generateAds(); + } + return ads; + } + + public Long insert(Ad ad) { + // make sure we have ads + if (ads == null) { + ads = generateAds(); + } + // we'll assign an "id" here based on the size of the ads list + // really the dao would handle this + ad.setId((long) ads.size()); + ads.add(ad); + return ad.getId(); + } + + private List generateAds() { + List ads = new ArrayList<>(); + ads.add(new Ad( + 1, + 1, + "playstation for sale", + "This is a slightly used playstation" + )); + ads.add(new Ad( + 2, + 1, + "Super Nintendo", + "Get your game on with this old-school classic!" + )); + ads.add(new Ad( + 3, + 2, + "Junior Java Developer Position", + "Minimum 7 years of experience required. You will be working in the scripting language for Java, JavaScript" + )); + ads.add(new Ad( + 4, + 2, + "JavaScript Developer needed", + "Must have strong Java skills" + )); + return ads; + } +} diff --git a/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java new file mode 100644 index 0000000000..a29871d531 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java @@ -0,0 +1,79 @@ +//package com.codeup.adlister.dao; +// +//import com.codeup.adlister.models.Ad; +//import com.mysql.cj.jdbc.Driver; +//import sun.security.krb5.Config; +// +//import java.io.FileInputStream; +//import java.io.IOException; +//import java.io.InputStream; +//import java.sql.*; +//import java.util.ArrayList; +//import java.util.List; +// +//public class MySQLAdsDao implements Ads { +// private Connection connection = null; +// +// public MySQLAdsDao(Config config) { +// try { +// DriverManager.registerDriver(new Driver()); +// connection = DriverManager.getConnection( +// config.getUrl(), +// config.getUser(), +// config.getPassword() +// ); +// } catch (SQLException e) { +// throw new RuntimeException("Error connecting to the database!", e); +// } +// } +// +// @Override +// public List all() { +// Statement stmt = null; +// try { +// stmt = connection.createStatement(); +// ResultSet rs = stmt.executeQuery("SELECT * FROM ads"); +// return createAdsFromResults(rs); +// } catch (SQLException e) { +// throw new RuntimeException("Error retrieving all ads.", e); +// } +// } +// +// @Override +// public Long insert(Ad ad) { +// try { +// Statement stmt = connection.createStatement(); +// stmt.executeUpdate(createInsertQuery(ad), Statement.RETURN_GENERATED_KEYS); +// ResultSet rs = stmt.getGeneratedKeys(); +// rs.next(); +// return rs.getLong(1); +// } catch (SQLException e) { +// throw new RuntimeException("Error creating a new ad.", e); +// } +// } +// +// private String createInsertQuery(Ad ad) { +// return "INSERT INTO ads(user_id, title, description) VALUES " +// + "(" + ad.getUserId() + ", " +// + "'" + ad.getTitle() +"', " +// + "'" + ad.getDescription() + "')"; +// } +// +// private Ad extractAd(ResultSet rs) throws SQLException { +// return new Ad( +// rs.getLong("id"), +// rs.getLong("user_id"), +// rs.getString("title"), +// rs.getString("description") +// ); +// } +// +// private List createAdsFromResults(ResultSet rs) throws SQLException { +// List ads = new ArrayList<>(); +// while (rs.next()) { +// ads.add(extractAd(rs)); +// } +// return ads; +// } +//} +//// \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java new file mode 100644 index 0000000000..8bb1d57974 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java @@ -0,0 +1,4 @@ +package com.codeup.adlister.dao; + +public class MySQLUsersDao { +} diff --git a/src/main/java/com/codeup/adlister/dao/Users.java b/src/main/java/com/codeup/adlister/dao/Users.java new file mode 100644 index 0000000000..62da74d20b --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/Users.java @@ -0,0 +1,10 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.User; + +import java.util.List; + +public interface Users { + User findByUsername(String username); + Long insert(User user); +} diff --git a/src/main/java/com/codeup/adlister/models/Ad.java b/src/main/java/com/codeup/adlister/models/Ad.java new file mode 100644 index 0000000000..9e9e02d87e --- /dev/null +++ b/src/main/java/com/codeup/adlister/models/Ad.java @@ -0,0 +1,53 @@ +package com.codeup.adlister.models; + +public class Ad { + private long id; + private long userId; + private String title; + private String description; + + public Ad(long id, long userId, String title, String description) { + this.id = id; + this.userId = userId; + this.title = title; + this.description = description; + } + + public Ad(long userId, String title, String description) { + this.userId = userId; + this.title = title; + this.description = description; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getUserId() { + return userId; + } + + public void setUserId(long userId) { + this.userId = userId; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/src/main/java/com/codeup/adlister/models/User.java b/src/main/java/com/codeup/adlister/models/User.java new file mode 100644 index 0000000000..1c9c75cdb7 --- /dev/null +++ b/src/main/java/com/codeup/adlister/models/User.java @@ -0,0 +1,49 @@ +package com.codeup.adlister.models; + +public class User { + private long id; + private String username; + private String email; + private String password; + + public User() {} + + public User(long id, String username, String email, String password) { + this.id = id; + this.username = username; + this.email = email; + this.password = password; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/src/main/webapp/WEB-INF/ads/create.jsp b/src/main/webapp/WEB-INF/ads/create.jsp new file mode 100644 index 0000000000..f6332692f7 --- /dev/null +++ b/src/main/webapp/WEB-INF/ads/create.jsp @@ -0,0 +1,24 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + +
+

Create a new Ad

+
+
+ + +
+
+ + +
+ +
+
+ + diff --git a/src/main/webapp/WEB-INF/ads/index.jsp b/src/main/webapp/WEB-INF/ads/index.jsp new file mode 100644 index 0000000000..6f4371f0bb --- /dev/null +++ b/src/main/webapp/WEB-INF/ads/index.jsp @@ -0,0 +1,24 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + + +
+

Here Are all the ads!

+ + +
+

${ad.title}

+

${ad.description}

+
+
+
+ + + diff --git a/src/main/webapp/WEB-INF/login.jsp b/src/main/webapp/WEB-INF/login.jsp new file mode 100644 index 0000000000..83ce2d0a1f --- /dev/null +++ b/src/main/webapp/WEB-INF/login.jsp @@ -0,0 +1,25 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + +
+

Please Log In

+
+
+ + +
+
+ + +
+ +
+
+ + diff --git a/src/main/webapp/WEB-INF/partials/head.jsp b/src/main/webapp/WEB-INF/partials/head.jsp new file mode 100644 index 0000000000..a33443d65c --- /dev/null +++ b/src/main/webapp/WEB-INF/partials/head.jsp @@ -0,0 +1,2 @@ +${param.title} + diff --git a/src/main/webapp/WEB-INF/partials/navbar.jsp b/src/main/webapp/WEB-INF/partials/navbar.jsp new file mode 100644 index 0000000000..8e1f98f662 --- /dev/null +++ b/src/main/webapp/WEB-INF/partials/navbar.jsp @@ -0,0 +1,13 @@ + diff --git a/src/main/webapp/WEB-INF/profile.jsp b/src/main/webapp/WEB-INF/profile.jsp new file mode 100644 index 0000000000..384c2081c6 --- /dev/null +++ b/src/main/webapp/WEB-INF/profile.jsp @@ -0,0 +1,16 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + + +
+

Welcome, ${sessionScope.user}!

+
+ + + diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 0000000000..68cf346ec9 --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,15 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + +
+

Welcome to the Adlister!

+
+ + diff --git a/src/main/webapp/register.jsp b/src/main/webapp/register.jsp new file mode 100644 index 0000000000..ba990e6dfa --- /dev/null +++ b/src/main/webapp/register.jsp @@ -0,0 +1,17 @@ +<%-- + Created by IntelliJ IDEA. + User: amanda + Date: 11/18/21 + Time: 9:17 PM + To change this template use File | Settings | File Templates. +--%> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Register + + + + + +<%----%> \ No newline at end of file