Skip to content
Snippets Groups Projects
Commit d4d5088b authored by Connor Brock's avatar Connor Brock
Browse files

Merge remote-tracking branch 'origin/main' into...

Merge remote-tracking branch 'origin/main' into 80-as-a-convenience-enthusiast-i-want-a-drop-down-menu-to-be-able-to-quickly-scan-qr-codes-i-find

# Conflicts:
#	src/main/java/Team5/SmartTowns/landmarks/Landmarks.java
parents 250d0337 6a4491e8
No related branches found
No related tags found
1 merge request!41Resolve "As a convenience enthusiast, I want a drop down menu to be able to quickly scan QR codes I find along my dragon trail so that I may continue on my adventure without disruption."
Showing
with 419 additions and 116 deletions
...@@ -27,7 +27,8 @@ dependencies { ...@@ -27,7 +27,8 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-jdbc' implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.mariadb.jdbc:mariadb-java-client:2.1.2' implementation 'org.mariadb.jdbc:mariadb-java-client:2.1.2'
testImplementation 'junit:junit:4.13.1' implementation 'org.springframework.boot:spring-boot-starter-security'
testImplementation 'junit:junit:4.13.1'
compileOnly 'org.projectlombok:lombok' compileOnly 'org.projectlombok:lombok'
testImplementation 'org.projectlombok:lombok:1.18.28' testImplementation 'org.projectlombok:lombok:1.18.28'
compileOnly 'org.projectlombok:lombok' compileOnly 'org.projectlombok:lombok'
...@@ -35,6 +36,8 @@ dependencies { ...@@ -35,6 +36,8 @@ dependencies {
annotationProcessor 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test' testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity6:3.1.1.RELEASE'
// https://mvnrepository.com/artifact/org.webjars/openlayers // https://mvnrepository.com/artifact/org.webjars/openlayers
implementation group: 'org.webjars', name: 'openlayers', version: '5.2.0' implementation group: 'org.webjars', name: 'openlayers', version: '5.2.0'
} }
...@@ -42,6 +45,9 @@ dependencies { ...@@ -42,6 +45,9 @@ dependencies {
tasks.named('bootBuildImage') { tasks.named('bootBuildImage') {
builder = 'paketobuildpacks/builder-jammy-base:latest' builder = 'paketobuildpacks/builder-jammy-base:latest'
} }
test {
useJUnitPlatform()
}
tasks.named('test') { tasks.named('test') {
useJUnitPlatform() useJUnitPlatform()
......
...@@ -11,7 +11,7 @@ public class Location { ...@@ -11,7 +11,7 @@ public class Location {
private String locationEmail; private String locationEmail;
private String locationDescription; private String locationDescription;
private String locationPlace; private String locationPlace;
private int locationTrailID; private String locationTrailID;
private boolean locationApproved; private boolean locationApproved;
...@@ -47,11 +47,36 @@ public class Location { ...@@ -47,11 +47,36 @@ public class Location {
return locationPlace; return locationPlace;
} }
public int getLocationTrailID() { public String getLocationTrailID() {
return locationTrailID; return locationTrailID;
} }
public boolean isLocationApproved() { public boolean isLocationApproved() {
return locationApproved; return locationApproved;
} }
public void setLocationName(String locationName) {
this.locationName = locationName;
}
public void setLocationEmail(String locationEmail) {
this.locationEmail = locationEmail;
}
public void setLocationDescription(String locationDescription) {
this.locationDescription = locationDescription;
}
public void setLocationPlace(String locationPlace) {
this.locationPlace = locationPlace;
}
public void setLocationTrailID(String locationTrailID) {
this.locationTrailID = locationTrailID;
}
public void setLocationApproved(boolean locationApproved) {
this.locationApproved = locationApproved;
}
} }
...@@ -9,11 +9,11 @@ public interface LocationRepository { ...@@ -9,11 +9,11 @@ public interface LocationRepository {
void addLocation(Location loc); void addLocation(Location loc);
List<Location> getApprovedLocations(); List<Location> getAllApprovedLocations();
// List<Location> getApprovedLocations2(List<Location> list); // List<Location> getApprovedLocations2(List<Location> list);
List<Location> getUnapprovedLocations(); List<Location> getAllUnapprovedLocations();
// List<Location> approvedLocations(); // List<Location> approvedLocations();
......
...@@ -33,7 +33,7 @@ public class LocationRepositoryJDBC implements LocationRepository { ...@@ -33,7 +33,7 @@ public class LocationRepositoryJDBC implements LocationRepository {
rs.getString("locationEmail"), rs.getString("locationEmail"),
rs.getString("locationDescription"), rs.getString("locationDescription"),
rs.getString("locationPlace"), rs.getString("locationPlace"),
rs.getInt("locationTrailID"), rs.getString("locationTrailID"),
rs.getBoolean("locationApproved") rs.getBoolean("locationApproved")
); );
} }
...@@ -52,24 +52,50 @@ public class LocationRepositoryJDBC implements LocationRepository { ...@@ -52,24 +52,50 @@ public class LocationRepositoryJDBC implements LocationRepository {
// this.locationMapper = locationMapper; // this.locationMapper = locationMapper;
// } // }
@Override
public List<Location> getAllApprovedLocations(){
String sql= "SELECT * FROM locations";
List<Location> lis = jdbc.query(sql, locationMapper);
List<Location> lisFiltered = new ArrayList<>();
for (Location li : lis){
if (li.isLocationApproved()){
lisFiltered.add(li);
}
}
return lisFiltered;
}
@Override
public List<Location> getAllUnapprovedLocations(){
String sql= "SELECT * FROM locations";
List<Location> lis = jdbc.query(sql, locationMapper);
List<Location> lisFiltered = new ArrayList<>();
for (Location li : lis){
if (!li.isLocationApproved()){
lisFiltered.add(li);
}
}
return lisFiltered;
}
@Override // intended implementation at current: user data from templates/Landmarks/LandmarkFormTh.html is added to the Location table @Override // intended implementation at current: user data from templates/Landmarks/LandmarkFormTh.html is added to the Location table
public void addLocation(Location loc) { public void addLocation(Location loc) {
String sql = "insert into locations( locationName , locationEmail,locationDescription,locationPlace, locationTrailID, locationApproved) values (?,?,?,?,?,?)"; String sql = "insert into locations( locationName , locationEmail,locationDescription,locationPlace, locationTrailID, locationApproved) values (?,?,?,?,?,?)";
jdbc.update(sql,loc.getLocationName(),loc.getLocationEmail(),loc.getLocationDescription(),loc.getLocationPlace(),loc.getLocationTrailID()); jdbc.update(sql,loc.getLocationName(),loc.getLocationEmail(),loc.getLocationDescription(),loc.getLocationPlace(),loc.getLocationTrailID(), false);
} }
@Override // @Override
public List<Location> getApprovedLocations(){ // public List<Location> getApprovedLocations(){
JdbcTemplate jdbc = new JdbcTemplate(); // JdbcTemplate jdbc = new JdbcTemplate();
List<Location> locations = new LocationRepositoryJDBC(jdbc).getAllLocation(); // List<Location> locations = new LocationRepositoryJDBC(jdbc).getAllLocation();
List<Location> locationApprovalList= new ArrayList<Location>(); // List<Location> locationApprovalList= new ArrayList<Location>();
for (Location loc :locations){ // for (Location loc :locations){
if (loc.isLocationApproved()) { // if (loc.isLocationApproved()) {
locationApprovalList.add(loc); // locationApprovalList.add(loc);
} // }
} return locationApprovalList; // } return locationApprovalList;
} // }
// //
// @Override // @Override
// public List<Location> getApprovedLocations2(List<Location> list){ // public List<Location> getApprovedLocations2(List<Location> list){
...@@ -84,16 +110,16 @@ public class LocationRepositoryJDBC implements LocationRepository { ...@@ -84,16 +110,16 @@ public class LocationRepositoryJDBC implements LocationRepository {
// //
@Override // @Override
public List<Location> getUnapprovedLocations(){ // public List<Location> getUnapprovedLocations(){
List<Location> locations = getAllLocation(); // List<Location> locations = getAllLocation();
List<Location> locationUnapprovedList= new ArrayList<Location>(); // List<Location> locationUnapprovedList= new ArrayList<Location>();
for (Location loc :locations){ // for (Location loc :locations){
if (!loc.isLocationApproved()) { // if (!loc.isLocationApproved()) {
locationUnapprovedList.add(loc); // locationUnapprovedList.add(loc);
} // }
} return locationUnapprovedList; // } return locationUnapprovedList;
} // }
// public JdbcTemplate getJdbc() { // public JdbcTemplate getJdbc() {
......
...@@ -7,7 +7,22 @@ import lombok.Data; ...@@ -7,7 +7,22 @@ import lombok.Data;
@Data @Data
@AllArgsConstructor @AllArgsConstructor
public class Trail { public class Trail {
private int trailsId; private String trailsId;
private String name; private String trailName;
private Boolean tru; private String trailNumber;
public String getTrailsId() {
return trailsId;
}
public String getTrailName() {
return trailName;
}
public String getTrailNumber() {
return trailNumber;
}
} }
...@@ -5,4 +5,5 @@ import java.util.List; ...@@ -5,4 +5,5 @@ import java.util.List;
public interface TrailsRepository { public interface TrailsRepository {
List<Trail> getAllTrails(); List<Trail> getAllTrails();
String getTrailNameWithID(String trailsID);
} }
...@@ -17,13 +17,23 @@ public class TrailsRepositoryJDBC implements TrailsRepository { ...@@ -17,13 +17,23 @@ public class TrailsRepositoryJDBC implements TrailsRepository {
} }
private void settrailsMapper(){ private void settrailsMapper(){
trailMapper = (rs, i) -> new Trail( trailMapper = (rs, i) -> new Trail(
rs.getInt("trailID"), rs.getString("trailID"),
rs.getString("name"), rs.getString("trailName"),
rs.getBoolean("tru") rs.getString("trailNumber")
); );
} }
public List<Trail> getAllTrails(){ public List<Trail> getAllTrails(){
String sql= "SELECT * FROM trails"; String sql= "SELECT * FROM trails";
return jdbc.query(sql, trailMapper); return jdbc.query(sql, trailMapper);
} }
@Override
public String getTrailNameWithID(String trailsID){
String resultName = jdbc.queryForObject(
"SELECT trailName FROM trails WHERE trailID=?", String.class, trailsID);
return resultName;
}
} }
...@@ -12,7 +12,15 @@ import java.util.List; ...@@ -12,7 +12,15 @@ import java.util.List;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class Landmarks { public class Landmarks {
private Integer trailID;
// Initialized object to getID from trail.
//Predefined Landmark for Dragons Tale.
public static List<Landmarks> landmarksDragonstrail = List.of(
new Landmarks( 1, "A scent of...Dragon", "The Dragon has been spotted near by, find the QR code to continue" , "Start your discovery, at the sweet shop."),
new Landmarks( 2, "They've been found!", "Don't let them escape, find the next QR code to continue!", "Location test")
);
private String trailID;
private int landmarkID; private int landmarkID;
@NotEmpty(message = "You must type in a username.") @NotEmpty(message = "You must type in a username.")
private String landmarkName; private String landmarkName;
...@@ -23,6 +31,9 @@ public class Landmarks { ...@@ -23,6 +31,9 @@ public class Landmarks {
private String landmarkLocation; private String landmarkLocation;
private String landmarkPicture; private String landmarkPicture;
public static List<Landmarks> getLandmarksDragonstrail() {
return landmarksDragonstrail;
}
// Constructor for List above. // Constructor for List above.
public Landmarks( int landmarkID, String landmarkName, String landmarkDescription, String landmarkLocation) { public Landmarks( int landmarkID, String landmarkName, String landmarkDescription, String landmarkLocation) {
......
...@@ -38,7 +38,6 @@ public class LandmarksController { ...@@ -38,7 +38,6 @@ public class LandmarksController {
} else{ } else{
// converts valid response using Location constructor into a submittable format to the sql table // converts valid response using Location constructor into a submittable format to the sql table
Location loc= new Location(landmarks.getLandmarkName(), landmarks.getLandmarkEmail(), landmarks.getLandmarkDescription(), landmarks.getLandmarkLocation(), landmarks.getTrailID(), false); Location loc= new Location(landmarks.getLandmarkName(), landmarks.getLandmarkEmail(), landmarks.getLandmarkDescription(), landmarks.getLandmarkLocation(), landmarks.getTrailID(), false);
System.out.println(loc);
locationRepository.addLocation(loc); // adds valid landmark to locations table locationRepository.addLocation(loc); // adds valid landmark to locations table
ModelAndView modelAndView = new ModelAndView("redirect:/home"); ModelAndView modelAndView = new ModelAndView("redirect:/home");
return modelAndView; return modelAndView;
......
...@@ -92,16 +92,16 @@ public class LocationsCoordinates { ...@@ -92,16 +92,16 @@ public class LocationsCoordinates {
// JdbcTemplate jdbcSuper= new LocationRepositoryJDBC().getJdbc(); // JdbcTemplate jdbcSuper= new LocationRepositoryJDBC().getJdbc();
// return new LocationRepositoryJDBC(jdbcSuper).getApprovedLocations(); // return new LocationRepositoryJDBC(jdbcSuper).getApprovedLocations();
// } // }
//
public List<Location> getFullUnapprovedLocations(JdbcTemplate aJdbc){ // public List<Location> getFullUnapprovedLocations(JdbcTemplate aJdbc){
// LocationsCoordinates jdbcSuper= new LocationsCoordinates(aJdbc); //// LocationsCoordinates jdbcSuper= new LocationsCoordinates(aJdbc);
return new LocationRepositoryJDBC(aJdbc).getUnapprovedLocations(); // return new LocationRepositoryJDBC(aJdbc).getUnapprovedLocations();
} // }
/// Need a constructor to create a lcoations list, approved lcoatiosn lsit, unapproved lcoations list. /// Need a constructor to create a locations list, approved collation list, unapproved locations list.
......
...@@ -2,6 +2,9 @@ package Team5.SmartTowns.placeswithcoordinates; ...@@ -2,6 +2,9 @@ package Team5.SmartTowns.placeswithcoordinates;
import Team5.SmartTowns.data.Location; import Team5.SmartTowns.data.Location;
import Team5.SmartTowns.data.LocationRepository; import Team5.SmartTowns.data.LocationRepository;
import Team5.SmartTowns.data.Trail;
import Team5.SmartTowns.data.TrailsRepository;
import jakarta.validation.constraints.Max;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.ui.Model; import org.springframework.ui.Model;
...@@ -22,55 +25,91 @@ public class PlacesController { ...@@ -22,55 +25,91 @@ public class PlacesController {
@Autowired @Autowired
private LocationRepository locationRepo; private LocationRepository locationRepo;
@Autowired
private TrailsRepository trailsRepo;
@GetMapping("/checkpoints") @GetMapping("/checkpoints")
public ModelAndView getLocationPages(){ public ModelAndView getLocationPages(){
ModelAndView modelAndView = new ModelAndView("landmarks/locationPage.html"); ModelAndView modelAndView = new ModelAndView("landmarks/locationPage.html");
List<Location> locations = locationRepo.getAllLocation();
// List<Location> approvedLocations = locationRepo.getApprovedLocations2(locations);
List<LocationsCoordinates> locCoords = placeRepo.getAllLocationCoords(); List<LocationsCoordinates> locCoords = placeRepo.getAllLocationCoords();
List<Integer> locationIDIndex = new ArrayList<Integer>(); List<Location> approvedLocations = locationRepo.getAllApprovedLocations();
List<Location> locationCoordsWorkaround = new ArrayList<Location>();
for (LocationsCoordinates coord: locCoords){ modelAndView.addObject("location", approvedLocations);
locationIDIndex.add(coord.getLocationID()-1);
locationCoordsWorkaround.add(locations.get(coord.getLocationID()-1));
}
modelAndView.addObject("location", locationCoordsWorkaround);
modelAndView.addObject("locationCoords", locCoords); modelAndView.addObject("locationCoords", locCoords);
return modelAndView; return modelAndView;
} }
@RequestMapping(value="/location", method= RequestMethod.POST) @RequestMapping(value="/location", method= RequestMethod.POST)
public String sendHtmlFragment(Model map) { public String sendHtmlFragmentLocation(Model map) {
map.addAttribute("foo", "bar"); map.addAttribute("foo", "bar");
return "checkpoint/checkpoint"; return "checkpoint/checkpoint";
} }
@GetMapping("/checkpoints/{location}") @GetMapping("/checkpoints/{location}")
public ModelAndView getResultBySearchKey(@PathVariable String location) { public ModelAndView getResultBySearchKeyLocation(@PathVariable String location) {
List<Location> locations = locationRepo.getAllLocation();
List<LocationsCoordinates> locCoords = placeRepo.getAllLocationCoords(); List<LocationsCoordinates> locCoords = placeRepo.getAllLocationCoords();
List<Location> approvedLocations = locationRepo.getAllApprovedLocations();
List<Integer> locationIDIndex = new ArrayList<Integer>();
List<Location> locationCoordsWorkaround = new ArrayList<Location>();
int locationID = 999; int locationID = 999;
int workAroundID=0;// otherwise cases errors e.g. null used. 999 unlikely to be used so safe until then for (int i=0;i<approvedLocations.size();i++){
for (int i=0;i<locCoords.size();i++){ /// for loop iterating over coordinates table need to match coordinate index with lcoation index manually if ( (approvedLocations.get(i).getLocationName().replace(' ', '-').trim().equals(location)) ){
locationIDIndex.add(locCoords.get(i).getLocationID()-1); // gets location ID and therefore location list index number
locationCoordsWorkaround.add(locations.get(locCoords.get(i).getLocationID()-1));
if ( (locations.get(locCoords.get(i).getLocationID() - 1).getLocationName().replace(' ', '-').trim().equals(location)) ){
locationID= i; locationID= i;
break; }
} workAroundID++; }
}System.out.println(locationCoordsWorkaround);
System.out.println("ag"+locationID); String trailName=trailsRepo.getTrailNameWithID(approvedLocations.get(locationID).getLocationTrailID()).replace(' ', '-').trim();
ModelAndView modelAndView= new ModelAndView("fragments/locationPageFrags :: locationSection"); ModelAndView modelAndView= new ModelAndView("fragments/locationPageFrags :: locationSection");
System.out.println("ag"+locationID);
modelAndView.addObject("locCoord", locCoords.get(locationID)); modelAndView.addObject("locCoord", locCoords.get(locationID));
System.out.println("sd"+workAroundID); modelAndView.addObject("trail", trailName);
modelAndView.addObject("location", locationCoordsWorkaround.get(locationID)); modelAndView.addObject("location", approvedLocations.get(locationID));
return modelAndView;
}
/// Trail webpage mapping
@GetMapping("/trails")
public ModelAndView getTrailsPage(){
ModelAndView modelAndView = new ModelAndView("landmarks/trailsPage.html");
List<LocationsCoordinates> locCoords = placeRepo.getAllLocationCoords();
List<Location> approvedLocations = locationRepo.getAllApprovedLocations();
List<Trail> trailslocations = trailsRepo.getAllTrails();
List<Location> locationCoordsWorkaround = new ArrayList<Location>();
modelAndView.addObject("trails", trailslocations);
modelAndView.addObject("locations", approvedLocations);
modelAndView.addObject("locationCoords", locCoords);
return modelAndView;
}
@RequestMapping(value="/trail", method= RequestMethod.POST)
public String sendHtmlFragmentTrail(Model map) {
map.addAttribute("foo", "bar");
return "trail/trail";
}
@GetMapping("/trails/{trail}")
public ModelAndView getResultBySearchKeyTrails(@PathVariable String trail) {
List<LocationsCoordinates> locCoords = placeRepo.getAllLocationCoords();
List<Location> approvedLocations = locationRepo.getAllApprovedLocations();
List<Trail> trailslocations = trailsRepo.getAllTrails();
int trailID = 999;// otherwise cases errors e.g. null used. 999 unlikely to be used so safe until then
for (int i=0;i<trailslocations.size();i++){
if (trailslocations.get(i).getTrailName().replace(' ', '-').trim().equals(trail)){
trailID=i;
break;}
}
ModelAndView modelAndView= new ModelAndView("fragments/trailsPageFrags :: trailsSection");
modelAndView.addObject("trail", trailslocations.get(trailID));
modelAndView.addObject("locCoords", locCoords);
modelAndView.addObject("locations", approvedLocations);
return modelAndView; return modelAndView;
} }
......
...@@ -13,7 +13,7 @@ public interface PlacesCoordinatesRepository { ...@@ -13,7 +13,7 @@ public interface PlacesCoordinatesRepository {
List<TownWithTrails> getAllTownCoords(); List<TownWithTrails> getAllTownCoords();
void addTownWithCoords(TownWithTrails town); void addTownWithCoords(TownWithTrails town);
List<Location> getFullApprovedLocations(JdbcTemplate aJdbc); // List<Location> getFullApprovedLocations(JdbcTemplate aJdbc);
......
...@@ -53,6 +53,9 @@ public class PlacesCoordinatesRepositoryJDBC implements PlacesCoordinatesReposit ...@@ -53,6 +53,9 @@ public class PlacesCoordinatesRepositoryJDBC implements PlacesCoordinatesReposit
String sql= "SELECT * FROM locationCoordinates"; String sql= "SELECT * FROM locationCoordinates";
return jdbc.query(sql, locationCoordMapper); return jdbc.query(sql, locationCoordMapper);
} }
public List<TownWithTrails> getAllTownCoords(){ public List<TownWithTrails> getAllTownCoords(){
String sql= "SELECT * FROM townswithtrails"; String sql= "SELECT * FROM townswithtrails";
return jdbc.query(sql, townCoordMapper); return jdbc.query(sql, townCoordMapper);
...@@ -74,10 +77,10 @@ public class PlacesCoordinatesRepositoryJDBC implements PlacesCoordinatesReposit ...@@ -74,10 +77,10 @@ public class PlacesCoordinatesRepositoryJDBC implements PlacesCoordinatesReposit
} }
public List<Location> getFullApprovedLocations(JdbcTemplate aJdbc) { // public List<Location> getFullApprovedLocations(JdbcTemplate aJdbc) {
// LocationsCoordinates jdbcSuper= new LocationsCoordinates(aJdbc); //// LocationsCoordinates jdbcSuper= new LocationsCoordinates(aJdbc);
return new LocationRepositoryJDBC(aJdbc).getApprovedLocations(); // return new LocationRepositoryJDBC(aJdbc).getApprovedLocations();
} // }
// @Override //TODO CHECK // @Override //TODO CHECK
// public List<Location> getFullApprovedLocations(JdbcTemplate aJdbc) { // public List<Location> getFullApprovedLocations(JdbcTemplate aJdbc) {
......
...@@ -10,7 +10,6 @@ import java.util.List; ...@@ -10,7 +10,6 @@ import java.util.List;
@Repository @Repository
public class RewardsRepositoryJDBC implements RewardsRepository { public class RewardsRepositoryJDBC implements RewardsRepository {
private final JdbcTemplate jdbc; private final JdbcTemplate jdbc;
private RowMapper<Badge> badgeMapper;
private RowMapper<Sticker> stickerMapper; private RowMapper<Sticker> stickerMapper;
private RowMapper<Pack> packMapper; private RowMapper<Pack> packMapper;
...@@ -51,8 +50,8 @@ public class RewardsRepositoryJDBC implements RewardsRepository { ...@@ -51,8 +50,8 @@ public class RewardsRepositoryJDBC implements RewardsRepository {
@Override @Override
public List<Sticker> getAllStickersFromPack(int packID){ public List<Sticker> getAllStickersFromPack(int packID){
String sql= "SELECT * FROM stickers WHERE packID="+packID; String sql= "SELECT * FROM stickers WHERE packID=?";
return jdbc.query(sql, stickerMapper); return jdbc.query(sql, stickerMapper, packID);
} }
@Override @Override
...@@ -60,14 +59,14 @@ public class RewardsRepositoryJDBC implements RewardsRepository { ...@@ -60,14 +59,14 @@ public class RewardsRepositoryJDBC implements RewardsRepository {
/* FINDS ALL STICKERS UNLOCKED BY THE GIVEN USER */ /* FINDS ALL STICKERS UNLOCKED BY THE GIVEN USER */
String sql= "SELECT * FROM stickers LEFT JOIN stickerprogress " + String sql= "SELECT * FROM stickers LEFT JOIN stickerprogress " +
"ON (stickers.id, stickers.packID) = (stickerprogress.stickerID, stickerprogress.packID) " + "ON (stickers.id, stickers.packID) = (stickerprogress.stickerID, stickerprogress.packID) " +
"WHERE stickerprogress.userID="+userID; "WHERE stickerprogress.username = ? ";
return jdbc.query(sql, stickerMapper); return jdbc.query(sql, stickerMapper, userID);
} }
@Override @Override
public Pack findPackByID(int id){ public Pack findPackByID(int id){
String sql= "SELECT * FROM packs WHERE id="+id; String sql= "SELECT * FROM packs WHERE id= ?";
List<Pack> result = jdbc.query(sql, packMapper); List<Pack> result = jdbc.query(sql, packMapper, id);
return result.isEmpty() ? null : result.get(0); return result.isEmpty() ? null : result.get(0);
} }
} }
package Team5.SmartTowns.security;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.JdbcUserDetailsManager;
import org.springframework.security.provisioning.UserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import javax.sql.DataSource;
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
/* Configures the longin features and tracks logged on users on the page */
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.authorizeHttpRequests((requests) -> requests
.requestMatchers("/user/**", "/userProfile").authenticated()
.anyRequest().permitAll()
)
.formLogin((login) -> login
.loginPage("/login").permitAll()
.defaultSuccessUrl("/userProfile")
)
.logout((logout) -> logout.permitAll());
return http.build();
}
@Bean
public PasswordEncoder passwordEncoder(){
/* Nothing here yet, this just saves passwords in plaintext. TODO password encryption */
return NoOpPasswordEncoder.getInstance();
}
@Bean
public UserDetailsManager userDetailsManager(DataSource dataSource){
JdbcUserDetailsManager manager = new JdbcUserDetailsManager(dataSource);
return manager;
}
}
package Team5.SmartTowns.users;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@AllArgsConstructor
public class NewUser {
@NotEmpty(message = "You must type in a username.")
@NotNull
String name;
@NotEmpty(message = "You must type in a password.")
@NotNull
String password;
@NotEmpty(message = "You must type in an email.")
@NotNull
String email;
}
...@@ -27,8 +27,7 @@ public class User { ...@@ -27,8 +27,7 @@ public class User {
this.dragonProgress = dragonProgress; this.dragonProgress = dragonProgress;
imgPath = findImagePath(); imgPath = findImagePath();
} }
public User(int id, String email, String name) { public User(String email, String name) {
this.id = id;
this.email = email; this.email = email;
this.name = name; this.name = name;
imgPath = findImagePath(); imgPath = findImagePath();
......
...@@ -4,10 +4,15 @@ package Team5.SmartTowns.users; ...@@ -4,10 +4,15 @@ package Team5.SmartTowns.users;
import Team5.SmartTowns.rewards.Pack; import Team5.SmartTowns.rewards.Pack;
import Team5.SmartTowns.rewards.RewardsRepository; import Team5.SmartTowns.rewards.RewardsRepository;
import Team5.SmartTowns.rewards.Sticker; import Team5.SmartTowns.rewards.Sticker;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Controller; import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.ModelAndView;
import java.util.List; import java.util.List;
...@@ -17,45 +22,87 @@ public class UserController { ...@@ -17,45 +22,87 @@ public class UserController {
@Autowired @Autowired
private UserRepository userRepository; private UserRepository userRepository;
@Autowired @Autowired
private RewardsRepository rewardsRepository; private RewardsRepository rewardsRepository;
/* LOGIN MAPPING & FUNCTIONS */
@GetMapping("/login") @GetMapping("/login")
public ModelAndView getLoginPage() { public ModelAndView getLoginPage() {
ModelAndView mav = new ModelAndView("users/login"); ModelAndView mav = new ModelAndView("users/login");
// List<User> users = userRepository.getAllUsers(); mav.addObject("user", new NewUser( "", "", ""));
// mav.addObject("users", users); mav.addObject("error", "");
mav.addObject("status", "");
System.out.println(userRepository.findUserByName("Admin").getName());
return mav; return mav;
} }
@GetMapping("/userList") // @GetMapping("/logout")
public ModelAndView userList() { // public ModelAndView getLogOutPage(){
ModelAndView mav = new ModelAndView("towns/userData"); // ModelAndView mav = new ModelAndView("users/logout");
List<User> users = userRepository.getAllUsers(); // return mav;
mav.addObject("users", users); // }
@PostMapping("/login/register")
public ModelAndView registerUser(@Valid @ModelAttribute("user") NewUser user, BindingResult bindingResult, Model model) {
ModelAndView mav = new ModelAndView("users/login", model.asMap());
// TODO VALIDATE EMAIL INPUT
mav.addObject("status", "active");
if (bindingResult.hasErrors()) {
ModelAndView modelAndView = new ModelAndView("users/login");
modelAndView.addObject("errors", bindingResult);
return modelAndView;
}
if ( userRepository.doesUserExist(user.getEmail()) ) {
mav.addObject("errors", "Email already in use");
return mav;
}
try {
userRepository.addUser(user.name, user.email, user.password);
mav.addObject("error", "");
//TODO return user creation success
return mav;
} catch (DataAccessException e) {
mav.addObject("error", "User exists");
}
return mav; return mav;
} }
@GetMapping("/user/{id}") @GetMapping("/userProfile")
public ModelAndView getUserPage(@PathVariable int id) { public ModelAndView userProfile(){
ModelAndView mav = new ModelAndView("users/userProfile"); ModelAndView mav = new ModelAndView("users/userProfile");
List<Pack> allPacks = rewardsRepository.getAllPacks(); List<Pack> allPacks = rewardsRepository.getAllPacks();
mav.addObject("user", userRepository.getUserById(id));
mav.addObject("packs", allPacks); mav.addObject("packs", allPacks);
mav.addAllObjects(getPackInfo(id, 1).getModelMap()); User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
mav.addObject("user", userRepository.findUserByName("Admin"));
mav.addAllObjects(getPackInfo("Admin", 1).getModelMap());
return mav;
}
/* USER MAPPING & FUNCTIONS */
@GetMapping("/user/{username}")
public ModelAndView getUserPage(@PathVariable String username) {
ModelAndView mav = new ModelAndView("users/userProfile");
List<Pack> allPacks = rewardsRepository.getAllPacks();
mav.addObject("user", userRepository.findUserByName("Admin"));
mav.addObject("packs", allPacks);
mav.addAllObjects(getPackInfo(username, 1).getModelMap());
return mav; return mav;
} }
@GetMapping("/packInfo/{userID}/{packID}") @GetMapping("/packInfo/{username}/{packID}")
public ModelAndView getPackInfo(@PathVariable int userID, @PathVariable int packID) { public ModelAndView getPackInfo(@PathVariable String username, @PathVariable int packID) {
/* Displays on page the stickers present in the pack and colour the ones the /* Displays on page the stickers present in the pack and colour the ones the
* user has acquired */ * user has acquired */
ModelAndView mav = new ModelAndView("users/userFrags :: stickersBox"); ModelAndView mav = new ModelAndView("users/userFrags :: stickersBox");
List<Sticker> allStickers = rewardsRepository.getAllStickersFromPack(packID); List<Sticker> allStickers = rewardsRepository.getAllStickersFromPack(packID);
List<Long> userStickers = userRepository.getUserStickersFromPack(userID, packID); List<Long> userStickers = userRepository.getUserStickersFromPack(username, packID);
System.out.println(userStickers);
...@@ -86,4 +133,7 @@ public class UserController { ...@@ -86,4 +133,7 @@ public class UserController {
return displayedStickers; return displayedStickers;
} }
} }
...@@ -5,7 +5,10 @@ import java.util.List; ...@@ -5,7 +5,10 @@ import java.util.List;
public interface UserRepository { public interface UserRepository {
List<User> getAllUsers(); List<User> getAllUsers();
List<Long> getUserStickersFromPack(int userID, int packID); List<Long> getUserStickersFromPack(String username, int packID);
User getUserById(int userID); boolean unlockSticker(String username, int packID, int stickerID);
boolean unlockSticker(int userID, int packID, int stickerID); boolean addUser(String username, String email, String password);
boolean doesUserExist(String email);
User findUserByEmail(String email);
User findUserByName(String name);
} }
//Implements the users repository using JDBC //Implements the users repository using JDBC
package Team5.SmartTowns.users; package Team5.SmartTowns.users;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.object.SqlQuery;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Objects;
@Repository @Repository
public class UserRepositoryJDBC implements UserRepository{ public class UserRepositoryJDBC implements UserRepository{
private JdbcTemplate jdbc; private final JdbcTemplate jdbc;
private RowMapper<User> userMapper; private RowMapper<User> userMapper;
public UserRepositoryJDBC(JdbcTemplate aJdbc){ public UserRepositoryJDBC(JdbcTemplate aJdbc){
...@@ -20,9 +27,8 @@ public class UserRepositoryJDBC implements UserRepository{ ...@@ -20,9 +27,8 @@ public class UserRepositoryJDBC implements UserRepository{
private void setUserMapper(){ private void setUserMapper(){
userMapper = (rs, i) -> new User( userMapper = (rs, i) -> new User(
rs.getInt("id"),
rs.getString("email"), rs.getString("email"),
rs.getString("name") rs.getString("username")
); );
} }
...@@ -34,23 +40,57 @@ public class UserRepositoryJDBC implements UserRepository{ ...@@ -34,23 +40,57 @@ public class UserRepositoryJDBC implements UserRepository{
@Override @Override
public User getUserById(int userID){ public List<Long> getUserStickersFromPack(String username, int packID) {
String sql= "SELECT * FROM users WHERE id="+userID; /* Returns a list with the stickerIDs of stickers that the specified user has unlocked from the given pack */
List<User> result = jdbc.query(sql, userMapper); String sql = "SELECT stickerID FROM stickerprogress WHERE (username, packID)= (?,?)";
return result.isEmpty() ? null : result.get(0); return jdbc.queryForList(sql, Long.class, username, packID);
} }
@Override @Override
public List<Long> getUserStickersFromPack(int userID, int packID) { public boolean unlockSticker(String username, int packID, int stickerID){
String sql = "SELECT stickerID FROM stickerprogress WHERE (userID, packID)= (" + userID + "," + packID + ")"; /* Adds entry in the stickerprogress database, effectively unlocking the sticker for the user
return jdbc.queryForList(sql, Long.class); * Returns false if no sticker is unlocked */
String query = "SELECT COUNT(id) FROM stickers WHERE (stickerID, packID) = (?, ?)";
int stickerCount = jdbc.queryForObject(query, Integer.class, stickerID, packID);
if (stickerCount == 1){ //Checks if sticker exists
String sql = "INSERT INTO stickerprogress (username, packID, stickerID) VALUES (?,?,?)";
jdbc.update(sql, username, packID, stickerID);
return true;
}
return false;
} }
@Override @Override
public boolean unlockSticker(int userID, int packID, int stickerID){ public boolean addUser(String username, String email, String password) throws DataAccessException{
String sql = "INSERT INTO stickerprogress (userID, packID, stickerID) VALUES (" + /* Adds new user to the database */
userID + ", " + packID + "," + stickerID + ")"; String query = "INSERT INTO users (username, email, password) VALUES (?, ?, ?);";
jdbc.update(sql); String query2= "INSERT INTO authorities (username, authority) VALUES (?,?);";
jdbc.update(query, username, email, password);
jdbc.update(query2, username, "USER");
return true; return true;
} }
@Override
public boolean doesUserExist(String email){
/* Returns true if a user with given email already exists in the database */
String query = "SELECT COUNT(email) FROM users WHERE (email) = (?)";
return !(jdbc.queryForObject(query, Integer.class, email) == 0);
}
@Override
public User findUserByEmail(String email) {
/* Finds user matching given email */
String query = "SELECT * FROM users WHERE (email) = (?)";
List<User> result = jdbc.query(query, userMapper, email);
return result.isEmpty() ? null : result.get(0);
}
@Override
public User findUserByName(String name) {
/* Finds user matching given name */
String query = "SELECT * FROM users WHERE (username) = (?)";
List<User> result = jdbc.query(query, userMapper, name);
return result.isEmpty() ? null : result.get(0);
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment