Skip to content
Snippets Groups Projects
Commit 1885fd6e authored by Gabriel Copat's avatar Gabriel Copat
Browse files

Merge branch 'main' into...

Merge branch 'main' into 77-as-a-user-i-want-to-be-able-to-use-the-application-on-any-device-e-g-iphone-ipad-laptop

# Conflicts:
#	src/main/java/Team5/SmartTowns/data/TrailsRepository.java
#	src/main/java/Team5/SmartTowns/data/TrailsRepositoryJDBC.java
#	src/main/java/Team5/SmartTowns/landmarks/LandmarksController.java
#	src/main/java/Team5/SmartTowns/placeswithcoordinates/PlacesController.java
#	src/main/resources/static/css/homePageStyle.css
#	src/test/java/Team5/SmartTownsOld/DatasourceConfig.java
#	src/test/java/Team5/SmartTownsOld/users/UserTests.java
parents 1502d047 fc67ecf1
1 merge request!36Resolve "As a user I want to be able to use the application on any device e.g. iPhone, iPad, Laptop"
Showing
with 394 additions and 33 deletions
//package Team5.SmartTowns.Data;
//
//import Team5.SmartTowns.users.User;
//import Team5.SmartTowns.users.UserRepository;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Controller;
//import org.springframework.web.bind.annotation.GetMapping;
//import org.springframework.web.servlet.ModelAndView;
//
//import java.util.*;
//@Controller
//public class DatabaseController {
//
//
// @Autowired
// private LocationRepository LocationRepository;
// @Autowired
// private trailsRepository trailsRepository;
//
//
// @GetMapping("/trailList")
// public ModelAndView trailList() {
// ModelAndView mav1 = new ModelAndView("towns/trailsData");
// List<trail> trail = trailsRepository.getAllTrails();
// mav1.addObject("trails", trail);
// return mav1;
// }
// @GetMapping("locationList")
// public ModelAndView locationList(){
// ModelAndView mav2 = new ModelAndView("towns/locationData");
// List<Location> Locations = LocationRepository.getAllLocation();
// mav2.addObject("location", Locations);
// return mav2;
// }
//}
package Team5.SmartTowns.data;
import org.springframework.beans.factory.annotation.Autowired;
......
......@@ -3,6 +3,8 @@ package Team5.SmartTowns.data;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
public class Location {
......@@ -13,6 +15,7 @@ public class Location {
private String locationPlace;
private String locationTrailID;
private boolean locationApproved;
public Location() {
......@@ -51,11 +54,17 @@ public class Location {
return locationTrailID;
}
public boolean isLocationApproved() {
return locationApproved;
}
public void setLocationName(String locationName) {
this.locationName = locationName;
}
......
......@@ -8,8 +8,11 @@ public interface LocationRepository {
List<Location> getAllLocation();
void addLocation(Location loc);
void updateApprovalStatus(int locID);
List<Location> getAllApprovedLocations();
int nametoLocationID(String name);
// List<Location> getApprovedLocations2(List<Location> list);
......
......@@ -121,6 +121,18 @@ public class LocationRepositoryJDBC implements LocationRepository {
// } return locationUnapprovedList;
// }
@Override
public int nametoLocationID(String name){
return jdbc.queryForObject("SELECT locationID FROM locations WHERE locationName=?", Integer.class, name);
}
@Override
public void updateApprovalStatus(int locID){
String updateSql = "update locations set locationApproved = true where locationID = ?";
jdbc.update(updateSql, locID);
}
// return jdbc.queryForObject("SELECT locationApproval FROM locations WHERE locationName=?", locationID);
// public JdbcTemplate getJdbc() {
// return jdbc;
......
package Team5.SmartTowns.data;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.util.List;
public class MockUser {
private JdbcTemplate jdbc;
private RowMapper<Trail> trailMapper;
public List<Trail> getAllTrails(){
String sql= "SELECT * FROM trails";
return jdbc.query(sql, trailMapper);
}
}
package Team5.SmartTowns.data;
public class QRCodes {
}
package Team5.SmartTowns.data;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class Town {
private String townName;
private Integer townTrailNumber;
public String getTownName() {
return townName;
}
public Integer getTownTrailNumber() {
return townTrailNumber;
}
}
package Team5.SmartTowns.data;
import java.util.List;
public interface TownRepository {
List<Town> getAllTowns();
void addTown(Town town);
}
package Team5.SmartTowns.data;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class TownRepositoryJDBC implements TownRepository{
private JdbcTemplate jdbc;
private RowMapper<Town> townMapper;
public TownRepositoryJDBC(JdbcTemplate aJdbc) {
this.jdbc = aJdbc;
setTownMapper();
}
private void setTownMapper(){
townMapper = (rs, i) -> new Town(
rs.getString("townName"),
rs.getInt("townTrailNumber")
);
}
public List<Town> getAllTowns(){
String sql= "SELECT * FROM towns";
return jdbc.query(sql, townMapper);
}
@Override // intended implementation at current: user data from templates/Landmarks/LandmarkFormTh.html is added to the Location table
public void addTown(Town town) {
String sql = "insert into towns( townName,townTrailNumber) values (?,?)";
jdbc.update(sql,town.getTownName(),town.getTownTrailNumber());
}
}
......@@ -8,4 +8,6 @@ public interface TrailsRepository {
String getTrailNameWithID(String trailsID);
List<Trail> getAllTrailsFromCity(String cityName);
int getTrailIDFromTrailName(String trailsName);
}
......@@ -41,5 +41,10 @@ public class TrailsRepositoryJDBC implements TrailsRepository {
return jdbc.query(sql, trailMapper, cityName);
}
@Override
public int getTrailIDFromTrailName(String trailsName){
return jdbc.queryForObject("SELECT trailID FROM trails WHERE trailName=?", Integer.class, trailsName);
}
}
package Team5.SmartTowns.dragonstale;
import Team5.SmartTowns.landmarks.Landmarks;
import java.util.List;
public class DragonsTale {
Landmarks landmarks = new Landmarks();
private int landmarkID = landmarks.getLandmarkID();
private String landmarkName = landmarks.getLandmarkName();
private String landmarkDescription = landmarks.getLandmarkDescription();
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")
);
public static List<Landmarks> getLandmarksDragonstrail() {
return landmarksDragonstrail;
}
}
package Team5.SmartTowns.dragonstale;
import Team5.SmartTowns.landmarks.Landmarks;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
import static Team5.SmartTowns.dragonstale.DragonsTale.landmarksDragonstrail;
@RestController
public class DragonsTaleController {
ModelAndView modelAndView;
@GetMapping("/dragonstale")
public ModelAndView getDragonsTale(){
List<Landmarks> landmarksList = landmarksDragonstrail;
int landmarksListSize = landmarksDragonstrail.size();
modelAndView = new ModelAndView("/dragonstale/index")
.addObject("landmarksList", landmarksList)
.addObject("getListSize", landmarksListSize);
return modelAndView;
}
@GetMapping ("/QRScan") //In here, we could use trailID as a string variable and use it to track what trail the user clicked from.
public ModelAndView getQRScanner(){
modelAndView = new ModelAndView("fragments/qr-scanner");
//Can we extract the pathvariable in a JS function?
return modelAndView;
}
// @GetMapping("/dragonstale/{landmarkID}")
// public Integer getDTLandmarkID(@RequestParam(value="landmarkID") int landmark){
// Integer idCounter = 0;
// modelAndView = new ModelAndView("/dragonstale/{landmarkID}")
// .addObject() //All your doing is retrieving the information from the database giving it to a string variable.
// }
//Create another controller that directs to the given DragonsTale..Trail.. and updates the users account accordingly.
// This code is to be used
// @GetMapping("dragonstale/{qrCode}/{id}")
// public String qrCodeCheck(@PathVariable Optional<String> qrCode, @PathVariable Optional<Integer> id){
// if (qrCode.isPresent()){
//
// //Check if ID is present, if do this, if not dfo that.
//
// }
// }
}
package Team5.SmartTowns.dragonstale;
import Team5.SmartTowns.users.User;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class DragonsTaleJDBC implements DragonsTaleRepository{
private JdbcTemplate jdbc;
private RowMapper<User> userMapper;
// @Override
// public Map<Long, Boolean> getDTCompletion(int landmarkID){
// //Be conscious of sql injections here.
// String sql = "SELECT userid, trailID, completedOrNot FROM dtprogress WHERE landmarkID = ?";
// int dtQuery = jdbc.query(sql, landmarkID);
// //Query it twice to extract the given parameters, then use these parameters in a loop to query the completion.
// List<Map<String, Integer>> query = jdbc.query(sql, id);
//
// Map<Long, Boolean> dtProgress = new HashMap<>();
// for (Map<String, Object> result : dtQuery) {
// dtProgress.put((Long)result.get("stickerID"), (boolean)result.get("hasSticker"));
// }
// return dtProgress;
// }
}
package Team5.SmartTowns.dragonstale;
public interface DragonsTaleRepository {
}
......@@ -2,6 +2,8 @@ package Team5.SmartTowns.landmarks;
import Team5.SmartTowns.data.Location;
import Team5.SmartTowns.data.LocationRepository;
import Team5.SmartTowns.placeswithcoordinates.LocationsCoordinates;
import Team5.SmartTowns.placeswithcoordinates.PlacesCoordinatesRepository;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
......@@ -11,14 +13,16 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
//import jakarta.validation.Valid;
@Controller
public class LandmarksController {
// Controllers for LandmarkFormTh.html landmark submission form
// Controllers for LandmarkFormTh.html landmark submission form
@GetMapping("/landmarkSubmission")
public ModelAndView landmarkSubmission(){
public ModelAndView landmarkSubmission() {
ModelAndView modelAndView1 = new ModelAndView("Landmarks/LandmarkFormTh.html");
modelAndView1.addObject("landmarkData", new Landmarks());
return modelAndView1;
......@@ -27,30 +31,68 @@ public class LandmarksController {
@Autowired
private LocationRepository locationRepository;
@PostMapping("/landmarkSub")
public ModelAndView landmarkSent(@Valid @ModelAttribute("landmarkData") Landmarks landmarks, BindingResult bindingResult, Model model ) {
public ModelAndView landmarkSent(@Valid @ModelAttribute("landmarkData") Landmarks landmarks, BindingResult bindingResult, Model model) {
if (bindingResult.hasErrors()) {
ModelAndView modelAndView = new ModelAndView("Landmarks/LandmarkFormTh.html", model.asMap());
return modelAndView;
} else{
} else {
// converts valid response using Location constructor into a submittable format to the sql table
Location loc= new Location(landmarks.getLandmarkID(), 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);
locationRepository.addLocation(loc); // adds valid landmark to locations table
ModelAndView modelAndView = new ModelAndView("redirect:/home");
return modelAndView;
}
}
@Autowired
private PlacesCoordinatesRepository placesCoordinatesRepo;
// For form that allows an administrator to add an unapproved location to a trail
@GetMapping("/checkpointApproval")
public ModelAndView adminCheckpointApproval() {
List<Location> unapprovedLocations = locationRepository.getAllUnapprovedLocations(); //change to unauthorised once merger 68 accepted!! todo
ModelAndView modelAndView = new ModelAndView("Landmarks/locationApprovalFormTh.html");
modelAndView.addObject("uLocs", unapprovedLocations);
modelAndView.addObject("location", new Location());
modelAndView.addObject("locationCoord", new LocationsCoordinates());
return modelAndView;
}
@PostMapping("/checkpointSubmitted")
public ModelAndView checkpointSent(@Valid LocationsCoordinates locCoord, Location location, BindingResult bindingResult, Model model) {
if (bindingResult.hasErrors()) {
ModelAndView modelAndView = new ModelAndView("Landmarks/locationApprovalFormTh.html", model.asMap());
return modelAndView;
} else {
int locationID = locationRepository.nametoLocationID(location.getLocationName());
// converts valid response using Location constructor into a submittable format to the sql table
LocationsCoordinates ALocCoord = new LocationsCoordinates(locationID, locCoord.getLocationCoordsLat(), locCoord.getLocationCoordsLong());
boolean checkIfCoorsWithinBoundaries = placesCoordinatesRepo.checkIfCoordsAreWithinTownBoundary(ALocCoord);
if (checkIfCoorsWithinBoundaries==false){ // if coords outside associated town, form is returned to original state
return new ModelAndView("redirect:/checkpointApproval");
}
placesCoordinatesRepo.addLocationCoord(ALocCoord); // adds valid landmark to locations table
locationRepository.updateApprovalStatus(locationID); // updates approval status accordingly
System.out.println(placesCoordinatesRepo.getAllLocationCoords());
ModelAndView modelAndView = new ModelAndView("redirect:/home"); //redirects back top form in case admin wants to input second location
return modelAndView;
// }
}
}
}
......@@ -4,6 +4,10 @@ package Team5.SmartTowns.placeswithcoordinates;
import Team5.SmartTowns.data.Location;
import Team5.SmartTowns.data.LocationRepositoryJDBC;
import jakarta.validation.constraints.Digits;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -18,7 +22,12 @@ import java.util.List;
public class LocationsCoordinates {
/// separate class to location to cover all locations within trails that have been approved and have long/lat coords attached for mapping.
private int locationID;
// @NotEmpty(message = "You must enter a Latitude.")
// @Min(value=0,message = "You must enter a Latitude.")
private Double locationCoordsLat;
// @NotEmpty(message = "You must type in a Longitude.")
// @Min(value=0,message = "You must type in a Longitude.")
private Double locationCoordsLong;
private JdbcTemplate jdbc;
......@@ -104,8 +113,13 @@ public class LocationsCoordinates {
/// Need a constructor to create a locations list, approved collation list, unapproved locations list.
@Override
public String toString() {
return "LocationsCoordinates{" +
"locationID=" + locationID +
", locationCoordsLat=" + locationCoordsLat +
", locationCoordsLong=" + locationCoordsLong +
", jdbc=" + jdbc +
'}';
}
}
......@@ -13,6 +13,12 @@ public interface PlacesCoordinatesRepository {
List<TownWithTrails> getAllTownCoords();
void addTownWithCoords(TownWithTrails town);
int getLocationTableIDValue(List<Location> locations, String locationName);
Boolean checkIfCoordsAreWithinTownBoundary(LocationsCoordinates loc);
int getTownIDFromName(String townsName);
// List<Location> getFullApprovedLocations(JdbcTemplate aJdbc);
......
package Team5.SmartTowns.placeswithcoordinates;
import Team5.SmartTowns.data.Location;
import Team5.SmartTowns.data.LocationRepositoryJDBC;
import org.springframework.boot.autoconfigure.integration.IntegrationProperties;
import Team5.SmartTowns.data.LocationRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
......@@ -88,6 +88,11 @@ public class PlacesCoordinatesRepositoryJDBC implements PlacesCoordinatesReposit
// }
public boolean checkInputtedCoordsMatchTown(String inpLatCoords, String inpLongCoords, String townName){
PlacesCoordinatesRepositoryJDBC jbdcsecond = new PlacesCoordinatesRepositoryJDBC(jdbc);
List<TownWithTrails> allTowns = jbdcsecond.getAllTownCoords();
......@@ -116,7 +121,9 @@ public class PlacesCoordinatesRepositoryJDBC implements PlacesCoordinatesReposit
}
}
return true;}
int getLocationTableIDValue(List<Location> locations, String locationName){
@Override
public int getLocationTableIDValue(List<Location> locations, String locationName){
int index;
for(int i=0;i<locations.size();i++){
if (Objects.equals(locations.get(i).getLocationName(), locationName)){
......@@ -128,7 +135,37 @@ public class PlacesCoordinatesRepositoryJDBC implements PlacesCoordinatesReposit
}
@Autowired
LocationRepository local;
@Override
public Boolean checkIfCoordsAreWithinTownBoundary(LocationsCoordinates loc){
int locationID=loc.getLocationID();
String locationTown= jdbc.queryForObject("SELECT locationPlace FROM locations WHERE locationID=?", String.class, locationID);
List<TownWithTrails> allTowns = getAllTownCoords();
for (int i=0;i<allTowns.size();i++){
if (Objects.equals(allTowns.get(i).getTownName(), locationTown)){
double inpLat=(loc.getLocationCoordsLat());
double inpLong=(loc.getLocationCoordsLong());
double townBoundaryLatUppermost=Double.parseDouble(allTowns.get(i).getTownUppermostCoordsLat());
double townBoundaryLatLowermost=Double.parseDouble(allTowns.get(i).getTownLowermostCoordsLat());
double townBoundaryLongLeftmost=Double.parseDouble(allTowns.get(i).getTownLeftmostCoordsLong());
double townBoundaryLongRightmost=Double.parseDouble(allTowns.get(i).getTownRightmostCoordsLong());
// check coords within respective town boundary (boundary decided by rough google maps red-line)
if ( (inpLat<=townBoundaryLatUppermost)&& (inpLat>=townBoundaryLatLowermost) && (inpLong>=townBoundaryLongLeftmost) && (inpLong<=townBoundaryLongRightmost)){
// location within boundary returns true
return true;
}}
} return false; // if location outside boundary, return true won't function and it wil return false.
}
@Override
public int getTownIDFromName(String townsName){
return jdbc.queryForObject("SELECT townID FROM townswithtrails WHERE townName=?", Integer.class, townsName);
}
// Method used to approve and add locations with associated coordinates. List<Location> unapprovedLocations
// public void approveLocationAndAddCoords(String locationsName, Double latCoords, Double longCoords,JdbcTemplate jdbc) {
......
package Team5.SmartTowns.towns;
import Team5.SmartTowns.data.Location;
import Team5.SmartTowns.data.Town;
import Team5.SmartTowns.data.LocationRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@Controller
public class TownController {
@Autowired
private LocationRepository locationRepository;
@Autowired
private Team5.SmartTowns.data.TownRepository townRepository;
@GetMapping("/home")
public ModelAndView getTownList(){
......@@ -27,4 +37,30 @@ public class TownController {
return modelAndView;
}
@GetMapping("/home/town/Caerphilly")
public ModelAndView getATownTrailsList(){
ModelAndView modelAndView = new ModelAndView("userTrails/userTrailsTemplate");
TownStorage townsCurrent= new TownStorage().getInstance();
List<Towns> towns = townsCurrent.getTownList();
List<Town> Towns = townRepository.getAllTowns();
modelAndView.addObject("towns", Towns);
List<Location> Locations = locationRepository.getAllLocation();
Locations= filterByLocationForTrails(Locations, "Caerphilly");
modelAndView.addObject("locations", Locations);
return modelAndView;
}
public List<Location> filterByLocationForTrails(List<Location> locationList , String town){
List<Location> filteredList = new ArrayList<Location>();;
for( Location location:locationList){
if (Objects.equals(location.getLocationPlace(), town)){
filteredList.add(location);
}
}return filteredList;
}
}
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