Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
4ff3530
Initial changes for sprint 2 sign in and main menu functionality, inc…
snowcycle Jan 11, 2020
5b50dda
Update datasource url so local machines can access database while run…
jacksonb-cs Feb 16, 2021
a808f68
Update .project
fxnggg Feb 16, 2021
a8b2cc9
application.properties: Allows local instance of website to access re…
jacksonb-cs Feb 25, 2021
497eefd
Adds new sign in page made by Jackie (no routing yet)
jacksonb-cs Feb 28, 2021
ece30c4
Landing page is now the Sign In page. Product listings now accessible…
jacksonb-cs Mar 2, 2021
dee6349
Created form for sign in and created a test route to the main menu (/…
jacksonb-cs Mar 2, 2021
e092212
Merge pull request #1 from SMS-Store/SignInRouting
jacksonb-cs Mar 2, 2021
fe178bc
Final small changes before mergin with Sprint2Starter. Need to merge …
jacksonb-cs Mar 2, 2021
2876cb6
Merge pull request #2 from SMS-Store/Sprint2SignIn
jacksonb-cs Mar 2, 2021
b1e7cef
Add navigation buttons for main menu and custom CSS
fxnggg Mar 2, 2021
ff64480
Functionality implemented on buttons and added CSS for hovering over …
fxnggg Mar 2, 2021
91c9dca
Merge branch 'Sprint2SignIn' of github.com:SMS-Store/RegisterApp-Java…
jacksonb-cs Mar 3, 2021
cb38233
Exclude .iml files.
jacksonb-cs Mar 3, 2021
21b595c
ActiveEmployeeExistsQuery.java class complete. Cleaned up SignInRoute…
jacksonb-cs Mar 3, 2021
4aa8ea7
Task 3 COMPLETE!
jacksonb-cs Mar 3, 2021
74b7a8d
Add EmployeeSignIn object parameter
fxnggg Mar 4, 2021
e97da03
Create method to validate sign in
fxnggg Mar 4, 2021
aa2bc34
Completed the EmployeeSignInCommand.java class.
jacksonb-cs Mar 4, 2021
eb023fa
Added EMPTY employeeDetail.html. Added ActiveUserDeleteCommand.java (…
jacksonb-cs Mar 4, 2021
9ea0252
Update SignInRestController.java
EvanPerez777 Mar 5, 2021
08bddbc
Update ActiveUserDeleteCommand.java
EvanPerez777 Mar 5, 2021
d48642e
Sign in works. Still need to add error message for invalid login info…
jacksonb-cs Mar 5, 2021
ed4e637
Fixed ActiveUserDeleteCommand and related calls.
jacksonb-cs Mar 5, 2021
69cf904
Invalid login now shows error. 'Active' value in employee table now u…
jacksonb-cs Mar 5, 2021
02f245b
Sign out functionality is now totally complete (had a bug before).
jacksonb-cs Mar 5, 2021
37fc549
I think the main menu route controller checks for user elevation now.
jacksonb-cs Mar 5, 2021
0564f07
Hide button from users that aren't elevated users
fxnggg Mar 6, 2021
7f26b17
Changed isEmpty() to !isPresent()
fxnggg Mar 6, 2021
88ecac4
Layout of form with some more CSS, NO FUNCTIONALITY YET
fxnggg Mar 6, 2021
a6c8df2
Add signout button to remaining pages
fxnggg Mar 6, 2021
4d76765
Create Sign-Out.png
Jphrak Mar 6, 2021
a94c7bc
CSS
fxnggg Mar 6, 2021
8efea16
New employee functionality.
jacksonb-cs Mar 6, 2021
441853b
Merge branch 'Sprint2Starter' of github.com:SMS-Store/RegisterApp-Jav…
jacksonb-cs Mar 6, 2021
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
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ HELP.md
mvnw
mvnw.cmd
target/

# Ingore intelliJ generated module settings files
*.iml
11 changes: 11 additions & 0 deletions .project
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,15 @@
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
<filteredResources>
<filter>
<id>1613507358663</id>
<name></name>
<type>30</type>
<matcher>
<id>org.eclipse.core.resources.regexFilterMatcher</id>
<arguments>node_modules|.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
</matcher>
</filter>
</filteredResources>
</projectDescription>
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ The application defaults to port 8080.

To start from the IDE press F5 to run. This will open the debug and run view. You will need to create a launch configuration which Visual Studio Code will help you with.

# Landing page (list available products)
`https://uarkregappjava.herokuapp.com/`
# Landing page
`https://team-sms-store.herokuapp.com/`
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package edu.uark.registerapp.commands.activeUsers;

import java.util.Optional;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import edu.uark.registerapp.commands.VoidCommandInterface;
import edu.uark.registerapp.models.entities.ActiveUserEntity;
import edu.uark.registerapp.models.entities.EmployeeEntity;
import edu.uark.registerapp.models.repositories.ActiveUserRepository;
import edu.uark.registerapp.models.repositories.EmployeeRepository;

@Service
public class ActiveUserDeleteCommand implements VoidCommandInterface {

private String sessionKey;
private ActiveUserRepository activeUserRepository;
private EmployeeRepository employeeRepository;

public ActiveUserDeleteCommand(
String sessionKey,
ActiveUserRepository activeUserRepository,
EmployeeRepository employeeRepository)
{
this.sessionKey = sessionKey;
this.activeUserRepository = activeUserRepository;
this.employeeRepository = employeeRepository;
}

public ActiveUserDeleteCommand()
{
this.sessionKey = "";
}

@Override
@Transactional
public void execute()
{
if (activeUserRepository == null)
{
return;
}

final Optional<ActiveUserEntity> activeUserEntity =
this.activeUserRepository.findBySessionKey(this.sessionKey);

if (activeUserEntity.isPresent()) // Found active user
{
if (employeeRepository != null)
{
Optional<EmployeeEntity> employee =
employeeRepository.findById(activeUserEntity.get().getEmployeeId());

if (employee.isPresent()) // Found corresponding entry in 'employee' table
{
employee.get().setIsActive(false);
employeeRepository.save(employee.get());
}
}

this.activeUserRepository.delete(activeUserEntity.get());
}
}

public String getSessionKey()
{
return this.sessionKey;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package edu.uark.registerapp.commands.employees;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import edu.uark.registerapp.models.repositories.EmployeeRepository;
import edu.uark.registerapp.commands.exceptions.NotFoundException;

@Service
public class ActiveEmployeeExistsQuery {
public void execute()
{
final Boolean activeEmployeeExists =
this.employeeRepository.existsByIsActive(true);

if (!activeEmployeeExists)
{
throw new NotFoundException("Employee");
}
}

@Autowired
private EmployeeRepository employeeRepository;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
package edu.uark.registerapp.commands.employees;

import java.util.Optional;
import java.util.Arrays;

import org.apache.commons.lang3.StringUtils;

import javax.transaction.Transactional;

import edu.uark.registerapp.models.api.EmployeeSignIn;
import edu.uark.registerapp.models.entities.ActiveUserEntity;
import edu.uark.registerapp.models.entities.EmployeeEntity;
import edu.uark.registerapp.models.repositories.ActiveUserRepository;
import edu.uark.registerapp.models.repositories.EmployeeRepository;


public class EmployeeSignInCommand {

private EmployeeSignIn employeeSignIn;
private String sessionKey;

public EmployeeSignInCommand(EmployeeSignIn employeeSignIn, String sessionKey)
{
this.employeeSignIn = employeeSignIn;
this.sessionKey = sessionKey;
}

EmployeeSignInCommand()
{
this.employeeSignIn = new EmployeeSignIn();
this.sessionKey = "";
}

@Transactional
public boolean execute()
{
if (!validateSignIn()) // Credentials are invalid
return false;

Optional<EmployeeEntity> employee = // Finds employee by employee ID
employeeRepository.findByEmployeeId(
Integer.parseInt(employeeSignIn.getId()));

if (!employee.isPresent()) // Employee does not exist
return false;

if (!Arrays.equals( // Passwords do NOT match
employeeSignIn.getPassword().getBytes(),
employee.get().getPassword()))
{
return false;
}

// NOTE: At this point, we have a valid sign in

Optional<ActiveUserEntity> activeUser = // Finds active user by UUID
activeUserRepository.findByEmployeeId(employee.get().getId());

if (activeUser.isPresent()) // Updates existing active user's session key
{
ActiveUserEntity user = activeUser.get().setSessionKey(sessionKey);
activeUserRepository.save(user);
}
else // Creates new active user
{
ActiveUserEntity user = new ActiveUserEntity();

user.setClassification(employee.get().getClassification());

// Create full name then set active user name
String employeeName = employee.get().getFirstName();
employeeName.concat(" ").concat(employee.get().getLastName());

user.setName(employeeName);

user.setEmployeeId(employee.get().getId());
user.setSessionKey(sessionKey);

// New active user entry - complete
activeUserRepository.save(user);

// Update 'active' column on employee table to true
employee.get().setIsActive(true);
employeeRepository.save(employee.get());
}

return true;
}

private boolean validateSignIn()
{
String employeeId = employeeSignIn.getId();

if (StringUtils.isBlank(employeeId) || employeeId.length() > 5)
{
return false;
}

for (int i = 0; i < employeeId.length(); i++)
{
if(!(employeeId.charAt(i) >= '0' && employeeId.charAt(i) <= '9'))
{
return false;
}
}

if(StringUtils.isBlank(employeeSignIn.getPassword()))
{
return false;
}

return true;
}

/*
ONLY CALLED BY SignInRouteController
PROBABLY A BAD WAY TO DO THIS
I think @Autowired doesn't work because this class is not a controller...
...hence SignInRouteController setting this property
*/
public void setEmployeeRepository(EmployeeRepository employeeRepository)
{
this.employeeRepository = employeeRepository;
}

// THIS IS ALSO PROBABLY BAD FOR THE SAME REASON AS ABOVE
public void setActiveUserRepository(ActiveUserRepository activeUserRepository)
{
this.activeUserRepository = activeUserRepository;
}

private EmployeeRepository employeeRepository;
private ActiveUserRepository activeUserRepository;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package edu.uark.registerapp.controllers;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;

import edu.uark.registerapp.controllers.enums.ViewNames;
import edu.uark.registerapp.models.entities.EmployeeEntity;
import edu.uark.registerapp.models.repositories.EmployeeRepository;

@Controller
@RequestMapping(value = "/employeeDetail")
public class EmployeeDetailRouteController extends BaseRouteController {
@RequestMapping(method = RequestMethod.GET)
public ModelAndView showEmployeeDetail()
{
return new ModelAndView(ViewNames.EMPLOYEE_DETAIL.getViewName());
}

@RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public ModelAndView makeNewEmployee(
EmployeeEntity employee,
HttpServletRequest request
)
{
employee = new EmployeeEntity();

employee.setFirstName(request.getParameter("firstname"));
employee.setLastName(request.getParameter("lastname"));
employee.setPassword(request.getParameter("password").getBytes());
employee.setClassification(Integer.parseInt(
request.getParameter("classification")));

employeeRepository.save(employee);

if (this.employeeRepository.count() == 1)
{
ModelAndView modelAndView = new ModelAndView(
REDIRECT_PREPEND.concat(ViewNames.SIGN_IN.getRoute()));

modelAndView.addObject("Method", "GET");

return modelAndView;
}
else
return new ModelAndView(ViewNames.EMPLOYEE_DETAIL.getViewName());

//return new ModelAndView(ViewNames.EMPLOYEE_DETAIL.getViewName());
}

@Autowired
EmployeeRepository employeeRepository;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package edu.uark.registerapp.controllers;

import java.util.Map;
import java.util.Optional;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;

import edu.uark.registerapp.controllers.enums.ViewModelNames;
import edu.uark.registerapp.controllers.enums.ViewNames;
import edu.uark.registerapp.models.entities.ActiveUserEntity;
import edu.uark.registerapp.models.enums.EmployeeClassification;

@Controller
@RequestMapping(value = "/mainMenu")
public class MainMenuRouteController extends BaseRouteController {

@RequestMapping(method = RequestMethod.GET)
public ModelAndView start(
@RequestParam final Map<String, String> queryParameters,
final HttpServletRequest request
) {

final Optional<ActiveUserEntity> activeUserEntity =
this.getCurrentUser(request);
if (!activeUserEntity.isPresent()) {
return this.buildInvalidSessionResponse();
}

ModelAndView modelAndView =
this.setErrorMessageFromQueryString(
new ModelAndView(ViewNames.MAIN_MENU.getViewName()),
queryParameters);

// Check if user is any kind of manager
if (EmployeeClassification.isElevatedUser(
activeUserEntity.get().getClassification()))
{
modelAndView.addObject(
ViewModelNames.IS_ELEVATED_USER.getValue(), true);
}
else
{
modelAndView.addObject(
ViewModelNames.IS_ELEVATED_USER.getValue(), false);
}

return modelAndView;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
import edu.uark.registerapp.models.api.Product;

@Controller
@RequestMapping(value = "/")
@RequestMapping(value = "/productListing")
public class ProductListingRouteController {
@RequestMapping(method = RequestMethod.GET)
public ModelAndView showProductListing() {
Expand Down
Loading