From e8c1365feea01d74cd240bc4cc61979e5e7d7622 Mon Sep 17 00:00:00 2001
From: Gabriel Copat <copatg@cardiff.ac.uk>
Date: Tue, 5 Dec 2023 11:47:17 +0000
Subject: [PATCH] Rewards like Badges and Stickers now extend an abstract class
 Rewards Restructured rewards package for organization

---
 .../java/team5/smartTowns/rewards/Badge.java  | 39 +++-------------
 .../java/team5/smartTowns/rewards/Reward.java | 39 ++++++++++++++++
 .../smartTowns/rewards/RewardsController.java |  7 ---
 .../team5/smartTowns/rewards/Sticker.java     | 46 ++++---------------
 .../rewards/{ => data}/BadgesRepository.java  |  4 +-
 .../{ => data}/BadgesRepositoryJDBC.java      |  3 +-
 .../{ => data}/StickersRepository.java        |  4 +-
 .../{ => data}/StickersRepositoryJDBC.java    |  6 ++-
 8 files changed, 67 insertions(+), 81 deletions(-)
 create mode 100644 src/main/java/team5/smartTowns/rewards/Reward.java
 delete mode 100644 src/main/java/team5/smartTowns/rewards/RewardsController.java
 rename src/main/java/team5/smartTowns/rewards/{ => data}/BadgesRepository.java (62%)
 rename src/main/java/team5/smartTowns/rewards/{ => data}/BadgesRepositoryJDBC.java (91%)
 rename src/main/java/team5/smartTowns/rewards/{ => data}/StickersRepository.java (62%)
 rename src/main/java/team5/smartTowns/rewards/{ => data}/StickersRepositoryJDBC.java (85%)

diff --git a/src/main/java/team5/smartTowns/rewards/Badge.java b/src/main/java/team5/smartTowns/rewards/Badge.java
index d1ecc486..bf85cb7c 100644
--- a/src/main/java/team5/smartTowns/rewards/Badge.java
+++ b/src/main/java/team5/smartTowns/rewards/Badge.java
@@ -1,51 +1,26 @@
 /*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";
     }
 }
diff --git a/src/main/java/team5/smartTowns/rewards/Reward.java b/src/main/java/team5/smartTowns/rewards/Reward.java
new file mode 100644
index 00000000..f2f457ae
--- /dev/null
+++ b/src/main/java/team5/smartTowns/rewards/Reward.java
@@ -0,0 +1,39 @@
+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;
+        displayImg = findImagePath();
+    }
+
+    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 + ".jpg";
+        String notFoundPath = "images/rewards/" + getImgFolder() + "/" + getDefaultImg();
+
+        File imgFile = new File("src/main/resources/static/" + imgPath);
+        return imgFile.exists() ? imgPath : notFoundPath;
+    }
+}
diff --git a/src/main/java/team5/smartTowns/rewards/RewardsController.java b/src/main/java/team5/smartTowns/rewards/RewardsController.java
deleted file mode 100644
index b8e81b56..00000000
--- a/src/main/java/team5/smartTowns/rewards/RewardsController.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package team5.smartTowns.rewards;
-
-import org.springframework.stereotype.Controller;
-
-@Controller
-public class RewardsController {
-}
diff --git a/src/main/java/team5/smartTowns/rewards/Sticker.java b/src/main/java/team5/smartTowns/rewards/Sticker.java
index fe067dbf..426b2d93 100644
--- a/src/main/java/team5/smartTowns/rewards/Sticker.java
+++ b/src/main/java/team5/smartTowns/rewards/Sticker.java
@@ -1,37 +1,25 @@
 /*AUTHOR: Gabriel Copat*/
 package team5.smartTowns.rewards;
 
-import lombok.Data;
+import lombok.Getter;
 
-import java.io.File;
-import java.util.Objects;
 
