diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..f335dee584 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.iml +target/ +.idea/ +Config.java \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000..5587ee478f --- /dev/null +++ b/pom.xml @@ -0,0 +1,49 @@ + + + 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 + + + + + + + + org.mindrot + jbcrypt + 0.4 + + + javax.servlet + javax.servlet-api + 4.0.1 + + + jstl + jstl + 1.2 + + + mysql + mysql-connector-java + 8.0.29 + + + + \ 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..169f6ca97b --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java @@ -0,0 +1,41 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.Ad; +import com.codeup.adlister.models.User; + +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; + +import static java.lang.Long.parseLong; +import static java.lang.Long.valueOf; + +@WebServlet("/ads/create") +public class CreateAdServlet 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/ads/create.jsp") + .forward(request, response); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + User user = (User) request.getSession().getAttribute("user"); + + Ad ad = new Ad( + user.getId(), + Long.parseLong(request.getParameter("category")), + request.getParameter("title"), + request.getParameter("description"), + request.getParameter("location") + ); + DaoFactory.getAdsDao().insert(ad); + response.sendRedirect("/ads"); + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/DeleteAdServlet.java b/src/main/java/com/codeup/adlister/controllers/DeleteAdServlet.java new file mode 100644 index 0000000000..58ba755705 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/DeleteAdServlet.java @@ -0,0 +1,29 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.Ad; +import com.codeup.adlister.models.User; + +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("/delete") +public class DeleteAdServlet extends HttpServlet { + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + System.out.println(Long.parseLong(req.getParameter("delete"))); + + long ad_id = (Long.parseLong(req.getParameter("delete"))); + + DaoFactory.getAdsDao().destroy(ad_id); + + resp.sendRedirect("/ads"); + } + +} diff --git a/src/main/java/com/codeup/adlister/controllers/DisplayCatServlet.java b/src/main/java/com/codeup/adlister/controllers/DisplayCatServlet.java new file mode 100644 index 0000000000..29e42b22b6 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/DisplayCatServlet.java @@ -0,0 +1,21 @@ +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("/category") +public class DisplayCatServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String query = req.getQueryString(); + System.out.println(query); + req.setAttribute("ads", DaoFactory.getCategoriesDao().findByCategory(query)); + req.getRequestDispatcher("/WEB-INF/ads/index.jsp").forward(req, resp); + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/LikeAdServlet.java b/src/main/java/com/codeup/adlister/controllers/LikeAdServlet.java new file mode 100644 index 0000000000..19fd6fcb7d --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/LikeAdServlet.java @@ -0,0 +1,21 @@ +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("/like") +public class LikeAdServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + String id = req.getQueryString(); +// System.out.println(id); + DaoFactory.getAdsDao().likeAd(id); + resp.sendRedirect("/ads"); + } +} 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..e5c52723a2 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/LoginServlet.java @@ -0,0 +1,43 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.User; +import com.codeup.adlister.util.Password; + +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"); + User user = DaoFactory.getUsersDao().findByUsername(username); + + if (user == null) { + response.sendRedirect("/login"); + return; + } + + boolean validAttempt = Password.check(password, user.getPassword()); + + if (validAttempt) { + request.getSession().setAttribute("user", user); + 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..e1e997c17a --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/RegisterServlet.java @@ -0,0 +1,41 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.User; + +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.RegisterServlet", urlPatterns = "/register") +public class RegisterServlet extends HttpServlet { + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + request.getRequestDispatcher("/WEB-INF/register.jsp").forward(request, response); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + String username = request.getParameter("username"); + String email = request.getParameter("email"); + String password = request.getParameter("password"); + String passwordConfirmation = request.getParameter("confirm_password"); + + // validate input + boolean inputHasErrors = username.isEmpty() + || email.isEmpty() + || password.isEmpty() + || (! password.equals(passwordConfirmation)); + + if (inputHasErrors) { + response.sendRedirect("/register"); + return; + } + + // create and save a new user + User user = new User(username, email, password); + DaoFactory.getUsersDao().insert(user); + response.sendRedirect("/login"); + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/SearchServlet.java b/src/main/java/com/codeup/adlister/controllers/SearchServlet.java new file mode 100644 index 0000000000..a271e3f66e --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/SearchServlet.java @@ -0,0 +1,27 @@ +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("/search") +public class SearchServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + String query = req.getParameter("search"); + System.out.println(query); + req.setAttribute("ads", DaoFactory.getAdsDao().findByKeyword(query)); + req.getRequestDispatcher("/WEB-INF/ads/index.jsp").forward(req, resp); + } + + @Override + protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + + } +} diff --git a/src/main/java/com/codeup/adlister/controllers/UpdateAdServlet.java b/src/main/java/com/codeup/adlister/controllers/UpdateAdServlet.java new file mode 100644 index 0000000000..166cfd04b7 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/UpdateAdServlet.java @@ -0,0 +1,40 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.Ad; +import com.codeup.adlister.models.User; + +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("/update") +public class UpdateAdServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession().getAttribute("user") == null) { + response.sendRedirect("/login"); + return; + } + request.getRequestDispatcher("/WEB-INF/ads/create.jsp") + .forward(request, response); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + + Ad ad = new Ad( + + Long.parseLong(request.getParameter("category")), + request.getParameter("title"), + request.getParameter("description"), + request.getParameter("location"), + Long.parseLong(request.getParameter("update")) + ); + + DaoFactory.getAdsDao().update(ad); + response.sendRedirect("/ads"); + } +} \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/controllers/UpdateProfileServlet.java b/src/main/java/com/codeup/adlister/controllers/UpdateProfileServlet.java new file mode 100644 index 0000000000..62da258f94 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/UpdateProfileServlet.java @@ -0,0 +1,39 @@ +package com.codeup.adlister.controllers; +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.User; + +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("/profileupdate") +public class UpdateProfileServlet extends HttpServlet { + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + if (request.getSession().getAttribute("user") == null) { + response.sendRedirect("/login"); + return; + } + request.getRequestDispatcher("/WEB-INF/updateProfile.jsp") + .forward(request, response); + request.setAttribute("user", DaoFactory.getUsersDao().all()); + } + + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException { + User user = (User) request.getSession().getAttribute("user"); + + User users = new User( + user.getId(), + request.getParameter("username"), + request.getParameter("email"), + request.getParameter("password") + ); + + DaoFactory.getUsersDao().update(users); + response.sendRedirect("/profile"); + } +} 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..896598c7e2 --- /dev/null +++ b/src/main/java/com/codeup/adlister/controllers/ViewProfileServlet.java @@ -0,0 +1,25 @@ +package com.codeup.adlister.controllers; + +import com.codeup.adlister.dao.DaoFactory; +import com.codeup.adlister.models.User; + +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 { + User user = (User) request.getSession().getAttribute("user"); + + if (request.getSession().getAttribute("user") == null) { + response.sendRedirect("/login"); + return; + } + request.setAttribute("ads", DaoFactory.getAdsDao().filterByUsername(user.getId())); + 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..911a934d38 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/Ads.java @@ -0,0 +1,27 @@ +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(); + + List filterByUsername(Long id); + // insert a new ad and return the new ad's id + Long insert(Ad ad); + //edit existing ad + void update(Ad ad); + + Ad findAdById(long id); + + //delete existing ad + void destroy(long id); + + //search + List findByKeyword(String query); + + void likeAd(String id); + +} diff --git a/src/main/java/com/codeup/adlister/dao/Categories.java b/src/main/java/com/codeup/adlister/dao/Categories.java new file mode 100644 index 0000000000..854f46fc26 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/Categories.java @@ -0,0 +1,14 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.Ad; +import com.codeup.adlister.models.Category; + +import java.util.List; + +public interface Categories { + // list all categories in the category table + List all(); + + // find all ads with a specific category + List findByCategory(String category); +} 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..53b486634b --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/DaoFactory.java @@ -0,0 +1,29 @@ +package com.codeup.adlister.dao; + +public class DaoFactory { + private static Ads adsDao; + private static Users usersDao; + private static Categories categoryDao; + private static Config config = new Config(); + + public static Ads getAdsDao() { + if (adsDao == null) { + adsDao = new MySQLAdsDao(config); + } + return adsDao; + } + + public static Users getUsersDao() { + if (usersDao == null) { + usersDao = new MySQLUsersDao(config); + } + return usersDao; + } + + public static Categories getCategoriesDao() { + if (categoryDao == null) { + categoryDao = new MySQLCategoriesDao(config); + } + return categoryDao; + } +} 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..fe3b9786f6 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/MySQLAdsDao.java @@ -0,0 +1,197 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.Ad; +import com.mysql.cj.jdbc.Driver; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +import static java.lang.Integer.parseInt; + +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() { + PreparedStatement stmt = null; + try { + stmt = connection.prepareStatement("SELECT * FROM sa_lister_db.ads"); + ResultSet rs = stmt.executeQuery(); + return createAdsFromResults(rs); + } catch (SQLException e) { + throw new RuntimeException("Error retrieving all ads.", e); + } + } + + + + @Override + public List filterByUsername(Long id){ + PreparedStatement stmt = null; + try { + stmt = connection.prepareStatement("SELECT * FROM sa_lister_db.ads WHERE user_id = ?"); + stmt.setLong(1, id); + ResultSet rs = stmt.executeQuery(); + return createAdsFromResults(rs); + } catch (SQLException e) { + throw new RuntimeException("Error retrieving all ads.", e); + } + } + + + public List createAdsFromResults(ResultSet rs) throws SQLException { + List ads = new ArrayList<>(); + while (rs.next()) { + ads.add(extractAd(rs)); + } + return ads; + } + + @Override + public Long insert(Ad ad) { + try { + String insertQuery = "INSERT INTO sa_lister_db.ads(user_id, cat_id, title, description, location, reputation) VALUES (?, ?, ?, ?, ?, 0)"; + PreparedStatement stmt = connection.prepareStatement(insertQuery, Statement.RETURN_GENERATED_KEYS); + stmt.setLong(1, ad.getUserId()); + stmt.setLong(2, ad.getCatId()); + stmt.setString(3, ad.getTitle()); + stmt.setString(4, ad.getDescription()); + stmt.setString(5, ad.getLocation()); + stmt.executeUpdate(); + ResultSet rs = stmt.getGeneratedKeys(); + rs.next(); + return rs.getLong(1); + } catch (SQLException e) { + throw new RuntimeException("Error creating a new ad!", e); + } + } + + @Override + public void update(Ad ad) { + try { + String insertQuery = "UPDATE sa_lister_db.ads SET cat_id = ?, title = ?, description = ?, location = ? WHERE id = ?"; + PreparedStatement stmt = connection.prepareStatement(insertQuery); + stmt.setLong(1, ad.getCatId()); + stmt.setString(2, ad.getTitle()); + stmt.setString(3, ad.getDescription()); + stmt.setString(4, ad.getLocation()); + stmt.setLong(5, ad.getId()); + stmt.executeUpdate(); + } catch (SQLException e) { + throw new RuntimeException("Error updating ad!", e); + } + } + + @Override + public void destroy(long id) { + PreparedStatement stmt; + try { + stmt = connection.prepareStatement("DELETE FROM sa_lister_db.ads WHERE id = ?"); + stmt.setLong(1, id); + stmt.executeUpdate(); + } catch (SQLException e) { + throw new RuntimeException("Error deleting ad!", e); + } + } + + + + @Override + public Ad findAdById(long id) { + String query = "SELECT * FROM sa_lister_db.ads WHERE id = ?"; + try { + PreparedStatement stmt = connection.prepareStatement(query); + stmt.setLong(1, id); + ResultSet rs = stmt.executeQuery(); + if(rs.next()) { + return extractAd(rs); + } else { + return null; + } + } catch (SQLException e) { + throw new RuntimeException("Error searching for ads by id!", e); + } + } + + @Override + public List findByKeyword(String title) { + String query = "SELECT * FROM sa_lister_db.ads WHERE title LIKE ?"; + try { + PreparedStatement stmt = connection.prepareStatement(query); + stmt.setString(1, '%'+title+'%'); + ResultSet rs = stmt.executeQuery(); + + Config config = new Config(); + MySQLAdsDao util = new MySQLAdsDao(config); + List ads = new ArrayList<>(); + + while(rs.next()){ + ads.add(util.extractAd(rs)); + } + return ads; + } catch(SQLException e) { + throw new RuntimeException("Error searching database!", e); + } + } + + + + + + + + + + + + + @Override + public void likeAd(String id) { + String query = "UPDATE ads set reputation = reputation+1 where id = ?"; + try { + PreparedStatement stmt = connection.prepareStatement(query); + stmt.setInt(1, parseInt(id)); + stmt.executeUpdate(); + } catch (SQLException e) { + throw new RuntimeException("Error updating ad!", e); + } + } + + + + + + + + + + + + + public Ad extractAd(ResultSet rs) throws SQLException { + return new Ad( + rs.getLong("id"), + rs.getLong("user_id"), + rs.getLong("cat_id"), + rs.getString("title"), + rs.getString("description"), + rs.getString("location"), + rs.getInt("reputation") + ); + } + +} //end \ No newline at end of file diff --git a/src/main/java/com/codeup/adlister/dao/MySQLCategoriesDao.java b/src/main/java/com/codeup/adlister/dao/MySQLCategoriesDao.java new file mode 100644 index 0000000000..b300f60dbc --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/MySQLCategoriesDao.java @@ -0,0 +1,85 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.Ad; +import com.codeup.adlister.models.Category; +import com.mysql.cj.jdbc.Driver; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class MySQLCategoriesDao implements Categories{ + private Connection connection; + + public MySQLCategoriesDao(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() { + String query = "SELECT * FROM categories"; + try { + PreparedStatement stmt = connection.prepareStatement(query); + ResultSet rs = stmt.executeQuery(); + return createCategoriesFromList(rs); + } catch(SQLException e) { + throw new RuntimeException("Error connecting to the database!", e); + } + } + + @Override + public List findByCategory(String category) { + String query = "SELECT * FROM ads JOIN categories c ON c.id = ads.cat_id WHERE category = ?"; + try { + PreparedStatement stmt = connection.prepareStatement(query); + stmt.setString(1, category); + ResultSet rs = stmt.executeQuery(); + + Config config = new Config(); + MySQLAdsDao util = new MySQLAdsDao(config); + List ads = new ArrayList<>(); + while(rs.next()){ + ads.add(util.extractAd(rs)); + } + + return ads; + } catch(SQLException e) { + throw new RuntimeException("Error connecting to the database!", e); + } + } + + private Category extractCategory(ResultSet rs) throws SQLException { + return new Category( + rs.getLong("id"), + rs.getString("category") + ); + } + + private List createCategoriesFromList(ResultSet rs) throws SQLException { + List categories = new ArrayList<>(); + while (rs.next()) { + categories.add(extractCategory(rs)); + } + return categories; + } + +// private Ad extractAd(ResultSet rs) throws SQLException { +// return new Ad( +// rs.getLong("id"), +// rs.getLong("user_id"), +// rs.getLong("cat_id"), +// rs.getString("title"), +// rs.getString("description"), +// rs.getString("location") +// ); +// } +} 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..0871117b87 --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/MySQLUsersDao.java @@ -0,0 +1,110 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.User; +import com.mysql.cj.jdbc.Driver; + +import java.sql.*; +import java.util.List; + +import static com.codeup.adlister.util.Password.hash; + +public class MySQLUsersDao implements Users { + private Connection connection; + + public MySQLUsersDao(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() { + return null; + } + + @Override + public User findByUsername(String username) { + String query = "SELECT * FROM users WHERE username = ? LIMIT 1"; + try { + PreparedStatement stmt = connection.prepareStatement(query); + stmt.setString(1, username); + return extractUser(stmt.executeQuery()); + } catch (SQLException e) { + throw new RuntimeException("Error finding a user by username", e); + } + } + + @Override + public Long insert(User user) { + String query = "INSERT INTO users(username, email, password) VALUES (?, ?, ?)"; + try { + PreparedStatement stmt = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); + stmt.setString(1, user.getUsername()); + stmt.setString(2, user.getEmail()); + stmt.setString(3, user.getPassword()); + stmt.executeUpdate(); + ResultSet rs = stmt.getGeneratedKeys(); + rs.next(); + return rs.getLong(1); + } catch (SQLException e) { + throw new RuntimeException("Error creating new user", e); + } + } + + @Override + public void update(User user) { + try { + String insertQuery = "UPDATE sa_lister_db.users SET username = ?, email = ?, password = ? WHERE id = ?"; + PreparedStatement stmt = connection.prepareStatement(insertQuery); + + stmt.setString(1, user.getUsername()); + stmt.setString(2, user.getEmail()); + stmt.setString(3, hash(user.getPassword())); + stmt.setLong(4, user.getId()); + stmt.executeUpdate(); + } catch (SQLException e) { + throw new RuntimeException("Error updating user.", e); + } + } + + @Override + public User findUserById(long id) { + String query = "SELECT * FROM sa_lister_db.users WHERE id = ?"; + try { + PreparedStatement stmt = connection.prepareStatement(query); + stmt.setLong(1, id); + ResultSet rs = stmt.executeQuery(); + if(rs.next()) { + return extractUser(rs); + } else { + return null; + } + + } catch (SQLException e) { + throw new RuntimeException("Error searching for ads by id", e); + } + } + + private User extractUser(ResultSet rs) throws SQLException { + if (! rs.next()) { + return null; + } + return new User( + rs.getLong("id"), + rs.getString("username"), + rs.getString("email"), + rs.getString("password") + ); + } + + + +} 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..1feb4ef6cc --- /dev/null +++ b/src/main/java/com/codeup/adlister/dao/Users.java @@ -0,0 +1,18 @@ +package com.codeup.adlister.dao; + +import com.codeup.adlister.models.User; + +import java.util.List; + +public interface Users { + + List all(); + + User findByUsername(String username); + + Long insert(User user); + + void update(User user); + + User findUserById(long id); +} \ No newline at end of file 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..e2fe381836 --- /dev/null +++ b/src/main/java/com/codeup/adlister/models/Ad.java @@ -0,0 +1,118 @@ +package com.codeup.adlister.models; + + +public class Ad { + private long id; + private long userId; + private long catId; + private String title; + private String description; + private String location; + private int reputation; + + public Ad(long id, long user_id, long cat_id, String title, String description, String location, int reputation) { + this.id = id; + this.userId = user_id; + this.catId = cat_id; + this.title = title; + this.description = description; + this.location = location; + this.reputation = reputation; + } + + public Ad(long userId, long catId, String title, String description, String location) { + this.userId = userId; + this.catId = catId; + this.title = title; + this.description = description; + this.location = location; + } + + public Ad(long id, long userId, long catId, String title, String description, String location) { + this.id = id; + this.userId = userId; + this.catId = catId; + this.title = title; + this.description = description; + this.location = location; + } + + public Ad(long catId, String title, String description, String location, long id){ + this.catId = catId; + this.title = title; + this.description = description; + this.location = location; + this.id = id; + } + + public Ad(long userId, String title, String description) { + this.userId = userId; + this.title = title; + this.description = description; + } + + public Ad(long catId, String title, String description, String location) { + this.catId = catId; + this.title = title; + this.description = description; + this.location = location; + } + + public Ad() {} + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public long getUserId() { + return userId; + } + + public long getCatId() { + return catId; + } + + public void setCatId(long catId) { + this.catId = catId; + } + + 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; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public int getReputation() { + return reputation; + } + + public void setReputation(int reputation) { + this.reputation = reputation; + } +} diff --git a/src/main/java/com/codeup/adlister/models/Category.java b/src/main/java/com/codeup/adlister/models/Category.java new file mode 100644 index 0000000000..3f5dcc03f5 --- /dev/null +++ b/src/main/java/com/codeup/adlister/models/Category.java @@ -0,0 +1,42 @@ +package com.codeup.adlister.models; + +public class Category { + private long id; + private long ad_id; + private String category; + + public Category(long id, long ad_id, String category){ + this.id = id; + this.ad_id = ad_id; + this.category = category; + } + + public Category(long ad_id, String category){ + this.ad_id = ad_id; + this.category = category; + } + + public long getId() { + return id; + } + + public long getAd_id() { + return ad_id; + } + + public String getCategory() { + return category; + } + + public void setId(long id) { + this.id = id; + } + + public void setAd_id(long ad_id) { + this.ad_id = ad_id; + } + + public void setCategory(String category) { + this.category = category; + } +} 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..ff0a6bde5e --- /dev/null +++ b/src/main/java/com/codeup/adlister/models/User.java @@ -0,0 +1,64 @@ +package com.codeup.adlister.models; + +import com.codeup.adlister.util.Password; + +public class User { + private long id; + private String username; + private String email; + private String password; + + public User() {} + + public User(String username, String email, String password) { + this.username = username; + this.email = email; + setPassword(password); + } + + public User(long id, String username, String email, String password) { + this.id = id; + this.username = username; + this.email = email; + this.password = password; + } + + public User(long id, String username, String email, String password, long editUser) { + 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.hash(password); + } +} diff --git a/src/main/java/com/codeup/adlister/util/Password.java b/src/main/java/com/codeup/adlister/util/Password.java new file mode 100644 index 0000000000..1ca33b20dd --- /dev/null +++ b/src/main/java/com/codeup/adlister/util/Password.java @@ -0,0 +1,15 @@ +package com.codeup.adlister.util; + +import org.mindrot.jbcrypt.BCrypt; + +public class Password { + private static final int ROUNDS = 12; + + public static String hash(String password) { + return BCrypt.hashpw(password, BCrypt.gensalt(ROUNDS)); + } + + public static boolean check(String password, String hash) { + return BCrypt.checkpw(password, hash); + } +} diff --git a/src/main/java/db/migration.sql b/src/main/java/db/migration.sql new file mode 100644 index 0000000000..e033647e92 --- /dev/null +++ b/src/main/java/db/migration.sql @@ -0,0 +1,32 @@ +DROP DATABASE IF EXISTS sa_lister_db; +CREATE DATABASE IF NOT EXISTS sa_lister_db; + +USE sa_lister_db; + +CREATE TABLE IF NOT EXISTS users ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL, + username VARCHAR(50) NOT NULL, + email VARCHAR(50) NOT NULL, + password VARCHAR(255) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS categories ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL, + category VARCHAR(50) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS ads ( + id INT UNSIGNED AUTO_INCREMENT NOT NULL, + user_id INT UNSIGNED NOT NULL, + cat_id INT UNSIGNED NOT NULL, + title VARCHAR(100) NOT NULL, + description TEXT NOT NULL, + location VARCHAR(100) NOT NULL, + reputation INT, + PRIMARY KEY (id), + FOREIGN KEY (user_id) REFERENCES users(id), + FOREIGN KEY (cat_id) REFERENCES categories(id) +); + diff --git a/src/main/java/db/seeder.sql b/src/main/java/db/seeder.sql new file mode 100644 index 0000000000..5135070b17 --- /dev/null +++ b/src/main/java/db/seeder.sql @@ -0,0 +1,20 @@ +USE sa_lister_db; + +INSERT INTO users (username, email, password) +VALUES ('Chris', 'chris@email.com', '$2a$12$PR.9ruxGJVsOfOGHCIYzl.JyA2CCxhMJXsosr2GTRM0exQPej3H/O'), + ('Sam', 'sam@email.com', '$2a$12$PR.9ruxGJVsOfOGHCIYzl.JyA2CCxhMJXsosr2GTRM0exQPej3H/O'), + ('Nathan', 'nathan@email.com', '$2a$12$PR.9ruxGJVsOfOGHCIYzl.JyA2CCxhMJXsosr2GTRM0exQPej3H/O'); + +INSERT INTO categories (category) +VALUES ('restaurant'), + ('history'), + ('outdoors'), + ('family'), + ('etc'); + +INSERT INTO ads (user_id, cat_id, title, description, location, reputation) +VALUES ('1', '1', 'Bunz', 'Local burger restaraunt with some of the best burgers in town.', '122 E Houston St, San Antonio, TX 78205', 0), + ('1', '2', 'Witte Museum', 'The Witte Museum was established in 1926 and is located in Brackenridge Park in San Antonio, Texas. It is dedicated to telling the stories of Texas, from prehistory to the present.', '3801 Broadway, San Antonio, TX 78209', 0), + ('2', '3', 'McAllister Park', 'Park located on the north side of San Antonio that is comprised of 713 acres. It is great for walking, biking, and even has a dog park.', '13102 Jones Maltsberger Rd, San Antonio, TX 78247', 0), + ('3', '4', 'Pearl Brewery', 'The Pearl San Antonio is a district in the city with a rich history. Initially home to the Pearl Brewery, which operated from 1883 to 2001, the Pearl district offers shops, a twice-weekly farmers market, restaurants, apartments, an outdoor park area, the Culinary Institute of America, and the Hotel Emma.', 'The, Pearl Pkwy, San Antonio, TX 78215', 0), + ('3', '5', 'Codeup', 'San Antonio''s premier coding academy.', '600 Navarro St #600, San Antonio, TX 78205', 0); 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..cc847ff3b8 --- /dev/null +++ b/src/main/webapp/WEB-INF/ads/create.jsp @@ -0,0 +1,41 @@ +<%@ 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..75ee0c55f6 --- /dev/null +++ b/src/main/webapp/WEB-INF/ads/index.jsp @@ -0,0 +1,51 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + + +
+ +
+
+
+ + + + + + + + + + + + + + +

Etc

+
+
+

${ad.title}

+
+
+

${ad.description}

+
+ +

${ad.reputation} Users like this

+
+
+
${ad.location}
+
+
+
+
+ + + + diff --git a/src/main/webapp/WEB-INF/login.jsp b/src/main/webapp/WEB-INF/login.jsp new file mode 100644 index 0000000000..2b41aa4bd8 --- /dev/null +++ b/src/main/webapp/WEB-INF/login.jsp @@ -0,0 +1,27 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + +
+

Please Log In

+
+
+ + +
+
+ + +
+ +
+
+ + + + diff --git a/src/main/webapp/WEB-INF/partials/footer.jsp b/src/main/webapp/WEB-INF/partials/footer.jsp new file mode 100644 index 0000000000..1d0e81dd3f --- /dev/null +++ b/src/main/webapp/WEB-INF/partials/footer.jsp @@ -0,0 +1,104 @@ + +
+
+
+ Check out our ads by category: +
+
+
+ + +
+
+ +

Restaurants

+
+
+ +

History

+
+
+ +

Outdoors

+
+
+ +

Family

+
+
+ +

Etc.

+
+
+ +
+ + +
+
+ +
+ +
+ +
+ San Antonio Lister +
+

+ SA Lister is your go-to resource dedicated to finding things to do in San Antonio! Search for specific things to do, or browse our list of ads by category. San Antonio has no shortage of fun activities for solo adventurers, romantic date spots, and wholesome family activities. +

+
+ + + +
+ +
+ Useful links +
+

+ + Maps +

+

+ + Food Stops +

+

+ + Hotel Rooms +

+

+ + Get a Ride +

+
+ + + +
+ +
+ Developers +
+ + Chris Berry +

+

Sam Arguello

+

Nate Haustveit

+
+ +
+ +
+
+ + + +
+ © 2022 Copyright: + SA-Lister +
+ +
\ No newline at end of file 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..cf0f50e9e5 --- /dev/null +++ b/src/main/webapp/WEB-INF/partials/head.jsp @@ -0,0 +1,4 @@ +${param.title} + + + \ No newline at end of file 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..065def34b9 --- /dev/null +++ b/src/main/webapp/WEB-INF/partials/navbar.jsp @@ -0,0 +1,91 @@ +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + Navbar +<%-- icons--%> + +<%-- bootstrap--%> + + + + +
+ + + + +
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/profile.jsp b/src/main/webapp/WEB-INF/profile.jsp new file mode 100644 index 0000000000..0f3deb6ef9 --- /dev/null +++ b/src/main/webapp/WEB-INF/profile.jsp @@ -0,0 +1,89 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + + + + + +
+

Welcome, ${sessionScope.user.username}!

+
+ +
+

Here Are all your ads!

+
+ + + +
+
+
+ + + + + + + + + + + + + + +

Etc

+
+
+ +

${ad.title}

+
+
+

${ad.description}

+
+
${ad.location}
+ +
+
+ + +
+
+ + +
+ <%--
--%> +
+ + +
+ <%--
--%> +
+ + +
+ + +
+
+
+
+
+ + + + + + + + diff --git a/src/main/webapp/WEB-INF/register.jsp b/src/main/webapp/WEB-INF/register.jsp new file mode 100644 index 0000000000..f34b8a8d49 --- /dev/null +++ b/src/main/webapp/WEB-INF/register.jsp @@ -0,0 +1,35 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + +
+

Please fill in your information.

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

Edit Account Information for ${sessionScope.user.username}

+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ + +
+ + + + diff --git a/src/main/webapp/css/style.css b/src/main/webapp/css/style.css new file mode 100644 index 0000000000..3dcff94f87 --- /dev/null +++ b/src/main/webapp/css/style.css @@ -0,0 +1,4 @@ +.text-style { + font-size: 14px; + +} diff --git a/src/main/webapp/img/1404HK-header_san_antonio_6-original-2507402688.jpg b/src/main/webapp/img/1404HK-header_san_antonio_6-original-2507402688.jpg new file mode 100644 index 0000000000..28086b43b1 Binary files /dev/null and b/src/main/webapp/img/1404HK-header_san_antonio_6-original-2507402688.jpg differ diff --git a/src/main/webapp/img/san_antonio_fish.jpg b/src/main/webapp/img/san_antonio_fish.jpg new file mode 100644 index 0000000000..b9da3595ff Binary files /dev/null and b/src/main/webapp/img/san_antonio_fish.jpg differ diff --git a/src/main/webapp/img/sanantonioattractions.jpeg b/src/main/webapp/img/sanantonioattractions.jpeg new file mode 100644 index 0000000000..8715f44667 Binary files /dev/null and b/src/main/webapp/img/sanantonioattractions.jpeg differ diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 0000000000..f58e3983f1 --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,45 @@ + +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + + + + + + + + + + +
+

Welcome to SA-lister!

+
+ + + +