From bef43a5eb21aa3fb5332a16a149e2cebeca2a22e Mon Sep 17 00:00:00 2001 From: hannah-em Date: Sat, 8 Nov 2025 10:50:11 -0500 Subject: [PATCH 01/97] Adding entity for Gallery --- src/main/java/entity/Gallery.java | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/java/entity/Gallery.java diff --git a/src/main/java/entity/Gallery.java b/src/main/java/entity/Gallery.java new file mode 100644 index 00000000..b95c249c --- /dev/null +++ b/src/main/java/entity/Gallery.java @@ -0,0 +1,24 @@ +package entity; + +import java.util.Collections; +import java.util.List; + +public class Gallery { + private final List pets; // immutable list reference (treat as read-only) + + public Gallery(List pets) { + this.pets = pets == null ? Collections.emptyList() : Collections.unmodifiableList(pets); + } + + public List getPets() { + return pets; + } + + public int size() { + return pets.size(); + } + + public boolean isEmpty() { + return pets.isEmpty(); + } +} From e61581ef67b55083b83625a9e1853cb7c3516c0d Mon Sep 17 00:00:00 2001 From: hannah-em Date: Sat, 8 Nov 2025 10:52:34 -0500 Subject: [PATCH 02/97] Update Gallery.java --- src/main/java/entity/Gallery.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/entity/Gallery.java b/src/main/java/entity/Gallery.java index b95c249c..a3f4bff8 100644 --- a/src/main/java/entity/Gallery.java +++ b/src/main/java/entity/Gallery.java @@ -4,7 +4,7 @@ import java.util.List; public class Gallery { - private final List pets; // immutable list reference (treat as read-only) + private final List pets; public Gallery(List pets) { this.pets = pets == null ? Collections.emptyList() : Collections.unmodifiableList(pets); @@ -22,3 +22,4 @@ public boolean isEmpty() { return pets.isEmpty(); } } + From f662e7fb5d64939553bc96dbbeba4839b611e086 Mon Sep 17 00:00:00 2001 From: zahrabuch Date: Sat, 8 Nov 2025 22:04:41 -0500 Subject: [PATCH 03/97] pet class --- src/main/java/entity/Pet.java | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 src/main/java/entity/Pet.java diff --git a/src/main/java/entity/Pet.java b/src/main/java/entity/Pet.java new file mode 100644 index 00000000..832f172d --- /dev/null +++ b/src/main/java/entity/Pet.java @@ -0,0 +1,28 @@ +package entity; + +public class Pet { + private String name; + private String type; + private String breed; + private int age; + private String gender; + private String size; + private String contact; + + public String getName() {return name;} + + public String getType() {return type;} + + public String getBreed() {return breed;} + + public int getAge() {return age;} + + public void setAge(int age) {this.age = age;} + + public String getGender() {return gender;} + + public String getSize() {return size;} + + public String getContact() {return contact;} + +} From 116fca1a9157c3594cbfad43282a69aa7c015110 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Mon, 10 Nov 2025 17:38:34 -0500 Subject: [PATCH 04/97] Create BrowseFilterController --- .../java/interface_adapter/browse_filter/BrowseFilterController | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/interface_adapter/browse_filter/BrowseFilterController diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterController b/src/main/java/interface_adapter/browse_filter/BrowseFilterController new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterController @@ -0,0 +1 @@ + From 42196a0109aeda8a3b75687ba3c4e5f1c8ae25cf Mon Sep 17 00:00:00 2001 From: hannah-em Date: Mon, 10 Nov 2025 17:39:13 -0500 Subject: [PATCH 05/97] Create BrowseFilterPresenter --- .../java/interface_adapter/browse_filter/BrowseFilterPresenter | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter b/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter @@ -0,0 +1 @@ + From c02231c629b263fc68ae3069c31b6a12deefa6a4 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Mon, 10 Nov 2025 17:39:31 -0500 Subject: [PATCH 06/97] Create BrowseFilterViewModel --- .../java/interface_adapter/browse_filter/BrowseFilterViewModel | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel b/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel @@ -0,0 +1 @@ + From 063c05da8a6ecd4a0920695f6244ef3d61fc699e Mon Sep 17 00:00:00 2001 From: hannah-em Date: Mon, 10 Nov 2025 17:41:33 -0500 Subject: [PATCH 07/97] Rename BrowseFilterController to BrowseFilterController.java --- .../{BrowseFilterController => BrowseFilterController.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/interface_adapter/browse_filter/{BrowseFilterController => BrowseFilterController.java} (100%) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterController b/src/main/java/interface_adapter/browse_filter/BrowseFilterController.java similarity index 100% rename from src/main/java/interface_adapter/browse_filter/BrowseFilterController rename to src/main/java/interface_adapter/browse_filter/BrowseFilterController.java From ec763b7ec78dd97f5f5fa2496c1a77451f4b91c2 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Mon, 10 Nov 2025 17:41:52 -0500 Subject: [PATCH 08/97] Rename BrowseFilterPresenter to BrowseFilterPresenter.java --- .../{BrowseFilterPresenter => BrowseFilterPresenter.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/interface_adapter/browse_filter/{BrowseFilterPresenter => BrowseFilterPresenter.java} (100%) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter b/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java similarity index 100% rename from src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter rename to src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java From 0469ae4c5594b29fdd4ac3f032aece4a8def01aa Mon Sep 17 00:00:00 2001 From: hannah-em Date: Mon, 10 Nov 2025 17:43:42 -0500 Subject: [PATCH 09/97] Rename BrowseFilterViewModel to BrowseFilterViewModel.java --- .../{BrowseFilterViewModel => BrowseFilterViewModel.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/interface_adapter/browse_filter/{BrowseFilterViewModel => BrowseFilterViewModel.java} (100%) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel b/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java similarity index 100% rename from src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel rename to src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java From 50c2178877265c75e1fff524212a4076c91b852a Mon Sep 17 00:00:00 2001 From: hannah-em Date: Mon, 10 Nov 2025 17:45:01 -0500 Subject: [PATCH 10/97] Create BrowseFilterInputBoundary.java --- .../java/use_case/browse_filter/BrowseFilterInputBoundary.java | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java diff --git a/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java b/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java @@ -0,0 +1 @@ + From c4d75e09faf63cd5375ca756e4e9dcebfa0c5e1a Mon Sep 17 00:00:00 2001 From: hannah-em Date: Mon, 10 Nov 2025 17:45:24 -0500 Subject: [PATCH 11/97] Create BrowseFilterInputData.java --- src/main/java/use_case/browse_filter/BrowseFilterInputData.java | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/use_case/browse_filter/BrowseFilterInputData.java diff --git a/src/main/java/use_case/browse_filter/BrowseFilterInputData.java b/src/main/java/use_case/browse_filter/BrowseFilterInputData.java new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/java/use_case/browse_filter/BrowseFilterInputData.java @@ -0,0 +1 @@ + From e335e4cab43b5089d82cc0c162c2b43dd15a913b Mon Sep 17 00:00:00 2001 From: hannah-em Date: Mon, 10 Nov 2025 17:45:40 -0500 Subject: [PATCH 12/97] Create BrowseFilterInteractor.java --- src/main/java/use_case/browse_filter/BrowseFilterInteractor.java | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/use_case/browse_filter/BrowseFilterInteractor.java diff --git a/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java b/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java @@ -0,0 +1 @@ + From b817b87061c72baeaf23dfe56b8e6f3903478553 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Mon, 10 Nov 2025 17:45:56 -0500 Subject: [PATCH 13/97] Create BrowseFilterOutputBoundary.java --- .../java/use_case/browse_filter/BrowseFilterOutputBoundary.java | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java diff --git a/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java b/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java @@ -0,0 +1 @@ + From 133c874fbb38efbd1cf324fb48ef461cc7728654 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Mon, 10 Nov 2025 17:46:21 -0500 Subject: [PATCH 14/97] Create BrowseFilterOutputData.java --- src/main/java/use_case/browse_filter/BrowseFilterOutputData.java | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/use_case/browse_filter/BrowseFilterOutputData.java diff --git a/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java b/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java @@ -0,0 +1 @@ + From 6d70481cb7fcad96fc7d3eb66a53f8df80901454 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Mon, 10 Nov 2025 17:47:06 -0500 Subject: [PATCH 15/97] Create BrowseFilterView.java --- src/main/java/view/BrowseFilterView.java | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/view/BrowseFilterView.java diff --git a/src/main/java/view/BrowseFilterView.java b/src/main/java/view/BrowseFilterView.java new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/java/view/BrowseFilterView.java @@ -0,0 +1 @@ + From 678050992c3bce334c5bcfd5b43e94e315b85f7f Mon Sep 17 00:00:00 2001 From: KaedeKagami86 <105937682+KaedeKagami86@users.noreply.github.com> Date: Mon, 10 Nov 2025 19:53:53 -0500 Subject: [PATCH 16/97] Finished application entity, might need to change pet field to id instead of pet object --- src/main/java/entity/Application.java | 82 +++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 src/main/java/entity/Application.java diff --git a/src/main/java/entity/Application.java b/src/main/java/entity/Application.java new file mode 100644 index 00000000..aa3d5612 --- /dev/null +++ b/src/main/java/entity/Application.java @@ -0,0 +1,82 @@ + +package entity; +import java.util.ArrayList; +import java.util.List; + +public class Application { + + // Applicant Information + private Visitor user; + + // Which Pet to adopt - !!!! Might change to ID !!!!!; + private Pet pet; // !! Might change to pet id !!!! // + + // + private String reason_to_adopt; + private String home_environment; // describe, apartment, small, big, etc. + // give hint on how to fill out each field + private int availability; + // indicate by 0-10, 10 means someone is going to be home all the time with the pet + // or by hours per week or smth; + private String previous_experience; + private List personal_information; + + // helper method, to gather all info from the user + private getPersonaLInformation(Visitor user) { + // get all personal info from visitor + String name = user.getName(); + String email = user.getEmail(); + String phone_number = user.getPhone(); + String age = user.getAge(); + String occupation = user.getOccupation(); + + List personal_information = new ArrayList<>(); + personal_information.add(name); + personal_information.add(email); + personal_information.add(phone_number); + personal_information.add(age); + personal_information.add(occupation); + + return personal_information; + } + + /** + * Creates a new application + * @throws IllegalArgumentException if the password or name are empty + */ + // + public Application(Visitor user, Pet pet, String reason_to_adopt, String home_environment, int availability, String previous_experience) { + List personal_information = getPersonalInformation(user); + // loop through the list, see if any is empty, if yes throw an error + for (String info : personal_information) { + if ("".equals(info)) { + throw new IllegalArgumentException("This information cannot be empty." + + "Please fill out your personal information in setting."); + } + } + // set all attributes + this.pet = pet; + this.personal_information = personal_information; + this.reason_to_adopt = reason_to_adopt; + this.home_environment = home_environment; + this.availability = availability; + this.previous_experience = previous_experience; + + } + + + // Getter methods + public List getPersonalInformation() { + return personal_information; + } + public String getReason() { + return reason_to_adopt; + } + public String getHomeEnvironment() {return home_environment;} + public String getPreviousExperience() {return previous_experience;} + public Pet getPet() {return pet;} + public int getAvailability() {return availability;} + public Visitor getVisitor() {return user;} + + +} From dfaf15e2f19138f81f6f45b9382ad09540224def Mon Sep 17 00:00:00 2001 From: Haizhiling Lyu Date: Mon, 10 Nov 2025 20:09:01 -0500 Subject: [PATCH 17/97] adding Administrator and Visitor entities and updating User entity to abstract --- src/main/java/entity/Administrator.java | 14 ++++ src/main/java/entity/User.java | 2 +- src/main/java/entity/Visitor.java | 106 ++++++++++++++++++++++++ 3 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 src/main/java/entity/Administrator.java create mode 100644 src/main/java/entity/Visitor.java diff --git a/src/main/java/entity/Administrator.java b/src/main/java/entity/Administrator.java new file mode 100644 index 00000000..f32637bb --- /dev/null +++ b/src/main/java/entity/Administrator.java @@ -0,0 +1,14 @@ +package entity; + +public class Administrator extends User{ + /** + * Creates a new user with the given non-empty name and non-empty password. + * + * @param name the username + * @param password the password + * @throws IllegalArgumentException if the password or name are empty + */ + public Administrator(String name, String password) { + super(name, password); + } +} diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java index bf9783d0..55ada81d 100644 --- a/src/main/java/entity/User.java +++ b/src/main/java/entity/User.java @@ -3,7 +3,7 @@ /** * A simple entity representing a user. Users have a username and password.. */ -public class User { +public abstract class User { private final String name; private final String password; diff --git a/src/main/java/entity/Visitor.java b/src/main/java/entity/Visitor.java new file mode 100644 index 00000000..1e4f8571 --- /dev/null +++ b/src/main/java/entity/Visitor.java @@ -0,0 +1,106 @@ +package entity; + +public class Visitor extends User{ + + private String legalName; + private String address; + private String homeEvi; + private String occupation; + private String contactInfo; + private String adoptionReason; + private String availability; + private String prevExp; + private String age; + + /** + * Creates a new user with the given non-empty name and non-empty password. + * + * @param name the username + * @param password the password + * @throws IllegalArgumentException if the password or name are empty + */ + public Visitor(String name, String password) { + super(name, password); + this.legalName = ""; + this.address = ""; + this.homeEvi = ""; + this.occupation = ""; + this.contactInfo = ""; + this.adoptionReason = ""; + this.availability = ""; + this.prevExp = ""; + this.age = ""; + } + + public String getLegalName() { + return legalName; + } + + public void setLegalName(String legalName) { + this.legalName = legalName; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getHomeEvi() { + return homeEvi; + } + + public void setHomeEvi(String homeEvi) { + this.homeEvi = homeEvi; + } + + public String getOccupation() { + return occupation; + } + + public void setOccupation(String occupation) { + this.occupation = occupation; + } + + public String getContactInfo() { + return contactInfo; + } + + public void setContactInfo(String contactInfo) { + this.contactInfo = contactInfo; + } + + public String getAdoptionReason() { + return adoptionReason; + } + + public void setAdoptionReason(String adoptionReason) { + this.adoptionReason = adoptionReason; + } + + public String getAvailability() { + return availability; + } + + public void setAvailability(String availability) { + this.availability = availability; + } + + public String getPrevExp() { + return prevExp; + } + + public void setPrevExp(String prevExp) { + this.prevExp = prevExp; + } + + public String getAge() { + return age; + } + + public void setAge(String age) { + this.age = age; + } +} From 0f4142645649e0e66e93a1507702be5fcf328517 Mon Sep 17 00:00:00 2001 From: keikatee Date: Tue, 11 Nov 2025 11:41:08 -0500 Subject: [PATCH 18/97] User entity --- src/main/java/entity/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java index bf9783d0..13714a2c 100644 --- a/src/main/java/entity/User.java +++ b/src/main/java/entity/User.java @@ -1,7 +1,7 @@ package entity; /** - * A simple entity representing a user. Users have a username and password.. + * A entity representing a user. Users have a username and password. */ public class User { From dffe6ef373bc0b97814c58ac5dd64ca2b1f060a0 Mon Sep 17 00:00:00 2001 From: zahrabuch Date: Tue, 11 Nov 2025 11:44:07 -0500 Subject: [PATCH 19/97] pet class update to include setters and description attribute --- src/main/java/entity/Pet.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/entity/Pet.java b/src/main/java/entity/Pet.java index 832f172d..b0bfaf66 100644 --- a/src/main/java/entity/Pet.java +++ b/src/main/java/entity/Pet.java @@ -8,21 +8,30 @@ public class Pet { private String gender; private String size; private String contact; + private String description; public String getName() {return name;} + public void setName(String name) {this.name = name;} public String getType() {return type;} + public void setType(String type) {this.type = type;} public String getBreed() {return breed;} + public void setBreed(String breed) {this.breed = breed;} public int getAge() {return age;} - public void setAge(int age) {this.age = age;} public String getGender() {return gender;} + public void setGender(String gender) {this.gender = gender;} public String getSize() {return size;} + public void setSize(String size) {this.size = size;} public String getContact() {return contact;} + public void setContact(String contact) {this.contact = contact;} + + public String getDescription() {return description;} + public void setDescription(String description) {this.description = description;} } From 11dea028c9ffa60f04a3fd25d5e59f158233f51c Mon Sep 17 00:00:00 2001 From: keikatee Date: Tue, 11 Nov 2025 11:58:13 -0500 Subject: [PATCH 20/97] User entity --- src/main/java/entity/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java index 13714a2c..ea096450 100644 --- a/src/main/java/entity/User.java +++ b/src/main/java/entity/User.java @@ -9,7 +9,7 @@ public class User { private final String password; /** - * Creates a new user with the given non-empty name and non-empty password. + * Creates a simple new user with the given non-empty name and non-empty password. * @param name the username * @param password the password * @throws IllegalArgumentException if the password or name are empty From 8b6917e2f26698c418106bd4f7d692f42afd50f9 Mon Sep 17 00:00:00 2001 From: keikatee Date: Tue, 11 Nov 2025 11:58:45 -0500 Subject: [PATCH 21/97] User entity --- src/main/java/entity/User.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java index ea096450..6199792a 100644 --- a/src/main/java/entity/User.java +++ b/src/main/java/entity/User.java @@ -1,7 +1,7 @@ package entity; /** - * A entity representing a user. Users have a username and password. + * A simple entity representing a user. Users have a username and password. */ public class User { @@ -9,7 +9,7 @@ public class User { private final String password; /** - * Creates a simple new user with the given non-empty name and non-empty password. + * Creates a new user with the given non-empty name and non-empty password. * @param name the username * @param password the password * @throws IllegalArgumentException if the password or name are empty From e427c781b6c211ffe3ab12f0e66db599c9329f23 Mon Sep 17 00:00:00 2001 From: keikatee Date: Tue, 11 Nov 2025 12:00:31 -0500 Subject: [PATCH 22/97] User entity --- src/main/java/entity/User.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java index 6199792a..0a93d13e 100644 --- a/src/main/java/entity/User.java +++ b/src/main/java/entity/User.java @@ -9,7 +9,7 @@ public class User { private final String password; /** - * Creates a new user with the given non-empty name and non-empty password. + * Creates a new user with the given non-empty name and non-empty password.. * @param name the username * @param password the password * @throws IllegalArgumentException if the password or name are empty From 2034c582cdb09d27767adc6b52278d03d2d58314 Mon Sep 17 00:00:00 2001 From: keikatee Date: Tue, 11 Nov 2025 12:01:21 -0500 Subject: [PATCH 23/97] User entity --- src/main/java/entity/User.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java index 0a93d13e..bf9783d0 100644 --- a/src/main/java/entity/User.java +++ b/src/main/java/entity/User.java @@ -1,7 +1,7 @@ package entity; /** - * A simple entity representing a user. Users have a username and password. + * A simple entity representing a user. Users have a username and password.. */ public class User { @@ -9,7 +9,7 @@ public class User { private final String password; /** - * Creates a new user with the given non-empty name and non-empty password.. + * Creates a new user with the given non-empty name and non-empty password. * @param name the username * @param password the password * @throws IllegalArgumentException if the password or name are empty From ccacbf9bc588b050642acff86716344bd83688b9 Mon Sep 17 00:00:00 2001 From: keikatee Date: Tue, 11 Nov 2025 12:05:22 -0500 Subject: [PATCH 24/97] Registration Use case --- src/main/java/interface_adapter/signup/SignupController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/interface_adapter/signup/SignupController.java b/src/main/java/interface_adapter/signup/SignupController.java index c01d25aa..e347f4fe 100644 --- a/src/main/java/interface_adapter/signup/SignupController.java +++ b/src/main/java/interface_adapter/signup/SignupController.java @@ -5,6 +5,7 @@ /** * Controller for the Signup Use Case. + * Register Their name(First Name and Last Name) and Email and Password */ public class SignupController { From a466ff040198e27df0bf766fe8ee77f7657a545e Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:31:00 -0500 Subject: [PATCH 25/97] Create DatabaseConnection.java --- .../java/data_access/DatabaseConnection.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/data_access/DatabaseConnection.java diff --git a/src/main/java/data_access/DatabaseConnection.java b/src/main/java/data_access/DatabaseConnection.java new file mode 100644 index 00000000..2c39a361 --- /dev/null +++ b/src/main/java/data_access/DatabaseConnection.java @@ -0,0 +1,35 @@ +package data_access; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; + +public class DatabaseConnection { + private static final String DB_URL = "jdbc:sqlite:src/main/resources/pets.db"; + + public static Connection connect() throws SQLException { + Connection conn = DriverManager.getConnection(DB_URL); + createTableIfNotExists(conn); + return conn; + } + + private static void createTableIfNotExists(Connection conn) throws SQLException { + String createTableSQL = """ + CREATE TABLE IF NOT EXISTS pets ( + id TEXT PRIMARY KEY, + name TEXT, + species TEXT, + gender TEXT, + breed TEXT, + age TEXT, + size TEXT, + coat TEXT + ); + """; + + try (Statement stmt = conn.createStatement()) { + stmt.execute(createTableSQL); + } + } +} From e990099a0dc3e0264aee8f2305fbf83c44236f57 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:31:54 -0500 Subject: [PATCH 26/97] Create DatabasePetGateway.java --- .../java/data_access/DatabasePetGateway.java | 107 ++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 src/main/java/data_access/DatabasePetGateway.java diff --git a/src/main/java/data_access/DatabasePetGateway.java b/src/main/java/data_access/DatabasePetGateway.java new file mode 100644 index 00000000..e90e200b --- /dev/null +++ b/src/main/java/data_access/DatabasePetGateway.java @@ -0,0 +1,107 @@ +package data_access; + +import entity.Pet; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class DatabasePetGateway implements PetAPIGatewayInterface { + private final Connection conn; + + public DatabasePetGateway(Connection conn) { + this.conn = conn; + } + + @Override + public List fetchPets(String species, String gender) { + List pets = new ArrayList<>(); + + String sql = "SELECT * FROM pets WHERE species LIKE ? AND gender LIKE ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, species.isEmpty() ? "%" : species); + stmt.setString(2, gender.isEmpty() ? "%" : gender); + ResultSet rs = stmt.executeQuery(); + + while (rs.next()) { + pets.add(new Pet( + rs.getString("id"), + rs.getString("name"), + rs.getString("species"), + rs.getString("breed"), + "", false, + rs.getString("age"), + rs.getString("gender"), + rs.getString("size"), + rs.getString("coat"), + new ArrayList<>(), + new ArrayList<>(), + null, // photo removed + null + )); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return pets; + } + + @Override + public Pet fetchPetById(String petId) { + String sql = "SELECT * FROM pets WHERE id = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, petId); + ResultSet rs = stmt.executeQuery(); + if (rs.next()) { + return new Pet( + rs.getString("id"), + rs.getString("name"), + rs.getString("species"), + rs.getString("breed"), + "", false, + rs.getString("age"), + rs.getString("gender"), + rs.getString("size"), + rs.getString("coat"), + new ArrayList<>(), + new ArrayList<>(), + null, // photo removed + null + ); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return null; + } + + // Add and remove methods + public void addPet(Pet pet) { + String sql = "INSERT OR REPLACE INTO pets (id, name, species, gender, breed, age, size, coat) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, pet.getId()); + stmt.setString(2, pet.getName()); + stmt.setString(3, pet.getSpecies()); + stmt.setString(4, pet.getGender()); + stmt.setString(5, pet.getPrimaryBreed()); + stmt.setString(6, pet.getAge()); + stmt.setString(7, pet.getSize()); + stmt.setString(8, pet.getCoat()); + stmt.executeUpdate(); + conn.commit(); // ensure the insert is saved + System.out.println("✅ Added pet to DB: " + pet.getName()); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void removePet(String id) { + String sql = "DELETE FROM pets WHERE id = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, id); + stmt.executeUpdate(); + conn.commit(); // ensure deletion is saved + } catch (SQLException e) { + e.printStackTrace(); + } + } +} From 839849076f810457028dfae2dab40989ae68224a Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:32:49 -0500 Subject: [PATCH 27/97] Create PetAPIGatewayInterface --- src/main/java/data_access/PetAPIGatewayInterface | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/data_access/PetAPIGatewayInterface diff --git a/src/main/java/data_access/PetAPIGatewayInterface b/src/main/java/data_access/PetAPIGatewayInterface new file mode 100644 index 00000000..d5e8cc50 --- /dev/null +++ b/src/main/java/data_access/PetAPIGatewayInterface @@ -0,0 +1,9 @@ +package data_access; + +import entity.Pet; +import java.util.List; + +public interface PetAPIGatewayInterface { + List fetchPets(String species, String gender); + Pet fetchPetById(String petId); +} From 49a2f59f3c53feca9afb5a9de1d9acd4daca59c5 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:33:28 -0500 Subject: [PATCH 28/97] Rename PetAPIGatewayInterface to PetAPIGatewayInterface.java --- .../{PetAPIGatewayInterface => PetAPIGatewayInterface.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/data_access/{PetAPIGatewayInterface => PetAPIGatewayInterface.java} (100%) diff --git a/src/main/java/data_access/PetAPIGatewayInterface b/src/main/java/data_access/PetAPIGatewayInterface.java similarity index 100% rename from src/main/java/data_access/PetAPIGatewayInterface rename to src/main/java/data_access/PetAPIGatewayInterface.java From 7bd5dc7363883468a4c43cd2a1b742c1e725b94d Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:34:24 -0500 Subject: [PATCH 29/97] Create PetfinderAPIGateway.java --- .../java/data_access/PetfinderAPIGateway.java | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 src/main/java/data_access/PetfinderAPIGateway.java diff --git a/src/main/java/data_access/PetfinderAPIGateway.java b/src/main/java/data_access/PetfinderAPIGateway.java new file mode 100644 index 00000000..4650b1df --- /dev/null +++ b/src/main/java/data_access/PetfinderAPIGateway.java @@ -0,0 +1,129 @@ +package data_access; + +import entity.Pet; +import okhttp3.*; +import org.json.*; + +import java.util.ArrayList; +import java.util.List; + +public class PetfinderAPIGateway implements PetAPIGatewayInterface { + + private final OkHttpClient client = new OkHttpClient(); + private final String apiToken; // You already successfully retrieved this in your test + + public PetfinderAPIGateway(String apiToken) { + this.apiToken = apiToken; + } + + @Override + public List fetchPets(String species, String gender) { + List pets = new ArrayList<>(); + + // Build request URL + HttpUrl.Builder urlBuilder = HttpUrl.parse("https://api.petfinder.com/v2/animals").newBuilder(); + if (!species.isBlank()) urlBuilder.addQueryParameter("type", species); + if (!gender.isBlank()) urlBuilder.addQueryParameter("gender", gender); + urlBuilder.addQueryParameter("limit", "50"); + + Request request = new Request.Builder() + .url(urlBuilder.build().toString()) + .addHeader("Authorization", "Bearer " + apiToken) + .build(); + + try (Response response = client.newCall(request).execute()) { + String jsonString = response.body().string(); + JSONObject root = new JSONObject(jsonString); + + System.out.println("🔍 Raw JSON response:\n" + jsonString); + + JSONArray animalsArray = root.getJSONArray("animals"); + + for (int i = 0; i < animalsArray.length(); i++) { + JSONObject a = animalsArray.getJSONObject(i); + + String id = String.valueOf(a.getInt("id")); + String name = a.optString("name", "Unknown"); + String speciesRes = a.optString("species", "Unknown"); + + JSONObject breeds = a.getJSONObject("breeds"); + String primaryBreed = breeds.optString("primary", "Unknown"); + String secondaryBreed = breeds.optString("secondary", ""); + boolean mixed = breeds.optBoolean("mixed", false); + + String petAge = a.optString("age", "Unknown"); + String petGender = a.optString("gender", "Unknown"); + String petSize = a.optString("size", "Unknown"); + String coat = a.optString("coat", "Unknown"); + + // Photos + List allPhotos = new ArrayList<>(); + String primaryMediumPhoto = null; + + if (a.has("photos")) { + JSONArray photos = a.getJSONArray("photos"); + for (int p = 0; p < photos.length(); p++) { + JSONObject photo = photos.getJSONObject(p); + if (photo.has("medium")) + allPhotos.add(photo.getString("medium")); + } + } + + if (a.has("primary_photo_cropped") && !a.isNull("primary_photo_cropped")) { + JSONObject ppc = a.getJSONObject("primary_photo_cropped"); + primaryMediumPhoto = ppc.optString("medium", null); + } + + // Contact + JSONObject contactObj = a.optJSONObject("contact"); + Pet.Contact contact = null; + + if (contactObj != null) { + String email = contactObj.optString("email", ""); + String phone = contactObj.optString("phone", ""); + + JSONObject addressObj = contactObj.optJSONObject("address"); + Pet.Address address = null; + if (addressObj != null) { + address = new Pet.Address( + addressObj.optString("address1", ""), + addressObj.optString("city", ""), + addressObj.optString("state", ""), + addressObj.optString("postcode", ""), + addressObj.optString("country", "") + ); + } + contact = new Pet.Contact(email, phone, address); + } + + pets.add(new Pet( + id, + name, + speciesRes, + primaryBreed, + secondaryBreed, + mixed, + petAge, + petGender, + petSize, + coat, + new ArrayList<>(), // tags can be added later + allPhotos, + primaryMediumPhoto, + contact + )); + } + + } catch (Exception e) { + e.printStackTrace(); + } + + return pets; + } + + @Override + public Pet fetchPetById(String petId) { + // we will implement this after Browse+Filter use case is done + return null; + } +} From 9109363a02b58e771c35b2002b2b9513c88c9559 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:35:20 -0500 Subject: [PATCH 30/97] Create PetfinderAuthService.java --- .../data_access/PetfinderAuthService.java | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/main/java/data_access/PetfinderAuthService.java diff --git a/src/main/java/data_access/PetfinderAuthService.java b/src/main/java/data_access/PetfinderAuthService.java new file mode 100644 index 00000000..3a43fece --- /dev/null +++ b/src/main/java/data_access/PetfinderAuthService.java @@ -0,0 +1,38 @@ +package data_access; + +import okhttp3.*; +import org.json.JSONObject; + +public class PetfinderAuthService { + + private static final String CLIENT_ID = "98LHq0XnAgjCVHKzTakl9iTR7lnOKkOfq9b9JxlyXBhczzXP7z"; + private static final String CLIENT_SECRET = "wOuOnBiPZBpNYyB54epVnhPyZuYuZ6H9XYvsHRuk"; + private static final String TOKEN_URL = "https://api.petfinder.com/v2/oauth2/token"; + + public static String getAccessToken() throws Exception { + OkHttpClient client = new OkHttpClient(); + + RequestBody formBody = new FormBody.Builder() + .add("grant_type", "client_credentials") + .add("client_id", CLIENT_ID) + .add("client_secret", CLIENT_SECRET) + .build(); + + Request request = new Request.Builder() + .url(TOKEN_URL) + .post(formBody) + .build(); + + try (Response response = client.newCall(request).execute()) { + if (!response.isSuccessful()) { + throw new RuntimeException("❌ Failed to get token: " + response.code() + " - " + response.message()); + } + + String responseBody = response.body().string(); + JSONObject json = new JSONObject(responseBody); + String token = json.getString("access_token"); + System.out.println("🔑 Received token: " + token); + return token; + } + } +} From 9a4105612d8cd6f6f96095587d866f202b139f01 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:37:18 -0500 Subject: [PATCH 31/97] Create pets.db --- src/main/java/resources/pets.db | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/main/java/resources/pets.db diff --git a/src/main/java/resources/pets.db b/src/main/java/resources/pets.db new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/src/main/java/resources/pets.db @@ -0,0 +1 @@ + From 66878e749366b0a0daed218a9abb29a97770e04f Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:38:55 -0500 Subject: [PATCH 32/97] Update pom.xml --- pom.xml | 56 ++++++++++++++++++++++---------------------------------- 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/pom.xml b/pom.xml index 5875d5ae..2d769770 100644 --- a/pom.xml +++ b/pom.xml @@ -1,52 +1,40 @@ - + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 + http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - edu.csc207 - ca-login-example + org.example + testingapi 1.0-SNAPSHOT + + 17 + 17 + + + + + com.squareup.okhttp3 + okhttp + 4.12.0 + + org.json json 20240303 + - com.squareup.okhttp3 - okhttp - 4.12.0 + org.xerial + sqlite-jdbc + 3.45.2.0 - - org.junit.jupiter - junit-jupiter - 5.8.1 - test - - - - - - org.apache.maven.plugins - maven-compiler-plugin - - 15 - 15 - - - - - - - - 11 - 11 - UTF-8 - - \ No newline at end of file + From b9062437fbd251e8a3feef58318b1ca404a3d889 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:41:16 -0500 Subject: [PATCH 33/97] Create Pet.java --- src/main/java/entity/Pet.java | 149 ++++++++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 src/main/java/entity/Pet.java diff --git a/src/main/java/entity/Pet.java b/src/main/java/entity/Pet.java new file mode 100644 index 00000000..80daa96d --- /dev/null +++ b/src/main/java/entity/Pet.java @@ -0,0 +1,149 @@ +package entity; + +import java.util.List; +import java.util.Objects; + +public class Pet { + private final String id; + private final String name; + private final String species; + private final String primaryBreed; + private final String secondaryBreed; + private final boolean mixed; + private final String age; + private final String gender; + private final String size; + private final String coat; + private final List tags; + private final List photoUrls; // ordered list of photo URLs (small/medium/large/full as you choose) + private final String primaryPhotoMediumUrl; // convenience field (what you showed in Main.java) + private final Contact contact; // nested contact info + + public Pet(String id, + String name, + String species, + String primaryBreed, + String secondaryBreed, + boolean mixed, + String age, + String gender, + String size, + String coat, + List tags, + List photoUrls, + String primaryPhotoMediumUrl, + Contact contact) { + this.id = id; + this.name = name; + this.species = species; + this.primaryBreed = primaryBreed; + this.secondaryBreed = secondaryBreed; + this.mixed = mixed; + this.age = age; + this.gender = gender; + this.size = size; + this.coat = coat; + this.tags = tags; + this.photoUrls = photoUrls; + this.primaryPhotoMediumUrl = primaryPhotoMediumUrl; + this.contact = contact; + } + + // Getters + public String getId() { return id; } + public String getName() { return name; } + public String getSpecies() { return species; } + public String getPrimaryBreed() { return primaryBreed; } + public String getSecondaryBreed() { return secondaryBreed; } + public boolean isMixed() { return mixed; } + public String getAge() { return age; } + public String getGender() { return gender; } + public String getSize() { return size; } + public String getCoat() { return coat; } + public List getTags() { return tags; } + public List getPhotoUrls() { return photoUrls; } + public String getPrimaryPhotoMediumUrl() { return primaryPhotoMediumUrl; } + public Contact getContact() { return contact; } + + @Override + public String toString() { + return "Pet{" + + "id='" + id + '\'' + + ", name='" + name + '\'' + + ", species='" + species + '\'' + + ", primaryBreed='" + primaryBreed + '\'' + + ", age='" + age + '\'' + + ", gender='" + gender + '\'' + + ", primaryPhotoMediumUrl='" + primaryPhotoMediumUrl + '\'' + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (!(o instanceof Pet)) return false; + Pet pet = (Pet) o; + return Objects.equals(id, pet.id); + } + + @Override + public int hashCode() { + return Objects.hash(id); + } + + // Contact nested static class + public static class Contact { + private final String email; + private final String phone; + private final Address address; + + public Contact(String email, String phone, Address address) { + this.email = email; + this.phone = phone; + this.address = address; + } + + public String getEmail() { return email; } + public String getPhone() { return phone; } + public Address getAddress() { return address; } + + @Override + public String toString() { + return "Contact{" + "email='" + email + '\'' + ", phone='" + phone + '\'' + ", address=" + address + '}'; + } + } + + // Address nested static class + public static class Address { + private final String address1; + private final String city; + private final String state; + private final String postcode; + private final String country; + + public Address(String address1, String city, String state, String postcode, String country) { + this.address1 = address1; + this.city = city; + this.state = state; + this.postcode = postcode; + this.country = country; + } + + public String getAddress1() { return address1; } + public String getCity() { return city; } + public String getState() { return state; } + public String getPostcode() { return postcode; } + public String getCountry() { return country; } + + @Override + public String toString() { + return "Address{" + + "address1='" + address1 + '\'' + + ", city='" + city + '\'' + + ", state='" + state + '\'' + + ", postcode='" + postcode + '\'' + + ", country='" + country + '\'' + + '}'; + } + } +} From 0e18fd1dee9b6fd9ff10a6faf3713df4b5b6edf6 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:42:01 -0500 Subject: [PATCH 34/97] Update BrowseFilterController.java --- .../browse_filter/BrowseFilterController.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterController.java b/src/main/java/interface_adapter/browse_filter/BrowseFilterController.java index 8b137891..063eb50c 100644 --- a/src/main/java/interface_adapter/browse_filter/BrowseFilterController.java +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterController.java @@ -1 +1,16 @@ +package interface_adapter.browse_filter; +import use_case.browse_filter.*; + +public class BrowseFilterController { + private final BrowseFilterInputBoundary interactor; + + public BrowseFilterController(BrowseFilterInputBoundary interactor) { + this.interactor = interactor; + } + + public void onSearch(String species, String gender) { + BrowseFilterInputData inputData = new BrowseFilterInputData(species, gender); + interactor.execute(inputData); + } +} From 072658d592eab311fd45ce936e42be6f76bf4afc Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:42:37 -0500 Subject: [PATCH 35/97] Update BrowseFilterPresenter.java --- .../browse_filter/BrowseFilterPresenter.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java b/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java index 8b137891..d741614d 100644 --- a/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java @@ -1 +1,25 @@ +package interface_adapter.browse_filter; +import entity.Pet; +import use_case.browse_filter.BrowseFilterOutputBoundary; +import use_case.browse_filter.BrowseFilterOutputData; + +import java.util.List; +import java.util.stream.Collectors; + +public class BrowseFilterPresenter implements BrowseFilterOutputBoundary { + private final BrowseFilterViewModel viewModel; + + public BrowseFilterPresenter(BrowseFilterViewModel viewModel) { + this.viewModel = viewModel; + } + + @Override + public void presentPets(BrowseFilterOutputData outputData) { + List petSummaries = outputData.getPets().stream() + .map(p -> p.getName() + " | " + p.getPrimaryBreed() + " | " + p.getAge() + " | " + p.getGender()) + .collect(Collectors.toList()); + + viewModel.setPetsList(petSummaries); + } +} From e904e19e1bdc21e3d316697986a111c225b78c54 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:43:26 -0500 Subject: [PATCH 36/97] Update BrowseFilterViewModel.java --- .../browse_filter/BrowseFilterViewModel.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java b/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java index 8b137891..0f56b348 100644 --- a/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java @@ -1 +1,19 @@ +package interface_adapter.browse_filter; +import java.util.ArrayList; +import java.util.List; + +public class BrowseFilterViewModel { + private List petsList = new ArrayList<>(); + + public List getPetsList() { + return petsList; + } + + public void setPetsList(List petsList) { + this.petsList = petsList; + // In a full app, you’d notify listeners here (for now, just print) + System.out.println("🐾 Found pets: "); + petsList.forEach(System.out::println); + } +} From f0850510f8132d661857b87732428642a7b8300f Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:44:14 -0500 Subject: [PATCH 37/97] Update BrowseFilterInputBoundary.java --- .../use_case/browse_filter/BrowseFilterInputBoundary.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java b/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java index 8b137891..0efb1cec 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java @@ -1 +1,6 @@ +package use_case.browse_filter; + +public interface BrowseFilterInputBoundary { + void execute(BrowseFilterInputData inputData); +} From 278625007d9ba682d240339f01b0f690fa532bc5 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:45:34 -0500 Subject: [PATCH 38/97] Update BrowseFilterInputData.java --- .../browse_filter/BrowseFilterInputData.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterInputData.java b/src/main/java/use_case/browse_filter/BrowseFilterInputData.java index 8b137891..a2df0f71 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterInputData.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterInputData.java @@ -1 +1,14 @@ +package use_case.browse_filter; +public class BrowseFilterInputData { + private final String species; + private final String gender; + + public BrowseFilterInputData(String species, String gender) { + this.species = species; + this.gender = gender; + } + + public String getSpecies() { return species; } + public String getGender() { return gender; } +} From bd41956f6a063eb5e7fce81afcf9e648398b0d61 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:45:57 -0500 Subject: [PATCH 39/97] Update BrowseFilterInteractor.java --- .../browse_filter/BrowseFilterInteractor.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java b/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java index 8b137891..25fb5ad0 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java @@ -1 +1,27 @@ +package use_case.browse_filter; +import data_access.PetAPIGatewayInterface; +import entity.Pet; +import java.util.List; + +public class BrowseFilterInteractor implements BrowseFilterInputBoundary { + private final PetAPIGatewayInterface petApiGateway; + private final BrowseFilterOutputBoundary presenter; + + public BrowseFilterInteractor(PetAPIGatewayInterface petApiGateway, BrowseFilterOutputBoundary presenter) { + this.petApiGateway = petApiGateway; + this.presenter = presenter; + } + + @Override + public void execute(BrowseFilterInputData inputData) { + // Fetch pets using filters + List pets = petApiGateway.fetchPets( + inputData.getSpecies(), + inputData.getGender() + ); + + BrowseFilterOutputData outputData = new BrowseFilterOutputData(pets); + presenter.presentPets(outputData); + } +} From 0036dd95d472914156372c50c0a67220884e53f8 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:46:25 -0500 Subject: [PATCH 40/97] Update BrowseFilterOutputBoundary.java --- .../use_case/browse_filter/BrowseFilterOutputBoundary.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java b/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java index 8b137891..01bc52a1 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java @@ -1 +1,5 @@ +package use_case.browse_filter; +public interface BrowseFilterOutputBoundary { + void presentPets(BrowseFilterOutputData outputData); +} From 93d99704959d244e3de400f784dea38b098c770b Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:47:14 -0500 Subject: [PATCH 41/97] Update BrowseFilterOutputData.java --- .../browse_filter/BrowseFilterOutputData.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java b/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java index 8b137891..33da647c 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java @@ -1 +1,14 @@ +package use_case.browse_filter; +import entity.Pet; +import java.util.List; + +public class BrowseFilterOutputData { + private final List pets; + + public BrowseFilterOutputData(List pets) { + this.pets = pets; + } + + public List getPets() { return pets; } +} From 5bff234f56f796d4dccbd9f57f52ff78828a752b Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 11 Nov 2025 12:47:52 -0500 Subject: [PATCH 42/97] Update BrowseFilterView.java --- src/main/java/view/BrowseFilterView.java | 82 ++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/src/main/java/view/BrowseFilterView.java b/src/main/java/view/BrowseFilterView.java index 8b137891..e7ae5fc4 100644 --- a/src/main/java/view/BrowseFilterView.java +++ b/src/main/java/view/BrowseFilterView.java @@ -1 +1,83 @@ +package view; +import interface_adapter.browse_filter.BrowseFilterController; +import interface_adapter.browse_filter.BrowseFilterViewModel; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; + +public class BrowseFilterView extends JFrame { + private final BrowseFilterController controller; + private final BrowseFilterViewModel viewModel; + + public BrowseFilterView(BrowseFilterController controller, BrowseFilterViewModel viewModel) { + this.controller = controller; + this.viewModel = viewModel; + + setTitle("🐾 Pet Adoption Browser"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(700, 500); + setLocationRelativeTo(null); // Center window on screen + + // === INPUT FIELDS === + JTextField speciesField = new JTextField(10); + JTextField genderField = new JTextField(10); + + // === BUTTONS === + JButton searchButton = new JButton("Search"); + JButton clearButton = new JButton("Clear Filters"); + + // === RESULTS AREA === + JTextArea resultsArea = new JTextArea(); + resultsArea.setEditable(false); + resultsArea.setFont(new Font("Monospaced", Font.PLAIN, 13)); + + // Make results scrollable + JScrollPane scrollPane = new JScrollPane(resultsArea); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + scrollPane.setBorder(BorderFactory.createTitledBorder("Results")); + + // === INPUT PANEL === + JPanel inputPanel = new JPanel(new GridLayout(1, 4, 10, 10)); + inputPanel.setBorder(BorderFactory.createTitledBorder("Filters")); + inputPanel.add(new JLabel("Species:")); + inputPanel.add(speciesField); + inputPanel.add(new JLabel("Gender:")); + inputPanel.add(genderField); + + // === BUTTON PANEL === + JPanel buttonPanel = new JPanel(); + buttonPanel.add(searchButton); + buttonPanel.add(clearButton); + + // === COMBINE INPUT + BUTTON PANELS === + JPanel topPanel = new JPanel(new BorderLayout()); + topPanel.add(inputPanel, BorderLayout.NORTH); + topPanel.add(buttonPanel, BorderLayout.SOUTH); + + // === MAIN LAYOUT === + setLayout(new BorderLayout(10, 10)); + add(topPanel, BorderLayout.NORTH); + add(scrollPane, BorderLayout.CENTER); + + // === ACTIONS === + searchButton.addActionListener((ActionEvent e) -> { + controller.onSearch( + speciesField.getText(), + genderField.getText() + ); + + resultsArea.setText(String.join("\n", viewModel.getPetsList())); + }); + + clearButton.addActionListener((ActionEvent e) -> { + speciesField.setText(""); + genderField.setText(""); + resultsArea.setText(""); + }); + + setVisible(true); + } +} From 439bdf4cbbf711362b78a0d2c470af709b99fe92 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:52:42 -0500 Subject: [PATCH 43/97] Update Pet.java --- src/main/java/entity/Pet.java | 146 +++++----------------------------- 1 file changed, 19 insertions(+), 127 deletions(-) diff --git a/src/main/java/entity/Pet.java b/src/main/java/entity/Pet.java index 80daa96d..6d0eeb4d 100644 --- a/src/main/java/entity/Pet.java +++ b/src/main/java/entity/Pet.java @@ -1,149 +1,41 @@ package entity; -import java.util.List; -import java.util.Objects; - public class Pet { - private final String id; - private final String name; - private final String species; - private final String primaryBreed; - private final String secondaryBreed; - private final boolean mixed; - private final String age; - private final String gender; - private final String size; - private final String coat; - private final List tags; - private final List photoUrls; // ordered list of photo URLs (small/medium/large/full as you choose) - private final String primaryPhotoMediumUrl; // convenience field (what you showed in Main.java) - private final Contact contact; // nested contact info - - public Pet(String id, - String name, - String species, - String primaryBreed, - String secondaryBreed, - boolean mixed, - String age, - String gender, - String size, - String coat, - List tags, - List photoUrls, - String primaryPhotoMediumUrl, - Contact contact) { + private String id; + private String name; + private String type; + private String breed; + private String age; + private String gender; + private String size; + private String contact; + + public Pet(String id, String name, String type, String breed, + String age, String gender, String size, String contact) { this.id = id; this.name = name; - this.species = species; - this.primaryBreed = primaryBreed; - this.secondaryBreed = secondaryBreed; - this.mixed = mixed; + this.type = type; + this.breed = breed; this.age = age; this.gender = gender; this.size = size; - this.coat = coat; - this.tags = tags; - this.photoUrls = photoUrls; - this.primaryPhotoMediumUrl = primaryPhotoMediumUrl; this.contact = contact; } // Getters public String getId() { return id; } public String getName() { return name; } - public String getSpecies() { return species; } - public String getPrimaryBreed() { return primaryBreed; } - public String getSecondaryBreed() { return secondaryBreed; } - public boolean isMixed() { return mixed; } + public String getType() { return type; } + public String getBreed() { return breed; } public String getAge() { return age; } public String getGender() { return gender; } public String getSize() { return size; } - public String getCoat() { return coat; } - public List getTags() { return tags; } - public List getPhotoUrls() { return photoUrls; } - public String getPrimaryPhotoMediumUrl() { return primaryPhotoMediumUrl; } - public Contact getContact() { return contact; } - - @Override - public String toString() { - return "Pet{" + - "id='" + id + '\'' + - ", name='" + name + '\'' + - ", species='" + species + '\'' + - ", primaryBreed='" + primaryBreed + '\'' + - ", age='" + age + '\'' + - ", gender='" + gender + '\'' + - ", primaryPhotoMediumUrl='" + primaryPhotoMediumUrl + '\'' + - '}'; - } + public String getContact() { return contact; } - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (!(o instanceof Pet)) return false; - Pet pet = (Pet) o; - return Objects.equals(id, pet.id); - } @Override - public int hashCode() { - return Objects.hash(id); - } - - // Contact nested static class - public static class Contact { - private final String email; - private final String phone; - private final Address address; - - public Contact(String email, String phone, Address address) { - this.email = email; - this.phone = phone; - this.address = address; - } - - public String getEmail() { return email; } - public String getPhone() { return phone; } - public Address getAddress() { return address; } - - @Override - public String toString() { - return "Contact{" + "email='" + email + '\'' + ", phone='" + phone + '\'' + ", address=" + address + '}'; - } - } - - // Address nested static class - public static class Address { - private final String address1; - private final String city; - private final String state; - private final String postcode; - private final String country; - - public Address(String address1, String city, String state, String postcode, String country) { - this.address1 = address1; - this.city = city; - this.state = state; - this.postcode = postcode; - this.country = country; - } - - public String getAddress1() { return address1; } - public String getCity() { return city; } - public String getState() { return state; } - public String getPostcode() { return postcode; } - public String getCountry() { return country; } - - @Override - public String toString() { - return "Address{" + - "address1='" + address1 + '\'' + - ", city='" + city + '\'' + - ", state='" + state + '\'' + - ", postcode='" + postcode + '\'' + - ", country='" + country + '\'' + - '}'; - } + public String toString() { + return name + " (" + type + ", " + breed + ", " + gender + ")"; } } + From 42f8aa64c80429eb6dc9219a38cc2ac8ea72a4cd Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:53:10 -0500 Subject: [PATCH 44/97] Update BrowseFilterController.java --- .../browse_filter/BrowseFilterController.java | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterController.java b/src/main/java/interface_adapter/browse_filter/BrowseFilterController.java index 063eb50c..8b137891 100644 --- a/src/main/java/interface_adapter/browse_filter/BrowseFilterController.java +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterController.java @@ -1,16 +1 @@ -package interface_adapter.browse_filter; -import use_case.browse_filter.*; - -public class BrowseFilterController { - private final BrowseFilterInputBoundary interactor; - - public BrowseFilterController(BrowseFilterInputBoundary interactor) { - this.interactor = interactor; - } - - public void onSearch(String species, String gender) { - BrowseFilterInputData inputData = new BrowseFilterInputData(species, gender); - interactor.execute(inputData); - } -} From bbffbf8bc6ff69b8e6242d30dc52fc03b12299d8 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:53:23 -0500 Subject: [PATCH 45/97] Update BrowseFilterPresenter.java --- .../browse_filter/BrowseFilterPresenter.java | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java b/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java index d741614d..8b137891 100644 --- a/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java @@ -1,25 +1 @@ -package interface_adapter.browse_filter; -import entity.Pet; -import use_case.browse_filter.BrowseFilterOutputBoundary; -import use_case.browse_filter.BrowseFilterOutputData; - -import java.util.List; -import java.util.stream.Collectors; - -public class BrowseFilterPresenter implements BrowseFilterOutputBoundary { - private final BrowseFilterViewModel viewModel; - - public BrowseFilterPresenter(BrowseFilterViewModel viewModel) { - this.viewModel = viewModel; - } - - @Override - public void presentPets(BrowseFilterOutputData outputData) { - List petSummaries = outputData.getPets().stream() - .map(p -> p.getName() + " | " + p.getPrimaryBreed() + " | " + p.getAge() + " | " + p.getGender()) - .collect(Collectors.toList()); - - viewModel.setPetsList(petSummaries); - } -} From f8df1b39f319be45f6bd56caf7c2f70b12712bba Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:53:36 -0500 Subject: [PATCH 46/97] Update BrowseFilterViewModel.java --- .../browse_filter/BrowseFilterViewModel.java | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java b/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java index 0f56b348..8b137891 100644 --- a/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java @@ -1,19 +1 @@ -package interface_adapter.browse_filter; -import java.util.ArrayList; -import java.util.List; - -public class BrowseFilterViewModel { - private List petsList = new ArrayList<>(); - - public List getPetsList() { - return petsList; - } - - public void setPetsList(List petsList) { - this.petsList = petsList; - // In a full app, you’d notify listeners here (for now, just print) - System.out.println("🐾 Found pets: "); - petsList.forEach(System.out::println); - } -} From e65f0a57bb49cd9bae0e7cb6a37f53cdedc368b1 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:54:18 -0500 Subject: [PATCH 47/97] Update BrowseFilterInputBoundary.java --- .../use_case/browse_filter/BrowseFilterInputBoundary.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java b/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java index 0efb1cec..139597f9 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java @@ -1,6 +1,2 @@ -package use_case.browse_filter; -public interface BrowseFilterInputBoundary { - void execute(BrowseFilterInputData inputData); -} From 3e6643c4aed86af6f01e34b600c311e438dca401 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:54:31 -0500 Subject: [PATCH 48/97] Update BrowseFilterInputData.java --- .../browse_filter/BrowseFilterInputData.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterInputData.java b/src/main/java/use_case/browse_filter/BrowseFilterInputData.java index a2df0f71..8b137891 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterInputData.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterInputData.java @@ -1,14 +1 @@ -package use_case.browse_filter; -public class BrowseFilterInputData { - private final String species; - private final String gender; - - public BrowseFilterInputData(String species, String gender) { - this.species = species; - this.gender = gender; - } - - public String getSpecies() { return species; } - public String getGender() { return gender; } -} From 9a6c27e8c5ef551090f42fa40ee17cd67a5a2249 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:54:45 -0500 Subject: [PATCH 49/97] Update BrowseFilterInteractor.java --- .../browse_filter/BrowseFilterInteractor.java | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java b/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java index 25fb5ad0..8b137891 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java @@ -1,27 +1 @@ -package use_case.browse_filter; -import data_access.PetAPIGatewayInterface; -import entity.Pet; -import java.util.List; - -public class BrowseFilterInteractor implements BrowseFilterInputBoundary { - private final PetAPIGatewayInterface petApiGateway; - private final BrowseFilterOutputBoundary presenter; - - public BrowseFilterInteractor(PetAPIGatewayInterface petApiGateway, BrowseFilterOutputBoundary presenter) { - this.petApiGateway = petApiGateway; - this.presenter = presenter; - } - - @Override - public void execute(BrowseFilterInputData inputData) { - // Fetch pets using filters - List pets = petApiGateway.fetchPets( - inputData.getSpecies(), - inputData.getGender() - ); - - BrowseFilterOutputData outputData = new BrowseFilterOutputData(pets); - presenter.presentPets(outputData); - } -} From 399848704db58356e95cbc26c8e3a4fb30e4e01a Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:54:58 -0500 Subject: [PATCH 50/97] Update BrowseFilterOutputBoundary.java --- .../use_case/browse_filter/BrowseFilterOutputBoundary.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java b/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java index 01bc52a1..8b137891 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java @@ -1,5 +1 @@ -package use_case.browse_filter; -public interface BrowseFilterOutputBoundary { - void presentPets(BrowseFilterOutputData outputData); -} From fd627784f06a5ab605c5c02ad4b60ab14ff18f54 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:55:13 -0500 Subject: [PATCH 51/97] Update BrowseFilterOutputData.java --- .../browse_filter/BrowseFilterOutputData.java | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java b/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java index 33da647c..8b137891 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java @@ -1,14 +1 @@ -package use_case.browse_filter; -import entity.Pet; -import java.util.List; - -public class BrowseFilterOutputData { - private final List pets; - - public BrowseFilterOutputData(List pets) { - this.pets = pets; - } - - public List getPets() { return pets; } -} From dbb6b4bb6fc0a26a85ef22bc6c28a8237ebf6d83 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:55:31 -0500 Subject: [PATCH 52/97] Update BrowseFilterView.java --- src/main/java/view/BrowseFilterView.java | 82 ------------------------ 1 file changed, 82 deletions(-) diff --git a/src/main/java/view/BrowseFilterView.java b/src/main/java/view/BrowseFilterView.java index e7ae5fc4..8b137891 100644 --- a/src/main/java/view/BrowseFilterView.java +++ b/src/main/java/view/BrowseFilterView.java @@ -1,83 +1 @@ -package view; -import interface_adapter.browse_filter.BrowseFilterController; -import interface_adapter.browse_filter.BrowseFilterViewModel; - -import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; - -public class BrowseFilterView extends JFrame { - private final BrowseFilterController controller; - private final BrowseFilterViewModel viewModel; - - public BrowseFilterView(BrowseFilterController controller, BrowseFilterViewModel viewModel) { - this.controller = controller; - this.viewModel = viewModel; - - setTitle("🐾 Pet Adoption Browser"); - setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); - setSize(700, 500); - setLocationRelativeTo(null); // Center window on screen - - // === INPUT FIELDS === - JTextField speciesField = new JTextField(10); - JTextField genderField = new JTextField(10); - - // === BUTTONS === - JButton searchButton = new JButton("Search"); - JButton clearButton = new JButton("Clear Filters"); - - // === RESULTS AREA === - JTextArea resultsArea = new JTextArea(); - resultsArea.setEditable(false); - resultsArea.setFont(new Font("Monospaced", Font.PLAIN, 13)); - - // Make results scrollable - JScrollPane scrollPane = new JScrollPane(resultsArea); - scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); - scrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); - scrollPane.setBorder(BorderFactory.createTitledBorder("Results")); - - // === INPUT PANEL === - JPanel inputPanel = new JPanel(new GridLayout(1, 4, 10, 10)); - inputPanel.setBorder(BorderFactory.createTitledBorder("Filters")); - inputPanel.add(new JLabel("Species:")); - inputPanel.add(speciesField); - inputPanel.add(new JLabel("Gender:")); - inputPanel.add(genderField); - - // === BUTTON PANEL === - JPanel buttonPanel = new JPanel(); - buttonPanel.add(searchButton); - buttonPanel.add(clearButton); - - // === COMBINE INPUT + BUTTON PANELS === - JPanel topPanel = new JPanel(new BorderLayout()); - topPanel.add(inputPanel, BorderLayout.NORTH); - topPanel.add(buttonPanel, BorderLayout.SOUTH); - - // === MAIN LAYOUT === - setLayout(new BorderLayout(10, 10)); - add(topPanel, BorderLayout.NORTH); - add(scrollPane, BorderLayout.CENTER); - - // === ACTIONS === - searchButton.addActionListener((ActionEvent e) -> { - controller.onSearch( - speciesField.getText(), - genderField.getText() - ); - - resultsArea.setText(String.join("\n", viewModel.getPetsList())); - }); - - clearButton.addActionListener((ActionEvent e) -> { - speciesField.setText(""); - genderField.setText(""); - resultsArea.setText(""); - }); - - setVisible(true); - } -} From 77642f5d285961302591d54093a39c8c04616531 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:56:26 -0500 Subject: [PATCH 53/97] Update DatabaseConnection.java --- src/main/java/data_access/DatabaseConnection.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/data_access/DatabaseConnection.java b/src/main/java/data_access/DatabaseConnection.java index 2c39a361..44d5b5da 100644 --- a/src/main/java/data_access/DatabaseConnection.java +++ b/src/main/java/data_access/DatabaseConnection.java @@ -10,6 +10,7 @@ public class DatabaseConnection { public static Connection connect() throws SQLException { Connection conn = DriverManager.getConnection(DB_URL); + conn.setAutoCommit(true); // simpler for small projects createTableIfNotExists(conn); return conn; } @@ -19,17 +20,17 @@ private static void createTableIfNotExists(Connection conn) throws SQLException CREATE TABLE IF NOT EXISTS pets ( id TEXT PRIMARY KEY, name TEXT, - species TEXT, - gender TEXT, + type TEXT, breed TEXT, age TEXT, + gender TEXT, size TEXT, - coat TEXT + contact TEXT ); """; - try (Statement stmt = conn.createStatement()) { stmt.execute(createTableSQL); } } } + From 67a00e9a564a26ad144e5579c84bafd570d135b1 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:57:22 -0500 Subject: [PATCH 54/97] Update DatabasePetGateway.java --- .../java/data_access/DatabasePetGateway.java | 129 ++++-------------- 1 file changed, 29 insertions(+), 100 deletions(-) diff --git a/src/main/java/data_access/DatabasePetGateway.java b/src/main/java/data_access/DatabasePetGateway.java index e90e200b..44d5b5da 100644 --- a/src/main/java/data_access/DatabasePetGateway.java +++ b/src/main/java/data_access/DatabasePetGateway.java @@ -1,107 +1,36 @@ package data_access; -import entity.Pet; -import java.sql.*; -import java.util.ArrayList; -import java.util.List; - -public class DatabasePetGateway implements PetAPIGatewayInterface { - private final Connection conn; - - public DatabasePetGateway(Connection conn) { - this.conn = conn; - } - - @Override - public List fetchPets(String species, String gender) { - List pets = new ArrayList<>(); - - String sql = "SELECT * FROM pets WHERE species LIKE ? AND gender LIKE ?"; - try (PreparedStatement stmt = conn.prepareStatement(sql)) { - stmt.setString(1, species.isEmpty() ? "%" : species); - stmt.setString(2, gender.isEmpty() ? "%" : gender); - ResultSet rs = stmt.executeQuery(); - - while (rs.next()) { - pets.add(new Pet( - rs.getString("id"), - rs.getString("name"), - rs.getString("species"), - rs.getString("breed"), - "", false, - rs.getString("age"), - rs.getString("gender"), - rs.getString("size"), - rs.getString("coat"), - new ArrayList<>(), - new ArrayList<>(), - null, // photo removed - null - )); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return pets; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; + +public class DatabaseConnection { + private static final String DB_URL = "jdbc:sqlite:src/main/resources/pets.db"; + + public static Connection connect() throws SQLException { + Connection conn = DriverManager.getConnection(DB_URL); + conn.setAutoCommit(true); // simpler for small projects + createTableIfNotExists(conn); + return conn; } - @Override - public Pet fetchPetById(String petId) { - String sql = "SELECT * FROM pets WHERE id = ?"; - try (PreparedStatement stmt = conn.prepareStatement(sql)) { - stmt.setString(1, petId); - ResultSet rs = stmt.executeQuery(); - if (rs.next()) { - return new Pet( - rs.getString("id"), - rs.getString("name"), - rs.getString("species"), - rs.getString("breed"), - "", false, - rs.getString("age"), - rs.getString("gender"), - rs.getString("size"), - rs.getString("coat"), - new ArrayList<>(), - new ArrayList<>(), - null, // photo removed - null - ); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return null; - } - - // Add and remove methods - public void addPet(Pet pet) { - String sql = "INSERT OR REPLACE INTO pets (id, name, species, gender, breed, age, size, coat) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; - try (PreparedStatement stmt = conn.prepareStatement(sql)) { - stmt.setString(1, pet.getId()); - stmt.setString(2, pet.getName()); - stmt.setString(3, pet.getSpecies()); - stmt.setString(4, pet.getGender()); - stmt.setString(5, pet.getPrimaryBreed()); - stmt.setString(6, pet.getAge()); - stmt.setString(7, pet.getSize()); - stmt.setString(8, pet.getCoat()); - stmt.executeUpdate(); - conn.commit(); // ensure the insert is saved - System.out.println("✅ Added pet to DB: " + pet.getName()); - } catch (SQLException e) { - e.printStackTrace(); - } - } - - public void removePet(String id) { - String sql = "DELETE FROM pets WHERE id = ?"; - try (PreparedStatement stmt = conn.prepareStatement(sql)) { - stmt.setString(1, id); - stmt.executeUpdate(); - conn.commit(); // ensure deletion is saved - } catch (SQLException e) { - e.printStackTrace(); + private static void createTableIfNotExists(Connection conn) throws SQLException { + String createTableSQL = """ + CREATE TABLE IF NOT EXISTS pets ( + id TEXT PRIMARY KEY, + name TEXT, + type TEXT, + breed TEXT, + age TEXT, + gender TEXT, + size TEXT, + contact TEXT + ); + """; + try (Statement stmt = conn.createStatement()) { + stmt.execute(createTableSQL); } } } + From c7051513f0ac92e88bc788a7cf485199c58e4c25 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:57:50 -0500 Subject: [PATCH 55/97] Update PetAPIGatewayInterface.java From 8eeb443eb9b8ca1233ca29b8e4bc68c191bc613f Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:58:33 -0500 Subject: [PATCH 56/97] Update PetfinderAPIGateway.java --- .../java/data_access/PetfinderAPIGateway.java | 99 ++++--------------- 1 file changed, 21 insertions(+), 78 deletions(-) diff --git a/src/main/java/data_access/PetfinderAPIGateway.java b/src/main/java/data_access/PetfinderAPIGateway.java index 4650b1df..b7fd04a4 100644 --- a/src/main/java/data_access/PetfinderAPIGateway.java +++ b/src/main/java/data_access/PetfinderAPIGateway.java @@ -10,24 +10,23 @@ public class PetfinderAPIGateway implements PetAPIGatewayInterface { private final OkHttpClient client = new OkHttpClient(); - private final String apiToken; // You already successfully retrieved this in your test + private final String apiToken; public PetfinderAPIGateway(String apiToken) { this.apiToken = apiToken; } @Override - public List fetchPets(String species, String gender) { + public List fetchPets(String type, String gender) { List pets = new ArrayList<>(); - // Build request URL HttpUrl.Builder urlBuilder = HttpUrl.parse("https://api.petfinder.com/v2/animals").newBuilder(); - if (!species.isBlank()) urlBuilder.addQueryParameter("type", species); + if (!type.isBlank()) urlBuilder.addQueryParameter("type", type); if (!gender.isBlank()) urlBuilder.addQueryParameter("gender", gender); - urlBuilder.addQueryParameter("limit", "50"); + urlBuilder.addQueryParameter("limit", "100"); Request request = new Request.Builder() - .url(urlBuilder.build().toString()) + .url(urlBuilder.build()) .addHeader("Authorization", "Bearer " + apiToken) .build(); @@ -35,83 +34,26 @@ public List fetchPets(String species, String gender) { String jsonString = response.body().string(); JSONObject root = new JSONObject(jsonString); - System.out.println("🔍 Raw JSON response:\n" + jsonString); - - JSONArray animalsArray = root.getJSONArray("animals"); - - for (int i = 0; i < animalsArray.length(); i++) { - JSONObject a = animalsArray.getJSONObject(i); + JSONArray animals = root.getJSONArray("animals"); + for (int i = 0; i < animals.length(); i++) { + JSONObject a = animals.getJSONObject(i); String id = String.valueOf(a.getInt("id")); String name = a.optString("name", "Unknown"); - String speciesRes = a.optString("species", "Unknown"); - + String species = a.optString("species", "Unknown"); JSONObject breeds = a.getJSONObject("breeds"); - String primaryBreed = breeds.optString("primary", "Unknown"); - String secondaryBreed = breeds.optString("secondary", ""); - boolean mixed = breeds.optBoolean("mixed", false); - - String petAge = a.optString("age", "Unknown"); - String petGender = a.optString("gender", "Unknown"); - String petSize = a.optString("size", "Unknown"); - String coat = a.optString("coat", "Unknown"); - - // Photos - List allPhotos = new ArrayList<>(); - String primaryMediumPhoto = null; - - if (a.has("photos")) { - JSONArray photos = a.getJSONArray("photos"); - for (int p = 0; p < photos.length(); p++) { - JSONObject photo = photos.getJSONObject(p); - if (photo.has("medium")) - allPhotos.add(photo.getString("medium")); - } - } - - if (a.has("primary_photo_cropped") && !a.isNull("primary_photo_cropped")) { - JSONObject ppc = a.getJSONObject("primary_photo_cropped"); - primaryMediumPhoto = ppc.optString("medium", null); - } - - // Contact - JSONObject contactObj = a.optJSONObject("contact"); - Pet.Contact contact = null; - - if (contactObj != null) { - String email = contactObj.optString("email", ""); - String phone = contactObj.optString("phone", ""); - - JSONObject addressObj = contactObj.optJSONObject("address"); - Pet.Address address = null; - if (addressObj != null) { - address = new Pet.Address( - addressObj.optString("address1", ""), - addressObj.optString("city", ""), - addressObj.optString("state", ""), - addressObj.optString("postcode", ""), - addressObj.optString("country", "") - ); - } - contact = new Pet.Contact(email, phone, address); + String breed = breeds.optString("primary", "Unknown"); + String age = a.optString("age", "Unknown"); + String g = a.optString("gender", "Unknown"); + String size = a.optString("size", "Unknown"); + + String contact = ""; + if (a.has("contact")) { + JSONObject c = a.getJSONObject("contact"); + contact = c.optString("email", ""); } - pets.add(new Pet( - id, - name, - speciesRes, - primaryBreed, - secondaryBreed, - mixed, - petAge, - petGender, - petSize, - coat, - new ArrayList<>(), // tags can be added later - allPhotos, - primaryMediumPhoto, - contact - )); + pets.add(new Pet(id, name, species, breed, age, g, size, contact)); } } catch (Exception e) { @@ -123,7 +65,8 @@ public List fetchPets(String species, String gender) { @Override public Pet fetchPetById(String petId) { - // we will implement this after Browse+Filter use case is done + // Optional for later use return null; } } + From 25b5870c854de284005cb93ccd8fc42e3083a843 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 10:59:06 -0500 Subject: [PATCH 57/97] Update PetfinderAuthService.java --- src/main/java/data_access/PetfinderAuthService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/data_access/PetfinderAuthService.java b/src/main/java/data_access/PetfinderAuthService.java index 3a43fece..f683b5f5 100644 --- a/src/main/java/data_access/PetfinderAuthService.java +++ b/src/main/java/data_access/PetfinderAuthService.java @@ -36,3 +36,4 @@ public static String getAccessToken() throws Exception { } } } + From ed642a44bbcc83367cf63c4050cbd5a8d1c6f973 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 11:00:09 -0500 Subject: [PATCH 58/97] Update pom.xml --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 2d769770..25ea50bf 100644 --- a/pom.xml +++ b/pom.xml @@ -38,3 +38,4 @@ + From 427ac454bf0acf9f3e3206e8ee223f4e0ea650ac Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 11:08:38 -0500 Subject: [PATCH 59/97] Create MainDatabase.java --- src/main/java/app/MainDatabase.java | 52 +++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 src/main/java/app/MainDatabase.java diff --git a/src/main/java/app/MainDatabase.java b/src/main/java/app/MainDatabase.java new file mode 100644 index 00000000..17c1d7c9 --- /dev/null +++ b/src/main/java/app/MainDatabase.java @@ -0,0 +1,52 @@ +//Creating this file temporarily to put data in the database. Should be included with Main later on. + +package app; + +import data_access.*; +import java.sql.Connection; + +public class MainDatabase { + public static void main(String[] args) throws Exception { + // Step 1: Connect to SQLite database + Connection conn = DatabaseConnection.connect(); + DatabasePetGateway dbGateway = new DatabasePetGateway(conn); + + // Step 2: Populate DB from API if empty + var existingPets = dbGateway.fetchPets("", ""); + if (existingPets.isEmpty()) { + System.out.println("🐾 Database is empty — importing pets from API..."); + + String[] speciesList = {"dog", "cat", "rabbit", "bird", "horse"}; // Can add more types + int totalImported = 0; + + for (String species : speciesList) { + // Get a new token for every API call (prevents "token expired" errors) + String token = PetfinderAuthService.getAccessToken(); + PetfinderAPIGateway apiGateway = new PetfinderAPIGateway(token); + + System.out.println("Fetching " + species + " from API..."); + var pets = apiGateway.fetchPets(species, ""); + + if (pets.isEmpty()) { + System.out.println("⚠️ No pets fetched for " + species + " — check API or token"); + } else { + for (var pet : pets) { + dbGateway.addPet(pet); + } + totalImported += pets.size(); + System.out.println("Imported " + pets.size() + " " + species + "(s) into database!"); + } + } + + System.out.println("Total pets imported: " + totalImported); + } + + // Step 3: Show how many pets are in the database + var allPets = dbGateway.fetchPets("", ""); + System.out.println("Total pets in database: " + allPets.size()); + for (var pet : allPets) { + System.out.println(pet.getType()); + } + + } +} From 4f0e5039b2c4ce8442e9299eda1bbd612e34f8b0 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 12 Nov 2025 11:16:50 -0500 Subject: [PATCH 60/97] Update DatabasePetGateway.java --- .../java/data_access/DatabasePetGateway.java | 116 +++++++++++++----- 1 file changed, 88 insertions(+), 28 deletions(-) diff --git a/src/main/java/data_access/DatabasePetGateway.java b/src/main/java/data_access/DatabasePetGateway.java index 44d5b5da..8bac2336 100644 --- a/src/main/java/data_access/DatabasePetGateway.java +++ b/src/main/java/data_access/DatabasePetGateway.java @@ -1,36 +1,96 @@ package data_access; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.sql.Statement; - -public class DatabaseConnection { - private static final String DB_URL = "jdbc:sqlite:src/main/resources/pets.db"; - - public static Connection connect() throws SQLException { - Connection conn = DriverManager.getConnection(DB_URL); - conn.setAutoCommit(true); // simpler for small projects - createTableIfNotExists(conn); - return conn; +import entity.Pet; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; + +public class DatabasePetGateway implements PetAPIGatewayInterface { + private final Connection conn; + + public DatabasePetGateway(Connection conn) { + this.conn = conn; + } + + @Override + public List fetchPets(String type, String gender) { + List pets = new ArrayList<>(); + String sql = "SELECT * FROM pets WHERE type LIKE ? AND gender LIKE ?"; + + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, type.isEmpty() ? "%" : type); + stmt.setString(2, gender.isEmpty() ? "%" : gender); + ResultSet rs = stmt.executeQuery(); + + while (rs.next()) { + pets.add(new Pet( + rs.getString("id"), + rs.getString("name"), + rs.getString("type"), + rs.getString("breed"), + rs.getString("age"), + rs.getString("gender"), + rs.getString("size"), + rs.getString("contact") + )); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return pets; } - private static void createTableIfNotExists(Connection conn) throws SQLException { - String createTableSQL = """ - CREATE TABLE IF NOT EXISTS pets ( - id TEXT PRIMARY KEY, - name TEXT, - type TEXT, - breed TEXT, - age TEXT, - gender TEXT, - size TEXT, - contact TEXT - ); - """; - try (Statement stmt = conn.createStatement()) { - stmt.execute(createTableSQL); + @Override + public Pet fetchPetById(String petId) { + String sql = "SELECT * FROM pets WHERE id = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, petId); + ResultSet rs = stmt.executeQuery(); + if (rs.next()) { + return new Pet( + rs.getString("id"), + rs.getString("name"), + rs.getString("type"), + rs.getString("breed"), + rs.getString("age"), + rs.getString("gender"), + rs.getString("size"), + rs.getString("contact") + ); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return null; + } + + public void addPet(Pet pet) { + String sql = "INSERT OR REPLACE INTO pets (id, name, type, breed, age, gender, size, contact) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, pet.getId()); + stmt.setString(2, pet.getName()); + stmt.setString(3, pet.getType()); + stmt.setString(4, pet.getBreed()); + stmt.setString(5, pet.getAge()); + stmt.setString(6, pet.getGender()); + stmt.setString(7, pet.getSize()); + stmt.setString(8, pet.getContact()); + stmt.executeUpdate(); + System.out.println("✅ Added pet to DB: " + pet.getName()); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void removePet(String id) { + String sql = "DELETE FROM pets WHERE id = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, id); + stmt.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); } } } + From 2d95ac2626b8af1b631b246bc8b0e040a2d45d64 Mon Sep 17 00:00:00 2001 From: keikatee Date: Wed, 12 Nov 2025 11:46:38 -0500 Subject: [PATCH 61/97] Modified sign up usecase and interface adaptor --- .../signup/SignupController.java | 9 ++-- .../interface_adapter/signup/SignupState.java | 34 ++++++++++-- .../signup/SignupViewModel.java | 2 + .../java/use_case/signup/SignupInputData.java | 10 +++- src/main/java/view/SignupView.java | 52 +++++++++++++++++++ 5 files changed, 98 insertions(+), 9 deletions(-) diff --git a/src/main/java/interface_adapter/signup/SignupController.java b/src/main/java/interface_adapter/signup/SignupController.java index e347f4fe..7f2e0a26 100644 --- a/src/main/java/interface_adapter/signup/SignupController.java +++ b/src/main/java/interface_adapter/signup/SignupController.java @@ -5,7 +5,7 @@ /** * Controller for the Signup Use Case. - * Register Their name(First Name and Last Name) and Email and Password + * Register Their name(First Name and Last Name) and Username and Password */ public class SignupController { @@ -17,13 +17,14 @@ public SignupController(SignupInputBoundary userSignupUseCaseInteractor) { /** * Executes the Signup Use Case. + * @param firstname the First Name + * @param lastname the Last Name * @param username the username to sign up * @param password1 the password * @param password2 the password repeated */ - public void execute(String username, String password1, String password2) { - final SignupInputData signupInputData = new SignupInputData( - username, password1, password2); + public void execute(String firstname, String lastname, String username, String password1, String password2) { + final SignupInputData signupInputData = new SignupInputData(firstname, lastname, username, password1, password2); userSignupUseCaseInteractor.execute(signupInputData); } diff --git a/src/main/java/interface_adapter/signup/SignupState.java b/src/main/java/interface_adapter/signup/SignupState.java index 4a7f6932..75a6d086 100644 --- a/src/main/java/interface_adapter/signup/SignupState.java +++ b/src/main/java/interface_adapter/signup/SignupState.java @@ -4,12 +4,26 @@ * The state for the Signup View Model. */ public class SignupState { + private String firstname = ""; + private String firstnameError = ""; + private String lastname = ""; + private String lastnameError = ""; private String username = ""; - private String usernameError; + private String usernameError = ""; private String password = ""; - private String passwordError; + private String passwordError = ""; private String repeatPassword = ""; - private String repeatPasswordError; + private String repeatPasswordError = ""; + + // --- Getters --- + public String getFirstname() { + return firstname; + } + public String getFirstnameError() {return firstnameError;} + + public String getLastname() {return lastname;} + + public String getLastnameError() {return lastnameError;} public String getUsername() { return username; @@ -35,6 +49,16 @@ public String getRepeatPasswordError() { return repeatPasswordError; } + // --- Setters --- + + public void setFirstname(String firstname) {this.firstname = firstname;} + + public void setFirstnameError(String firstnameError) {this.firstnameError = firstnameError;} + + public void setLastname(String lastname) {this.lastname = lastname;} + + public void setLastnameError(String lastnameError) {this.lastnameError = lastnameError;} + public void setUsername(String username) { this.username = username; } @@ -62,7 +86,9 @@ public void setRepeatPasswordError(String repeatPasswordError) { @Override public String toString() { return "SignupState{" - + "username='" + username + '\'' + + "firstname='" + firstname + '\'' + + ", lastname='" + lastname + '\'' + + ", username='" + username + '\'' + ", password='" + password + '\'' + ", repeatPassword='" + repeatPassword + '\'' + '}'; diff --git a/src/main/java/interface_adapter/signup/SignupViewModel.java b/src/main/java/interface_adapter/signup/SignupViewModel.java index 01f0086b..458aefa8 100644 --- a/src/main/java/interface_adapter/signup/SignupViewModel.java +++ b/src/main/java/interface_adapter/signup/SignupViewModel.java @@ -8,6 +8,8 @@ public class SignupViewModel extends ViewModel { public static final String TITLE_LABEL = "Sign Up View"; + public static final String FIRSTNAME_LABEL = "First Name"; + public static final String LASTNAME_LABEL = "Last Name"; public static final String USERNAME_LABEL = "Choose username"; public static final String PASSWORD_LABEL = "Choose password"; public static final String REPEAT_PASSWORD_LABEL = "Enter password again"; diff --git a/src/main/java/use_case/signup/SignupInputData.java b/src/main/java/use_case/signup/SignupInputData.java index 86c5e8ab..2565a6c2 100644 --- a/src/main/java/use_case/signup/SignupInputData.java +++ b/src/main/java/use_case/signup/SignupInputData.java @@ -5,16 +5,24 @@ */ public class SignupInputData { + private final String firstname; + private final String lastname; private final String username; private final String password; private final String repeatPassword; - public SignupInputData(String username, String password, String repeatPassword) { + public SignupInputData(String firstname, String lastname, String username, String password, String repeatPassword) { + this.firstname = firstname; + this.lastname = lastname; this.username = username; this.password = password; this.repeatPassword = repeatPassword; } + String getFirstname() {return firstname;} + + String getLastname() {return lastname;} + String getUsername() { return username; } diff --git a/src/main/java/view/SignupView.java b/src/main/java/view/SignupView.java index 1330c097..f172f4f8 100644 --- a/src/main/java/view/SignupView.java +++ b/src/main/java/view/SignupView.java @@ -20,6 +20,8 @@ public class SignupView extends JPanel implements ActionListener, PropertyChange private final String viewName = "sign up"; private final SignupViewModel signupViewModel; + private final JTextField firstnameInputField = new JTextField(15); + private final JTextField lastnameInputField = new JTextField(15); private final JTextField usernameInputField = new JTextField(15); private final JPasswordField passwordInputField = new JPasswordField(15); private final JPasswordField repeatPasswordInputField = new JPasswordField(15); @@ -36,6 +38,10 @@ public SignupView(SignupViewModel signupViewModel) { final JLabel title = new JLabel(SignupViewModel.TITLE_LABEL); title.setAlignmentX(Component.CENTER_ALIGNMENT); + final LabelTextPanel firstnameInfo = new LabelTextPanel( + new JLabel(SignupViewModel.FIRSTNAME_LABEL), firstnameInputField); + final LabelTextPanel lastnameInfo = new LabelTextPanel( + new JLabel(SignupViewModel.LASTNAME_LABEL), lastnameInputField); final LabelTextPanel usernameInfo = new LabelTextPanel( new JLabel(SignupViewModel.USERNAME_LABEL), usernameInputField); final LabelTextPanel passwordInfo = new LabelTextPanel( @@ -59,6 +65,8 @@ public void actionPerformed(ActionEvent evt) { final SignupState currentState = signupViewModel.getState(); signupController.execute( + currentState.getFirstname(), + currentState.getLastname(), currentState.getUsername(), currentState.getPassword(), currentState.getRepeatPassword() @@ -78,6 +86,8 @@ public void actionPerformed(ActionEvent evt) { cancel.addActionListener(this); + addFirstnameListener(); + addLastnameListener(); addUsernameListener(); addPasswordListener(); addRepeatPasswordListener(); @@ -85,12 +95,54 @@ public void actionPerformed(ActionEvent evt) { this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); this.add(title); + this.add(firstnameInfo); + this.add(lastnameInfo); this.add(usernameInfo); this.add(passwordInfo); this.add(repeatPasswordInfo); this.add(buttons); } + private void addFirstnameListener() { + firstnameInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SignupState currentState = signupViewModel.getState(); + currentState.setFirstname(firstnameInputField.getText()); + signupViewModel.setState(currentState); + } + + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } + + private void addLastnameListener() { + lastnameInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SignupState currentState = signupViewModel.getState(); + currentState.setLastname(lastnameInputField.getText()); + signupViewModel.setState(currentState); + } + + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } + private void addUsernameListener() { usernameInputField.getDocument().addDocumentListener(new DocumentListener() { From 0ef3e83737c305c9159d1799c9211c80cc0d9c91 Mon Sep 17 00:00:00 2001 From: zahrabuch Date: Sat, 15 Nov 2025 16:23:25 -0500 Subject: [PATCH 62/97] pet class updates --- src/main/java/entity/Pet.java | 3 ++ src/main/java/entity/PetFactory.java | 8 ++++ .../add_pet/AddPetDataAccessInterface.java | 15 +++++++ .../use_case/add_pet/AddPetInputBoundary.java | 7 ++++ .../use_case/add_pet/AddPetInputData.java | 33 +++++++++++++++ .../use_case/add_pet/AddPetInteractor.java | 42 +++++++++++++++++++ .../add_pet/AddPetOutputBoundary.java | 7 ++++ .../use_case/add_pet/AddPetOutputData.java | 15 +++++++ 8 files changed, 130 insertions(+) create mode 100644 src/main/java/entity/PetFactory.java create mode 100644 src/main/java/use_case/add_pet/AddPetDataAccessInterface.java create mode 100644 src/main/java/use_case/add_pet/AddPetInputBoundary.java create mode 100644 src/main/java/use_case/add_pet/AddPetInputData.java create mode 100644 src/main/java/use_case/add_pet/AddPetInteractor.java create mode 100644 src/main/java/use_case/add_pet/AddPetOutputBoundary.java create mode 100644 src/main/java/use_case/add_pet/AddPetOutputData.java diff --git a/src/main/java/entity/Pet.java b/src/main/java/entity/Pet.java index b0bfaf66..c4247ab4 100644 --- a/src/main/java/entity/Pet.java +++ b/src/main/java/entity/Pet.java @@ -10,6 +10,9 @@ public class Pet { private String contact; private String description; + public Pet(String name, String type, String breed, int age, String gender, String size, String contact, String description) { + } + public String getName() {return name;} public void setName(String name) {this.name = name;} diff --git a/src/main/java/entity/PetFactory.java b/src/main/java/entity/PetFactory.java new file mode 100644 index 00000000..0becccf6 --- /dev/null +++ b/src/main/java/entity/PetFactory.java @@ -0,0 +1,8 @@ +package entity; +//Factory for creating Pet Objects +public class PetFactory { + public Pet create(String name, String type, String breed, int age, String gender, + String size, String contact, String description) { + return new Pet(name, type,breed,age,gender,size,contact, description); + } +} diff --git a/src/main/java/use_case/add_pet/AddPetDataAccessInterface.java b/src/main/java/use_case/add_pet/AddPetDataAccessInterface.java new file mode 100644 index 00000000..c2894fb6 --- /dev/null +++ b/src/main/java/use_case/add_pet/AddPetDataAccessInterface.java @@ -0,0 +1,15 @@ +package use_case.add_pet; + +import entity.Pet; + +public interface AddPetDataAccessInterface { + /** + * Returns true if a pet with this name already exists. + */ + boolean existsByName(String name); + + /** + * Saves a new pet to the data store. + */ + void add(Pet pet); +} diff --git a/src/main/java/use_case/add_pet/AddPetInputBoundary.java b/src/main/java/use_case/add_pet/AddPetInputBoundary.java new file mode 100644 index 00000000..983d8766 --- /dev/null +++ b/src/main/java/use_case/add_pet/AddPetInputBoundary.java @@ -0,0 +1,7 @@ +package use_case.add_pet; + +public interface AddPetInputBoundary { + + //Executes the Add Pet Use Case + void execute(AddPetInputData addPetInputData); +} diff --git a/src/main/java/use_case/add_pet/AddPetInputData.java b/src/main/java/use_case/add_pet/AddPetInputData.java new file mode 100644 index 00000000..f3fdc4df --- /dev/null +++ b/src/main/java/use_case/add_pet/AddPetInputData.java @@ -0,0 +1,33 @@ +package use_case.add_pet; + +public class AddPetInputData { + private String name; + private String type; + private String breed; + private int age; + private String gender; + private String size; + private String contact; + private String description; + + public AddPetInputData(String name, String type, String breed, int age, String gender, String size, + String contact, String description) { + this.name = name; + this.type = type; + this.breed = breed; + this.age = age; + this.gender = gender; + this.size = size; + this.contact = contact; + this.description = description; + } + + public String getName() {return name;} + public String getType() {return type;} + public String getBreed() {return breed;} + public int getAge() {return age;} + public String getGender() {return gender;} + public String getSize() {return size;} + public String getContact() {return contact;} + public String getDescription() {return description;} +} diff --git a/src/main/java/use_case/add_pet/AddPetInteractor.java b/src/main/java/use_case/add_pet/AddPetInteractor.java new file mode 100644 index 00000000..9aeb1a74 --- /dev/null +++ b/src/main/java/use_case/add_pet/AddPetInteractor.java @@ -0,0 +1,42 @@ +package use_case.add_pet; + +import entity.Pet; +import entity.PetFactory; + +public class AddPetInteractor implements AddPetInputBoundary { + private final PetFactory petFactory; + private final AddPetDataAccessInterface gallery; + + public AddPetInteractor(PetFactory petFactory, AddPetDataAccessInterface gallery) { + this.petFactory = petFactory; + this.gallery = gallery; + } + + @Override + public void execute(AddPetInputData addPetInputData) { + String petName = addPetInputData.getName(); + + // Check if pet already exists + if (gallery.existsByName(petName)) { + System.out.println("Pet already exists in gallery."); + return; + } + + // Create new Pet entity using factory + String petType = addPetInputData.getType(); + String breed = addPetInputData.getBreed(); + int age = addPetInputData.getAge(); + String gender = addPetInputData.getGender(); + String size = addPetInputData.getSize(); + String contact = addPetInputData.getContact(); + String description = addPetInputData.getDescription(); + + Pet newPet = petFactory.create(petName, petType, breed, age, gender, size, contact, description); + + // Save to data access layer + gallery.add(newPet); + + System.out.println("Pet added successfully!"); + } +} + diff --git a/src/main/java/use_case/add_pet/AddPetOutputBoundary.java b/src/main/java/use_case/add_pet/AddPetOutputBoundary.java new file mode 100644 index 00000000..2f809052 --- /dev/null +++ b/src/main/java/use_case/add_pet/AddPetOutputBoundary.java @@ -0,0 +1,7 @@ +package use_case.add_pet; + +public interface AddPetOutputBoundary { + void prepareSuccessView(AddPetOutputData outputData); + + void prepareFailView(String errorMessage); +} diff --git a/src/main/java/use_case/add_pet/AddPetOutputData.java b/src/main/java/use_case/add_pet/AddPetOutputData.java new file mode 100644 index 00000000..cef1a95b --- /dev/null +++ b/src/main/java/use_case/add_pet/AddPetOutputData.java @@ -0,0 +1,15 @@ +package use_case.add_pet; +import entity.Pet; + +import java.util.List; + +//Output Data for the AddPet usecase +public class AddPetOutputData { + private final List gallery;//change data type to gallery soon + + public AddPetOutputData(List gallery){ + this.gallery = gallery; + } + + public List getGallery() {return gallery;} +} From 78b48ce2e4210faf9e6c986893b0bebe6a62b2bd Mon Sep 17 00:00:00 2001 From: zahrabuch Date: Sat, 15 Nov 2025 17:31:45 -0500 Subject: [PATCH 63/97] pet class updates --- .../InMemoryPetDataAccessObject.java | 29 +++++++++++++++++++ src/main/java/entity/PetFactory.java | 6 ++-- .../add_pet/AddPetDataAccessInterface.java | 2 +- .../use_case/add_pet/AddPetInputData.java | 15 +++++----- .../use_case/add_pet/AddPetInteractor.java | 7 +++-- 5 files changed, 45 insertions(+), 14 deletions(-) create mode 100644 src/main/java/data_access/InMemoryPetDataAccessObject.java diff --git a/src/main/java/data_access/InMemoryPetDataAccessObject.java b/src/main/java/data_access/InMemoryPetDataAccessObject.java new file mode 100644 index 00000000..f45041b2 --- /dev/null +++ b/src/main/java/data_access/InMemoryPetDataAccessObject.java @@ -0,0 +1,29 @@ +package data_access; + +import entity.Pet; +import use_case.add_pet.AddPetDataAccessInterface; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class InMemoryPetDataAccessObject implements AddPetDataAccessInterface { + private final Map pets = new HashMap<>(); + + + // Optional: expose for debugging/testing + public Collection getAllPets() { + return pets.values(); + } + + @Override + public boolean existsById(String id) { + return false; + } + + @Override + public void add(Pet pet) { + + } +} + diff --git a/src/main/java/entity/PetFactory.java b/src/main/java/entity/PetFactory.java index 0becccf6..9fc5010e 100644 --- a/src/main/java/entity/PetFactory.java +++ b/src/main/java/entity/PetFactory.java @@ -1,8 +1,8 @@ package entity; //Factory for creating Pet Objects public class PetFactory { - public Pet create(String name, String type, String breed, int age, String gender, - String size, String contact, String description) { - return new Pet(name, type,breed,age,gender,size,contact, description); + public Pet create(String id, String name, String type, String breed, String age, String gender, + String size, String contact) { + return new Pet(id, name, type,breed, age ,gender,size,contact); } } diff --git a/src/main/java/use_case/add_pet/AddPetDataAccessInterface.java b/src/main/java/use_case/add_pet/AddPetDataAccessInterface.java index c2894fb6..5ca3b80c 100644 --- a/src/main/java/use_case/add_pet/AddPetDataAccessInterface.java +++ b/src/main/java/use_case/add_pet/AddPetDataAccessInterface.java @@ -6,7 +6,7 @@ public interface AddPetDataAccessInterface { /** * Returns true if a pet with this name already exists. */ - boolean existsByName(String name); + boolean existsById(String id); /** * Saves a new pet to the data store. diff --git a/src/main/java/use_case/add_pet/AddPetInputData.java b/src/main/java/use_case/add_pet/AddPetInputData.java index f3fdc4df..a9d6fc68 100644 --- a/src/main/java/use_case/add_pet/AddPetInputData.java +++ b/src/main/java/use_case/add_pet/AddPetInputData.java @@ -1,17 +1,18 @@ package use_case.add_pet; public class AddPetInputData { + private String id; private String name; private String type; private String breed; - private int age; + private String age; private String gender; private String size; private String contact; - private String description; - public AddPetInputData(String name, String type, String breed, int age, String gender, String size, - String contact, String description) { + public AddPetInputData(String id,String name, String type, String breed, String age, String gender, String size, + String contact) { + this.id = id; this.name = name; this.type = type; this.breed = breed; @@ -19,15 +20,15 @@ public AddPetInputData(String name, String type, String breed, int age, String g this.gender = gender; this.size = size; this.contact = contact; - this.description = description; } + public String getId() {return id;} public String getName() {return name;} public String getType() {return type;} public String getBreed() {return breed;} - public int getAge() {return age;} + public String getAge() {return age;} public String getGender() {return gender;} public String getSize() {return size;} public String getContact() {return contact;} - public String getDescription() {return description;} + } diff --git a/src/main/java/use_case/add_pet/AddPetInteractor.java b/src/main/java/use_case/add_pet/AddPetInteractor.java index 9aeb1a74..0eb577bc 100644 --- a/src/main/java/use_case/add_pet/AddPetInteractor.java +++ b/src/main/java/use_case/add_pet/AddPetInteractor.java @@ -23,15 +23,16 @@ public void execute(AddPetInputData addPetInputData) { } // Create new Pet entity using factory + String id = addPetInputData.getId(); String petType = addPetInputData.getType(); String breed = addPetInputData.getBreed(); - int age = addPetInputData.getAge(); + String age = addPetInputData.getAge(); String gender = addPetInputData.getGender(); String size = addPetInputData.getSize(); String contact = addPetInputData.getContact(); - String description = addPetInputData.getDescription(); - Pet newPet = petFactory.create(petName, petType, breed, age, gender, size, contact, description); + + Pet newPet = petFactory.create(id,petName, petType, breed, age, gender, size, contact); // Save to data access layer gallery.add(newPet); From 1bb2c6ae6921786b772233689d04f349329f7ca7 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Sat, 15 Nov 2025 17:41:00 -0500 Subject: [PATCH 64/97] Update DatabasePetGateway.java --- .../java/data_access/DatabasePetGateway.java | 70 +++++++++++++------ 1 file changed, 49 insertions(+), 21 deletions(-) diff --git a/src/main/java/data_access/DatabasePetGateway.java b/src/main/java/data_access/DatabasePetGateway.java index 8bac2336..47cfb37f 100644 --- a/src/main/java/data_access/DatabasePetGateway.java +++ b/src/main/java/data_access/DatabasePetGateway.java @@ -2,28 +2,28 @@ import entity.Pet; import java.sql.*; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class DatabasePetGateway implements PetAPIGatewayInterface { + private final Connection conn; + private final Map petMap = new HashMap<>(); + public DatabasePetGateway(Connection conn) { this.conn = conn; + loadAllPetsIntoMap(); } - @Override - public List fetchPets(String type, String gender) { - List pets = new ArrayList<>(); - String sql = "SELECT * FROM pets WHERE type LIKE ? AND gender LIKE ?"; - try (PreparedStatement stmt = conn.prepareStatement(sql)) { - stmt.setString(1, type.isEmpty() ? "%" : type); - stmt.setString(2, gender.isEmpty() ? "%" : gender); - ResultSet rs = stmt.executeQuery(); + private void loadAllPetsIntoMap() { + String sql = "SELECT * FROM pets"; + + try (Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(sql)) { while (rs.next()) { - pets.add(new Pet( + Pet pet = new Pet( rs.getString("id"), rs.getString("name"), rs.getString("type"), @@ -32,22 +32,30 @@ public List fetchPets(String type, String gender) { rs.getString("gender"), rs.getString("size"), rs.getString("contact") - )); + ); + petMap.put(pet.getId(), pet); } + + System.out.println("📥 Loaded " + petMap.size() + " pets into memory map."); + } catch (SQLException e) { e.printStackTrace(); } - return pets; } + @Override - public Pet fetchPetById(String petId) { - String sql = "SELECT * FROM pets WHERE id = ?"; + public List fetchPets(String type, String gender) { + List pets = new ArrayList<>(); + String sql = "SELECT * FROM pets WHERE type LIKE ? AND gender LIKE ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { - stmt.setString(1, petId); + stmt.setString(1, type.isEmpty() ? "%" : type); + stmt.setString(2, gender.isEmpty() ? "%" : gender); ResultSet rs = stmt.executeQuery(); - if (rs.next()) { - return new Pet( + + while (rs.next()) { + pets.add(new Pet( rs.getString("id"), rs.getString("name"), rs.getString("type"), @@ -56,16 +64,25 @@ public Pet fetchPetById(String petId) { rs.getString("gender"), rs.getString("size"), rs.getString("contact") - ); + )); } + } catch (SQLException e) { e.printStackTrace(); } - return null; + return pets; } + + @Override + public Pet fetchPetById(String petId) { + return petMap.get(petId); // O(1) lookup + } + + public void addPet(Pet pet) { String sql = "INSERT OR REPLACE INTO pets (id, name, type, breed, age, gender, size, contact) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setString(1, pet.getId()); stmt.setString(2, pet.getName()); @@ -76,17 +93,28 @@ public void addPet(Pet pet) { stmt.setString(7, pet.getSize()); stmt.setString(8, pet.getContact()); stmt.executeUpdate(); - System.out.println("✅ Added pet to DB: " + pet.getName()); + + // Update map + petMap.put(pet.getId(), pet); + + System.out.println("✅ Added pet to DB + map: " + pet.getName()); + } catch (SQLException e) { e.printStackTrace(); } } + public void removePet(String id) { String sql = "DELETE FROM pets WHERE id = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setString(1, id); stmt.executeUpdate(); + + // remove from map + petMap.remove(id); + } catch (SQLException e) { e.printStackTrace(); } From 091ac007081b906fc21042040fed888a94f645c0 Mon Sep 17 00:00:00 2001 From: Haizhiling Lyu Date: Sat, 15 Nov 2025 17:46:59 -0500 Subject: [PATCH 65/97] submit application use case files --- src/main/java/entity/Visitor.java | 51 ++++++------------- .../submit_application/SubmitController.java | 4 ++ .../submit_application/SubmitPresenter.java | 4 ++ .../submit_application/SubmitViewModel.java | 4 ++ .../SubmitInputBoundary.java | 4 ++ .../submit_application/SubmitInputData.java | 4 ++ .../submit_application/SubmitInteractor.java | 6 +++ .../SubmitOutputBoundary.java | 4 ++ .../submit_application/SubmitOutputData.java | 4 ++ src/main/java/view/SubmitView.java | 30 +++++++++++ 10 files changed, 79 insertions(+), 36 deletions(-) create mode 100644 src/main/java/interface_adapter/submit_application/SubmitController.java create mode 100644 src/main/java/interface_adapter/submit_application/SubmitPresenter.java create mode 100644 src/main/java/interface_adapter/submit_application/SubmitViewModel.java create mode 100644 src/main/java/use_case/submit_application/SubmitInputBoundary.java create mode 100644 src/main/java/use_case/submit_application/SubmitInputData.java create mode 100644 src/main/java/use_case/submit_application/SubmitInteractor.java create mode 100644 src/main/java/use_case/submit_application/SubmitOutputBoundary.java create mode 100644 src/main/java/use_case/submit_application/SubmitOutputData.java create mode 100644 src/main/java/view/SubmitView.java diff --git a/src/main/java/entity/Visitor.java b/src/main/java/entity/Visitor.java index 1e4f8571..cb1cc5a4 100644 --- a/src/main/java/entity/Visitor.java +++ b/src/main/java/entity/Visitor.java @@ -6,10 +6,8 @@ public class Visitor extends User{ private String address; private String homeEvi; private String occupation; - private String contactInfo; - private String adoptionReason; - private String availability; - private String prevExp; + private String phoneNum; + private String email; private String age; /** @@ -25,10 +23,7 @@ public Visitor(String name, String password) { this.address = ""; this.homeEvi = ""; this.occupation = ""; - this.contactInfo = ""; - this.adoptionReason = ""; - this.availability = ""; - this.prevExp = ""; + this.email = ""; this.age = ""; } @@ -64,36 +59,12 @@ public void setOccupation(String occupation) { this.occupation = occupation; } - public String getContactInfo() { - return contactInfo; + public String getEmail() { + return email; } - public void setContactInfo(String contactInfo) { - this.contactInfo = contactInfo; - } - - public String getAdoptionReason() { - return adoptionReason; - } - - public void setAdoptionReason(String adoptionReason) { - this.adoptionReason = adoptionReason; - } - - public String getAvailability() { - return availability; - } - - public void setAvailability(String availability) { - this.availability = availability; - } - - public String getPrevExp() { - return prevExp; - } - - public void setPrevExp(String prevExp) { - this.prevExp = prevExp; + public void setEmail(String email) { + this.email = email; } public String getAge() { @@ -103,4 +74,12 @@ public String getAge() { public void setAge(String age) { this.age = age; } + + public String getPhoneNum() { + return phoneNum; + } + + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } } diff --git a/src/main/java/interface_adapter/submit_application/SubmitController.java b/src/main/java/interface_adapter/submit_application/SubmitController.java new file mode 100644 index 00000000..bc6ad6de --- /dev/null +++ b/src/main/java/interface_adapter/submit_application/SubmitController.java @@ -0,0 +1,4 @@ +package interface_adapter.submit_application; + +public class SubmitController { +} diff --git a/src/main/java/interface_adapter/submit_application/SubmitPresenter.java b/src/main/java/interface_adapter/submit_application/SubmitPresenter.java new file mode 100644 index 00000000..a03119b0 --- /dev/null +++ b/src/main/java/interface_adapter/submit_application/SubmitPresenter.java @@ -0,0 +1,4 @@ +package interface_adapter.submit_application; + +public class SubmitPresenter { +} diff --git a/src/main/java/interface_adapter/submit_application/SubmitViewModel.java b/src/main/java/interface_adapter/submit_application/SubmitViewModel.java new file mode 100644 index 00000000..bee48e27 --- /dev/null +++ b/src/main/java/interface_adapter/submit_application/SubmitViewModel.java @@ -0,0 +1,4 @@ +package interface_adapter.submit_application; + +public class SubmitViewModel { +} diff --git a/src/main/java/use_case/submit_application/SubmitInputBoundary.java b/src/main/java/use_case/submit_application/SubmitInputBoundary.java new file mode 100644 index 00000000..6577b47e --- /dev/null +++ b/src/main/java/use_case/submit_application/SubmitInputBoundary.java @@ -0,0 +1,4 @@ +package use_case.submit_application; + +public interface SubmitInputBoundary { +} diff --git a/src/main/java/use_case/submit_application/SubmitInputData.java b/src/main/java/use_case/submit_application/SubmitInputData.java new file mode 100644 index 00000000..b369ab0d --- /dev/null +++ b/src/main/java/use_case/submit_application/SubmitInputData.java @@ -0,0 +1,4 @@ +package use_case.submit_application; + +public class SubmitInputData { +} diff --git a/src/main/java/use_case/submit_application/SubmitInteractor.java b/src/main/java/use_case/submit_application/SubmitInteractor.java new file mode 100644 index 00000000..ecf94212 --- /dev/null +++ b/src/main/java/use_case/submit_application/SubmitInteractor.java @@ -0,0 +1,6 @@ +package use_case.submit_application; + +import use_case.login.LoginInputBoundary; + +public class SubmitInteractor implements SubmitInputBoundary { +} diff --git a/src/main/java/use_case/submit_application/SubmitOutputBoundary.java b/src/main/java/use_case/submit_application/SubmitOutputBoundary.java new file mode 100644 index 00000000..6b14719b --- /dev/null +++ b/src/main/java/use_case/submit_application/SubmitOutputBoundary.java @@ -0,0 +1,4 @@ +package use_case.submit_application; + +public interface SubmitOutputBoundary { +} diff --git a/src/main/java/use_case/submit_application/SubmitOutputData.java b/src/main/java/use_case/submit_application/SubmitOutputData.java new file mode 100644 index 00000000..048e8d44 --- /dev/null +++ b/src/main/java/use_case/submit_application/SubmitOutputData.java @@ -0,0 +1,4 @@ +package use_case.submit_application; + +public class SubmitOutputData { +} diff --git a/src/main/java/view/SubmitView.java b/src/main/java/view/SubmitView.java new file mode 100644 index 00000000..c7d84614 --- /dev/null +++ b/src/main/java/view/SubmitView.java @@ -0,0 +1,30 @@ +package view; + +import interface_adapter.submit_application.SubmitViewModel; + +import javax.swing.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +public class SubmitView extends JPanel implements ActionListener, PropertyChangeListener { + final String viewName = "Fill the Blanks below to Create an Application"; + + private final SubmitViewModel submitViewModel; + private final JTextField legalNameInputField = new JTextField(15); + private final JTextField occupationInputField = new JTextField(15); + private final JTextField addressInputField = new JTextField(100); + private final JTextField homeEviInputField = new JTextField(200); + + + @Override + public void actionPerformed(ActionEvent e) { + + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + + } +} From ec6cebe006689a70a93bf852ff681c01453df706 Mon Sep 17 00:00:00 2001 From: zahrabuch Date: Sat, 15 Nov 2025 18:23:43 -0500 Subject: [PATCH 66/97] fixes on Application class --- src/main/java/entity/Application.java | 7 +++---- src/main/java/entity/Pet.java | 2 +- src/main/java/entity/Visitor.java | 10 ++++++++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/entity/Application.java b/src/main/java/entity/Application.java index aa3d5612..07687408 100644 --- a/src/main/java/entity/Application.java +++ b/src/main/java/entity/Application.java @@ -22,11 +22,11 @@ public class Application { private List personal_information; // helper method, to gather all info from the user - private getPersonaLInformation(Visitor user) { + public List getPersonalInfo() { // get all personal info from visitor String name = user.getName(); String email = user.getEmail(); - String phone_number = user.getPhone(); + String phone_number = user.getPhoneNumber(); String age = user.getAge(); String occupation = user.getOccupation(); @@ -46,7 +46,7 @@ private getPersonaLInformation(Visitor user) { */ // public Application(Visitor user, Pet pet, String reason_to_adopt, String home_environment, int availability, String previous_experience) { - List personal_information = getPersonalInformation(user); + List personal_information = getPersonalInfo(); // loop through the list, see if any is empty, if yes throw an error for (String info : personal_information) { if ("".equals(info)) { @@ -78,5 +78,4 @@ public String getReason() { public int getAvailability() {return availability;} public Visitor getVisitor() {return user;} - } diff --git a/src/main/java/entity/Pet.java b/src/main/java/entity/Pet.java index 6d0eeb4d..f66e8517 100644 --- a/src/main/java/entity/Pet.java +++ b/src/main/java/entity/Pet.java @@ -25,7 +25,7 @@ public Pet(String id, String name, String type, String breed, // Getters public String getId() { return id; } public String getName() { return name; } - public String getType() { return type; } + public String getType() { return type; } public String getBreed() { return breed; } public String getAge() { return age; } public String getGender() { return gender; } diff --git a/src/main/java/entity/Visitor.java b/src/main/java/entity/Visitor.java index 1e4f8571..51a84f43 100644 --- a/src/main/java/entity/Visitor.java +++ b/src/main/java/entity/Visitor.java @@ -11,6 +11,8 @@ public class Visitor extends User{ private String availability; private String prevExp; private String age; + private String phoneNumber; + private String email; /** * Creates a new user with the given non-empty name and non-empty password. @@ -103,4 +105,12 @@ public String getAge() { public void setAge(String age) { this.age = age; } + + public String getPhoneNumber() {return phoneNumber;} + + public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;} + + public String getEmail() {return email;} + + public void setEmail(String email) {this.email = email;} } From 4081327662d058e41b742fbcf84b5ac668378c44 Mon Sep 17 00:00:00 2001 From: zahrabuch Date: Sat, 15 Nov 2025 21:40:28 -0500 Subject: [PATCH 67/97] edited interactor --- src/main/java/use_case/add_pet/AddPetInteractor.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/use_case/add_pet/AddPetInteractor.java b/src/main/java/use_case/add_pet/AddPetInteractor.java index 0eb577bc..e130f327 100644 --- a/src/main/java/use_case/add_pet/AddPetInteractor.java +++ b/src/main/java/use_case/add_pet/AddPetInteractor.java @@ -14,16 +14,16 @@ public AddPetInteractor(PetFactory petFactory, AddPetDataAccessInterface gallery @Override public void execute(AddPetInputData addPetInputData) { - String petName = addPetInputData.getName(); + String petID = addPetInputData.getId(); // Check if pet already exists - if (gallery.existsByName(petName)) { + if (gallery.existsById(petID)) { System.out.println("Pet already exists in gallery."); return; } // Create new Pet entity using factory - String id = addPetInputData.getId(); + String petName = addPetInputData.getId(); String petType = addPetInputData.getType(); String breed = addPetInputData.getBreed(); String age = addPetInputData.getAge(); @@ -32,7 +32,7 @@ public void execute(AddPetInputData addPetInputData) { String contact = addPetInputData.getContact(); - Pet newPet = petFactory.create(id,petName, petType, breed, age, gender, size, contact); + Pet newPet = petFactory.create(petID,petName, petType, breed, age, gender, size, contact); // Save to data access layer gallery.add(newPet); From 511724423856bc269acc439b7669dd060aac527d Mon Sep 17 00:00:00 2001 From: Haizhiling Lyu Date: Sun, 16 Nov 2025 04:22:26 -0500 Subject: [PATCH 68/97] submit view almost done --- src/main/java/entity/Visitor.java | 25 +- .../submit_application/SubmitState.java | 102 +++++ .../submit_application/SubmitViewModel.java | 28 +- src/main/java/view/SignupView.java | 4 +- src/main/java/view/SubmitView.java | 356 +++++++++++++++++- 5 files changed, 503 insertions(+), 12 deletions(-) create mode 100644 src/main/java/interface_adapter/submit_application/SubmitState.java diff --git a/src/main/java/entity/Visitor.java b/src/main/java/entity/Visitor.java index cb1cc5a4..4551c3d1 100644 --- a/src/main/java/entity/Visitor.java +++ b/src/main/java/entity/Visitor.java @@ -2,7 +2,8 @@ public class Visitor extends User{ - private String legalName; + private String firstName; + private String lastName; private String address; private String homeEvi; private String occupation; @@ -19,20 +20,31 @@ public class Visitor extends User{ */ public Visitor(String name, String password) { super(name, password); - this.legalName = ""; + this.firstName = ""; + this.lastName = ""; this.address = ""; this.homeEvi = ""; this.occupation = ""; this.email = ""; + this.phoneNum = "" this.age = ""; } - public String getLegalName() { - return legalName; + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; } - public void setLegalName(String legalName) { - this.legalName = legalName; + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; } public String getAddress() { @@ -82,4 +94,5 @@ public String getPhoneNum() { public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } + } diff --git a/src/main/java/interface_adapter/submit_application/SubmitState.java b/src/main/java/interface_adapter/submit_application/SubmitState.java new file mode 100644 index 00000000..63a67253 --- /dev/null +++ b/src/main/java/interface_adapter/submit_application/SubmitState.java @@ -0,0 +1,102 @@ +package interface_adapter.submit_application; + +public class SubmitState { + private String username = ""; + private String firstname = ""; + private String lastname = ""; + private String address = ""; + private String homeEvi = ""; + private String occupation = ""; + private String phoneNum = ""; + private String email = ""; + private String age = ""; + private String reason = ""; + private String prevExp = ""; + private String availability = ""; + + + public String getUsername() { + return username; + } + public void setUsername(String username) { + this.username = username; + } + + public String getFirstname() { + return firstname; + } + public void setFirstname(String firstname) { + this.firstname = firstname; + } + + public String getLastname() { + return lastname; + } + public void setLastname(String lastname) { + this.lastname = lastname; + } + + public String getAddress() { + return address; + } + public void setAddress(String address) { + this.address = address; + } + + public String getHomeEvi() { + return homeEvi; + } + public void setHomeEvi(String homeEvi) { + this.homeEvi = homeEvi; + } + + public String getOccupation() { + return occupation; + } + public void setOccupation(String occupation) { + this.occupation = occupation; + } + + public String getPhoneNum() { + return phoneNum; + } + public void setPhoneNum(String phoneNum) { + this.phoneNum = phoneNum; + } + + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + + public String getAge() { + return age; + } + public void setAge(String age) { + this.age = age; + } + + public String getReason() { + return reason; + } + public void setReason(String reason) { + this.reason = reason; + } + + public String getPrevExp() { + return prevExp; + } + public void setPrevExp(String prevExp) { + this.prevExp = prevExp; + } + + public String getAvailability() { + return availability; + } + public void setAvailability(String availability) { + this.availability = availability; + } + +} diff --git a/src/main/java/interface_adapter/submit_application/SubmitViewModel.java b/src/main/java/interface_adapter/submit_application/SubmitViewModel.java index bee48e27..3bf5c5a7 100644 --- a/src/main/java/interface_adapter/submit_application/SubmitViewModel.java +++ b/src/main/java/interface_adapter/submit_application/SubmitViewModel.java @@ -1,4 +1,30 @@ package interface_adapter.submit_application; -public class SubmitViewModel { +import interface_adapter.ViewModel; + +public class SubmitViewModel extends ViewModel { + + public static final String TITLE_LABEL = "Start Your Application"; + public static final String USERNAME_LABEL = "Username"; + public static final String FIRSTNAME_LABEL = "First Name"; + public static final String LASTNAME_LABEL = "Last Name"; + public static final String AGE_LABEL = "Enter your age"; + public static final String OCCUPATION_LABEL = "Enter your occupation"; + public static final String ADDRESS_LABEL = "Enter your address"; + public static final String HOME_LABEL = "Describe your home environment"; + public static final String REASON_LABEL = "Reason(s) for wanting to adopt a pet"; + public static final String EXP_LABEL = "Describe your previous experience keeping a pet or pets; " + + "if none, write None."; + public static final String AVAILABILITY_LABEL = "How much time can you spend with the pet?"; + public static final String EMAIL_LABEL = "Enter your email"; + public static final String TEL_LABEL = "Enter your phone number"; + + public static final String SUBMIT_BUTTON_LABEL = "Submit"; + public static final String CANCEL_BUTTON_LABEL = "Cancel"; + + SubmitViewModel() { + super("submit"); + setState(new SubmitState()); + } + } diff --git a/src/main/java/view/SignupView.java b/src/main/java/view/SignupView.java index f172f4f8..6e90ed4d 100644 --- a/src/main/java/view/SignupView.java +++ b/src/main/java/view/SignupView.java @@ -32,7 +32,7 @@ public class SignupView extends JPanel implements ActionListener, PropertyChange private final JButton toLogin; public SignupView(SignupViewModel signupViewModel) { - this.signupViewModel = signupViewModel; + this.signupViewModel = signupViewModel; //其实是ViewModel所以get state会得到signup state signupViewModel.addPropertyChangeListener(this); final JLabel title = new JLabel(SignupViewModel.TITLE_LABEL); @@ -62,7 +62,7 @@ public SignupView(SignupViewModel signupViewModel) { new ActionListener() { public void actionPerformed(ActionEvent evt) { if (evt.getSource().equals(signUp)) { - final SignupState currentState = signupViewModel.getState(); + final SignupState currentState = signupViewModel.getState(); //取出用户输入的所有注册信息 signupController.execute( currentState.getFirstname(), diff --git a/src/main/java/view/SubmitView.java b/src/main/java/view/SubmitView.java index c7d84614..c05f219d 100644 --- a/src/main/java/view/SubmitView.java +++ b/src/main/java/view/SubmitView.java @@ -1,21 +1,364 @@ package view; +import interface_adapter.submit_application.SubmitController; +import interface_adapter.submit_application.SubmitState; import interface_adapter.submit_application.SubmitViewModel; import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; public class SubmitView extends JPanel implements ActionListener, PropertyChangeListener { - final String viewName = "Fill the Blanks below to Create an Application"; - + final String viewName = "Submit"; private final SubmitViewModel submitViewModel; - private final JTextField legalNameInputField = new JTextField(15); + + private final JTextField usernameInputField = new JTextField(15); + private final JTextField firstnameInputField = new JTextField(15); + private final JTextField lastnameInputField = new JTextField(15); + private final JTextField ageInputField = new JTextField(3); private final JTextField occupationInputField = new JTextField(15); private final JTextField addressInputField = new JTextField(100); private final JTextField homeEviInputField = new JTextField(200); + private final JTextField telInputField = new JTextField(20); + private final JTextField emailInputField = new JTextField(30); + private final JTextField reasonInputField = new JTextField(200); + private final JTextField prevExpInputField = new JTextField(100); + private final JTextField availabilityInputField = new JTextField(100); + private SubmitController submitController = null; + + private final JButton submit; + private final JButton cancel; + + public SubmitView(SubmitViewModel submitViewModel) { + this.submitViewModel = submitViewModel; + submitViewModel.addPropertyChangeListener(this); + + final JLabel title = new JLabel(SubmitViewModel.TITLE_LABEL); + title.setAlignmentX(Component.CENTER_ALIGNMENT); + + final LabelTextPanel usernameInfo = new LabelTextPanel( + new JLabel(SubmitViewModel.USERNAME_LABEL), usernameInputField); + final LabelTextPanel firstnameInfo = new LabelTextPanel( + new JLabel(SubmitViewModel.FIRSTNAME_LABEL), firstnameInputField); + final LabelTextPanel lastnameInfo = new LabelTextPanel( + new JLabel(SubmitViewModel.LASTNAME_LABEL), lastnameInputField); + final LabelTextPanel ageInfo = new LabelTextPanel( + new JLabel(SubmitViewModel.AGE_LABEL), ageInputField); + final LabelTextPanel occupationInfo = new LabelTextPanel( + new JLabel(SubmitViewModel.OCCUPATION_LABEL), occupationInputField); + final LabelTextPanel addressInfo = new LabelTextPanel( + new JLabel(SubmitViewModel.ADDRESS_LABEL), addressInputField); + final LabelTextPanel telInfo = new LabelTextPanel( + new JLabel(SubmitViewModel.TEL_LABEL), telInputField); + final LabelTextPanel emailInfo = new LabelTextPanel( + new JLabel(SubmitViewModel.EMAIL_LABEL), emailInputField); + + final JPanel homeEviInfo = new JPanel(); + homeEviInfo.setLayout(new BoxLayout(homeEviInfo, BoxLayout.Y_AXIS)); + homeEviInfo.add(new JLabel(SubmitViewModel.HOME_LABEL)); + homeEviInfo.add(homeEviInputField); + + final JPanel reasonInfo = new JPanel(); + homeEviInfo.setLayout(new BoxLayout(reasonInfo, BoxLayout.Y_AXIS)); + homeEviInfo.add(new JLabel(SubmitViewModel.REASON_LABEL)); + homeEviInfo.add(reasonInputField); + + final JPanel prevExpInfo = new JPanel(); + homeEviInfo.setLayout(new BoxLayout(prevExpInfo, BoxLayout.Y_AXIS)); + homeEviInfo.add(new JLabel(SubmitViewModel.EXP_LABEL)); + homeEviInfo.add(prevExpInputField); + + final JPanel availabilityInfo = new JPanel(); + homeEviInfo.setLayout(new BoxLayout(availabilityInfo, BoxLayout.Y_AXIS)); + homeEviInfo.add(new JLabel(SubmitViewModel.AVAILABILITY_LABEL)); + homeEviInfo.add(availabilityInputField); + + final JPanel buttons = new JPanel(); + submit = new JButton(SubmitViewModel.SUBMIT_BUTTON_LABEL); + buttons.add(submit); + cancel = new JButton(SubmitViewModel.CANCEL_BUTTON_LABEL); + buttons.add(cancel); + + submit.addActionListener( + new ActionListener() { + public void actionPerformed(ActionEvent evt) { + if (evt.getSource().equals(submit)) { + final SubmitState currentState = submitViewModel.getState(); + + submitController.execute() + + JOptionPane.showMessageDialog(this, + "Your application has been successfully submitted!"); + + } + } + } + ); + + cancel.addActionListener(this); + + addUsernameListener(); + addFirstnameListener(); + addLastnameListener(); + addAgeListener(); + addOccupationListener(); + addAddressListener(); + addHomeListener(); + addTelListener(); + addEmailListener(); + addReasonListener(); + addExpListener(); + addAvailabilityListener(); + + this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); + + this.add(title); + this.add(usernameInfo); + this.add(firstnameInfo); + this.add(lastnameInfo); + this.add(ageInfo); + this.add(occupationInfo); + this.add(addressInfo); + this.add(telInfo); + this.add(emailInfo); + this.add(reasonInfo); + this.add(prevExpInfo); + this.add(availabilityInfo); + this.add(buttons); + } + + private void addUsernameListener() { + usernameInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SubmitState currentState = submitViewModel.getState(); + currentState.setUsername(usernameInputField.getText()); + submitViewModel.setState(currentState); + } + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } + + private void addFirstnameListener() { + firstnameInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SubmitState currentState = submitViewModel.getState(); + currentState.setFirstname(firstnameInputField.getText()); + submitViewModel.setState(currentState); + } + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } + + private void addLastnameListener() { + lastnameInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SubmitState currentState = submitViewModel.getState(); + currentState.setLastname(lastnameInputField.getText()); + submitViewModel.setState(currentState); + } + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } + + private void addAgeListener() { + ageInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SubmitState currentState = submitViewModel.getState(); + currentState.setAge(ageInputField.getText()); + submitViewModel.setState(currentState); + } + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } + + private void addOccupationListener() { + occupationInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SubmitState currentState = submitViewModel.getState(); + currentState.setOccupation(occupationInputField.getText()); + submitViewModel.setState(currentState); + } + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } + + private void addAddressListener() { + addressInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SubmitState currentState = submitViewModel.getState(); + currentState.setAddress(addressInputField.getText()); + submitViewModel.setState(currentState); + } + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } + + private void addHomeListener() { + homeEviInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SubmitState currentState = submitViewModel.getState(); + currentState.setHomeEvi(homeEviInputField.getText()); + submitViewModel.setState(currentState); + } + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } + + private void addTelListener() { + telInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SubmitState currentState = submitViewModel.getState(); + currentState.setPhoneNum(telInputField.getText()); + submitViewModel.setState(currentState); + } + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } + + private void addEmailListener() { + emailInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SubmitState currentState = submitViewModel.getState(); + currentState.setEmail(emailInputField.getText()); + submitViewModel.setState(currentState); + } + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } + + private void addReasonListener() { + reasonInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SubmitState currentState = submitViewModel.getState(); + currentState.setReason(reasonInputField.getText()); + submitViewModel.setState(currentState); + } + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } + + private void addExpListener() { + prevExpInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SubmitState currentState = submitViewModel.getState(); + currentState.setPrevExp(prevExpInputField.getText()); + submitViewModel.setState(currentState); + } + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } + + private void addAvailabilityListener() { + availabilityInputField.getDocument().addDocumentListener(new DocumentListener() { + + private void documentListenerHelper() { + final SubmitState currentState = submitViewModel.getState(); + currentState.setAvailability(availabilityInputField.getText()); + submitViewModel.setState(currentState); + } + @Override + public void insertUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void removeUpdate(DocumentEvent e) {documentListenerHelper();} + + @Override + public void changedUpdate(DocumentEvent e) {documentListenerHelper();} + }); + } @Override @@ -27,4 +370,11 @@ public void actionPerformed(ActionEvent e) { public void propertyChange(PropertyChangeEvent evt) { } + public String getViewName() { + return viewName; + } + + public void setSignupController(SubmitController controller) { + this.submitController = controller; + } } From 47ab5b4f97521a7110430cad4cb1075dcb6846b5 Mon Sep 17 00:00:00 2001 From: keikatee Date: Mon, 17 Nov 2025 01:02:23 -0500 Subject: [PATCH 69/97] Modified logout system --- .../logout/LogoutController.java | 6 +++--- .../logout/LogoutPresenter.java | 21 +++++++++++++------ .../use_case/logout/LogoutInteractor.java | 13 ++++++++---- 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/src/main/java/interface_adapter/logout/LogoutController.java b/src/main/java/interface_adapter/logout/LogoutController.java index 49eedf89..6b915717 100644 --- a/src/main/java/interface_adapter/logout/LogoutController.java +++ b/src/main/java/interface_adapter/logout/LogoutController.java @@ -7,16 +7,16 @@ */ public class LogoutController { - private LogoutInputBoundary logoutUseCaseInteractor; + private final LogoutInputBoundary logoutUseCaseInteractor; public LogoutController(LogoutInputBoundary logoutUseCaseInteractor) { - // TODO: Save the interactor in the instance variable. + this.logoutUseCaseInteractor = logoutUseCaseInteractor; } /** * Executes the Logout Use Case. */ public void execute() { - // TODO: run the use case interactor for the logout use case + logoutUseCaseInteractor.execute(); } } diff --git a/src/main/java/interface_adapter/logout/LogoutPresenter.java b/src/main/java/interface_adapter/logout/LogoutPresenter.java index 4df31e73..f2a4d67b 100644 --- a/src/main/java/interface_adapter/logout/LogoutPresenter.java +++ b/src/main/java/interface_adapter/logout/LogoutPresenter.java @@ -1,7 +1,9 @@ package interface_adapter.logout; import interface_adapter.ViewManagerModel; +import interface_adapter.logged_in.LoggedInState; import interface_adapter.logged_in.LoggedInViewModel; +import interface_adapter.login.LoginState; import interface_adapter.login.LoginViewModel; import use_case.logout.LogoutOutputBoundary; import use_case.logout.LogoutOutputData; @@ -11,14 +13,16 @@ */ public class LogoutPresenter implements LogoutOutputBoundary { - private LoggedInViewModel loggedInViewModel; - private ViewManagerModel viewManagerModel; - private LoginViewModel loginViewModel; + private final LoggedInViewModel loggedInViewModel; + private final ViewManagerModel viewManagerModel; + private final LoginViewModel loginViewModel; public LogoutPresenter(ViewManagerModel viewManagerModel, LoggedInViewModel loggedInViewModel, LoginViewModel loginViewModel) { - // TODO: assign to the three instance variables. + this.loggedInViewModel = loggedInViewModel; + this.viewManagerModel = viewManagerModel; + this.loginViewModel = loginViewModel; } @Override @@ -29,12 +33,17 @@ public void prepareSuccessView(LogoutOutputData response) { // We also need to set the username in the LoggedInState to // the empty string. - // TODO: have prepareSuccessView update the LoggedInState + final LoggedInState loggedInState = loggedInViewModel.getState(); + loggedInState.setUsername(""); + this.loggedInViewModel.firePropertyChange(); // 1. get the LoggedInState out of the appropriate View Model, // 2. set the username in the state to the empty string // 3. firePropertyChanged so that the View that is listening is updated. - // TODO: have prepareSuccessView update the LoginState + final LoginState loginState = loginViewModel.getState(); + loginState.setUsername(""); + loginState.setPassword(""); + loginViewModel.firePropertyChange(); // 1. get the LoginState out of the appropriate View Model, // 2. set the username in the state to be the username of the user that just logged out, // 3. firePropertyChanged so that the View that is listening is updated. diff --git a/src/main/java/use_case/logout/LogoutInteractor.java b/src/main/java/use_case/logout/LogoutInteractor.java index d252f7c4..11aa8a6a 100644 --- a/src/main/java/use_case/logout/LogoutInteractor.java +++ b/src/main/java/use_case/logout/LogoutInteractor.java @@ -4,17 +4,22 @@ * The Logout Interactor. */ public class LogoutInteractor implements LogoutInputBoundary { - private LogoutUserDataAccessInterface userDataAccessObject; - private LogoutOutputBoundary logoutPresenter; + private final LogoutUserDataAccessInterface userDataAccessObject; + private final LogoutOutputBoundary logoutPresenter; public LogoutInteractor(LogoutUserDataAccessInterface userDataAccessInterface, LogoutOutputBoundary logoutOutputBoundary) { - // TODO: save the DAO and Presenter in the instance variables. + this.userDataAccessObject = userDataAccessInterface; + this.logoutPresenter = logoutOutputBoundary; } @Override public void execute() { - // TODO: implement the logic of the Logout Use Case + String currentUsername = userDataAccessObject.getCurrentUsername(); + userDataAccessObject.setCurrentUsername(null); + + final LogoutOutputData logoutOutputData = new LogoutOutputData(currentUsername); + logoutPresenter.prepareSuccessView(logoutOutputData); // * set the current username to null in the DAO // * instantiate the `LogoutOutputData`, which needs to contain the username. // * tell the presenter to prepare a success view. From fb5e5f5fe7a2105b371852dd00ee677702080984 Mon Sep 17 00:00:00 2001 From: Haizhiling Lyu Date: Mon, 17 Nov 2025 06:31:11 -0500 Subject: [PATCH 70/97] interactor almost done --- src/main/java/entity/Visitor.java | 2 +- .../submit_application/SubmitController.java | 23 +++++ .../submit_application/SubmitState.java | 20 +++-- .../use_case/signup/SignupInteractor.java | 2 +- .../SubmitApplicationDataAccessInterface.java | 10 +++ .../SubmitInputBoundary.java | 5 ++ .../submit_application/SubmitInputData.java | 84 +++++++++++++++++++ .../submit_application/SubmitInteractor.java | 42 +++++++++- .../SubmitOutputBoundary.java | 5 ++ src/main/java/view/SubmitView.java | 31 +++++-- 10 files changed, 210 insertions(+), 14 deletions(-) create mode 100644 src/main/java/use_case/submit_application/SubmitApplicationDataAccessInterface.java diff --git a/src/main/java/entity/Visitor.java b/src/main/java/entity/Visitor.java index 4551c3d1..f7415e69 100644 --- a/src/main/java/entity/Visitor.java +++ b/src/main/java/entity/Visitor.java @@ -26,7 +26,7 @@ public Visitor(String name, String password) { this.homeEvi = ""; this.occupation = ""; this.email = ""; - this.phoneNum = "" + this.phoneNum = ""; this.age = ""; } diff --git a/src/main/java/interface_adapter/submit_application/SubmitController.java b/src/main/java/interface_adapter/submit_application/SubmitController.java index bc6ad6de..a5c4201c 100644 --- a/src/main/java/interface_adapter/submit_application/SubmitController.java +++ b/src/main/java/interface_adapter/submit_application/SubmitController.java @@ -1,4 +1,27 @@ package interface_adapter.submit_application; +import use_case.submit_application.SubmitInputBoundary; +import use_case.submit_application.SubmitInputData; + public class SubmitController { + private final SubmitInputBoundary submitUseCaseInteractor; + + + public SubmitController(SubmitInputBoundary submitUseCaseInteractor) { + this.submitUseCaseInteractor = submitUseCaseInteractor; + } + + public void execute(String petId, String username, String firstname, String lastname, String age, String occupation, + String address, String homeEvi, String tel, String email, String reason, + String prevExp, String availability) { + final SubmitInputData submitInputData = new SubmitInputData(petId, username, firstname, lastname, age, occupation, + address, homeEvi, tel, email, reason, prevExp, availability); + + submitUseCaseInteractor.execute(submitInputData); + + } + + public void switchToBrowserFilterView() { + submitUseCaseInteractor.switchToBrowserFilterView(); + } } diff --git a/src/main/java/interface_adapter/submit_application/SubmitState.java b/src/main/java/interface_adapter/submit_application/SubmitState.java index 63a67253..78f770c0 100644 --- a/src/main/java/interface_adapter/submit_application/SubmitState.java +++ b/src/main/java/interface_adapter/submit_application/SubmitState.java @@ -1,13 +1,15 @@ package interface_adapter.submit_application; public class SubmitState { + + private String petId = ""; private String username = ""; private String firstname = ""; private String lastname = ""; private String address = ""; private String homeEvi = ""; private String occupation = ""; - private String phoneNum = ""; + private String tel = ""; private String email = ""; private String age = ""; private String reason = ""; @@ -15,6 +17,14 @@ public class SubmitState { private String availability = ""; + public String getPetId() { + return petId; + } + + public void setPetId(String petId) { + this.petId = petId; + } + public String getUsername() { return username; } @@ -57,11 +67,11 @@ public void setOccupation(String occupation) { this.occupation = occupation; } - public String getPhoneNum() { - return phoneNum; + public String getTel() { + return tel; } - public void setPhoneNum(String phoneNum) { - this.phoneNum = phoneNum; + public void setTel(String tel) { + this.tel = tel; } public String getEmail() { diff --git a/src/main/java/use_case/signup/SignupInteractor.java b/src/main/java/use_case/signup/SignupInteractor.java index e384b72d..a2f0e208 100644 --- a/src/main/java/use_case/signup/SignupInteractor.java +++ b/src/main/java/use_case/signup/SignupInteractor.java @@ -35,7 +35,7 @@ else if ("".equals(signupInputData.getUsername())) { } else { final User user = userFactory.create(signupInputData.getUsername(), signupInputData.getPassword()); - userDataAccessObject.save(user); + userDataAssObject.save(user); final SignupOutputData signupOutputData = new SignupOutputData(user.getName()); userPresenter.prepareSuccessView(signupOutputData); diff --git a/src/main/java/use_case/submit_application/SubmitApplicationDataAccessInterface.java b/src/main/java/use_case/submit_application/SubmitApplicationDataAccessInterface.java new file mode 100644 index 00000000..4ae67533 --- /dev/null +++ b/src/main/java/use_case/submit_application/SubmitApplicationDataAccessInterface.java @@ -0,0 +1,10 @@ +package use_case.submit_application; + +import entity.Application; + +public interface SubmitApplicationDataAccessInterface { + void save(Application application); + + Application get(String username, String petId); + +} diff --git a/src/main/java/use_case/submit_application/SubmitInputBoundary.java b/src/main/java/use_case/submit_application/SubmitInputBoundary.java index 6577b47e..98b989eb 100644 --- a/src/main/java/use_case/submit_application/SubmitInputBoundary.java +++ b/src/main/java/use_case/submit_application/SubmitInputBoundary.java @@ -1,4 +1,9 @@ package use_case.submit_application; public interface SubmitInputBoundary { + + void execute(SubmitInputData submitInputData); + + void switchToBrowserFilterView(); + } diff --git a/src/main/java/use_case/submit_application/SubmitInputData.java b/src/main/java/use_case/submit_application/SubmitInputData.java index b369ab0d..9d3d14cb 100644 --- a/src/main/java/use_case/submit_application/SubmitInputData.java +++ b/src/main/java/use_case/submit_application/SubmitInputData.java @@ -1,4 +1,88 @@ package use_case.submit_application; public class SubmitInputData { + private final String petId; + private final String username; + private final String firstname; + private final String lastname; + private final String age; + private final String occupation; + private final String address; + private final String homeEvi; + private final String tel; + private final String email; + private final String reason; + private final String prevExp; + private final String availability; + + public SubmitInputData(String petId, String username, String firstname, String lastname, String age, + String occupation, String address, String homeEvi, String tel, String email, String reason, + String prevExp, String availability) { + this.petId = petId; + this.username = username; + this.firstname = firstname; + this.lastname = lastname; + this.age = age; + this.occupation = occupation; + this.address = address; + this.homeEvi = homeEvi; + this.tel = tel; + this.email = email; + this.reason = reason; + this.prevExp = prevExp; + this.availability = availability; + } + + public String getPetId() { + return petId; + } + + public String getUsername() { + return username; + } + + public String getFirstname() { + return firstname; + } + + public String getLastname() { + return lastname; + } + + public String getAge() { + return age; + } + + public String getOccupation() { + return occupation; + } + + public String getAddress() { + return address; + } + + public String getHomeEvi() { + return homeEvi; + } + + public String getTel() { + return tel; + } + + public String getEmail() { + return email; + } + + public String getReason() { + return reason; + } + + public String getPrevExp() { + return prevExp; + } + + public String getAvailability() { + return availability; + } + } diff --git a/src/main/java/use_case/submit_application/SubmitInteractor.java b/src/main/java/use_case/submit_application/SubmitInteractor.java index ecf94212..cebcd345 100644 --- a/src/main/java/use_case/submit_application/SubmitInteractor.java +++ b/src/main/java/use_case/submit_application/SubmitInteractor.java @@ -1,6 +1,46 @@ package use_case.submit_application; -import use_case.login.LoginInputBoundary; +import entity.Application; +import entity.Visitor; public class SubmitInteractor implements SubmitInputBoundary { + private final SubmitApplicationDataAccessInterface applicationDataAccessObject; + private final SubmitOutputBoundary submitPresenter; + private final Application application; + + public SubmitInteractor(SubmitApplicationDataAccessInterface applicationDataAccessInterface, + SubmitOutputBoundary submitOutputBoundary, + Application application) { + this.applicationDataAccessObject = applicationDataAccessInterface; + this.submitPresenter = submitOutputBoundary; + this.application = application; + } + + @Override + public void execute(SubmitInputData submitInputData) { + if ("".equals(submitInputData.getUsername())|| + "".equals(submitInputData.getFirstname())|| + "".equals(submitInputData.getLastname())|| + "".equals(submitInputData.getAge())|| + "".equals(submitInputData.getOccupation())|| + "".equals(submitInputData.getAddress())|| + "".equals(submitInputData.getHomeEvi())|| + "".equals(submitInputData.getTel())|| + "".equals(submitInputData.getEmail())|| + "".equals(submitInputData.getReason())|| + "".equals(submitInputData.getPrevExp())|| + "".equals(submitInputData.getAvailability())) { + submitPresenter.prepareFailView("Some required fields are missing"); + } + final Visitor visitor = (Visitor)DAO.get(submitInputData.getUsername()); + final Application application = new Application(visitor, submitInputData.getPetId(), + submitInputData.getReason(), submitInputData.getHomeEvi(), + submitInputData.getAvailability(), submitInputData.getPrevExp()); + applicationDataAccessObject.save(application); + } + + @Override + public void switchToBrowserFilterView() { + submitPresenter.switchToBrowserFilterView(); + } } diff --git a/src/main/java/use_case/submit_application/SubmitOutputBoundary.java b/src/main/java/use_case/submit_application/SubmitOutputBoundary.java index 6b14719b..cf5e80f3 100644 --- a/src/main/java/use_case/submit_application/SubmitOutputBoundary.java +++ b/src/main/java/use_case/submit_application/SubmitOutputBoundary.java @@ -1,4 +1,9 @@ package use_case.submit_application; public interface SubmitOutputBoundary { + + void prepareFailView(String errorMessage); + + void switchToBrowserFilterView(); + } diff --git a/src/main/java/view/SubmitView.java b/src/main/java/view/SubmitView.java index c05f219d..44511146 100644 --- a/src/main/java/view/SubmitView.java +++ b/src/main/java/view/SubmitView.java @@ -90,9 +90,23 @@ public void actionPerformed(ActionEvent evt) { if (evt.getSource().equals(submit)) { final SubmitState currentState = submitViewModel.getState(); - submitController.execute() - - JOptionPane.showMessageDialog(this, + submitController.execute( + currentState.getPetId(), + currentState.getUsername(), + currentState.getFirstname(), + currentState.getLastname(), + currentState.getAge(), + currentState.getOccupation(), + currentState.getAddress(), + currentState.getHomeEvi(), + currentState.getTel(), + currentState.getEmail(), + currentState.getReason(), + currentState.getPrevExp(), + currentState.getAvailability() + ); + + JOptionPane.showMessageDialog(SubmitView.this, "Your application has been successfully submitted!"); } @@ -100,7 +114,12 @@ public void actionPerformed(ActionEvent evt) { } ); - cancel.addActionListener(this); + cancel.addActionListener( + new ActionListener() { + public void actionPerformed(ActionEvent evt) { + submitController.switchToBrowserFilterView(); + } + }); addUsernameListener(); addFirstnameListener(); @@ -270,7 +289,7 @@ private void addTelListener() { private void documentListenerHelper() { final SubmitState currentState = submitViewModel.getState(); - currentState.setPhoneNum(telInputField.getText()); + currentState.setTel(telInputField.getText()); submitViewModel.setState(currentState); } @Override @@ -374,7 +393,7 @@ public String getViewName() { return viewName; } - public void setSignupController(SubmitController controller) { + public void setSubmitController(SubmitController controller) { this.submitController = controller; } } From 3328a938c85b7ed77ff03af6c5c0a55a4c65773b Mon Sep 17 00:00:00 2001 From: KaedeKagami86 <105937682+KaedeKagami86@users.noreply.github.com> Date: Mon, 17 Nov 2025 12:30:43 -0500 Subject: [PATCH 71/97] Added ManageApplication package --- src/main/java/entity/Application.java | 3 +-- .../AcceptInputBoundary.java | 15 +++++++++++++ .../AcceptInputData.java | 4 ++++ .../AcceptInteractor.java | 4 ++++ .../AcceptOutputBoundary.java | 15 +++++++++++++ .../AcceptOutputData.java | 4 ++++ .../AcceptUserDataInterfaceInteractor.java | 15 +++++++++++++ .../ManageInputBoundary.java | 22 +++++++++++++++++++ .../manage_application/ManageInputData.java | 6 +++++ .../manage_application/ManageInteractor.java | 11 ++++++++++ .../ManageOutputBoundary.java | 15 +++++++++++++ .../manage_application/ManageOutputData.java | 4 ++++ .../ManageUserDataAccessInterface.java | 15 +++++++++++++ 13 files changed, 131 insertions(+), 2 deletions(-) create mode 100644 src/main/java/use_case/accept_reject_application/AcceptInputBoundary.java create mode 100644 src/main/java/use_case/accept_reject_application/AcceptInputData.java create mode 100644 src/main/java/use_case/accept_reject_application/AcceptInteractor.java create mode 100644 src/main/java/use_case/accept_reject_application/AcceptOutputBoundary.java create mode 100644 src/main/java/use_case/accept_reject_application/AcceptOutputData.java create mode 100644 src/main/java/use_case/accept_reject_application/AcceptUserDataInterfaceInteractor.java create mode 100644 src/main/java/use_case/manage_application/ManageInputBoundary.java create mode 100644 src/main/java/use_case/manage_application/ManageInputData.java create mode 100644 src/main/java/use_case/manage_application/ManageInteractor.java create mode 100644 src/main/java/use_case/manage_application/ManageOutputBoundary.java create mode 100644 src/main/java/use_case/manage_application/ManageOutputData.java create mode 100644 src/main/java/use_case/manage_application/ManageUserDataAccessInterface.java diff --git a/src/main/java/entity/Application.java b/src/main/java/entity/Application.java index aa3d5612..f5a01f8d 100644 --- a/src/main/java/entity/Application.java +++ b/src/main/java/entity/Application.java @@ -24,7 +24,7 @@ public class Application { // helper method, to gather all info from the user private getPersonaLInformation(Visitor user) { // get all personal info from visitor - String name = user.getName(); + String name = user.getLegalName(); String email = user.getEmail(); String phone_number = user.getPhone(); String age = user.getAge(); @@ -64,7 +64,6 @@ public Application(Visitor user, Pet pet, String reason_to_adopt, String home_en } - // Getter methods public List getPersonalInformation() { return personal_information; diff --git a/src/main/java/use_case/accept_reject_application/AcceptInputBoundary.java b/src/main/java/use_case/accept_reject_application/AcceptInputBoundary.java new file mode 100644 index 00000000..989b1e35 --- /dev/null +++ b/src/main/java/use_case/accept_reject_application/AcceptInputBoundary.java @@ -0,0 +1,15 @@ +package use_case.accept_reject_application; + +import use_case.login.LoginInputData; + +/** + * Input Boundary for actions which are related to logging in. + */ +public interface AcceptInputBoundary { + + /** + * Executes the login use case. + * @param loginInputData the input data + */ + void execute(LoginInputData loginInputData); +} diff --git a/src/main/java/use_case/accept_reject_application/AcceptInputData.java b/src/main/java/use_case/accept_reject_application/AcceptInputData.java new file mode 100644 index 00000000..24c30d9f --- /dev/null +++ b/src/main/java/use_case/accept_reject_application/AcceptInputData.java @@ -0,0 +1,4 @@ +package use_case.accept_reject_application; + +public class AcceptInputData { +} diff --git a/src/main/java/use_case/accept_reject_application/AcceptInteractor.java b/src/main/java/use_case/accept_reject_application/AcceptInteractor.java new file mode 100644 index 00000000..5bed99f4 --- /dev/null +++ b/src/main/java/use_case/accept_reject_application/AcceptInteractor.java @@ -0,0 +1,4 @@ +package use_case.accept_reject_application; + +public class AcceptInteractor { +} diff --git a/src/main/java/use_case/accept_reject_application/AcceptOutputBoundary.java b/src/main/java/use_case/accept_reject_application/AcceptOutputBoundary.java new file mode 100644 index 00000000..84488125 --- /dev/null +++ b/src/main/java/use_case/accept_reject_application/AcceptOutputBoundary.java @@ -0,0 +1,15 @@ +package use_case.accept_reject_application; + +import use_case.login.LoginInputData; + +/** + * Input Boundary for actions which are related to logging in. + */ +public interface AcceptOutputBoundary { + + /** + * Executes the login use case. + * @param loginInputData the input data + */ + void execute(LoginInputData loginInputData); +} diff --git a/src/main/java/use_case/accept_reject_application/AcceptOutputData.java b/src/main/java/use_case/accept_reject_application/AcceptOutputData.java new file mode 100644 index 00000000..7c43845c --- /dev/null +++ b/src/main/java/use_case/accept_reject_application/AcceptOutputData.java @@ -0,0 +1,4 @@ +package use_case.accept_reject_application; + +public class AcceptOutputData { +} diff --git a/src/main/java/use_case/accept_reject_application/AcceptUserDataInterfaceInteractor.java b/src/main/java/use_case/accept_reject_application/AcceptUserDataInterfaceInteractor.java new file mode 100644 index 00000000..c78aa56b --- /dev/null +++ b/src/main/java/use_case/accept_reject_application/AcceptUserDataInterfaceInteractor.java @@ -0,0 +1,15 @@ +package use_case.accept_reject_application; + +import use_case.login.LoginInputData; + +/** + * Input Boundary for actions which are related to logging in. + */ +public interface AcceptUserDataInterfaceInteractor { + + /** + * Executes the login use case. + * @param loginInputData the input data + */ + void execute(LoginInputData loginInputData); +} diff --git a/src/main/java/use_case/manage_application/ManageInputBoundary.java b/src/main/java/use_case/manage_application/ManageInputBoundary.java new file mode 100644 index 00000000..e739536d --- /dev/null +++ b/src/main/java/use_case/manage_application/ManageInputBoundary.java @@ -0,0 +1,22 @@ +package use_case.manage_application; + +import use_case.login.LoginInputData; +import use_case.signup.SignupInputData; + +/** + * Input Boundary for actions which are related to logging in. + */ +public interface ManageInputBoundary { + + /** + * Executes the login use case. + * @param manageInputData the input data + */ + void execute(ManageInputData manageInputData); + + // when clicked on an application: +// /** +// * Executes the switch to accept/reject view use case. +// */ +// void switchToLoginView(); +} diff --git a/src/main/java/use_case/manage_application/ManageInputData.java b/src/main/java/use_case/manage_application/ManageInputData.java new file mode 100644 index 00000000..8e61ecc9 --- /dev/null +++ b/src/main/java/use_case/manage_application/ManageInputData.java @@ -0,0 +1,6 @@ +package use_case.manage_application; + +public class ManageInputData { + // Empty because no input data is required for managing application + // Going to fetch all the applications info +} diff --git a/src/main/java/use_case/manage_application/ManageInteractor.java b/src/main/java/use_case/manage_application/ManageInteractor.java new file mode 100644 index 00000000..2cd1b694 --- /dev/null +++ b/src/main/java/use_case/manage_application/ManageInteractor.java @@ -0,0 +1,11 @@ +package use_case.manage_application; + +public class ManageInteractor { + // grab information from database + + // do http request, like for login logout + + // display them somehow? (send them to outputdata / boundary)? + + +} diff --git a/src/main/java/use_case/manage_application/ManageOutputBoundary.java b/src/main/java/use_case/manage_application/ManageOutputBoundary.java new file mode 100644 index 00000000..a4132b06 --- /dev/null +++ b/src/main/java/use_case/manage_application/ManageOutputBoundary.java @@ -0,0 +1,15 @@ +package use_case.manage_application; + +import use_case.login.LoginInputData; + +/** + * Input Boundary for actions which are related to logging in. + */ +public interface ManageOutputBoundary { + + /** + * Executes the login use case. + * @param loginInputData the input data + */ + void execute(LoginInputData loginInputData); +} diff --git a/src/main/java/use_case/manage_application/ManageOutputData.java b/src/main/java/use_case/manage_application/ManageOutputData.java new file mode 100644 index 00000000..78a8b2e5 --- /dev/null +++ b/src/main/java/use_case/manage_application/ManageOutputData.java @@ -0,0 +1,4 @@ +package use_case.manage_application; + +public class ManageOutputData { +} diff --git a/src/main/java/use_case/manage_application/ManageUserDataAccessInterface.java b/src/main/java/use_case/manage_application/ManageUserDataAccessInterface.java new file mode 100644 index 00000000..cb7e4610 --- /dev/null +++ b/src/main/java/use_case/manage_application/ManageUserDataAccessInterface.java @@ -0,0 +1,15 @@ +package use_case.manage_application; + +import use_case.login.LoginInputData; + +/** + * Input Boundary for actions which are related to logging in. + */ +public interface ManageUserDataAccessInterface { + + /** + * Executes the login use case. + * @param loginInputData the input data + */ + void execute(LoginInputData loginInputData); +} From d1f5b6fb7ded21320dbcfea29696637d4d238b26 Mon Sep 17 00:00:00 2001 From: zahrabuch Date: Mon, 17 Nov 2025 21:06:59 -0500 Subject: [PATCH 72/97] add pet gui --- src/main/java/app/AddPetAppBuilder.java | 52 ++++++++++ src/main/java/app/AddPetMain.java | 22 +++++ .../add_pet/AddPetController.java | 28 ++++++ .../add_pet/AddPetPresenter.java | 26 +++++ .../interface_adapter/add_pet/AddPetView.java | 96 +++++++++++++++++++ .../add_pet/AddPetViewModel.java | 27 ++++++ .../use_case/add_pet/AddPetInteractor.java | 36 +++---- .../use_case/add_pet/AddPetOutputData.java | 28 ++++-- ...Boundary.java => AddPetInputBoundary.java} | 2 +- 9 files changed, 292 insertions(+), 25 deletions(-) create mode 100644 src/main/java/app/AddPetAppBuilder.java create mode 100644 src/main/java/app/AddPetMain.java create mode 100644 src/main/java/interface_adapter/add_pet/AddPetController.java create mode 100644 src/main/java/interface_adapter/add_pet/AddPetPresenter.java create mode 100644 src/main/java/interface_adapter/add_pet/AddPetView.java create mode 100644 src/main/java/interface_adapter/add_pet/AddPetViewModel.java rename src/main/java/use_case/login/{LoginInputBoundary.java => AddPetInputBoundary.java} (86%) diff --git a/src/main/java/app/AddPetAppBuilder.java b/src/main/java/app/AddPetAppBuilder.java new file mode 100644 index 00000000..cdd2b197 --- /dev/null +++ b/src/main/java/app/AddPetAppBuilder.java @@ -0,0 +1,52 @@ +package app; + +import data_access.InMemoryPetDataAccessObject; +import entity.PetFactory; +import interface_adapter.add_pet.AddPetController; +import interface_adapter.add_pet.AddPetPresenter; +import interface_adapter.add_pet.AddPetView; +import interface_adapter.add_pet.AddPetViewModel; +import use_case.add_pet.AddPetDataAccessInterface; +import use_case.add_pet.AddPetInputBoundary; +import use_case.add_pet.AddPetInteractor; +import use_case.add_pet.AddPetOutputBoundary; + +import javax.swing.*; + +public class AddPetAppBuilder { + + private AddPetView addPetView; + private AddPetController addPetController; + + public AddPetAppBuilder addAddPetView() { + this.addPetView = new AddPetView(); + return this; + } + + public AddPetAppBuilder addAddPetUseCase() { + + AddPetDataAccessInterface petRepo = new InMemoryPetDataAccessObject(); + + AddPetViewModel addPetViewModel = new AddPetViewModel(); + AddPetOutputBoundary presenter = new AddPetPresenter(addPetViewModel); + + PetFactory petFactory = new PetFactory(); + + AddPetInputBoundary interactor = + new AddPetInteractor(petFactory, petRepo, presenter); + + this.addPetController = new AddPetController(interactor); + this.addPetView.setAddPetController(addPetController); + + return this; + } + + public JFrame build() { + JFrame frame = new JFrame("Add Pet"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setContentPane(addPetView); + return frame; + } +} + + diff --git a/src/main/java/app/AddPetMain.java b/src/main/java/app/AddPetMain.java new file mode 100644 index 00000000..1d8fc97d --- /dev/null +++ b/src/main/java/app/AddPetMain.java @@ -0,0 +1,22 @@ +package app; + +import app.AddPetAppBuilder; + +import javax.swing.*; + +public class AddPetMain { + public static void main(String[] args) { + + AddPetAppBuilder builder = new AddPetAppBuilder(); + + JFrame app = builder + .addAddPetView() + .addAddPetUseCase() + .build(); + + app.pack(); + app.setLocationRelativeTo(null); + app.setVisible(true); + } +} + diff --git a/src/main/java/interface_adapter/add_pet/AddPetController.java b/src/main/java/interface_adapter/add_pet/AddPetController.java new file mode 100644 index 00000000..d1dd8498 --- /dev/null +++ b/src/main/java/interface_adapter/add_pet/AddPetController.java @@ -0,0 +1,28 @@ +package interface_adapter.add_pet; + +import use_case.add_pet.AddPetInputData; +import use_case.add_pet.AddPetInputBoundary; + +public class AddPetController { + + private final AddPetInputBoundary addPetUsecaseInteractor; + + public AddPetController(AddPetInputBoundary addPetUsecaseInteractor) { + this.addPetUsecaseInteractor = addPetUsecaseInteractor; + } + + public void execute(String id, + String name, + String type, + String breed, + String age, + String gender, + String size, + String contact) { + + AddPetInputData inputData = new AddPetInputData(id, name, type, breed, age, gender, size, contact); + + addPetUsecaseInteractor.execute(inputData); + } +} + diff --git a/src/main/java/interface_adapter/add_pet/AddPetPresenter.java b/src/main/java/interface_adapter/add_pet/AddPetPresenter.java new file mode 100644 index 00000000..85839dee --- /dev/null +++ b/src/main/java/interface_adapter/add_pet/AddPetPresenter.java @@ -0,0 +1,26 @@ +package interface_adapter.add_pet; + +import use_case.add_pet.AddPetOutputBoundary; +import use_case.add_pet.AddPetOutputData; + +public class AddPetPresenter implements AddPetOutputBoundary { + + private final AddPetViewModel viewModel; + + public AddPetPresenter(AddPetViewModel viewModel) { + this.viewModel = viewModel; + } + + @Override + public void prepareSuccessView(AddPetOutputData data) { + viewModel.setMessage("Pet \"" + data.getName() + "\" added successfully!"); + viewModel.firePropertyChanged(); + } + + @Override + public void prepareFailView(String errorMessage) { + viewModel.setMessage("Failed to add pet: " + errorMessage); + viewModel.firePropertyChanged(); + } +} + diff --git a/src/main/java/interface_adapter/add_pet/AddPetView.java b/src/main/java/interface_adapter/add_pet/AddPetView.java new file mode 100644 index 00000000..8c0e89fc --- /dev/null +++ b/src/main/java/interface_adapter/add_pet/AddPetView.java @@ -0,0 +1,96 @@ +package interface_adapter.add_pet; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + +public class AddPetView extends JPanel implements ActionListener, PropertyChangeListener { + + private final String viewName = "Add Pet"; + + private final JTextField nameInputField = new JTextField(15); + private final JTextField typeInputField = new JTextField(15); + private final JTextField breedInputField = new JTextField(15); + private final JTextField ageInputField = new JTextField(15); + private final JTextField genderInputField = new JTextField(15); + private final JTextField sizeInputField = new JTextField(15); + private final JTextField contactInputField = new JTextField(15); + private final JTextArea petIDInputArea = new JTextArea(3, 15); + + private final JButton submitButton = new JButton("Add Pet"); + + // The controller for this view + private AddPetController addPetController; + + public AddPetView() { + setLayout(new BorderLayout()); + + JPanel formPanel = new JPanel(); + formPanel.setLayout(new GridLayout(0, 2, 5, 5)); + + formPanel.add(new JLabel("Pet Name:")); + formPanel.add(nameInputField); + + formPanel.add(new JLabel("Type:")); + formPanel.add(typeInputField); + + formPanel.add(new JLabel("Breed:")); + formPanel.add(breedInputField); + + formPanel.add(new JLabel("Age:")); + formPanel.add(ageInputField); + + formPanel.add(new JLabel("Gender:")); + formPanel.add(genderInputField); + + formPanel.add(new JLabel("Size:")); + formPanel.add(sizeInputField); + + formPanel.add(new JLabel("Contact:")); + formPanel.add(contactInputField); + + formPanel.add(new JLabel("Pet ID :")); + formPanel.add(new JScrollPane(petIDInputArea)); + + submitButton.addActionListener(this); + + add(formPanel, BorderLayout.CENTER); + add(submitButton, BorderLayout.SOUTH); + } + + public String getViewName() { + return viewName; + } + + public void setAddPetController(AddPetController controller) { + this.addPetController = controller; + } + + @Override + public void actionPerformed(ActionEvent e) { + if (addPetController != null) { + addPetController.execute( + petIDInputArea.getText(), + nameInputField.getText(), + typeInputField.getText(), + breedInputField.getText(), + ageInputField.getText(), + genderInputField.getText(), + sizeInputField.getText(), + contactInputField.getText() + ); + } + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + // This is where the presenter can update UI elements. + // Example: showing success or error messages + if (evt.getPropertyName().equals("addPetStatus")) { + JOptionPane.showMessageDialog(this, evt.getNewValue().toString()); + } + } +} diff --git a/src/main/java/interface_adapter/add_pet/AddPetViewModel.java b/src/main/java/interface_adapter/add_pet/AddPetViewModel.java new file mode 100644 index 00000000..92cab77f --- /dev/null +++ b/src/main/java/interface_adapter/add_pet/AddPetViewModel.java @@ -0,0 +1,27 @@ +package interface_adapter.add_pet; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; + +public class AddPetViewModel { + + private final PropertyChangeSupport support = new PropertyChangeSupport(this); + + private String message = ""; + + public void setMessage(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public void addPropertyChangeListener(PropertyChangeListener l) { + support.addPropertyChangeListener(l); + } + + public void firePropertyChanged() { + support.firePropertyChange("addPetStatus", null, message); + } +} diff --git a/src/main/java/use_case/add_pet/AddPetInteractor.java b/src/main/java/use_case/add_pet/AddPetInteractor.java index e130f327..803a8efa 100644 --- a/src/main/java/use_case/add_pet/AddPetInteractor.java +++ b/src/main/java/use_case/add_pet/AddPetInteractor.java @@ -6,38 +6,42 @@ public class AddPetInteractor implements AddPetInputBoundary { private final PetFactory petFactory; private final AddPetDataAccessInterface gallery; + private final AddPetOutputBoundary presenter; - public AddPetInteractor(PetFactory petFactory, AddPetDataAccessInterface gallery) { + public AddPetInteractor(PetFactory petFactory, + AddPetDataAccessInterface gallery, + AddPetOutputBoundary presenter) { this.petFactory = petFactory; this.gallery = gallery; + this.presenter = presenter; } @Override public void execute(AddPetInputData addPetInputData) { String petID = addPetInputData.getId(); - // Check if pet already exists if (gallery.existsById(petID)) { - System.out.println("Pet already exists in gallery."); + presenter.prepareFailView("Pet already exists."); return; } - // Create new Pet entity using factory - String petName = addPetInputData.getId(); - String petType = addPetInputData.getType(); - String breed = addPetInputData.getBreed(); - String age = addPetInputData.getAge(); - String gender = addPetInputData.getGender(); - String size = addPetInputData.getSize(); - String contact = addPetInputData.getContact(); + // Create pet + Pet newPet = petFactory.create( + addPetInputData.getId(), + addPetInputData.getName(), + addPetInputData.getType(), + addPetInputData.getBreed(), + addPetInputData.getAge(), + addPetInputData.getGender(), + addPetInputData.getSize(), + addPetInputData.getContact() + ); - - Pet newPet = petFactory.create(petID,petName, petType, breed, age, gender, size, contact); - - // Save to data access layer gallery.add(newPet); - System.out.println("Pet added successfully!"); + presenter.prepareSuccessView(new AddPetOutputData(petID, addPetInputData.getName(), true)); } } + + diff --git a/src/main/java/use_case/add_pet/AddPetOutputData.java b/src/main/java/use_case/add_pet/AddPetOutputData.java index cef1a95b..c8efb0ea 100644 --- a/src/main/java/use_case/add_pet/AddPetOutputData.java +++ b/src/main/java/use_case/add_pet/AddPetOutputData.java @@ -1,15 +1,27 @@ package use_case.add_pet; -import entity.Pet; -import java.util.List; - -//Output Data for the AddPet usecase public class AddPetOutputData { - private final List gallery;//change data type to gallery soon - public AddPetOutputData(List gallery){ - this.gallery = gallery; + private final String id; + private final String name; + private final boolean success; + + public AddPetOutputData(String id, String name, boolean success) { + this.id = id; + this.name = name; + this.success = success; + } + + public String getId() { + return id; } - public List getGallery() {return gallery;} + public String getName() { + return name; + } + + public boolean isSuccess() { + return success; + } } + diff --git a/src/main/java/use_case/login/LoginInputBoundary.java b/src/main/java/use_case/login/AddPetInputBoundary.java similarity index 86% rename from src/main/java/use_case/login/LoginInputBoundary.java rename to src/main/java/use_case/login/AddPetInputBoundary.java index faf72dc9..d174d9d3 100644 --- a/src/main/java/use_case/login/LoginInputBoundary.java +++ b/src/main/java/use_case/login/AddPetInputBoundary.java @@ -3,7 +3,7 @@ /** * Input Boundary for actions which are related to logging in. */ -public interface LoginInputBoundary { +public interface AddPetInputBoundary { /** * Executes the login use case. From 9fd996f84456643b5e2f879be33eea1d338b0b79 Mon Sep 17 00:00:00 2001 From: KaedeKagami86 <105937682+KaedeKagami86@users.noreply.github.com> Date: Tue, 18 Nov 2025 00:15:10 -0500 Subject: [PATCH 73/97] Deleted process(accept/reject) application use case for now, added database manipulations for application, and added application id to application class, and a counter class variable to produce application id --- .../ApplicationGatewayInterface.java | 9 +++ .../DBApplicationDataAccessObject.java | 5 ++ .../DatabaseApplicationGateway.java | 80 +++++++++++++++++++ .../java/data_access/DatabaseConnection.java | 24 ++++++ src/main/java/entity/Application.java | 28 ++++--- ...ManageApplicationApplicationPresenter.java | 23 ++++++ .../ManageApplicationController.java | 4 + .../ManageApplicationViewModel.java | 6 ++ .../AcceptInputBoundary.java | 15 ---- .../AcceptInputData.java | 4 - .../AcceptInteractor.java | 4 - .../AcceptOutputBoundary.java | 15 ---- .../AcceptOutputData.java | 4 - .../AcceptUserDataInterfaceInteractor.java | 15 ---- .../ManageApplicationInputBoundary.java | 22 +++++ ...a.java => ManageApplicationInputData.java} | 2 +- .../ManageApplicationInteractor.java | 50 ++++++++++++ .../ManageApplicationOutputBoundary.java | 14 ++++ .../ManageApplicationOutputData.java | 4 + ...geApplicationUserDataAccessInterface.java} | 2 +- .../ManageInputBoundary.java | 22 ----- .../manage_application/ManageInteractor.java | 11 --- .../ManageOutputBoundary.java | 15 ---- .../manage_application/ManageOutputData.java | 4 - src/main/java/view/ManageApplicationView.java | 4 + 25 files changed, 265 insertions(+), 121 deletions(-) create mode 100644 src/main/java/data_access/ApplicationGatewayInterface.java create mode 100644 src/main/java/data_access/DBApplicationDataAccessObject.java create mode 100644 src/main/java/data_access/DatabaseApplicationGateway.java create mode 100644 src/main/java/interface_adapter/manage_application/ManageApplicationApplicationPresenter.java create mode 100644 src/main/java/interface_adapter/manage_application/ManageApplicationController.java create mode 100644 src/main/java/interface_adapter/manage_application/ManageApplicationViewModel.java delete mode 100644 src/main/java/use_case/accept_reject_application/AcceptInputBoundary.java delete mode 100644 src/main/java/use_case/accept_reject_application/AcceptInputData.java delete mode 100644 src/main/java/use_case/accept_reject_application/AcceptInteractor.java delete mode 100644 src/main/java/use_case/accept_reject_application/AcceptOutputBoundary.java delete mode 100644 src/main/java/use_case/accept_reject_application/AcceptOutputData.java delete mode 100644 src/main/java/use_case/accept_reject_application/AcceptUserDataInterfaceInteractor.java create mode 100644 src/main/java/use_case/manage_application/ManageApplicationInputBoundary.java rename src/main/java/use_case/manage_application/{ManageInputData.java => ManageApplicationInputData.java} (79%) create mode 100644 src/main/java/use_case/manage_application/ManageApplicationInteractor.java create mode 100644 src/main/java/use_case/manage_application/ManageApplicationOutputBoundary.java create mode 100644 src/main/java/use_case/manage_application/ManageApplicationOutputData.java rename src/main/java/use_case/manage_application/{ManageUserDataAccessInterface.java => ManageApplicationUserDataAccessInterface.java} (83%) delete mode 100644 src/main/java/use_case/manage_application/ManageInputBoundary.java delete mode 100644 src/main/java/use_case/manage_application/ManageInteractor.java delete mode 100644 src/main/java/use_case/manage_application/ManageOutputBoundary.java delete mode 100644 src/main/java/use_case/manage_application/ManageOutputData.java create mode 100644 src/main/java/view/ManageApplicationView.java diff --git a/src/main/java/data_access/ApplicationGatewayInterface.java b/src/main/java/data_access/ApplicationGatewayInterface.java new file mode 100644 index 00000000..83c8bb26 --- /dev/null +++ b/src/main/java/data_access/ApplicationGatewayInterface.java @@ -0,0 +1,9 @@ +package data_access; + +import entity.Application; + +import java.util.List; + +public interface ApplicationGatewayInterface { + Application fetchApplicationById(String applicationId); +} diff --git a/src/main/java/data_access/DBApplicationDataAccessObject.java b/src/main/java/data_access/DBApplicationDataAccessObject.java new file mode 100644 index 00000000..2f338f2a --- /dev/null +++ b/src/main/java/data_access/DBApplicationDataAccessObject.java @@ -0,0 +1,5 @@ +package data_access; + +public class DBApplicationDataAccessObject { + +} diff --git a/src/main/java/data_access/DatabaseApplicationGateway.java b/src/main/java/data_access/DatabaseApplicationGateway.java new file mode 100644 index 00000000..29a7535e --- /dev/null +++ b/src/main/java/data_access/DatabaseApplicationGateway.java @@ -0,0 +1,80 @@ +package data_access; + +import entity.Application; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class DatabaseApplicationGateway implements ApplicationGatewayInterface { + private final Connection conn; + + public DatabaseApplicationGateway(Connection conn) { + this.conn = conn; + } + + @Override + public Application fetchApplicationById(String applicationId) { // why does applicationID have to be a string not int? + String sql = "SELECT * FROM pets WHERE id = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { // here + stmt.setString(1, applicationId); + ResultSet rs = stmt.executeQuery(); + if (rs.next()) { + return new Application( + rs.getString("id"), + rs.getString("application_id"), //TODO: make Application entity, pass in personal_info list, not separate fields! + //List personal_information = getPersonalInformation(user); ..... etc. + rs.getString("pet_id"), + rs.getString("legal_name"), + rs.getString("reason"), + rs.getString("availability"), + rs.getString("occupation"), + rs.getString("age"), + rs.getString("email"), + rs.getString("phone"), + rs.getString("previous_experience") + ); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return null; + } + + public void addApplication(Application application) { + String sql = "INSERT OR REPLACE INTO applications (id, pet_id, legal_name, reason, availability, " + + "occupation, age, email, phone, previous_experience) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, application.getApplicationId()); + stmt.setString(2, application.getPetId()); + stmt.setString(3, application.getUser().getLegalName()); + stmt.setString(4, application.getReason()); + stmt.setString(5, application.getAvailability()); + stmt.setString(6, application.getUser().getOccupation()); + stmt.setString(7, application.getUser().getAge()); + stmt.setString(8, application.getUser().getEmail()); + stmt.setString(9, application.getUser().getPhone()); + stmt.setString(10, application.getPreviousExperience()); + stmt.executeUpdate(); + System.out.println("✅ Added application to DB: " + application.getUser().getLegalName() + "s application for" + + application.getPetId() + "ID: " + application.getApplicationId()); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void deleteApplication(String id) { + String sql = "DELETE FROM applications WHERE id = ?"; + try (PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, id); + stmt.executeUpdate(); + } catch (SQLException e) { + e.printStackTrace(); + } + } +} + + diff --git a/src/main/java/data_access/DatabaseConnection.java b/src/main/java/data_access/DatabaseConnection.java index 44d5b5da..7618bf0f 100644 --- a/src/main/java/data_access/DatabaseConnection.java +++ b/src/main/java/data_access/DatabaseConnection.java @@ -32,5 +32,29 @@ CREATE TABLE IF NOT EXISTS pets ( stmt.execute(createTableSQL); } } + + private static void createApplicationTableIfNotExists(Connection conn) throws SQLException { + String createTableSQL = """ + CREATE TABLE IF NOT EXISTS applications ( + id TEXT PRIMARY KEY, + application_id TEXT, + pet_id TEXT, + legal_name TEXT, + reason TEXT, + availability TEXT, + occupation TEXT, + age TEXT, + email TEXT, + phone TEXT, + previous_experience TEXT + ); + """; + try (Statement stmt = conn.createStatement()) { + stmt.execute(createTableSQL); + } + + //pet might not be text, but an id from the pets table so we get the correct one + //might want to find pet id using the pet entity we got from the form + } } diff --git a/src/main/java/entity/Application.java b/src/main/java/entity/Application.java index f5a01f8d..b637dbd0 100644 --- a/src/main/java/entity/Application.java +++ b/src/main/java/entity/Application.java @@ -5,19 +5,24 @@ public class Application { + // Class variable to keep track of how many applcations, used as id + public static int counter = 0; + + // Application ID for internal use + private String application_id; + // Applicant Information private Visitor user; - // Which Pet to adopt - !!!! Might change to ID !!!!!; - private Pet pet; // !! Might change to pet id !!!! // + // Which Pet to adopt by id + private String pet_id; // private String reason_to_adopt; private String home_environment; // describe, apartment, small, big, etc. // give hint on how to fill out each field - private int availability; - // indicate by 0-10, 10 means someone is going to be home all the time with the pet - // or by hours per week or smth; + private String availability; + // explain their availability private String previous_experience; private List personal_information; @@ -45,7 +50,7 @@ private getPersonaLInformation(Visitor user) { * @throws IllegalArgumentException if the password or name are empty */ // - public Application(Visitor user, Pet pet, String reason_to_adopt, String home_environment, int availability, String previous_experience) { + public Application(Visitor user, Pet pet, String reason_to_adopt, String home_environment, String availability, String previous_experience) { List personal_information = getPersonalInformation(user); // loop through the list, see if any is empty, if yes throw an error for (String info : personal_information) { @@ -55,12 +60,14 @@ public Application(Visitor user, Pet pet, String reason_to_adopt, String home_en } } // set all attributes - this.pet = pet; + this.pet_id = pet.getId(); this.personal_information = personal_information; this.reason_to_adopt = reason_to_adopt; this.home_environment = home_environment; this.availability = availability; this.previous_experience = previous_experience; + this.application_id = Integer.toString(counter); // use counter count as id of application + counter++; // increase counter count by 1 } @@ -73,9 +80,10 @@ public String getReason() { } public String getHomeEnvironment() {return home_environment;} public String getPreviousExperience() {return previous_experience;} - public Pet getPet() {return pet;} - public int getAvailability() {return availability;} - public Visitor getVisitor() {return user;} + public String getPetId() {return pet_id;} + public String getApplicationId() {return application_id;} + public String getAvailability() {return availability;} + public Visitor getUser() {return user;} } diff --git a/src/main/java/interface_adapter/manage_application/ManageApplicationApplicationPresenter.java b/src/main/java/interface_adapter/manage_application/ManageApplicationApplicationPresenter.java new file mode 100644 index 00000000..79c17f53 --- /dev/null +++ b/src/main/java/interface_adapter/manage_application/ManageApplicationApplicationPresenter.java @@ -0,0 +1,23 @@ +package interface_adapter.manage_application; + +import interface_adapter.ViewManagerModel; +import interface_adapter.logged_in.LoggedInViewModel; +import interface_adapter.login.LoginViewModel; +import use_case.manage_application.ManageApplicationOutputBoundary; + +public class ManageApplicationApplicationPresenter implements ManageApplicationOutputBoundary { + + + private final ManageApplicationViewModel manageApplicationViewModel; + private final ViewManagerModel viewManagerModel; + + public ManageApplicationApplicationPresenter() { + + } + + @Override + public void prepareSuccessView(ManageApplicationViewModel manageApplicationViewModel) { + + + +} \ No newline at end of file diff --git a/src/main/java/interface_adapter/manage_application/ManageApplicationController.java b/src/main/java/interface_adapter/manage_application/ManageApplicationController.java new file mode 100644 index 00000000..eb2acb13 --- /dev/null +++ b/src/main/java/interface_adapter/manage_application/ManageApplicationController.java @@ -0,0 +1,4 @@ +package interface_adapter.manage_application; + +public class ManageApplicationController { +} diff --git a/src/main/java/interface_adapter/manage_application/ManageApplicationViewModel.java b/src/main/java/interface_adapter/manage_application/ManageApplicationViewModel.java new file mode 100644 index 00000000..9eabb19f --- /dev/null +++ b/src/main/java/interface_adapter/manage_application/ManageApplicationViewModel.java @@ -0,0 +1,6 @@ +package interface_adapter.manage_application; + +public class ManageApplicationViewModel { +} + + diff --git a/src/main/java/use_case/accept_reject_application/AcceptInputBoundary.java b/src/main/java/use_case/accept_reject_application/AcceptInputBoundary.java deleted file mode 100644 index 989b1e35..00000000 --- a/src/main/java/use_case/accept_reject_application/AcceptInputBoundary.java +++ /dev/null @@ -1,15 +0,0 @@ -package use_case.accept_reject_application; - -import use_case.login.LoginInputData; - -/** - * Input Boundary for actions which are related to logging in. - */ -public interface AcceptInputBoundary { - - /** - * Executes the login use case. - * @param loginInputData the input data - */ - void execute(LoginInputData loginInputData); -} diff --git a/src/main/java/use_case/accept_reject_application/AcceptInputData.java b/src/main/java/use_case/accept_reject_application/AcceptInputData.java deleted file mode 100644 index 24c30d9f..00000000 --- a/src/main/java/use_case/accept_reject_application/AcceptInputData.java +++ /dev/null @@ -1,4 +0,0 @@ -package use_case.accept_reject_application; - -public class AcceptInputData { -} diff --git a/src/main/java/use_case/accept_reject_application/AcceptInteractor.java b/src/main/java/use_case/accept_reject_application/AcceptInteractor.java deleted file mode 100644 index 5bed99f4..00000000 --- a/src/main/java/use_case/accept_reject_application/AcceptInteractor.java +++ /dev/null @@ -1,4 +0,0 @@ -package use_case.accept_reject_application; - -public class AcceptInteractor { -} diff --git a/src/main/java/use_case/accept_reject_application/AcceptOutputBoundary.java b/src/main/java/use_case/accept_reject_application/AcceptOutputBoundary.java deleted file mode 100644 index 84488125..00000000 --- a/src/main/java/use_case/accept_reject_application/AcceptOutputBoundary.java +++ /dev/null @@ -1,15 +0,0 @@ -package use_case.accept_reject_application; - -import use_case.login.LoginInputData; - -/** - * Input Boundary for actions which are related to logging in. - */ -public interface AcceptOutputBoundary { - - /** - * Executes the login use case. - * @param loginInputData the input data - */ - void execute(LoginInputData loginInputData); -} diff --git a/src/main/java/use_case/accept_reject_application/AcceptOutputData.java b/src/main/java/use_case/accept_reject_application/AcceptOutputData.java deleted file mode 100644 index 7c43845c..00000000 --- a/src/main/java/use_case/accept_reject_application/AcceptOutputData.java +++ /dev/null @@ -1,4 +0,0 @@ -package use_case.accept_reject_application; - -public class AcceptOutputData { -} diff --git a/src/main/java/use_case/accept_reject_application/AcceptUserDataInterfaceInteractor.java b/src/main/java/use_case/accept_reject_application/AcceptUserDataInterfaceInteractor.java deleted file mode 100644 index c78aa56b..00000000 --- a/src/main/java/use_case/accept_reject_application/AcceptUserDataInterfaceInteractor.java +++ /dev/null @@ -1,15 +0,0 @@ -package use_case.accept_reject_application; - -import use_case.login.LoginInputData; - -/** - * Input Boundary for actions which are related to logging in. - */ -public interface AcceptUserDataInterfaceInteractor { - - /** - * Executes the login use case. - * @param loginInputData the input data - */ - void execute(LoginInputData loginInputData); -} diff --git a/src/main/java/use_case/manage_application/ManageApplicationInputBoundary.java b/src/main/java/use_case/manage_application/ManageApplicationInputBoundary.java new file mode 100644 index 00000000..487db15a --- /dev/null +++ b/src/main/java/use_case/manage_application/ManageApplicationInputBoundary.java @@ -0,0 +1,22 @@ +package use_case.manage_application; + +/** + * Input Boundary for actions which are related to logging in. + */ + +/// // DONE ////// +public interface ManageApplicationInputBoundary { + // note that this is an interface so there isn't implementation of methods + + /** + * Executes the manage application use case. + */ + + void execute(); // doesn't require input from user + + // when clicked on an application: +// /** +// * Executes the switch to accept/reject view use case. +// */ +// void switchToProcessView();? +} diff --git a/src/main/java/use_case/manage_application/ManageInputData.java b/src/main/java/use_case/manage_application/ManageApplicationInputData.java similarity index 79% rename from src/main/java/use_case/manage_application/ManageInputData.java rename to src/main/java/use_case/manage_application/ManageApplicationInputData.java index 8e61ecc9..79a65c46 100644 --- a/src/main/java/use_case/manage_application/ManageInputData.java +++ b/src/main/java/use_case/manage_application/ManageApplicationInputData.java @@ -1,6 +1,6 @@ package use_case.manage_application; -public class ManageInputData { +public class ManageApplicationInputData { // Empty because no input data is required for managing application // Going to fetch all the applications info } diff --git a/src/main/java/use_case/manage_application/ManageApplicationInteractor.java b/src/main/java/use_case/manage_application/ManageApplicationInteractor.java new file mode 100644 index 00000000..1a7809bf --- /dev/null +++ b/src/main/java/use_case/manage_application/ManageApplicationInteractor.java @@ -0,0 +1,50 @@ +package use_case.manage_application; + +import use_case.login.LoginOutputBoundary; +import use_case.login.LoginUserDataAccessInterface; + +public class ManageApplicationInteractor implements ManageApplicationInputBoundary { + private final userDataAccessObject; + private final ManageApplicationOutputBoundary managePresenter; + + public ManageApplicationInteractor(ManageApplicationDataAccessInterface userDataAccessInterface, + ManageApplicationOutputBoundary manageApplicationOutputBoundary) { + this.userDataAccessObject = userDataAccessInterface; + this.managePresenter = manageApplicationOutputBoundary; + } + + + // grab information from database + + // do http request, like for login logout + + @Override + public void execute() { + + +// final String username = loginInputData.getUsername(); +// final String password = loginInputData.getPassword(); +// if (!userDataAccessObject.existsByName(username)) { +// loginPresenter.prepareFailView(username + ": Account does not exist."); +// } +// else { +// final String pwd = userDataAccessObject.get(username).getPassword(); +// if (!password.equals(pwd)) { +// loginPresenter.prepareFailView("Incorrect password for \"" + username + "\"."); +// } +// else { +// +// final User user = userDataAccessObject.get(loginInputData.getUsername()); +// +// userDataAccessObject.setCurrentUsername(username); +// +// final LoginOutputData loginOutputData = new LoginOutputData(user.getName()); + + /// you are trying to do your logic here, and then define output data, + /// pass it back into the prepare success view method in outputboundary at last +// loginPresenter.prepareSuccessView(loginOutputData); +// } +// } + } + +} diff --git a/src/main/java/use_case/manage_application/ManageApplicationOutputBoundary.java b/src/main/java/use_case/manage_application/ManageApplicationOutputBoundary.java new file mode 100644 index 00000000..a04b5313 --- /dev/null +++ b/src/main/java/use_case/manage_application/ManageApplicationOutputBoundary.java @@ -0,0 +1,14 @@ +package use_case.manage_application; + +/** + * Input Boundary for actions which are related to logging in. + */ +public interface ManageApplicationOutputBoundary { + // note that this is an interface so there isn't implementation of methods + + /** + * Prepares the success view for the Manage Application Use Case + * @param outputData the output data + */ + void prepareSuccessView(ManageApplicationOutputData outputData); +} diff --git a/src/main/java/use_case/manage_application/ManageApplicationOutputData.java b/src/main/java/use_case/manage_application/ManageApplicationOutputData.java new file mode 100644 index 00000000..a896ce1c --- /dev/null +++ b/src/main/java/use_case/manage_application/ManageApplicationOutputData.java @@ -0,0 +1,4 @@ +package use_case.manage_application; + +public class ManageApplicationOutputData { +} diff --git a/src/main/java/use_case/manage_application/ManageUserDataAccessInterface.java b/src/main/java/use_case/manage_application/ManageApplicationUserDataAccessInterface.java similarity index 83% rename from src/main/java/use_case/manage_application/ManageUserDataAccessInterface.java rename to src/main/java/use_case/manage_application/ManageApplicationUserDataAccessInterface.java index cb7e4610..5744054d 100644 --- a/src/main/java/use_case/manage_application/ManageUserDataAccessInterface.java +++ b/src/main/java/use_case/manage_application/ManageApplicationUserDataAccessInterface.java @@ -5,7 +5,7 @@ /** * Input Boundary for actions which are related to logging in. */ -public interface ManageUserDataAccessInterface { +public interface ManageApplicationUserDataAccessInterface { /** * Executes the login use case. diff --git a/src/main/java/use_case/manage_application/ManageInputBoundary.java b/src/main/java/use_case/manage_application/ManageInputBoundary.java deleted file mode 100644 index e739536d..00000000 --- a/src/main/java/use_case/manage_application/ManageInputBoundary.java +++ /dev/null @@ -1,22 +0,0 @@ -package use_case.manage_application; - -import use_case.login.LoginInputData; -import use_case.signup.SignupInputData; - -/** - * Input Boundary for actions which are related to logging in. - */ -public interface ManageInputBoundary { - - /** - * Executes the login use case. - * @param manageInputData the input data - */ - void execute(ManageInputData manageInputData); - - // when clicked on an application: -// /** -// * Executes the switch to accept/reject view use case. -// */ -// void switchToLoginView(); -} diff --git a/src/main/java/use_case/manage_application/ManageInteractor.java b/src/main/java/use_case/manage_application/ManageInteractor.java deleted file mode 100644 index 2cd1b694..00000000 --- a/src/main/java/use_case/manage_application/ManageInteractor.java +++ /dev/null @@ -1,11 +0,0 @@ -package use_case.manage_application; - -public class ManageInteractor { - // grab information from database - - // do http request, like for login logout - - // display them somehow? (send them to outputdata / boundary)? - - -} diff --git a/src/main/java/use_case/manage_application/ManageOutputBoundary.java b/src/main/java/use_case/manage_application/ManageOutputBoundary.java deleted file mode 100644 index a4132b06..00000000 --- a/src/main/java/use_case/manage_application/ManageOutputBoundary.java +++ /dev/null @@ -1,15 +0,0 @@ -package use_case.manage_application; - -import use_case.login.LoginInputData; - -/** - * Input Boundary for actions which are related to logging in. - */ -public interface ManageOutputBoundary { - - /** - * Executes the login use case. - * @param loginInputData the input data - */ - void execute(LoginInputData loginInputData); -} diff --git a/src/main/java/use_case/manage_application/ManageOutputData.java b/src/main/java/use_case/manage_application/ManageOutputData.java deleted file mode 100644 index 78a8b2e5..00000000 --- a/src/main/java/use_case/manage_application/ManageOutputData.java +++ /dev/null @@ -1,4 +0,0 @@ -package use_case.manage_application; - -public class ManageOutputData { -} diff --git a/src/main/java/view/ManageApplicationView.java b/src/main/java/view/ManageApplicationView.java new file mode 100644 index 00000000..aa27cad1 --- /dev/null +++ b/src/main/java/view/ManageApplicationView.java @@ -0,0 +1,4 @@ +package view; + +public class ManageApplicationView { +} From 50addb6baba8e709be1bb02b8a2e8cfbcd684758 Mon Sep 17 00:00:00 2001 From: Haizhiling Lyu Date: Tue, 18 Nov 2025 05:31:25 -0500 Subject: [PATCH 74/97] presenter, view, outputflow done --- .../data_access/DBUserDataAccessObject.java | 5 ++- .../data_access/FileUserDataAccessObject.java | 4 +- .../InMemoryUserDataAccessObject.java | 4 +- src/main/java/entity/Application.java | 2 +- .../submit_application/SubmitPresenter.java | 44 ++++++++++++++++++- .../submit_application/SubmitState.java | 17 +++++++ .../submit_application/SubmitViewModel.java | 2 +- .../use_case/signup/SignupInteractor.java | 2 +- .../SubmitApplicationDataAccessInterface.java | 3 ++ .../submit_application/SubmitInteractor.java | 23 +++++++--- .../SubmitOutputBoundary.java | 2 + .../SubmitUserDataAccessInterface.java | 10 +++++ src/main/java/view/SubmitView.java | 31 ++++++++----- 13 files changed, 126 insertions(+), 23 deletions(-) create mode 100644 src/main/java/use_case/submit_application/SubmitUserDataAccessInterface.java diff --git a/src/main/java/data_access/DBUserDataAccessObject.java b/src/main/java/data_access/DBUserDataAccessObject.java index 08cc04ad..dcb01016 100644 --- a/src/main/java/data_access/DBUserDataAccessObject.java +++ b/src/main/java/data_access/DBUserDataAccessObject.java @@ -9,6 +9,7 @@ import use_case.login.LoginUserDataAccessInterface; import use_case.logout.LogoutUserDataAccessInterface; import use_case.signup.SignupUserDataAccessInterface; +import use_case.submit_application.SubmitUserDataAccessInterface; import java.io.IOException; @@ -18,7 +19,9 @@ public class DBUserDataAccessObject implements SignupUserDataAccessInterface, LoginUserDataAccessInterface, ChangePasswordUserDataAccessInterface, - LogoutUserDataAccessInterface { + LogoutUserDataAccessInterface, + SubmitUserDataAccessInterface { + private static final int SUCCESS_CODE = 200; private static final String CONTENT_TYPE_LABEL = "Content-Type"; private static final String CONTENT_TYPE_JSON = "application/json"; diff --git a/src/main/java/data_access/FileUserDataAccessObject.java b/src/main/java/data_access/FileUserDataAccessObject.java index 4cae88c5..f02f0175 100644 --- a/src/main/java/data_access/FileUserDataAccessObject.java +++ b/src/main/java/data_access/FileUserDataAccessObject.java @@ -6,6 +6,7 @@ import use_case.login.LoginUserDataAccessInterface; import use_case.logout.LogoutUserDataAccessInterface; import use_case.signup.SignupUserDataAccessInterface; +import use_case.submit_application.SubmitUserDataAccessInterface; import java.io.*; import java.util.HashMap; @@ -18,7 +19,8 @@ public class FileUserDataAccessObject implements SignupUserDataAccessInterface, LoginUserDataAccessInterface, ChangePasswordUserDataAccessInterface, - LogoutUserDataAccessInterface { + LogoutUserDataAccessInterface, + SubmitUserDataAccessInterface { private static final String HEADER = "username,password"; diff --git a/src/main/java/data_access/InMemoryUserDataAccessObject.java b/src/main/java/data_access/InMemoryUserDataAccessObject.java index fc5dd2b2..e36fd54e 100644 --- a/src/main/java/data_access/InMemoryUserDataAccessObject.java +++ b/src/main/java/data_access/InMemoryUserDataAccessObject.java @@ -5,6 +5,7 @@ import use_case.login.LoginUserDataAccessInterface; import use_case.logout.LogoutUserDataAccessInterface; import use_case.signup.SignupUserDataAccessInterface; +import use_case.submit_application.SubmitUserDataAccessInterface; import java.util.HashMap; import java.util.Map; @@ -16,7 +17,8 @@ public class InMemoryUserDataAccessObject implements SignupUserDataAccessInterface, LoginUserDataAccessInterface, ChangePasswordUserDataAccessInterface, - LogoutUserDataAccessInterface { + LogoutUserDataAccessInterface, + SubmitUserDataAccessInterface { private final Map users = new HashMap<>(); diff --git a/src/main/java/entity/Application.java b/src/main/java/entity/Application.java index aa3d5612..ead1a5d3 100644 --- a/src/main/java/entity/Application.java +++ b/src/main/java/entity/Application.java @@ -26,7 +26,7 @@ private getPersonaLInformation(Visitor user) { // get all personal info from visitor String name = user.getName(); String email = user.getEmail(); - String phone_number = user.getPhone(); + String phone_number = user.getPhoneNum(); String age = user.getAge(); String occupation = user.getOccupation(); diff --git a/src/main/java/interface_adapter/submit_application/SubmitPresenter.java b/src/main/java/interface_adapter/submit_application/SubmitPresenter.java index a03119b0..9eb43ddc 100644 --- a/src/main/java/interface_adapter/submit_application/SubmitPresenter.java +++ b/src/main/java/interface_adapter/submit_application/SubmitPresenter.java @@ -1,4 +1,46 @@ package interface_adapter.submit_application; -public class SubmitPresenter { +import interface_adapter.ViewManagerModel; +import interface_adapter.login.LoginViewModel; +import interface_adapter.signup.SignupState; +import interface_adapter.signup.SignupViewModel; +import use_case.submit_application.SubmitOutputBoundary; + +public class SubmitPresenter implements SubmitOutputBoundary { + private final SubmitViewModel submitViewModel; + private final BrowseFilterViewModel browseFilterViewModel; + private final ViewManagerModel viewManagerModel; + + public SubmitPresenter(ViewManagerModel viewManagerModel, + SubmitViewModel submitViewModel, + BrowseFilterViewModel browseFilterViewModel) { + this.viewManagerModel = viewManagerModel; + this.submitViewModel = submitViewModel; + this.browseFilterViewModel = browseFilterViewModel; + } + + @Override + public void prepareSuccessView(String successMessage) { + //show "submit successfully" to user + final SubmitState submitState = submitViewModel.getState(); + submitState.setSuccess(successMessage); + submitViewModel.firePropertyChange(); + //On success, switch back to BrowserFilter view + viewManagerModel.setState(BrowseFilterViewModel.getViewName()); + viewManagerModel.firePropertyChange(); + } + + @Override + public void prepareFailView(String errorMessage) { + final SubmitState submitState = submitViewModel.getState(); + submitState.setError(errorMessage); + submitViewModel.firePropertyChange(); + } + + @Override + public void switchToBrowserFilterView() { + //for the cancel button + viewManagerModel.setState(BrowseFilterViewModel.getViewName()); + viewManagerModel.firePropertyChange(); + } } diff --git a/src/main/java/interface_adapter/submit_application/SubmitState.java b/src/main/java/interface_adapter/submit_application/SubmitState.java index 78f770c0..88cf6229 100644 --- a/src/main/java/interface_adapter/submit_application/SubmitState.java +++ b/src/main/java/interface_adapter/submit_application/SubmitState.java @@ -15,6 +15,8 @@ public class SubmitState { private String reason = ""; private String prevExp = ""; private String availability = ""; + private String error = ""; + private String success = ""; public String getPetId() { @@ -109,4 +111,19 @@ public void setAvailability(String availability) { this.availability = availability; } + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getSuccess() { + return success; + } + + public void setSuccess(String success) { + this.success = success; + } } diff --git a/src/main/java/interface_adapter/submit_application/SubmitViewModel.java b/src/main/java/interface_adapter/submit_application/SubmitViewModel.java index 3bf5c5a7..bf4be7fc 100644 --- a/src/main/java/interface_adapter/submit_application/SubmitViewModel.java +++ b/src/main/java/interface_adapter/submit_application/SubmitViewModel.java @@ -22,7 +22,7 @@ public class SubmitViewModel extends ViewModel { public static final String SUBMIT_BUTTON_LABEL = "Submit"; public static final String CANCEL_BUTTON_LABEL = "Cancel"; - SubmitViewModel() { + public SubmitViewModel() { super("submit"); setState(new SubmitState()); } diff --git a/src/main/java/use_case/signup/SignupInteractor.java b/src/main/java/use_case/signup/SignupInteractor.java index a2f0e208..e384b72d 100644 --- a/src/main/java/use_case/signup/SignupInteractor.java +++ b/src/main/java/use_case/signup/SignupInteractor.java @@ -35,7 +35,7 @@ else if ("".equals(signupInputData.getUsername())) { } else { final User user = userFactory.create(signupInputData.getUsername(), signupInputData.getPassword()); - userDataAssObject.save(user); + userDataAccessObject.save(user); final SignupOutputData signupOutputData = new SignupOutputData(user.getName()); userPresenter.prepareSuccessView(signupOutputData); diff --git a/src/main/java/use_case/submit_application/SubmitApplicationDataAccessInterface.java b/src/main/java/use_case/submit_application/SubmitApplicationDataAccessInterface.java index 4ae67533..6ae55af4 100644 --- a/src/main/java/use_case/submit_application/SubmitApplicationDataAccessInterface.java +++ b/src/main/java/use_case/submit_application/SubmitApplicationDataAccessInterface.java @@ -1,10 +1,13 @@ package use_case.submit_application; import entity.Application; +import entity.User; public interface SubmitApplicationDataAccessInterface { void save(Application application); Application get(String username, String petId); + User get(String username); + } diff --git a/src/main/java/use_case/submit_application/SubmitInteractor.java b/src/main/java/use_case/submit_application/SubmitInteractor.java index cebcd345..b9f1c375 100644 --- a/src/main/java/use_case/submit_application/SubmitInteractor.java +++ b/src/main/java/use_case/submit_application/SubmitInteractor.java @@ -4,13 +4,16 @@ import entity.Visitor; public class SubmitInteractor implements SubmitInputBoundary { + private final SubmitUserDataAccessInterface userDataAccessObject; private final SubmitApplicationDataAccessInterface applicationDataAccessObject; private final SubmitOutputBoundary submitPresenter; private final Application application; - public SubmitInteractor(SubmitApplicationDataAccessInterface applicationDataAccessInterface, + public SubmitInteractor(SubmitUserDataAccessInterface userDataAccessInterface, + SubmitApplicationDataAccessInterface applicationDataAccessInterface, SubmitOutputBoundary submitOutputBoundary, Application application) { + this.userDataAccessObject = userDataAccessInterface; this.applicationDataAccessObject = applicationDataAccessInterface; this.submitPresenter = submitOutputBoundary; this.application = application; @@ -32,12 +35,20 @@ public void execute(SubmitInputData submitInputData) { "".equals(submitInputData.getAvailability())) { submitPresenter.prepareFailView("Some required fields are missing"); } - final Visitor visitor = (Visitor)DAO.get(submitInputData.getUsername()); - final Application application = new Application(visitor, submitInputData.getPetId(), - submitInputData.getReason(), submitInputData.getHomeEvi(), - submitInputData.getAvailability(), submitInputData.getPrevExp()); - applicationDataAccessObject.save(application); + else if (! userDataAccessObject.existsByName(submitInputData.getUsername())){ + submitPresenter.prepareFailView("Username not found"); } + else { + final Visitor visitor = (Visitor)userDataAccessObject.get(submitInputData.getUsername()); + final Application application = new Application(visitor, submitInputData.getPetId(), + submitInputData.getReason(), submitInputData.getHomeEvi(), + submitInputData.getAvailability(), submitInputData.getPrevExp()); + applicationDataAccessObject.save(application); + submitPresenter.prepareSuccessView( + "Your application has been successfully submitted. " + + "We will review it and contact you shortly."); + } + } @Override public void switchToBrowserFilterView() { diff --git a/src/main/java/use_case/submit_application/SubmitOutputBoundary.java b/src/main/java/use_case/submit_application/SubmitOutputBoundary.java index cf5e80f3..e7d4ab62 100644 --- a/src/main/java/use_case/submit_application/SubmitOutputBoundary.java +++ b/src/main/java/use_case/submit_application/SubmitOutputBoundary.java @@ -2,6 +2,8 @@ public interface SubmitOutputBoundary { + void prepareSuccessView(String successMessage); + void prepareFailView(String errorMessage); void switchToBrowserFilterView(); diff --git a/src/main/java/use_case/submit_application/SubmitUserDataAccessInterface.java b/src/main/java/use_case/submit_application/SubmitUserDataAccessInterface.java new file mode 100644 index 00000000..f90302d9 --- /dev/null +++ b/src/main/java/use_case/submit_application/SubmitUserDataAccessInterface.java @@ -0,0 +1,10 @@ +package use_case.submit_application; + +import entity.User; + +public interface SubmitUserDataAccessInterface { + + boolean existsByName(String username); + + User get(String username); +} diff --git a/src/main/java/view/SubmitView.java b/src/main/java/view/SubmitView.java index 44511146..0f9c9503 100644 --- a/src/main/java/view/SubmitView.java +++ b/src/main/java/view/SubmitView.java @@ -1,5 +1,6 @@ package view; +import interface_adapter.signup.SignupState; import interface_adapter.submit_application.SubmitController; import interface_adapter.submit_application.SubmitState; import interface_adapter.submit_application.SubmitViewModel; @@ -64,19 +65,19 @@ public SubmitView(SubmitViewModel submitViewModel) { homeEviInfo.add(homeEviInputField); final JPanel reasonInfo = new JPanel(); - homeEviInfo.setLayout(new BoxLayout(reasonInfo, BoxLayout.Y_AXIS)); - homeEviInfo.add(new JLabel(SubmitViewModel.REASON_LABEL)); - homeEviInfo.add(reasonInputField); + reasonInfo.setLayout(new BoxLayout(reasonInfo, BoxLayout.Y_AXIS)); + reasonInfo.add(new JLabel(SubmitViewModel.REASON_LABEL)); + reasonInfo.add(reasonInputField); final JPanel prevExpInfo = new JPanel(); - homeEviInfo.setLayout(new BoxLayout(prevExpInfo, BoxLayout.Y_AXIS)); - homeEviInfo.add(new JLabel(SubmitViewModel.EXP_LABEL)); - homeEviInfo.add(prevExpInputField); + prevExpInfo.setLayout(new BoxLayout(prevExpInfo, BoxLayout.Y_AXIS)); + prevExpInfo.add(new JLabel(SubmitViewModel.EXP_LABEL)); + prevExpInfo.add(prevExpInputField); final JPanel availabilityInfo = new JPanel(); - homeEviInfo.setLayout(new BoxLayout(availabilityInfo, BoxLayout.Y_AXIS)); - homeEviInfo.add(new JLabel(SubmitViewModel.AVAILABILITY_LABEL)); - homeEviInfo.add(availabilityInputField); + availabilityInfo.setLayout(new BoxLayout(availabilityInfo, BoxLayout.Y_AXIS)); + prevExpInfo.add(new JLabel(SubmitViewModel.AVAILABILITY_LABEL)); + prevExpInfo.add(availabilityInputField); final JPanel buttons = new JPanel(); submit = new JButton(SubmitViewModel.SUBMIT_BUTTON_LABEL); @@ -387,8 +388,15 @@ public void actionPerformed(ActionEvent e) { @Override public void propertyChange(PropertyChangeEvent evt) { - + final SubmitState state = (SubmitState) evt.getNewValue(); + if (state.getError() != null) { + JOptionPane.showMessageDialog(this, state.getError()); + } + if (state.getSuccess() != null) { + JOptionPane.showMessageDialog(this, state.getSuccess()); + } } + public String getViewName() { return viewName; } @@ -396,4 +404,7 @@ public String getViewName() { public void setSubmitController(SubmitController controller) { this.submitController = controller; } + + + } From 5f13da3e181ff2efab72ddf20f7ad5112bbeed4e Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 18 Nov 2025 09:45:06 -0500 Subject: [PATCH 75/97] Update BrowseFilterController.java --- .../browse_filter/BrowseFilterController.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterController.java b/src/main/java/interface_adapter/browse_filter/BrowseFilterController.java index 8b137891..fd488570 100644 --- a/src/main/java/interface_adapter/browse_filter/BrowseFilterController.java +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterController.java @@ -1 +1,16 @@ +package interface_adapter.browse_filter; +import use_case.browse_filter.*; + +public class BrowseFilterController { + private final BrowseFilterInputBoundary interactor; + + public BrowseFilterController(BrowseFilterInputBoundary interactor) { + this.interactor = interactor; + } + + public void execute(String type, String gender) { + BrowseFilterInputData inputData = new BrowseFilterInputData(type, gender); + interactor.execute(inputData); + } +} From 6f33fccd5860e108358dd092ddceabd07e8eee24 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 18 Nov 2025 09:45:39 -0500 Subject: [PATCH 76/97] Update BrowseFilterPresenter.java --- .../browse_filter/BrowseFilterPresenter.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java b/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java index 8b137891..eb80df14 100644 --- a/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java @@ -1 +1,28 @@ +package interface_adapter.browse_filter; +import entity.Pet; +import use_case.browse_filter.BrowseFilterOutputBoundary; +import use_case.browse_filter.BrowseFilterOutputData; + +import java.util.List; +import java.util.stream.Collectors; + +public class BrowseFilterPresenter implements BrowseFilterOutputBoundary { + + private final BrowseFilterViewModel viewModel; + + public BrowseFilterPresenter(BrowseFilterViewModel vm) { + this.viewModel = vm; + } + + @Override + public void present(BrowseFilterOutputData outputData) { + List pets = outputData.getPets(); + + List petStrings = pets.stream() + .map(p -> p.getName() + " | " + p.getType() + " | " + p.getBreed() + " | " + p.getGender()) + .collect(Collectors.toList()); + + viewModel.setPets(petStrings); + } +} From 54369829f3a3b6a5bdac2099f3e7e590c756b7c0 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 18 Nov 2025 09:46:11 -0500 Subject: [PATCH 77/97] Update BrowseFilterViewModel.java --- .../browse_filter/BrowseFilterViewModel.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java b/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java index 8b137891..1760970a 100644 --- a/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java @@ -1 +1,25 @@ +package interface_adapter.browse_filter; +import entity.Pet; + +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; +import java.util.List; + +public class BrowseFilterViewModel { + private final PropertyChangeSupport support = new PropertyChangeSupport(this); + private List pets; + + public void setPets(List pets) { + this.pets = pets; + support.firePropertyChange("pets", null, pets); + } + + public List getPets() { + return pets; + } + + public void addPropertyChangeListener(PropertyChangeListener listener) { + support.addPropertyChangeListener(listener); + } +} From f14fe3db6d97619434dd976397060eddc467dc50 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 18 Nov 2025 09:46:48 -0500 Subject: [PATCH 78/97] Update BrowseFilterInputBoundary.java --- .../use_case/browse_filter/BrowseFilterInputBoundary.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java b/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java index 139597f9..ea805133 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterInputBoundary.java @@ -1,2 +1,5 @@ +package use_case.browse_filter; - +public interface BrowseFilterInputBoundary { + void execute(BrowseFilterInputData inputData); +} From 1fbb5c2503647e85dbc6f5c10c5a204c987beea7 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 18 Nov 2025 09:47:10 -0500 Subject: [PATCH 79/97] Update BrowseFilterInputData.java --- .../browse_filter/BrowseFilterInputData.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterInputData.java b/src/main/java/use_case/browse_filter/BrowseFilterInputData.java index 8b137891..14bedcfa 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterInputData.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterInputData.java @@ -1 +1,19 @@ +package use_case.browse_filter; +public class BrowseFilterInputData { + private final String type; + private final String gender; + + public BrowseFilterInputData(String type, String gender) { + this.type = type; + this.gender = gender; + } + + public String getType() { + return type; + } + + public String getGender() { + return gender; + } +} From 4463055304b81a3f19e01f0952a54bd14ddf4143 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 18 Nov 2025 09:47:32 -0500 Subject: [PATCH 80/97] Update BrowseFilterInteractor.java --- .../browse_filter/BrowseFilterInteractor.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java b/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java index 8b137891..8835df7a 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterInteractor.java @@ -1 +1,22 @@ +package use_case.browse_filter; +import data_access.PetAPIGatewayInterface; +import entity.Pet; +import java.util.List; + +public class BrowseFilterInteractor implements BrowseFilterInputBoundary { + private final PetAPIGatewayInterface petGateway; + private final BrowseFilterOutputBoundary presenter; + + public BrowseFilterInteractor(PetAPIGatewayInterface petGateway, BrowseFilterOutputBoundary presenter) { + this.petGateway = petGateway; + this.presenter = presenter; + } + + @Override + public void execute(BrowseFilterInputData inputData) { + List pets = petGateway.fetchPets(inputData.getType(), inputData.getGender()); + BrowseFilterOutputData outputData = new BrowseFilterOutputData(pets); + presenter.present(outputData); + } +} From cb0ecc3f1fa3848b873ca5ce77f88171fa50c3b1 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 18 Nov 2025 09:47:58 -0500 Subject: [PATCH 81/97] Update BrowseFilterOutputBoundary.java --- .../use_case/browse_filter/BrowseFilterOutputBoundary.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java b/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java index 8b137891..88a43f36 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterOutputBoundary.java @@ -1 +1,5 @@ +package use_case.browse_filter; +public interface BrowseFilterOutputBoundary { + void present(BrowseFilterOutputData outputData); +} From bfd0b1d0b8c5d3ab4241025fa1aa8baa3da38e13 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 18 Nov 2025 09:48:22 -0500 Subject: [PATCH 82/97] Update BrowseFilterOutputData.java --- .../browse_filter/BrowseFilterOutputData.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java b/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java index 8b137891..28627fae 100644 --- a/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java +++ b/src/main/java/use_case/browse_filter/BrowseFilterOutputData.java @@ -1 +1,16 @@ +package use_case.browse_filter; +import entity.Pet; +import java.util.List; + +public class BrowseFilterOutputData { + private final List pets; + + public BrowseFilterOutputData(List pets) { + this.pets = pets; + } + + public List getPets() { + return pets; + } +} From 0a49f610ddad48ad7a0d1b8fb5dc8109d469dff2 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 18 Nov 2025 09:48:57 -0500 Subject: [PATCH 83/97] Update BrowseFilterView.java --- src/main/java/view/BrowseFilterView.java | 109 +++++++++++++++++++++++ 1 file changed, 109 insertions(+) diff --git a/src/main/java/view/BrowseFilterView.java b/src/main/java/view/BrowseFilterView.java index 8b137891..5bc0ff3b 100644 --- a/src/main/java/view/BrowseFilterView.java +++ b/src/main/java/view/BrowseFilterView.java @@ -1 +1,110 @@ +package view; +import interface_adapter.browse_filter.BrowseFilterController; +import interface_adapter.browse_filter.BrowseFilterViewModel; + +import javax.swing.*; +import javax.swing.table.DefaultTableModel; +import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.util.List; + +public class BrowseFilterView extends JFrame implements PropertyChangeListener { + + private final BrowseFilterController controller; + private final BrowseFilterViewModel viewModel; + + private final JTextField speciesField = new JTextField(20); + private final JTextField genderField = new JTextField(20); + private final JButton searchButton = new JButton("Search"); + private final JButton clearButton = new JButton("Clear Filters"); + + // TABLE version + private final DefaultTableModel tableModel = new DefaultTableModel( + new String[]{"Name", "Type", "Breed", "Gender"}, 0 + ); + private final JTable petTable = new JTable(tableModel); + + public BrowseFilterView(BrowseFilterController controller, BrowseFilterViewModel viewModel) { + this.controller = controller; + this.viewModel = viewModel; + + viewModel.addPropertyChangeListener(this); + + setTitle("Pet Adoption Portal - Browse & Filter"); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + setSize(1000, 600); + setLocationRelativeTo(null); + + // ===== Filter Panel ===== + JPanel filterPanel = new JPanel(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.insets = new Insets(5, 5, 5, 5); + gbc.anchor = GridBagConstraints.WEST; + + gbc.gridx = 0; gbc.gridy = 0; + filterPanel.add(new JLabel("Species:"), gbc); + + gbc.gridx = 1; + filterPanel.add(speciesField, gbc); + + gbc.gridx = 0; gbc.gridy = 1; + filterPanel.add(new JLabel("Gender:"), gbc); + + gbc.gridx = 1; + filterPanel.add(genderField, gbc); + + gbc.gridx = 0; gbc.gridy = 2; gbc.gridwidth = 2; + gbc.anchor = GridBagConstraints.CENTER; + + JPanel buttonPanel = new JPanel(); + buttonPanel.add(searchButton); + buttonPanel.add(clearButton); + filterPanel.add(buttonPanel, gbc); + + // ===== TABLE results with scroll ===== + JScrollPane scrollPane = new JScrollPane(petTable); + petTable.setRowHeight(28); + + getContentPane().setLayout(new BorderLayout()); + getContentPane().add(filterPanel, BorderLayout.NORTH); + getContentPane().add(scrollPane, BorderLayout.CENTER); + + // ===== Button Actions ===== + searchButton.addActionListener(e -> { + String species = speciesField.getText().trim(); + String gender = genderField.getText().trim(); + controller.execute(species, gender); + }); + + clearButton.addActionListener(e -> { + speciesField.setText(""); + genderField.setText(""); + controller.execute("", ""); // reload all + }); + + setVisible(true); + } + + // 🔥 Whenever the presenter updates the ViewModel, this gets called + @Override + public void propertyChange(PropertyChangeEvent evt) { + if ("pets".equals(evt.getPropertyName())) { + updateTable(viewModel.getPets()); + } + } + + private void updateTable(List pets) { + tableModel.setRowCount(0); + + for (String line : pets) { + // "name | type | breed | gender" + String[] data = line.split("\\|"); + for (int i = 0; i < data.length; i++) { + data[i] = data[i].trim(); + } + tableModel.addRow(data); + } + } +} From a2c01458ea473a9a3e09c77fac6405c42ab179ae Mon Sep 17 00:00:00 2001 From: Haizhiling Lyu Date: Tue, 18 Nov 2025 11:35:56 -0500 Subject: [PATCH 84/97] small correction --- src/main/java/entity/Application.java | 2 +- .../submit_application/SubmitPresenter.java | 3 --- .../SubmitApplicationDataAccessInterface.java | 5 +---- src/main/java/view/SubmitView.java | 3 --- 4 files changed, 2 insertions(+), 11 deletions(-) diff --git a/src/main/java/entity/Application.java b/src/main/java/entity/Application.java index ead1a5d3..aa3d5612 100644 --- a/src/main/java/entity/Application.java +++ b/src/main/java/entity/Application.java @@ -26,7 +26,7 @@ private getPersonaLInformation(Visitor user) { // get all personal info from visitor String name = user.getName(); String email = user.getEmail(); - String phone_number = user.getPhoneNum(); + String phone_number = user.getPhone(); String age = user.getAge(); String occupation = user.getOccupation(); diff --git a/src/main/java/interface_adapter/submit_application/SubmitPresenter.java b/src/main/java/interface_adapter/submit_application/SubmitPresenter.java index 9eb43ddc..5284d87b 100644 --- a/src/main/java/interface_adapter/submit_application/SubmitPresenter.java +++ b/src/main/java/interface_adapter/submit_application/SubmitPresenter.java @@ -1,9 +1,6 @@ package interface_adapter.submit_application; import interface_adapter.ViewManagerModel; -import interface_adapter.login.LoginViewModel; -import interface_adapter.signup.SignupState; -import interface_adapter.signup.SignupViewModel; import use_case.submit_application.SubmitOutputBoundary; public class SubmitPresenter implements SubmitOutputBoundary { diff --git a/src/main/java/use_case/submit_application/SubmitApplicationDataAccessInterface.java b/src/main/java/use_case/submit_application/SubmitApplicationDataAccessInterface.java index 6ae55af4..6760cfd5 100644 --- a/src/main/java/use_case/submit_application/SubmitApplicationDataAccessInterface.java +++ b/src/main/java/use_case/submit_application/SubmitApplicationDataAccessInterface.java @@ -4,10 +4,7 @@ import entity.User; public interface SubmitApplicationDataAccessInterface { - void save(Application application); - - Application get(String username, String petId); - User get(String username); + void save(Application application); } diff --git a/src/main/java/view/SubmitView.java b/src/main/java/view/SubmitView.java index 0f9c9503..442c337e 100644 --- a/src/main/java/view/SubmitView.java +++ b/src/main/java/view/SubmitView.java @@ -404,7 +404,4 @@ public String getViewName() { public void setSubmitController(SubmitController controller) { this.submitController = controller; } - - - } From 4e95a5fc31e0f1f0bab7afe4c3c38208eeba7709 Mon Sep 17 00:00:00 2001 From: Haizhiling Lyu Date: Tue, 18 Nov 2025 11:49:54 -0500 Subject: [PATCH 85/97] update --- .../interface_adapter/submit_application/SubmitPresenter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/interface_adapter/submit_application/SubmitPresenter.java b/src/main/java/interface_adapter/submit_application/SubmitPresenter.java index 5284d87b..8566f569 100644 --- a/src/main/java/interface_adapter/submit_application/SubmitPresenter.java +++ b/src/main/java/interface_adapter/submit_application/SubmitPresenter.java @@ -29,6 +29,7 @@ public void prepareSuccessView(String successMessage) { @Override public void prepareFailView(String errorMessage) { + //username error or info not completed final SubmitState submitState = submitViewModel.getState(); submitState.setError(errorMessage); submitViewModel.firePropertyChange(); From 0ed48b1875b4f097a5800c7b5aac2031ce362a37 Mon Sep 17 00:00:00 2001 From: KaedeKagami86 <105937682+KaedeKagami86@users.noreply.github.com> Date: Tue, 18 Nov 2025 12:23:48 -0500 Subject: [PATCH 86/97] Fixed application bug, forgot to put output type for getPersonalInformation() helper --- src/main/java/entity/Application.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/entity/Application.java b/src/main/java/entity/Application.java index b637dbd0..3f290a10 100644 --- a/src/main/java/entity/Application.java +++ b/src/main/java/entity/Application.java @@ -27,11 +27,11 @@ public class Application { private List personal_information; // helper method, to gather all info from the user - private getPersonaLInformation(Visitor user) { + private List getPersonalInformation(Visitor user) { // get all personal info from visitor String name = user.getLegalName(); String email = user.getEmail(); - String phone_number = user.getPhone(); + String phone_number = user.getPhoneNum(); String age = user.getAge(); String occupation = user.getOccupation(); From 588e815a1f794e57a5c7654873c43f08331426aa Mon Sep 17 00:00:00 2001 From: Haizhiling Lyu Date: Tue, 18 Nov 2025 12:25:29 -0500 Subject: [PATCH 87/97] user factory and related database implemented --- src/main/java/data_access/DBUserDataAccessObject.java | 2 +- src/main/java/data_access/FileUserDataAccessObject.java | 2 +- src/main/java/entity/UserFactory.java | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/data_access/DBUserDataAccessObject.java b/src/main/java/data_access/DBUserDataAccessObject.java index dcb01016..18209c82 100644 --- a/src/main/java/data_access/DBUserDataAccessObject.java +++ b/src/main/java/data_access/DBUserDataAccessObject.java @@ -55,7 +55,7 @@ public User get(String username) { final String name = userJSONObject.getString(USERNAME); final String password = userJSONObject.getString(PASSWORD); - return userFactory.create(name, password); + return userFactory.create("visitor", name, password); } else { throw new RuntimeException(responseBody.getString(MESSAGE)); diff --git a/src/main/java/data_access/FileUserDataAccessObject.java b/src/main/java/data_access/FileUserDataAccessObject.java index f02f0175..03503d6a 100644 --- a/src/main/java/data_access/FileUserDataAccessObject.java +++ b/src/main/java/data_access/FileUserDataAccessObject.java @@ -59,7 +59,7 @@ public FileUserDataAccessObject(String csvPath, UserFactory userFactory) { final String[] col = row.split(","); final String username = String.valueOf(col[headers.get("username")]); final String password = String.valueOf(col[headers.get("password")]); - final User user = userFactory.create(username, password); + final User user = userFactory.create("visitor", username, password); accounts.put(username, user); } } diff --git a/src/main/java/entity/UserFactory.java b/src/main/java/entity/UserFactory.java index 238578d3..f1dea77f 100644 --- a/src/main/java/entity/UserFactory.java +++ b/src/main/java/entity/UserFactory.java @@ -5,7 +5,11 @@ */ public class UserFactory { - public User create(String name, String password) { - return new User(name, password); + public User create(String type, String name, String password) { + switch (type.toLowerCase()) { + case "visitor": + return new Visitor(name, password); + case "administrator": + return new Administrator(name, password); } } From 3c026488f03fe63fc88c3753627f281800935894 Mon Sep 17 00:00:00 2001 From: Haizhiling Lyu Date: Tue, 18 Nov 2025 12:39:32 -0500 Subject: [PATCH 88/97] small correction --- src/main/java/entity/UserFactory.java | 3 +++ .../use_case/change_password/ChangePasswordInteractor.java | 2 +- src/main/java/use_case/signup/SignupInteractor.java | 2 +- src/test/java/use_case/login/LoginInteractorTest.java | 4 ++-- src/test/java/use_case/logout/LogoutInteractorTest.java | 2 +- src/test/java/use_case/signup/SignupInteractorTest.java | 2 +- 6 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/main/java/entity/UserFactory.java b/src/main/java/entity/UserFactory.java index f1dea77f..0ce43862 100644 --- a/src/main/java/entity/UserFactory.java +++ b/src/main/java/entity/UserFactory.java @@ -11,5 +11,8 @@ public User create(String type, String name, String password) { return new Visitor(name, password); case "administrator": return new Administrator(name, password); + default: + throw new IllegalArgumentException("Unknown user type: " + type); + } } } diff --git a/src/main/java/use_case/change_password/ChangePasswordInteractor.java b/src/main/java/use_case/change_password/ChangePasswordInteractor.java index 8fe1f0e4..12a0f1a1 100644 --- a/src/main/java/use_case/change_password/ChangePasswordInteractor.java +++ b/src/main/java/use_case/change_password/ChangePasswordInteractor.java @@ -25,7 +25,7 @@ public void execute(ChangePasswordInputData changePasswordInputData) { userPresenter.prepareFailView("New password cannot be empty"); } else { - final User user = userFactory.create(changePasswordInputData.getUsername(), + final User user = userFactory.create("visitor", changePasswordInputData.getUsername(), changePasswordInputData.getPassword()); userDataAccessObject.changePassword(user); diff --git a/src/main/java/use_case/signup/SignupInteractor.java b/src/main/java/use_case/signup/SignupInteractor.java index e384b72d..820cb0bf 100644 --- a/src/main/java/use_case/signup/SignupInteractor.java +++ b/src/main/java/use_case/signup/SignupInteractor.java @@ -34,7 +34,7 @@ else if ("".equals(signupInputData.getUsername())) { userPresenter.prepareFailView("Username cannot be empty"); } else { - final User user = userFactory.create(signupInputData.getUsername(), signupInputData.getPassword()); + final User user = userFactory.create("visitor", signupInputData.getUsername(), signupInputData.getPassword()); userDataAccessObject.save(user); final SignupOutputData signupOutputData = new SignupOutputData(user.getName()); diff --git a/src/test/java/use_case/login/LoginInteractorTest.java b/src/test/java/use_case/login/LoginInteractorTest.java index 4662abd9..ba5b87c1 100644 --- a/src/test/java/use_case/login/LoginInteractorTest.java +++ b/src/test/java/use_case/login/LoginInteractorTest.java @@ -16,7 +16,7 @@ void successTest() { // For the success test, we need to add Paul to the data access repository before we log in. UserFactory factory = new UserFactory(); - User user = factory.create("Paul", "password"); + User user = factory.create("visitor","Paul", "password"); userRepository.save(user); // This creates a successPresenter that tests whether the test case is as we expect. @@ -46,7 +46,7 @@ void failurePasswordMismatchTest() { // For this failure test, we need to add Paul to the data access repository before we log in, and // the passwords should not match. UserFactory factory = new UserFactory(); - User user = factory.create("Paul", "password"); + User user = factory.create("visitor","Paul", "password"); userRepository.save(user); // This creates a presenter that tests whether the test case is as we expect. diff --git a/src/test/java/use_case/logout/LogoutInteractorTest.java b/src/test/java/use_case/logout/LogoutInteractorTest.java index e69fc341..d2766aa7 100644 --- a/src/test/java/use_case/logout/LogoutInteractorTest.java +++ b/src/test/java/use_case/logout/LogoutInteractorTest.java @@ -15,7 +15,7 @@ void successTest() { // For the success test, we need to add Paul to the data access repository before we log in. UserFactory factory = new UserFactory(); - User user = factory.create("Paul", "password"); + User user = factory.create("visitor","Paul", "password"); userRepository.save(user); userRepository.setCurrentUsername("Paul"); diff --git a/src/test/java/use_case/signup/SignupInteractorTest.java b/src/test/java/use_case/signup/SignupInteractorTest.java index adf75c28..085dcd69 100644 --- a/src/test/java/use_case/signup/SignupInteractorTest.java +++ b/src/test/java/use_case/signup/SignupInteractorTest.java @@ -73,7 +73,7 @@ void failureUserExistsTest() { // Add Paul to the repo so that when we check later they already exist UserFactory factory = new UserFactory(); - User user = factory.create("Paul", "pwd"); + User user = factory.create("visitor","Paul", "pwd"); userRepository.save(user); // This creates a presenter that tests whether the test case is as we expect. From 84a716572bcc9931f127ad067e0ce8336e8cd91e Mon Sep 17 00:00:00 2001 From: KaedeKagami86 <105937682+KaedeKagami86@users.noreply.github.com> Date: Tue, 18 Nov 2025 12:50:01 -0500 Subject: [PATCH 89/97] Changed application implementation to fit visitor implementation and application submission use case, added in appbuilder the manageapplication view, changed user to non-abstract (deleted abstract keyword) --- src/main/java/app/AppBuilder.java | 16 ++-- src/main/java/entity/Application.java | 10 ++- src/main/java/entity/User.java | 2 +- .../ManageApplicationViewModel.java | 19 ++++- src/main/java/view/ManageApplicationView.java | 84 ++++++++++++++++++- 5 files changed, 119 insertions(+), 12 deletions(-) diff --git a/src/main/java/app/AppBuilder.java b/src/main/java/app/AppBuilder.java index 3c654cad..5fbd0a92 100644 --- a/src/main/java/app/AppBuilder.java +++ b/src/main/java/app/AppBuilder.java @@ -11,6 +11,7 @@ import interface_adapter.login.LoginViewModel; import interface_adapter.logout.LogoutController; import interface_adapter.logout.LogoutPresenter; +import interface_adapter.manage_application.ManageApplicationViewModel; import interface_adapter.signup.SignupController; import interface_adapter.signup.SignupPresenter; import interface_adapter.signup.SignupViewModel; @@ -26,10 +27,7 @@ import use_case.signup.SignupInputBoundary; import use_case.signup.SignupInteractor; import use_case.signup.SignupOutputBoundary; -import view.LoggedInView; -import view.LoginView; -import view.SignupView; -import view.ViewManager; +import view.*; import javax.swing.*; import java.awt.*; @@ -50,6 +48,8 @@ public class AppBuilder { // DAO version using a shared external database // final DBUserDataAccessObject userDataAccessObject = new DBUserDataAccessObject(userFactory); + private ManageApplicationView manageApplicationView; + private ManageApplicationViewModel manageApplicationViewModel; private SignupView signupView; private SignupViewModel signupViewModel; private LoginViewModel loginViewModel; @@ -61,6 +61,13 @@ public AppBuilder() { cardPanel.setLayout(cardLayout); } + public AppBuilder addManageApplicationView() { + manageApplicationViewModel = new ManageApplicationViewModel(); + manageApplicationView = new ManageApplicationView(manageApplicationViewModel); + cardPanel.add(manageApplicationView, manageApplicationView.getViewName()); + return this; + } + public AppBuilder addSignupView() { signupViewModel = new SignupViewModel(); signupView = new SignupView(signupViewModel); @@ -137,7 +144,6 @@ public JFrame build() { application.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); application.add(cardPanel); - viewManagerModel.setState(signupView.getViewName()); viewManagerModel.firePropertyChange(); diff --git a/src/main/java/entity/Application.java b/src/main/java/entity/Application.java index 3f290a10..427e40e8 100644 --- a/src/main/java/entity/Application.java +++ b/src/main/java/entity/Application.java @@ -29,14 +29,16 @@ public class Application { // helper method, to gather all info from the user private List getPersonalInformation(Visitor user) { // get all personal info from visitor - String name = user.getLegalName(); + String first_name = user.getFirstName(); + String last_name = user.getLastName(); String email = user.getEmail(); String phone_number = user.getPhoneNum(); String age = user.getAge(); String occupation = user.getOccupation(); List personal_information = new ArrayList<>(); - personal_information.add(name); + personal_information.add(first_name); + personal_information.add(last_name); personal_information.add(email); personal_information.add(phone_number); personal_information.add(age); @@ -50,7 +52,7 @@ private List getPersonalInformation(Visitor user) { * @throws IllegalArgumentException if the password or name are empty */ // - public Application(Visitor user, Pet pet, String reason_to_adopt, String home_environment, String availability, String previous_experience) { + public Application(Visitor user, String pet_id, String reason_to_adopt, String home_environment, String availability, String previous_experience) { List personal_information = getPersonalInformation(user); // loop through the list, see if any is empty, if yes throw an error for (String info : personal_information) { @@ -60,7 +62,7 @@ public Application(Visitor user, Pet pet, String reason_to_adopt, String home_en } } // set all attributes - this.pet_id = pet.getId(); + this.pet_id = pet_id; this.personal_information = personal_information; this.reason_to_adopt = reason_to_adopt; this.home_environment = home_environment; diff --git a/src/main/java/entity/User.java b/src/main/java/entity/User.java index 55ada81d..bf9783d0 100644 --- a/src/main/java/entity/User.java +++ b/src/main/java/entity/User.java @@ -3,7 +3,7 @@ /** * A simple entity representing a user. Users have a username and password.. */ -public abstract class User { +public class User { private final String name; private final String password; diff --git a/src/main/java/interface_adapter/manage_application/ManageApplicationViewModel.java b/src/main/java/interface_adapter/manage_application/ManageApplicationViewModel.java index 9eabb19f..edd77a85 100644 --- a/src/main/java/interface_adapter/manage_application/ManageApplicationViewModel.java +++ b/src/main/java/interface_adapter/manage_application/ManageApplicationViewModel.java @@ -1,6 +1,23 @@ package interface_adapter.manage_application; +import java.beans.PropertyChangeListener; +import java.beans.PropertyChangeSupport; + public class ManageApplicationViewModel { -} + private final PropertyChangeSupport support = new PropertyChangeSupport(this); + + private ManageApplicationState state = new ManageApplicationState(); + public ManageApplicationState getState() { return state; } + + public void setState(ManageApplicationState newState) { + ManageApplicationState old = this.state; + this.state = newState; + support.firePropertyChange("state", old, newState); + } + + public void addPropertyChangeListener(PropertyChangeListener l) { + support.addPropertyChangeListener(l); + } +} diff --git a/src/main/java/view/ManageApplicationView.java b/src/main/java/view/ManageApplicationView.java index aa27cad1..e196fb2e 100644 --- a/src/main/java/view/ManageApplicationView.java +++ b/src/main/java/view/ManageApplicationView.java @@ -1,4 +1,86 @@ package view; -public class ManageApplicationView { +import interface_adapter.manage_application.ManageApplicationViewModel; + +import javax.swing.*; +import java.awt.*; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; + + +public class ManageApplicationView extends JPanel implements PropertyChangeListener { + + private final String viewName = "applications"; + private final ManageApplicationViewModel viewModel; + + // Container that holds all the cards + private final JPanel cardsPanel = new JPanel(); + + public ManageApplicationView(ManageApplicationViewModel viewModel) { + this.viewModel = viewModel; + this.viewModel.addPropertyChangeListener(this); + + setLayout(new BorderLayout()); + + JLabel title = new JLabel("Applications"); + title.setHorizontalAlignment(SwingConstants.CENTER); + title.setBorder(BorderFactory.createEmptyBorder(10, 0, 10, 0)); + add(title, BorderLayout.NORTH); + + // Configure card list panel + cardsPanel.setLayout(new BoxLayout(cardsPanel, BoxLayout.Y_AXIS)); + cardsPanel.setBackground(Color.WHITE); + + // Scroll pane containing the cards + JScrollPane scrollPane = new JScrollPane(cardsPanel); + scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + + add(scrollPane, BorderLayout.CENTER); + + // TEMP: Add 3 example empty cards to show the layout working + addPlaceholderCards(); + } + + // Add example empty cards so the UI renders before data exists. + private void addPlaceholderCards() { + for (int i = 0; i < 3; i++) { + cardsPanel.add(createApplicationCard("Application " + (i + 1))); + } + } + + //Creates a single card panel representing one application. + private JPanel createApplicationCard(String titleText) { + JPanel card = new JPanel(); + card.setLayout(new BoxLayout(card, BoxLayout.Y_AXIS)); + card.setBorder(BorderFactory.createCompoundBorder( + BorderFactory.createEmptyBorder(10, 10, 10, 10), + BorderFactory.createLineBorder(Color.GRAY, 1) + )); + card.setMaximumSize(new Dimension(Integer.MAX_VALUE, 120)); // full width + card.setBackground(Color.WHITE); + + JLabel title = new JLabel(titleText); + title.setFont(title.getFont().deriveFont(Font.BOLD, 16f)); + + JLabel details = new JLabel("Details go here..."); + details.setFont(details.getFont().deriveFont(12f)); + + card.add(title); + card.add(Box.createRigidArea(new Dimension(0, 5))); + card.add(details); + + return card; + } + + @Override + public void propertyChange(PropertyChangeEvent evt) { + // When ViewModel has new list → rebuild cards + // Eventually: render real application data + } + + public String getViewName() { + return viewName; + } } + + From 7ee14619aa0f7211d53448ec220949b0ac45bc90 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Tue, 18 Nov 2025 13:05:30 -0500 Subject: [PATCH 90/97] Update BrowseFilterViewModel.java --- .../browse_filter/BrowseFilterViewModel.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java b/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java index 1760970a..a8ff3ff5 100644 --- a/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java @@ -22,4 +22,9 @@ public List getPets() { public void addPropertyChangeListener(PropertyChangeListener listener) { support.addPropertyChangeListener(listener); } + + public BrowseFilterViewModel() { + super("Browse and Filter"); + setState(new BrowseFilterState); + } } From c7f3845299414e952f1c6325d45948427aa61b2f Mon Sep 17 00:00:00 2001 From: zahrabuch Date: Tue, 18 Nov 2025 17:42:55 -0500 Subject: [PATCH 91/97] add pet Completed!!! --- src/main/java/app/AddPetAppBuilder.java | 1 + .../InMemoryPetDataAccessObject.java | 29 ++++++- .../add_pet/AddPetController.java | 4 +- .../add_pet/AddPetPresenter.java | 8 +- .../interface_adapter/add_pet/AddPetView.java | 86 ++++++++++++++----- .../add_pet/AddPetViewModel.java | 19 ++-- .../add_pet/AddPetDataAccessInterface.java | 6 +- .../use_case/add_pet/AddPetInputData.java | 6 +- .../use_case/add_pet/AddPetInteractor.java | 68 +++++++++++---- .../add_pet/AddPetOutputBoundary.java | 1 + .../use_case/add_pet/AddPetOutputData.java | 18 ++-- 11 files changed, 166 insertions(+), 80 deletions(-) diff --git a/src/main/java/app/AddPetAppBuilder.java b/src/main/java/app/AddPetAppBuilder.java index cdd2b197..2a27ce24 100644 --- a/src/main/java/app/AddPetAppBuilder.java +++ b/src/main/java/app/AddPetAppBuilder.java @@ -36,6 +36,7 @@ public AddPetAppBuilder addAddPetUseCase() { new AddPetInteractor(petFactory, petRepo, presenter); this.addPetController = new AddPetController(interactor); + this.addPetView.setViewModel(addPetViewModel); this.addPetView.setAddPetController(addPetController); return this; diff --git a/src/main/java/data_access/InMemoryPetDataAccessObject.java b/src/main/java/data_access/InMemoryPetDataAccessObject.java index f45041b2..fc465d40 100644 --- a/src/main/java/data_access/InMemoryPetDataAccessObject.java +++ b/src/main/java/data_access/InMemoryPetDataAccessObject.java @@ -5,6 +5,7 @@ import java.util.Collection; import java.util.HashMap; +import java.util.List; import java.util.Map; public class InMemoryPetDataAccessObject implements AddPetDataAccessInterface { @@ -17,13 +18,37 @@ public Collection getAllPets() { } @Override - public boolean existsById(String id) { + public boolean existsPet(List petData) { + for (Pet pet : pets.values()) { + if (pet.getName().equals(petData.get(0))) { + if(pet.getGender().equals(petData.get(1)) + &&pet.getAge().equals(petData.get(2)) + &&pet.getType().equals(petData.get(3)) + &&pet.getSize().equals(petData.get(4)) + &&pet.getBreed().equals(petData.get(5)) + ){ + return true; + } + return false; + } + } return false; - } + }; @Override public void add(Pet pet) { } + @Override + public String generateId(String type) { + String prefix = type.toUpperCase().replaceAll("\\s+", ""); + long count = pets.values().stream() + .filter(p -> p.getType().equalsIgnoreCase(type)) + .count(); + + long next = count + 1; + + return prefix + "-" + String.format("%03d", next); + } } diff --git a/src/main/java/interface_adapter/add_pet/AddPetController.java b/src/main/java/interface_adapter/add_pet/AddPetController.java index d1dd8498..0fc11999 100644 --- a/src/main/java/interface_adapter/add_pet/AddPetController.java +++ b/src/main/java/interface_adapter/add_pet/AddPetController.java @@ -11,7 +11,7 @@ public AddPetController(AddPetInputBoundary addPetUsecaseInteractor) { this.addPetUsecaseInteractor = addPetUsecaseInteractor; } - public void execute(String id, + public void execute( String name, String type, String breed, @@ -20,7 +20,7 @@ public void execute(String id, String size, String contact) { - AddPetInputData inputData = new AddPetInputData(id, name, type, breed, age, gender, size, contact); + AddPetInputData inputData = new AddPetInputData(name, type, breed, age, gender, size, contact); addPetUsecaseInteractor.execute(inputData); } diff --git a/src/main/java/interface_adapter/add_pet/AddPetPresenter.java b/src/main/java/interface_adapter/add_pet/AddPetPresenter.java index 85839dee..0ed07b33 100644 --- a/src/main/java/interface_adapter/add_pet/AddPetPresenter.java +++ b/src/main/java/interface_adapter/add_pet/AddPetPresenter.java @@ -13,14 +13,14 @@ public AddPetPresenter(AddPetViewModel viewModel) { @Override public void prepareSuccessView(AddPetOutputData data) { - viewModel.setMessage("Pet \"" + data.getName() + "\" added successfully!"); - viewModel.firePropertyChanged(); + viewModel.setStatusMessage(data.getMessage()); + //viewModel.firePropertyChanged(); } @Override public void prepareFailView(String errorMessage) { - viewModel.setMessage("Failed to add pet: " + errorMessage); - viewModel.firePropertyChanged(); + viewModel.setStatusMessage("Failed to add pet: " + errorMessage); + //viewModel.firePropertyChanged(); } } diff --git a/src/main/java/interface_adapter/add_pet/AddPetView.java b/src/main/java/interface_adapter/add_pet/AddPetView.java index 8c0e89fc..6f542b13 100644 --- a/src/main/java/interface_adapter/add_pet/AddPetView.java +++ b/src/main/java/interface_adapter/add_pet/AddPetView.java @@ -14,21 +14,31 @@ public class AddPetView extends JPanel implements ActionListener, PropertyChange private final JTextField nameInputField = new JTextField(15); private final JTextField typeInputField = new JTextField(15); private final JTextField breedInputField = new JTextField(15); - private final JTextField ageInputField = new JTextField(15); - private final JTextField genderInputField = new JTextField(15); - private final JTextField sizeInputField = new JTextField(15); private final JTextField contactInputField = new JTextField(15); - private final JTextArea petIDInputArea = new JTextArea(3, 15); + + private final JComboBox ageDropdown = + new JComboBox<>(new String[]{"Baby", "Young", "Adult"}); + + private final JComboBox genderDropdown = + new JComboBox<>(new String[]{"Male", "Female"}); + + private final JComboBox sizeDropdown = + new JComboBox<>(new String[]{"Small", "Medium", "Large"}); + private final JButton submitButton = new JButton("Add Pet"); + private final JButton cancelButton = new JButton("Cancel"); + private final JButton clearButton = new JButton("Clear Fields"); // The controller for this view private AddPetController addPetController; + private AddPetViewModel viewModel; public AddPetView() { setLayout(new BorderLayout()); JPanel formPanel = new JPanel(); + JPanel buttons = new JPanel(); formPanel.setLayout(new GridLayout(0, 2, 5, 5)); formPanel.add(new JLabel("Pet Name:")); @@ -41,24 +51,27 @@ public AddPetView() { formPanel.add(breedInputField); formPanel.add(new JLabel("Age:")); - formPanel.add(ageInputField); + formPanel.add(ageDropdown); formPanel.add(new JLabel("Gender:")); - formPanel.add(genderInputField); + formPanel.add(genderDropdown); formPanel.add(new JLabel("Size:")); - formPanel.add(sizeInputField); + formPanel.add(sizeDropdown); formPanel.add(new JLabel("Contact:")); formPanel.add(contactInputField); - formPanel.add(new JLabel("Pet ID :")); - formPanel.add(new JScrollPane(petIDInputArea)); - submitButton.addActionListener(this); + cancelButton.addActionListener(this); + clearButton.addActionListener(this); + + buttons.add(submitButton); + buttons.add(cancelButton); add(formPanel, BorderLayout.CENTER); - add(submitButton, BorderLayout.SOUTH); + add(clearButton, BorderLayout.NORTH); + add(buttons, BorderLayout.SOUTH); } public String getViewName() { @@ -71,26 +84,53 @@ public void setAddPetController(AddPetController controller) { @Override public void actionPerformed(ActionEvent e) { - if (addPetController != null) { - addPetController.execute( - petIDInputArea.getText(), - nameInputField.getText(), - typeInputField.getText(), - breedInputField.getText(), - ageInputField.getText(), - genderInputField.getText(), - sizeInputField.getText(), - contactInputField.getText() - ); + Object source = e.getSource(); + + if (source == submitButton) { + // Add Pet + if (addPetController != null) { + addPetController.execute( + nameInputField.getText(), + typeInputField.getText(), + breedInputField.getText(), + ageDropdown.getSelectedItem().toString(), + genderDropdown.getSelectedItem().toString(), + sizeDropdown.getSelectedItem().toString(), + contactInputField.getText() + ); + } + } + + else if (source == cancelButton) { + // Close the parent window + JFrame frame = (JFrame) SwingUtilities.getWindowAncestor(this); + if (frame != null) { + frame.dispose(); + } + } + + else if (source == clearButton) { + // Clear all fields + nameInputField.setText(""); + typeInputField.setText(""); + breedInputField.setText(""); + ageDropdown.setSelectedIndex(0); + genderDropdown.setSelectedIndex(0); + sizeDropdown.setSelectedIndex(0); + contactInputField.setText(""); } } @Override public void propertyChange(PropertyChangeEvent evt) { // This is where the presenter can update UI elements. - // Example: showing success or error messages if (evt.getPropertyName().equals("addPetStatus")) { JOptionPane.showMessageDialog(this, evt.getNewValue().toString()); } } + + public void setViewModel(AddPetViewModel viewModel) { + this.viewModel = viewModel; + this.viewModel.addPropertyChangeListener(this); + } } diff --git a/src/main/java/interface_adapter/add_pet/AddPetViewModel.java b/src/main/java/interface_adapter/add_pet/AddPetViewModel.java index 92cab77f..338b0f1c 100644 --- a/src/main/java/interface_adapter/add_pet/AddPetViewModel.java +++ b/src/main/java/interface_adapter/add_pet/AddPetViewModel.java @@ -4,24 +4,17 @@ import java.beans.PropertyChangeSupport; public class AddPetViewModel { - private final PropertyChangeSupport support = new PropertyChangeSupport(this); + private String statusMessage; - private String message = ""; - - public void setMessage(String message) { - this.message = message; - } - - public String getMessage() { - return message; + public void setStatusMessage(String message) { + String old = this.statusMessage; + this.statusMessage = message; + support.firePropertyChange("addPetStatus", old, this.statusMessage); } public void addPropertyChangeListener(PropertyChangeListener l) { support.addPropertyChangeListener(l); } - - public void firePropertyChanged() { - support.firePropertyChange("addPetStatus", null, message); - } } + diff --git a/src/main/java/use_case/add_pet/AddPetDataAccessInterface.java b/src/main/java/use_case/add_pet/AddPetDataAccessInterface.java index 5ca3b80c..65772fd7 100644 --- a/src/main/java/use_case/add_pet/AddPetDataAccessInterface.java +++ b/src/main/java/use_case/add_pet/AddPetDataAccessInterface.java @@ -2,14 +2,18 @@ import entity.Pet; +import java.util.List; + public interface AddPetDataAccessInterface { /** * Returns true if a pet with this name already exists. */ - boolean existsById(String id); + boolean existsPet(List petData); /** * Saves a new pet to the data store. */ void add(Pet pet); + + String generateId(String type); } diff --git a/src/main/java/use_case/add_pet/AddPetInputData.java b/src/main/java/use_case/add_pet/AddPetInputData.java index a9d6fc68..5c52f649 100644 --- a/src/main/java/use_case/add_pet/AddPetInputData.java +++ b/src/main/java/use_case/add_pet/AddPetInputData.java @@ -1,7 +1,6 @@ package use_case.add_pet; public class AddPetInputData { - private String id; private String name; private String type; private String breed; @@ -10,9 +9,9 @@ public class AddPetInputData { private String size; private String contact; - public AddPetInputData(String id,String name, String type, String breed, String age, String gender, String size, + public AddPetInputData(String name, String type, String breed, String age, String gender, String size, String contact) { - this.id = id; + this.name = name; this.type = type; this.breed = breed; @@ -22,7 +21,6 @@ public AddPetInputData(String id,String name, String type, String breed, String this.contact = contact; } - public String getId() {return id;} public String getName() {return name;} public String getType() {return type;} public String getBreed() {return breed;} diff --git a/src/main/java/use_case/add_pet/AddPetInteractor.java b/src/main/java/use_case/add_pet/AddPetInteractor.java index 803a8efa..13f3d9b3 100644 --- a/src/main/java/use_case/add_pet/AddPetInteractor.java +++ b/src/main/java/use_case/add_pet/AddPetInteractor.java @@ -3,45 +3,75 @@ import entity.Pet; import entity.PetFactory; +import java.util.ArrayList; +import java.util.List; + public class AddPetInteractor implements AddPetInputBoundary { + private final PetFactory petFactory; - private final AddPetDataAccessInterface gallery; + private final AddPetDataAccessInterface petRepo; private final AddPetOutputBoundary presenter; + public AddPetInteractor(PetFactory petFactory, - AddPetDataAccessInterface gallery, + AddPetDataAccessInterface petRepo, AddPetOutputBoundary presenter) { this.petFactory = petFactory; - this.gallery = gallery; + this.petRepo = petRepo; this.presenter = presenter; } @Override - public void execute(AddPetInputData addPetInputData) { - String petID = addPetInputData.getId(); + public void execute(AddPetInputData inputData) { + + String generatedId = petRepo.generateId(inputData.getType());; + List petData = new ArrayList<>(); + + petData.add(inputData.getName()); + petData.add(inputData.getGender()); + petData.add(inputData.getAge()); + petData.add(inputData.getType()); + petData.add(inputData.getSize()); + petData.add(inputData.getBreed()); - if (gallery.existsById(petID)) { - presenter.prepareFailView("Pet already exists."); + // -------- CHECK EMPTY FIELDS ---------- + if ( inputData.getName().isEmpty() || + inputData.getType().isEmpty() || + inputData.getBreed().isEmpty() || + inputData.getAge().isEmpty() || + inputData.getGender().isEmpty() || + inputData.getSize().isEmpty() || + inputData.getContact().isEmpty()) { + + presenter.prepareFailView("All fields must be filled out."); return; } - // Create pet - Pet newPet = petFactory.create( - addPetInputData.getId(), - addPetInputData.getName(), - addPetInputData.getType(), - addPetInputData.getBreed(), - addPetInputData.getAge(), - addPetInputData.getGender(), - addPetInputData.getSize(), - addPetInputData.getContact() + // -------- CHECK DUPLICATE PET ID ---------- + if (petRepo.existsPet(petData)){ + presenter.prepareFailView("A pet already exists."); + return; + } + + // -------- CREATE PET -------- + Pet pet = petFactory.create( + generatedId, + inputData.getName(), + inputData.getType(), + inputData.getBreed(), + inputData.getAge(), + inputData.getGender(), + inputData.getSize(), + inputData.getContact() ); - gallery.add(newPet); + petRepo.add(pet); + //might change to save later - presenter.prepareSuccessView(new AddPetOutputData(petID, addPetInputData.getName(), true)); + presenter.prepareSuccessView(new AddPetOutputData("Pet added successfully!", true)); } } + diff --git a/src/main/java/use_case/add_pet/AddPetOutputBoundary.java b/src/main/java/use_case/add_pet/AddPetOutputBoundary.java index 2f809052..6f78230a 100644 --- a/src/main/java/use_case/add_pet/AddPetOutputBoundary.java +++ b/src/main/java/use_case/add_pet/AddPetOutputBoundary.java @@ -4,4 +4,5 @@ public interface AddPetOutputBoundary { void prepareSuccessView(AddPetOutputData outputData); void prepareFailView(String errorMessage); + } diff --git a/src/main/java/use_case/add_pet/AddPetOutputData.java b/src/main/java/use_case/add_pet/AddPetOutputData.java index c8efb0ea..a24d863a 100644 --- a/src/main/java/use_case/add_pet/AddPetOutputData.java +++ b/src/main/java/use_case/add_pet/AddPetOutputData.java @@ -1,23 +1,16 @@ package use_case.add_pet; public class AddPetOutputData { - - private final String id; - private final String name; + private final String message; private final boolean success; - public AddPetOutputData(String id, String name, boolean success) { - this.id = id; - this.name = name; + public AddPetOutputData(String message, boolean success) { + this.message = message; this.success = success; } - public String getId() { - return id; - } - - public String getName() { - return name; + public String getMessage() { + return message; } public boolean isSuccess() { @@ -25,3 +18,4 @@ public boolean isSuccess() { } } + From a8236e5e3100f81e02480c6a69c90d8b933d2342 Mon Sep 17 00:00:00 2001 From: KaedeKagami86 <105937682+KaedeKagami86@users.noreply.github.com> Date: Tue, 18 Nov 2025 20:08:26 -0500 Subject: [PATCH 92/97] temporary fix for manage application, use case part --- .../ManageApplicationCardState.java | 31 +++++ .../ManageApplicationPresenter.java | 50 ++++++++ .../ManageApplicationState.java | 17 +++ .../ManageApplicationInputBoundary.java | 43 ++++--- .../ManageApplicationInteractor.java | 110 ++++++++++++------ .../ManageApplicationOutputBoundary.java | 2 +- .../ManageApplicationOutputData.java | 33 ++++++ 7 files changed, 232 insertions(+), 54 deletions(-) create mode 100644 src/main/java/interface_adapter/manage_application/ManageApplicationCardState.java create mode 100644 src/main/java/interface_adapter/manage_application/ManageApplicationPresenter.java create mode 100644 src/main/java/interface_adapter/manage_application/ManageApplicationState.java diff --git a/src/main/java/interface_adapter/manage_application/ManageApplicationCardState.java b/src/main/java/interface_adapter/manage_application/ManageApplicationCardState.java new file mode 100644 index 00000000..a79c8ec6 --- /dev/null +++ b/src/main/java/interface_adapter/manage_application/ManageApplicationCardState.java @@ -0,0 +1,31 @@ +package interface_adapter.manage_application; + +/** + * Represents the UI data for a single application card. + */ +public class ManageApplicationCardState { + + private final String applicationId; + private final String title; + private final String status; + private final String subtitle; + + public ManageApplicationCardState(String applicationId, + String title, + String status, + String subtitle) { + + this.applicationId = applicationId; + this.title = title; + this.status = status; + this.subtitle = subtitle; + } + + public String getApplicationId() { return applicationId; } + + public String getTitle() { return title; } + + public String getStatus() { return status; } + + public String getSubtitle() { return subtitle; } +} diff --git a/src/main/java/interface_adapter/manage_application/ManageApplicationPresenter.java b/src/main/java/interface_adapter/manage_application/ManageApplicationPresenter.java new file mode 100644 index 00000000..c767d489 --- /dev/null +++ b/src/main/java/interface_adapter/manage_application/ManageApplicationPresenter.java @@ -0,0 +1,50 @@ +//package interface_adapter.manage_application; +// +//import interface_adapter.ViewManagerModel; +//import use_case.manage_application.ManageApplicationOutputBoundary; +// +//public class ManageApplicationPresenter implements ManageApplicationOutputBoundary { +// +// +// private final ManageApplicationViewModel manageApplicationViewModel; +// private final ViewManagerModel viewManagerModel; +// +// public ManageApplicationPresenter() { +// +// } +// +// @Override +// public void prepareSuccessView(ManageApplicationViewModel manageApplicationViewModel) { +// +// +// +//} +package interface_adapter.manage_application; + +import use_case.manage_application.ManageApplicationOutputBoundary; +import use_case.manage_application.ManageApplicationOutputData; + +import java.util.ArrayList; +import java.util.List; + +public class ManageApplicationPresenter implements ManageApplicationOutputBoundary { + + private final ManageApplicationViewModel viewModel; + + public ManageApplicationPresenter(ManageApplicationViewModel viewModel) { + this.viewModel = viewModel; + } + + @Override + public void presentApplications(ManageApplicationOutputData outputData) { + + List cardStates = new ArrayList<>(); + + for (ManageApplicationOutputData.ApplicationData d : outputData.getApps()) { + cardStates.add(new ManageApplicationCardState(d.id, d.title, d.status, d.subtitle)); + } + + ManageApplicationState state = new ManageApplicationState(); + viewModel.setState(state); + } +} diff --git a/src/main/java/interface_adapter/manage_application/ManageApplicationState.java b/src/main/java/interface_adapter/manage_application/ManageApplicationState.java new file mode 100644 index 00000000..0f73cf9f --- /dev/null +++ b/src/main/java/interface_adapter/manage_application/ManageApplicationState.java @@ -0,0 +1,17 @@ +package interface_adapter.manage_application; + +import java.util.ArrayList; +import java.util.List; + +public class ManageApplicationState { + + private final List cards = new ArrayList<>(); + + public List getCards() { + return cards; + } + + public void addCard(ManageApplicationCardState card) { + cards.add(card); + } +} diff --git a/src/main/java/use_case/manage_application/ManageApplicationInputBoundary.java b/src/main/java/use_case/manage_application/ManageApplicationInputBoundary.java index 487db15a..7edb4c24 100644 --- a/src/main/java/use_case/manage_application/ManageApplicationInputBoundary.java +++ b/src/main/java/use_case/manage_application/ManageApplicationInputBoundary.java @@ -1,22 +1,29 @@ -package use_case.manage_application; - -/** - * Input Boundary for actions which are related to logging in. - */ - -/// // DONE ////// -public interface ManageApplicationInputBoundary { - // note that this is an interface so there isn't implementation of methods +//package use_case.manage_application; +// +///** +// * Input Boundary for actions which are related to logging in. +// */ +// +///// // DONE ////// +//public interface ManageApplicationInputBoundary { +// // note that this is an interface so there isn't implementation of methods +// +// /** +// * Executes the manage application use case. +// */ +// +// void execute(); // doesn't require input from user +// +// // when clicked on an application: +//// /** +//// * Executes the switch to accept/reject view use case. +//// */ +//// void switchToProcessView();? +//} - /** - * Executes the manage application use case. - */ - void execute(); // doesn't require input from user +package use_case.manage_application; - // when clicked on an application: -// /** -// * Executes the switch to accept/reject view use case. -// */ -// void switchToProcessView();? +public interface ManageApplicationInputBoundary { + void loadApplications(); } diff --git a/src/main/java/use_case/manage_application/ManageApplicationInteractor.java b/src/main/java/use_case/manage_application/ManageApplicationInteractor.java index 1a7809bf..a18aa486 100644 --- a/src/main/java/use_case/manage_application/ManageApplicationInteractor.java +++ b/src/main/java/use_case/manage_application/ManageApplicationInteractor.java @@ -1,50 +1,90 @@ +//package use_case.manage_application; +// +//import use_case.login.LoginOutputBoundary; +//import use_case.login.LoginUserDataAccessInterface; +// +//public class ManageApplicationInteractor implements ManageApplicationInputBoundary { +// private final userDataAccessObject; +// private final ManageApplicationOutputBoundary managePresenter; +// +// public ManageApplicationInteractor(ManageApplicationDataAccessInterface userDataAccessInterface, +// ManageApplicationOutputBoundary manageApplicationOutputBoundary) { +// this.userDataAccessObject = userDataAccessInterface; +// this.managePresenter = manageApplicationOutputBoundary; +// } +// +// +// // grab information from database +// +// // do http request, like for login logout +// +// @Override +// public void execute() { +// +// +//// final String username = loginInputData.getUsername(); +//// final String password = loginInputData.getPassword(); +//// if (!userDataAccessObject.existsByName(username)) { +//// loginPresenter.prepareFailView(username + ": Account does not exist."); +//// } +//// else { +//// final String pwd = userDataAccessObject.get(username).getPassword(); +//// if (!password.equals(pwd)) { +//// loginPresenter.prepareFailView("Incorrect password for \"" + username + "\"."); +//// } +//// else { +//// +//// final User user = userDataAccessObject.get(loginInputData.getUsername()); +//// +//// userDataAccessObject.setCurrentUsername(username); +//// +//// final LoginOutputData loginOutputData = new LoginOutputData(user.getName()); +// +// /// you are trying to do your logic here, and then define output data, +// /// pass it back into the prepare success view method in outputboundary at last +//// loginPresenter.prepareSuccessView(loginOutputData); +//// } +//// } +// } +// +//} package use_case.manage_application; -import use_case.login.LoginOutputBoundary; -import use_case.login.LoginUserDataAccessInterface; +import java.util.ArrayList; +import java.util.List; public class ManageApplicationInteractor implements ManageApplicationInputBoundary { - private final userDataAccessObject; - private final ManageApplicationOutputBoundary managePresenter; - public ManageApplicationInteractor(ManageApplicationDataAccessInterface userDataAccessInterface, - ManageApplicationOutputBoundary manageApplicationOutputBoundary) { - this.userDataAccessObject = userDataAccessInterface; - this.managePresenter = manageApplicationOutputBoundary; + private final ManageApplicationOutputBoundary presenter; + + public ManageApplicationInteractor(ManageApplicationOutputBoundary presenter) { + this.presenter = presenter; } + @Override + public void loadApplications() { - // grab information from database + // Create placeholder applications (fake data) + List fakeList = new ArrayList<>(); - // do http request, like for login logout + fakeList.add(new ManageApplicationOutputData.ApplicationData( + "1", "Application 1", "Pending", "This is a placeholder." + )); - @Override - public void execute() { + fakeList.add(new ManageApplicationOutputData.ApplicationData( + "2", "Application 2", "Approved", "Another placeholder." + )); + fakeList.add(new ManageApplicationOutputData.ApplicationData( + "3", "Application 3", "Rejected", "Yet another placeholder." + )); -// final String username = loginInputData.getUsername(); -// final String password = loginInputData.getPassword(); -// if (!userDataAccessObject.existsByName(username)) { -// loginPresenter.prepareFailView(username + ": Account does not exist."); -// } -// else { -// final String pwd = userDataAccessObject.get(username).getPassword(); -// if (!password.equals(pwd)) { -// loginPresenter.prepareFailView("Incorrect password for \"" + username + "\"."); -// } -// else { -// -// final User user = userDataAccessObject.get(loginInputData.getUsername()); -// -// userDataAccessObject.setCurrentUsername(username); -// -// final LoginOutputData loginOutputData = new LoginOutputData(user.getName()); + // Wrap it in output data + ManageApplicationOutputData outputData = + new ManageApplicationOutputData(fakeList); - /// you are trying to do your logic here, and then define output data, - /// pass it back into the prepare success view method in outputboundary at last -// loginPresenter.prepareSuccessView(loginOutputData); -// } -// } + // Send to presenter → viewmodel → view + presenter.presentApplications(outputData); } - } + diff --git a/src/main/java/use_case/manage_application/ManageApplicationOutputBoundary.java b/src/main/java/use_case/manage_application/ManageApplicationOutputBoundary.java index a04b5313..8d10606f 100644 --- a/src/main/java/use_case/manage_application/ManageApplicationOutputBoundary.java +++ b/src/main/java/use_case/manage_application/ManageApplicationOutputBoundary.java @@ -10,5 +10,5 @@ public interface ManageApplicationOutputBoundary { * Prepares the success view for the Manage Application Use Case * @param outputData the output data */ - void prepareSuccessView(ManageApplicationOutputData outputData); + void presentApplications(ManageApplicationOutputData outputData); } diff --git a/src/main/java/use_case/manage_application/ManageApplicationOutputData.java b/src/main/java/use_case/manage_application/ManageApplicationOutputData.java index a896ce1c..9784a4ce 100644 --- a/src/main/java/use_case/manage_application/ManageApplicationOutputData.java +++ b/src/main/java/use_case/manage_application/ManageApplicationOutputData.java @@ -1,4 +1,37 @@ +//package use_case.manage_application; +// +//public class ManageApplicationOutputData { +//} + + package use_case.manage_application; +import java.util.List; + public class ManageApplicationOutputData { + + private final List apps; + + public ManageApplicationOutputData(List apps) { + this.apps = apps; + } + + public List getApps() { + return apps; + } + + public static class ApplicationData { + public final String id; + public final String title; + public final String status; + public final String subtitle; + + public ApplicationData(String id, String title, String status, String subtitle) { + this.id = id; + this.title = title; + this.status = status; + this.subtitle = subtitle; + } + } } + From 39da1076f2c9367207a0a431cbb408347a4a14b2 Mon Sep 17 00:00:00 2001 From: KaedeKagami86 <105937682+KaedeKagami86@users.noreply.github.com> Date: Tue, 18 Nov 2025 20:08:53 -0500 Subject: [PATCH 93/97] temporary fix for manage application db part --- .../ApplicationGatewayInterface.java | 2 +- .../DatabaseApplicationGateway.java | 73 ++++++++++--------- 2 files changed, 38 insertions(+), 37 deletions(-) diff --git a/src/main/java/data_access/ApplicationGatewayInterface.java b/src/main/java/data_access/ApplicationGatewayInterface.java index 83c8bb26..c742f865 100644 --- a/src/main/java/data_access/ApplicationGatewayInterface.java +++ b/src/main/java/data_access/ApplicationGatewayInterface.java @@ -5,5 +5,5 @@ import java.util.List; public interface ApplicationGatewayInterface { - Application fetchApplicationById(String applicationId); +// Application fetchApplicationById(String applicationId); } diff --git a/src/main/java/data_access/DatabaseApplicationGateway.java b/src/main/java/data_access/DatabaseApplicationGateway.java index 29a7535e..1a46049d 100644 --- a/src/main/java/data_access/DatabaseApplicationGateway.java +++ b/src/main/java/data_access/DatabaseApplicationGateway.java @@ -16,33 +16,33 @@ public DatabaseApplicationGateway(Connection conn) { this.conn = conn; } - @Override - public Application fetchApplicationById(String applicationId) { // why does applicationID have to be a string not int? - String sql = "SELECT * FROM pets WHERE id = ?"; - try (PreparedStatement stmt = conn.prepareStatement(sql)) { // here - stmt.setString(1, applicationId); - ResultSet rs = stmt.executeQuery(); - if (rs.next()) { - return new Application( - rs.getString("id"), - rs.getString("application_id"), //TODO: make Application entity, pass in personal_info list, not separate fields! - //List personal_information = getPersonalInformation(user); ..... etc. - rs.getString("pet_id"), - rs.getString("legal_name"), - rs.getString("reason"), - rs.getString("availability"), - rs.getString("occupation"), - rs.getString("age"), - rs.getString("email"), - rs.getString("phone"), - rs.getString("previous_experience") - ); - } - } catch (SQLException e) { - e.printStackTrace(); - } - return null; - } +// @Override +// public Application fetchApplicationById(String applicationId) { // why does applicationID have to be a string not int? +// String sql = "SELECT * FROM pets WHERE id = ?"; +// try (PreparedStatement stmt = conn.prepareStatement(sql)) { // here +// stmt.setString(1, applicationId); +// ResultSet rs = stmt.executeQuery(); +// if (rs.next()) { +// return new Application( +//// rs.getString("id"), +//// rs.getString("application_id"), //TODO: make Application entity, pass in personal_info list, not separate fields! +// //List personal_information = getPersonalInformation(user); ..... etc. +//// rs.getString("pet_id"), +//// rs.getString("legal_name"), +//// rs.getString("reason"), +// rs.getString("availability"), +// rs.getString("occupation"), +// rs.getString("age"), +// rs.getString("email"), +// rs.getString("phone"), +// rs.getString("previous_experience") +// ); +// } +// } catch (SQLException e) { +// e.printStackTrace(); +// } +// return null; +// } public void addApplication(Application application) { String sql = "INSERT OR REPLACE INTO applications (id, pet_id, legal_name, reason, availability, " + @@ -50,16 +50,17 @@ public void addApplication(Application application) { try (PreparedStatement stmt = conn.prepareStatement(sql)) { stmt.setString(1, application.getApplicationId()); stmt.setString(2, application.getPetId()); - stmt.setString(3, application.getUser().getLegalName()); - stmt.setString(4, application.getReason()); - stmt.setString(5, application.getAvailability()); - stmt.setString(6, application.getUser().getOccupation()); - stmt.setString(7, application.getUser().getAge()); - stmt.setString(8, application.getUser().getEmail()); - stmt.setString(9, application.getUser().getPhone()); - stmt.setString(10, application.getPreviousExperience()); + stmt.setString(3, application.getUser().getFirstName()); + stmt.setString(4, application.getUser().getLastName()); + stmt.setString(5, application.getReason()); + stmt.setString(6, application.getAvailability()); + stmt.setString(7, application.getUser().getOccupation()); + stmt.setString(8, application.getUser().getAge()); + stmt.setString(9, application.getUser().getEmail()); + stmt.setString(10, application.getUser().getPhoneNum()); + stmt.setString(11, application.getPreviousExperience()); stmt.executeUpdate(); - System.out.println("✅ Added application to DB: " + application.getUser().getLegalName() + "s application for" + System.out.println("✅ Added application to DB: " + application.getUser().getLastName() + " " + application.getUser().getLastName() + "'s application for" + application.getPetId() + "ID: " + application.getApplicationId()); } catch (SQLException e) { e.printStackTrace(); From f2ed05cd0742d05deb19e064852354b290d0d9d0 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 19 Nov 2025 08:53:08 -0500 Subject: [PATCH 94/97] Update BrowseFilterPresenter.java --- .../browse_filter/BrowseFilterPresenter.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java b/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java index eb80df14..0a1da669 100644 --- a/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterPresenter.java @@ -17,12 +17,15 @@ public BrowseFilterPresenter(BrowseFilterViewModel vm) { @Override public void present(BrowseFilterOutputData outputData) { - List pets = outputData.getPets(); - - List petStrings = pets.stream() + List petStrings = outputData.getPets().stream() .map(p -> p.getName() + " | " + p.getType() + " | " + p.getBreed() + " | " + p.getGender()) .collect(Collectors.toList()); - viewModel.setPets(petStrings); + // ★ Access the state inside the ViewModel + BrowseFilterState state = viewModel.getState(); + state.setPets(petStrings); + + // ★ Notify the view that P E T S changed + viewModel.firePropertyChange("pets"); } } From 0486d3aa14024aa49df8ecbe3a6f80f9bae8def3 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 19 Nov 2025 08:54:22 -0500 Subject: [PATCH 95/97] Update BrowseFilterViewModel.java --- .../browse_filter/BrowseFilterViewModel.java | 31 ++++++------------- 1 file changed, 9 insertions(+), 22 deletions(-) diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java b/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java index a8ff3ff5..476edf9b 100644 --- a/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterViewModel.java @@ -1,30 +1,17 @@ package interface_adapter.browse_filter; -import entity.Pet; +import interface_adapter.ViewModel; -import java.beans.PropertyChangeListener; -import java.beans.PropertyChangeSupport; -import java.util.List; +public class BrowseFilterViewModel extends ViewModel { -public class BrowseFilterViewModel { - private final PropertyChangeSupport support = new PropertyChangeSupport(this); - private List pets; - - public void setPets(List pets) { - this.pets = pets; - support.firePropertyChange("pets", null, pets); - } - - public List getPets() { - return pets; - } - - public void addPropertyChangeListener(PropertyChangeListener listener) { - support.addPropertyChangeListener(listener); - } + public static final String TITLE_LABEL = "Browse Pets"; + public static final String SPECIES_LABEL = "Species"; + public static final String GENDER_LABEL = "Gender"; + public static final String APPLY_FILTERS_BUTTON_LABEL = "Apply Filters"; public BrowseFilterViewModel() { - super("Browse and Filter"); - setState(new BrowseFilterState); + super("browse filter"); + setState(new BrowseFilterState()); } } + From dd67c9f906f5435364db906c280260f5a7db1216 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 19 Nov 2025 08:55:34 -0500 Subject: [PATCH 96/97] Update BrowseFilterView.java --- src/main/java/view/BrowseFilterView.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/view/BrowseFilterView.java b/src/main/java/view/BrowseFilterView.java index 5bc0ff3b..0c4c8675 100644 --- a/src/main/java/view/BrowseFilterView.java +++ b/src/main/java/view/BrowseFilterView.java @@ -1,6 +1,7 @@ package view; import interface_adapter.browse_filter.BrowseFilterController; +import interface_adapter.browse_filter.BrowseFilterState; import interface_adapter.browse_filter.BrowseFilterViewModel; import javax.swing.*; @@ -81,17 +82,20 @@ public BrowseFilterView(BrowseFilterController controller, BrowseFilterViewModel clearButton.addActionListener(e -> { speciesField.setText(""); genderField.setText(""); - controller.execute("", ""); // reload all +// controller.execute("", ""); // reload all + + BrowseFilterState state = viewModel.getState(); + state.setPets(List.of()); + viewModel.firePropertyChange("pets"); }); setVisible(true); } - // 🔥 Whenever the presenter updates the ViewModel, this gets called @Override public void propertyChange(PropertyChangeEvent evt) { if ("pets".equals(evt.getPropertyName())) { - updateTable(viewModel.getPets()); + updateTable(viewModel.getState().getPets()); } } @@ -108,3 +112,4 @@ private void updateTable(List pets) { } } } + From 13c321ef5f1c607e774963225c9b1ff8ce4f5113 Mon Sep 17 00:00:00 2001 From: hannah-em Date: Wed, 19 Nov 2025 08:57:19 -0500 Subject: [PATCH 97/97] Create BrowseFilterState.java --- .../browse_filter/BrowseFilterState.java | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 src/main/java/interface_adapter/browse_filter/BrowseFilterState.java diff --git a/src/main/java/interface_adapter/browse_filter/BrowseFilterState.java b/src/main/java/interface_adapter/browse_filter/BrowseFilterState.java new file mode 100644 index 00000000..006e1474 --- /dev/null +++ b/src/main/java/interface_adapter/browse_filter/BrowseFilterState.java @@ -0,0 +1,60 @@ +package interface_adapter.browse_filter; + +import java.util.ArrayList; +import java.util.List; + +/** + * The state for the Browse/Filter View Model. + */ +public class BrowseFilterState { + + private String selectedSpecies = ""; + private String selectedGender = ""; + private String speciesError = ""; + private String genderError = ""; + + // The list of pets the UI should display + private List pets = new ArrayList<>(); + + // --- Getters --- + public String getSelectedSpecies() { + return selectedSpecies; + } + + public String getSelectedGender() { + return selectedGender; + } + + public String getSpeciesError() { + return speciesError; + } + + public String getGenderError() { + return genderError; + } + + public List getPets() { + return pets; + } + + // --- Setters --- + public void setSelectedSpecies(String selectedSpecies) { + this.selectedSpecies = selectedSpecies; + } + + public void setSelectedGender(String selectedGender) { + this.selectedGender = selectedGender; + } + + public void setSpeciesError(String speciesError) { + this.speciesError = speciesError; + } + + public void setGenderError(String genderError) { + this.genderError = genderError; + } + + public void setPets(List pets) { + this.pets = pets; + } +}