Skip to content
Snippets Groups Projects
Commit 2fc992e9 authored by Rhys Evans's avatar Rhys Evans
Browse files

Merge branch...

Merge branch '73-as-a-qr-scanning-connoisseur-i-want-to-unlock-stickers-after-scanning-a-qr-code-to-feel-a-sense' into 'main'

Resolve "As a QR-scanning connoisseur , I want to unlock stickers after scanning a QR code to feel a sense of reward."

Closes #73

See merge request !33
parents a9ddc9f2 9ec8ccb8
No related branches found
No related tags found
1 merge request!33Resolve "As a QR-scanning connoisseur , I want to unlock stickers after scanning a QR code to feel a sense of reward."
Showing
with 203 additions and 112 deletions
File deleted
package Team5.SmartTowns.Data;
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;
......@@ -11,17 +9,19 @@ import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.*;
@Controller
public class DatabaseController {
@Autowired
private locationRepository locationRepository;
private LocationRepository locationRepository;
@Autowired
private trailsRepository trailsRepository;
private TrailsRepository trailsRepository;
@GetMapping("/trailList")
public ModelAndView trailList() {
ModelAndView mav1 = new ModelAndView("towns/trailsData");
List<trail> trail = trailsRepository.getAllTrails();
List<Trail> trail = trailsRepository.getAllTrails();
mav1.addObject("trails", trail);
return mav1;
}
......
//Holds variable data for the locations table (landmarks)
package Team5.SmartTowns.Data;
package Team5.SmartTowns.data;
import lombok.AllArgsConstructor;
import lombok.Data;
......
//Holds locations data repository (landmarks)
package Team5.SmartTowns.Data;
package Team5.SmartTowns.data;
import java.util.List;
public interface locationRepository {
public interface LocationRepository {
List<Location> getAllLocation();
void addLocation(Location loc);
}
//Implements the locations repository using JDBC
package Team5.SmartTowns.Data;
package Team5.SmartTowns.data;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
......@@ -8,11 +8,11 @@ import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class locationRepositoryJDBC implements locationRepository {
public class LocationRepositoryJDBC implements LocationRepository {
private JdbcTemplate jdbc;
private RowMapper<Location> locationMapper;
public locationRepositoryJDBC(JdbcTemplate aJdbc) {
public LocationRepositoryJDBC(JdbcTemplate aJdbc) {
this.jdbc = aJdbc;
setlocationMapper();
}
......
package Team5.SmartTowns.Data;
package Team5.SmartTowns.data;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
......@@ -8,8 +8,8 @@ import java.util.List;
public class MockUser {
private JdbcTemplate jdbc;
private RowMapper<trail> trailMapper;
public List<trail> getAllTrails(){
private RowMapper<Trail> trailMapper;
public List<Trail> getAllTrails(){
String sql= "SELECT * FROM trails";
return jdbc.query(sql, trailMapper);
}
......
package Team5.SmartTowns.Data;
package Team5.SmartTowns.data;
public class QRCodes {
}
//Holds variable data for the trails table
package Team5.SmartTowns.Data;
package Team5.SmartTowns.data;
import lombok.AllArgsConstructor;
import lombok.Data;
@Data
@AllArgsConstructor
public class trail {
public class Trail {
private int trailsId;
private String name;
}
//Holds trails data repository
package Team5.SmartTowns.Data;
package Team5.SmartTowns.data;
import java.util.List;
public interface trailsRepository {
List<trail> getAllTrails();
public interface TrailsRepository {
List<Trail> getAllTrails();
}
//Implements the trails repository using JDBC
package Team5.SmartTowns.Data;
package Team5.SmartTowns.data;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
......@@ -8,20 +8,20 @@ import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class trailsRepositoryJDBC implements trailsRepository{
public class TrailsRepositoryJDBC implements TrailsRepository {
private JdbcTemplate jdbc;
private RowMapper<trail> trailMapper;
public trailsRepositoryJDBC(JdbcTemplate aJdbc){
private RowMapper<Trail> trailMapper;
public TrailsRepositoryJDBC(JdbcTemplate aJdbc){
this.jdbc = aJdbc;
settrailsMapper();
}
private void settrailsMapper(){
trailMapper = (rs, i) -> new trail(
trailMapper = (rs, i) -> new Trail(
rs.getInt("trailID"),
rs.getString("name")
);
}
public List<trail> getAllTrails(){
public List<Trail> getAllTrails(){
String sql= "SELECT * FROM trails";
return jdbc.query(sql, trailMapper);
}
......
package Team5.SmartTowns.Landmarks;
package Team5.SmartTowns.landmarks;
import Team5.SmartTowns.trails.Trail;
import jakarta.validation.constraints.Email;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotEmpty;
import lombok.AllArgsConstructor;
import lombok.Data;
......
package Team5.SmartTowns.Landmarks;
package Team5.SmartTowns.landmarks;
import Team5.SmartTowns.Data.Location;
import Team5.SmartTowns.Data.locationRepository;
import Team5.SmartTowns.data.Location;
import Team5.SmartTowns.data.LocationRepository;
import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
......@@ -26,7 +26,7 @@ public class LandmarksController {
}
@Autowired
private locationRepository locationRepository;
private LocationRepository locationRepository;
@PostMapping("/landmarkSub")
public ModelAndView landmarkSent(@Valid @ModelAttribute("landmarkData") Landmarks landmarks, BindingResult bindingResult, Model model ) {
......
/*AUTHOR: Gabriel Copat*/
package Team5.SmartTowns.rewards;
import lombok.Data;
import lombok.Getter;
import java.io.File;
import java.util.Objects;
@Data
public class Badge {
@Getter
public class Badge extends Reward {
/* Badges can be earned by completing certain goals.
* They are displayed in the user profile page
*
* For example, one might earn a badge after visiting 20 locations */
static final String DEFAULT_IMAGE = "0.png";
int id;
String name;
String description;
String imgPath;
int difficulty; //1-5
public Badge(int id, String name, String description, int difficulty) {
this.id = id;
this.name = name;
this.description = description;
super(id, name, description);
this.difficulty = difficulty;
imgPath = findImagePath();
}
private String findImagePath(){
/* Finds the image in the Path folder, if image is not found assigns default image */
String imgPath = "images/rewards/badges/" + id + ".jpg";
String notFoundPath = "/images/rewards/badges/0.png";
File imgFile = new File("src/main/resources/static/" + imgPath);
return imgFile.exists() ? imgPath : notFoundPath;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Badge badge = (Badge) o;
return id == badge.id && Objects.equals(name, badge.name);
}
@Override
public int hashCode() {
return Objects.hash(id, name);
public String getImgFolder() {
return "badges";
}
}
//Holds locations data repository
package Team5.SmartTowns.rewards;
import java.util.List;
public interface BadgesRepository {
List<Badge> getAllBadges();
}
//Implements the locations repository using JDBC
package Team5.SmartTowns.rewards;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class BadgesRepositoryJDBC implements BadgesRepository {
private JdbcTemplate jdbc;
private RowMapper<Badge> badgeMapper;
public BadgesRepositoryJDBC(JdbcTemplate aJdbc) {
this.jdbc = aJdbc;
setBadgeMapper();
}
private void setBadgeMapper(){
badgeMapper = (rs, i) -> new Badge(
rs.getInt("badgeID"),
rs.getString("name"),
rs.getString("description"),
rs.getInt("difficulty")
);
}
@Override
public List<Badge> getAllBadges(){
String sql= "SELECT * FROM badges";
return jdbc.query(sql, badgeMapper);
}
}
package Team5.SmartTowns.rewards;
import lombok.Getter;
import java.util.List;
@Getter
public class Pack extends Reward{
int progression; //0-100%;
public Pack(int id, String name, String description) {
super(id, name, description);
displayImg = super.findImagePath();
}
public void setProgression(List<Sticker> packStickers, List<Sticker> userStickers){
/* Takes in a list with all stickers in the pack and a list with all userStickers from the pack
* These lists are taken from database in the Controllers via SQL query*/
int totalAmount = packStickers.size();
int hasAmount = userStickers.size();
progression = (int) ((totalAmount/hasAmount) * 100);
}
@Override
public String getImgFolder() {
return "packs";
}
}
package Team5.SmartTowns.rewards;
import lombok.Getter;
import java.io.File;
@Getter
public abstract class Reward {
/* Abstract class for all rewards */
int id;
String displayImg; //Path to the image file
String name;
String description;
public Reward(int id, String name, String description) {
//Default constructor
this.id = id;
this.name = name;
this.description = description;
}
public abstract String getImgFolder();
/*Returns folder in which images are located*/
public String getDefaultImg(){
/*Returns the name of the default image to be used in case no image is found*/
return "0.png";
}
public String findImagePath(){
/* Finds the image in the Path folder, if image is not found assigns default image */
String imgPath = "images/rewards/" + getImgFolder() + "/" + id + ".png";
String notFoundPath = "images/rewards/" + getImgFolder() + "/" + getDefaultImg();
File imgFile = new File("src/main/resources/static/" + imgPath);
return imgFile.exists() ? imgPath : notFoundPath;
}
}
package Team5.SmartTowns.rewards;
import org.springframework.stereotype.Controller;
@Controller
public class RewardsController {
}
......@@ -3,7 +3,16 @@ package Team5.SmartTowns.rewards;
import java.util.List;
public interface StickersRepository {
public interface RewardsRepository {
List<Sticker> getAllStickers();
List<Sticker> getAllStickersFromPack(int packID);
List<Sticker> getAllStickersFromUser(int userID);
List<Pack> getAllPacks();
Pack findPackByID(int id);
}
......@@ -8,26 +8,66 @@ import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class StickersRepositoryJDBC implements StickersRepository {
private JdbcTemplate jdbc;
public class RewardsRepositoryJDBC implements RewardsRepository {
private final JdbcTemplate jdbc;
private RowMapper<Badge> badgeMapper;
private RowMapper<Sticker> stickerMapper;
private RowMapper<Pack> packMapper;
public StickersRepositoryJDBC(JdbcTemplate aJdbc) {
public RewardsRepositoryJDBC(JdbcTemplate aJdbc) {
this.jdbc = aJdbc;
setStickerMapper();
setPackMapper();
}
private void setStickerMapper(){
stickerMapper = (rs, i) -> new Sticker(
rs.getInt("packID"),
rs.getInt("stickerID"),
rs.getString("name"),
rs.getString("description"),
rs.getInt("rarity")
);
}
private void setPackMapper(){
packMapper = (rs, i) -> new Pack(
rs.getInt("id"),
rs.getString("name"),
rs.getString("description")
);
}
@Override
public List<Sticker> getAllStickers(){
String sql= "SELECT * FROM stickers";
return jdbc.query(sql, stickerMapper);
}
@Override
public List<Pack> getAllPacks() {
String sql= "SELECT * FROM packs";
return jdbc.query(sql, packMapper);
}
@Override
public List<Sticker> getAllStickersFromPack(int packID){
String sql= "SELECT * FROM stickers WHERE packID="+packID;
return jdbc.query(sql, stickerMapper);
}
@Override
public List<Sticker> getAllStickersFromUser(int userID) {
/* FINDS ALL STICKERS UNLOCKED BY THE GIVEN USER */
String sql= "SELECT * FROM stickers LEFT JOIN stickerprogress " +
"ON (stickers.id, stickers.packID) = (stickerprogress.stickerID, stickerprogress.packID) " +
"WHERE stickerprogress.userID="+userID;
return jdbc.query(sql, stickerMapper);
}
@Override
public Pack findPackByID(int id){
String sql= "SELECT * FROM packs WHERE id="+id;
List<Pack> result = jdbc.query(sql, packMapper);
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