-@Data
-public class Sticker {
-    /* Stickers are trade-able rewards, they vary in rarity and are earned at random */
+@Getter
+public class Sticker extends Reward{
+    /* Stickers are randomly earned rewards from a specific pack */
 
-    int id;
-    String name;
-    String description;
-    String imgPath;
     int rarity; //1-5
     boolean hasSticker;
+    String pack;
 
-    public Sticker(int id, String name, String description, int rarity) {
-        this.id = id;
-        this.name = name;
-        this.description = description;
+    public Sticker(int id, String name, String description, int rarity, String pack) {
+        super(id, name, description);
         this.rarity = rarity;
-        imgPath = findImagePath();
     }
 
-    private String findImagePath(){
-        /* Finds the image in the Path folder, if image is not found assigns default image */
-        String imgPath = "images/rewards/stickers/" + id + ".jpg";
-        String notFoundPath = "images/rewards/stickers/0.png";
-
-        File imgFile = new File("src/main/resources/static/" + imgPath);
-        return imgFile.exists() ? imgPath : notFoundPath;
+    @Override
+    public String getImgFolder() {
+        return "stickers";
     }
 
     public boolean hasSticker(){
@@ -43,19 +31,5 @@ public class Sticker {
     public String getVisibility(){
         return hasSticker? "" : "grayedOut";
     }
-
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-        Sticker sticker = (Sticker) o;
-        return id == sticker.id && Objects.equals(name, sticker.name);
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(id, name);
-    }
 }
 
diff --git a/src/main/java/team5/smartTowns/rewards/BadgesRepository.java b/src/main/java/team5/smartTowns/rewards/data/BadgesRepository.java
similarity index 62%
rename from src/main/java/team5/smartTowns/rewards/BadgesRepository.java
rename to src/main/java/team5/smartTowns/rewards/data/BadgesRepository.java
index f3dcccde..70790543 100644
--- a/src/main/java/team5/smartTowns/rewards/BadgesRepository.java
+++ b/src/main/java/team5/smartTowns/rewards/data/BadgesRepository.java
@@ -1,5 +1,7 @@
 //Holds locations data repository
-package team5.smartTowns.rewards;
+package team5.smartTowns.rewards.data;
+
+import team5.smartTowns.rewards.Badge;
 
 import java.util.List;
 
diff --git a/src/main/java/team5/smartTowns/rewards/BadgesRepositoryJDBC.java b/src/main/java/team5/smartTowns/rewards/data/BadgesRepositoryJDBC.java
similarity index 91%
rename from src/main/java/team5/smartTowns/rewards/BadgesRepositoryJDBC.java
rename to src/main/java/team5/smartTowns/rewards/data/BadgesRepositoryJDBC.java
index a0f62669..5f8750fd 100644
--- a/src/main/java/team5/smartTowns/rewards/BadgesRepositoryJDBC.java
+++ b/src/main/java/team5/smartTowns/rewards/data/BadgesRepositoryJDBC.java
@@ -1,6 +1,7 @@
 //Implements the locations repository using JDBC
-package team5.smartTowns.rewards;
+package team5.smartTowns.rewards.data;
 
+import team5.smartTowns.rewards.Badge;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.stereotype.Repository;
diff --git a/src/main/java/team5/smartTowns/rewards/StickersRepository.java b/src/main/java/team5/smartTowns/rewards/data/StickersRepository.java
similarity index 62%
rename from src/main/java/team5/smartTowns/rewards/StickersRepository.java
rename to src/main/java/team5/smartTowns/rewards/data/StickersRepository.java
index 41e12aef..532d7cc6 100644
--- a/src/main/java/team5/smartTowns/rewards/StickersRepository.java
+++ b/src/main/java/team5/smartTowns/rewards/data/StickersRepository.java
@@ -1,6 +1,6 @@
 //Holds locations data repository
-package team5.smartTowns.rewards;
-
+package team5.smartTowns.rewards.data;
+import team5.smartTowns.rewards.Sticker;
 import java.util.List;
 
 public interface StickersRepository {
diff --git a/src/main/java/team5/smartTowns/rewards/StickersRepositoryJDBC.java b/src/main/java/team5/smartTowns/rewards/data/StickersRepositoryJDBC.java
similarity index 85%
rename from src/main/java/team5/smartTowns/rewards/StickersRepositoryJDBC.java
rename to src/main/java/team5/smartTowns/rewards/data/StickersRepositoryJDBC.java
index 8789c6db..49b3ca03 100644
--- a/src/main/java/team5/smartTowns/rewards/StickersRepositoryJDBC.java
+++ b/src/main/java/team5/smartTowns/rewards/data/StickersRepositoryJDBC.java
@@ -1,6 +1,7 @@
 //Implements the locations repository using JDBC
-package team5.smartTowns.rewards;
+package team5.smartTowns.rewards.data;
 
+import team5.smartTowns.rewards.Sticker;
 import org.springframework.jdbc.core.JdbcTemplate;
 import org.springframework.jdbc.core.RowMapper;
 import org.springframework.stereotype.Repository;
@@ -21,7 +22,8 @@ public class StickersRepositoryJDBC implements StickersRepository {
                 rs.getInt("stickerID"),
                 rs.getString("name"),
                 rs.getString("description"),
-                rs.getInt("rarity")
+                rs.getInt("rarity"),
+                rs.getString("pack")
         );
     }
 
-- 
GitLab