Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
bc7e559
add and include html template partials
zgulde Dec 2, 2016
2dc9ea2
add login and profile jsps
zgulde Dec 5, 2016
34bd264
check credentials when form is submitted
zgulde Dec 5, 2016
3604f19
add Ads interface and DAO implementation
zgulde Dec 2, 2016
f911119
show profile page from servlet
zgulde Dec 6, 2016
b034c36
move credential validation to servlet
zgulde Dec 6, 2016
1d22d9c
show all ads on ads index page
zgulde Dec 2, 2016
abc5b15
track login status
zgulde Dec 6, 2016
7b547d5
remove jsps from direct public access
zgulde Dec 7, 2016
a3fef90
insert ads in list dao
zgulde Dec 8, 2016
7293272
ad creation functionality
zgulde Dec 8, 2016
a20fe81
add mysql driver dependency
zgulde Dec 8, 2016
a7c1361
add migration script
zgulde Dec 6, 2016
70f7bd8
implement mysql ads dao
zgulde Dec 8, 2016
8e52d36
split project into packages
zgulde Dec 9, 2016
b4e9485
move configuration to external class
zgulde Dec 8, 2016
ed7b626
add users interface and model
zgulde Dec 9, 2016
fa01b25
plan out backend logic for user creation + login
zgulde Dec 9, 2016
844d3cd
use prepared statements for ad creation
zgulde Dec 9, 2016
66260b8
implement mysql users dao
zgulde Dec 9, 2016
ed6be17
add registration form
zgulde Dec 9, 2016
dbd48dd
persist users to database after registration
zgulde Dec 9, 2016
32c5dd5
check user credentials against database records
zgulde Dec 9, 2016
7a0c40f
store logged in user in the session
zgulde Dec 9, 2016
3aae064
add bcrypt dependency
zgulde Dec 9, 2016
35c03c6
add password utility class
zgulde Dec 9, 2016
84ca652
hash passwords
zgulde Dec 9, 2016
7249672
verify password hashes when logging in
zgulde Dec 9, 2016
f32e5ef
only allow ad creation if a user is logged in
zgulde Dec 9, 2016
89bdba8
feat: add readme file
fmendozaro Oct 28, 2019
b08955b
new name
Boryana1 Jun 15, 2022
3e44b5d
test
Boryana1 Jun 15, 2022
7418907
Merge pull request #2 from Boryana1/master
Boryana1 Jun 15, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
*.iml
target/
.idea/
Config.java
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Finish Up your Adlister

Follow the instructions and suggestions in [here](https://java.codeup.com/java-iii/finish-the-adlister)

## Final branch

Use this master branch as a base for your future features, this branch already has all the necessary code implemented up to the lesson on passwords including it's solution.

You might have to change the default branch in your own fork so you can have the master branch as the the default and merge your contributions into it.
22 changes: 22 additions & 0 deletions migration.sql
Original file line number Diff line number Diff line change
@@ -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
);
10 changes: 10 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@
</build>

<dependencies>
<dependency>
<groupId>org.mindrot</groupId>
<artifactId>jbcrypt</artifactId>
<version>0.3m</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
Expand All @@ -34,6 +39,11 @@
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.5</version>
</dependency>
</dependencies>

</project>
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
import java.io.IOException;

@WebServlet(name = "HelloWorldServlet", urlPatterns = "/")
public class HelloWorldServlet extends HttpServlet {
public class HelloWorldServlet1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
// response.getWriter().println("<h1>Hello, World!</h1>");
// response.getWriter().println("<h1>Hello, World!</h1>");
request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
18 changes: 18 additions & 0 deletions src/main/java/com/codeup/adlister/controllers/AdsIndexServlet.java
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
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 = "CounterServlet", urlPatterns = "/count")
@WebServlet(name = "controllers.CounterServlet", urlPatterns = "/count")
public class CounterServlet extends HttpServlet {
private int counter = 0;

Expand Down
35 changes: 35 additions & 0 deletions src/main/java/com/codeup/adlister/controllers/CreateAdServlet.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
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(name = "controllers.CreateAdServlet", urlPatterns = "/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(),
request.getParameter("title"),
request.getParameter("description")
);
DaoFactory.getAdsDao().insert(ad);
response.sendRedirect("/ads");
}
}
Original file line number Diff line number Diff line change
@@ -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("<h1>Hello, World!</h1>");
}
}
43 changes: 43 additions & 0 deletions src/main/java/com/codeup/adlister/controllers/LoginServlet.java
Original file line number Diff line number Diff line change
@@ -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");
}
}
}
16 changes: 16 additions & 0 deletions src/main/java/com/codeup/adlister/controllers/LogoutServlet.java
Original file line number Diff line number Diff line change
@@ -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");
}
}
41 changes: 41 additions & 0 deletions src/main/java/com/codeup/adlister/controllers/RegisterServlet.java
Original file line number Diff line number Diff line change
@@ -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");
}
}
Original file line number Diff line number Diff line change
@@ -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);
}
}
12 changes: 12 additions & 0 deletions src/main/java/com/codeup/adlister/dao/Ads.java
Original file line number Diff line number Diff line change
@@ -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<Ad> all();
// insert a new ad and return the new ad's id
Long insert(Ad ad);
}
21 changes: 21 additions & 0 deletions src/main/java/com/codeup/adlister/dao/DaoFactory.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.codeup.adlister.dao;

public class DaoFactory {
private static Ads adsDao;
private static Users usersDao;
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;
}
}
58 changes: 58 additions & 0 deletions src/main/java/com/codeup/adlister/dao/ListAdsDao.java
Original file line number Diff line number Diff line change
@@ -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<Ad> ads;

public List<Ad> 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<Ad> generateAds() {
List<Ad> 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;
}
}
Loading