From 7bb78c4873715d3facc941eb3dacf6b21b9508f1 Mon Sep 17 00:00:00 2001 From: KonklaveTtv Date: Sun, 27 Aug 2023 18:40:11 +0200 Subject: [PATCH] Linear Filtering 95% Done --- config.json | 8 +- src/curl.cpp | 6 + src/filtercriteria.cpp | 329 +++++++++++++++++++++++----------- src/include/filtercriteria.h | 97 +++------- src/include/menu.h | 20 +-- src/include/structs.h | 22 +-- src/main.cpp | 8 +- src/menu.cpp | 45 +---- src/test/mock_config.json | 22 +-- src/test/test_venuesender.cpp | 2 +- 10 files changed, 297 insertions(+), 262 deletions(-) diff --git a/config.json b/config.json index e114aae..640035a 100644 --- a/config.json +++ b/config.json @@ -1,10 +1,10 @@ { - "email_pass_encrypted" : false, + "email_pass_encrypted" : false, // DO NOT CHANGE "email_password" : "enter_email_password", - "sender_email" : "konklavettv@gmail.com", + "sender_email" : "enter_your_sender_email", "smtp_port" : 587, - "smtp_server" : "smtp.gmail.com", - "smtp_username" : "konklavettv@gmail.com", + "smtp_server" : "enter_your_smtp_server", + "smtp_username" : "enter_your_smtp_username", "useSSL" : false, "venues_csv_path" : "venues.csv", "verbose" : false, diff --git a/src/curl.cpp b/src/curl.cpp index 39badf9..593f8df 100644 --- a/src/curl.cpp +++ b/src/curl.cpp @@ -6,6 +6,8 @@ using namespace std; /* CurlHandleWrapper Class Implementation */ /*---------------------------------------*/ + + // Callback function to read data for sending in the request size_t CurlHandleWrapper::readCallback(void* ptr, size_t size, size_t nmemb, void* userp) { auto* payload = static_cast(userp); @@ -123,6 +125,10 @@ CURL* setupCurlHandle(CurlHandleWrapper &curlWrapper, bool useSSL, bool verifyPe // Increase timeout for larger attachments curl_easy_setopt(curl, CURLOPT_TIMEOUT, 60L); + // Set callback function to read data for sending in the request + curl_easy_setopt(curl, CURLOPT_READFUNCTION, CurlHandleWrapper::readCallback); + + // Enable verbose mode for debugging in config.json (if needed) curl_easy_setopt(curl, CURLOPT_VERBOSE, verbose ? 1L : 0L); diff --git a/src/filtercriteria.cpp b/src/filtercriteria.cpp index 6e338a9..5884d00 100644 --- a/src/filtercriteria.cpp +++ b/src/filtercriteria.cpp @@ -3,114 +3,243 @@ // Use the standard namespace using namespace std; -std::vector temporaryFilteredVenues; +// Utility function to convert a Venue object to a SelectedVenue object +SelectedVenue VenueUtilities::convertToSelectedVenue(const Venue& venue) { + // Create a SelectedVenue instance based on Venue data + SelectedVenue selectedVenue; + selectedVenue.name = venue.name; + selectedVenue.email = venue.email; + selectedVenue.country = venue.country; + selectedVenue.state = venue.state; + selectedVenue.city = venue.city; + selectedVenue.capacity = venue.capacity; + selectedVenue.genre = venue.genre; + return selectedVenue; +} -// Function to process venue selection based on user input -void VenueFilter::processVenueSelection(const vector& temporaryFilteredVenues, - vector& selectedVenuesForEmail, - vector& selectedVenuesForTemplates, - istream& input, - ostream& output) { - if (temporaryFilteredVenues.empty()) { - return; +Venue VenueUtilities::convertToVenue(const SelectedVenue& selectedVenue) { + // Create a Venue instance based on SelectedVenue data + Venue venue; + venue.name = selectedVenue.name; + venue.email = selectedVenue.email; + venue.country = selectedVenue.country; + venue.state = selectedVenue.state; + venue.city = selectedVenue.city; + venue.capacity = selectedVenue.capacity; + venue.genre = selectedVenue.genre; + return venue; +} + +// Utility function to get unique countries from a list of venues +std::set VenueUtilities::getUniqueCountries(const std::vector& venues) { + std::set uniqueCountries; + for (const auto& venue : venues) { + if (uniqueCountries.find(venue.country) == uniqueCountries.end()) { + uniqueCountries.insert(venue.country); + } } + return uniqueCountries; +} - ConsoleUtils::setColor(ConsoleUtils::Color::ORANGE); - output << "Select venues to add (comma-separated indices): "; +// Utility function to get unique states from a list of venues +std::set VenueUtilities::getUniqueStates(const std::vector& venues) { + std::set uniqueStates; + for (const auto& venue : venues) { + if (uniqueStates.find(venue.state) == uniqueStates.end()) { + uniqueStates.insert(venue.state); + } + } + return uniqueStates; +} + +// Utility function to get unique cities from a list of venues +std::set VenueUtilities::getUniqueCities(const std::vector& venues) { + std::set uniqueCities; + for (const auto& venue : venues) { + if (uniqueCities.find(venue.city) == uniqueCities.end()) { + uniqueCities.insert(venue.city); + } + } + return uniqueCities; +} + +// Utility function to get unique capacities from a list of venues +std::set VenueUtilities::getUniqueCapacities(const std::vector& venues) { + std::set uniqueCapacities; + for (const Venue& venue : venues) { + uniqueCapacities.insert(venue.capacity); + } + return uniqueCapacities; +} + +// Utility function to get unique genres from a list of venues +std::set VenueUtilities::getUniqueGenres(const std::vector& venues) { + std::set uniqueGenres; + for (const auto& venue : venues) { + if (uniqueGenres.find(venue.genre) == uniqueGenres.end()) { + uniqueGenres.insert(venue.genre); + } + } + return uniqueGenres; +} + +// Utility function to get unique options for a given filterType from a list of venues +std::variant, std::set> VenueUtilities::getUniqueOptions(const std::vector& venues, const std::string& filterType) { + if (filterType == "state") { + return getUniqueStates(venues); + } else if (filterType == "city") { + return getUniqueCities(venues); + } else if (filterType == "capacity") { + return getUniqueCapacities(venues); + } else if (filterType == "genre") { + return getUniqueGenres(venues); + } else { + // Handle invalid filterType + return std::set{}; // or some other default value + } +} + +// Function to process venue selection based on user input +void VenueFilter::processVenueSelection(const std::vector& venues, + istream& input, + ostream& output) { + std::vector filterTypes = {"state", "city", "capacity", "genre"}; + + ConsoleUtils::setColor(ConsoleUtils::Color::CYAN); + output << "===========================" << endl; + output << " Venue Selection " << endl; + output << "===========================" << endl; ConsoleUtils::resetColor(); - string userInput; - getline(input, userInput); - - // Validate input length - if (userInput.length() > MAX_INPUT_LENGTH) { - ErrorHandler::handleErrorAndReturn(ErrorHandler::ErrorType::INPUT_LENGTH_ERROR); - cout << "Press return to continue..." << endl; - ConsoleUtils::clearInputBuffer(); - cin.get(); // This will wait for a key press + + // Get unique countries from the initial list of venues + std::set uniqueCountries = venueUtilities.getUniqueCountries(venues); + output << "Available Countries: "; + size_t index = 1; + for (const auto& country : uniqueCountries) { + output << index++ << ". " << country << " "; + } + output << "\nPlease select a country index: "; + size_t selectedIndex; + input >> selectedIndex; + if (selectedIndex > uniqueCountries.size() || selectedIndex < 1) { + ErrorHandler::handleErrorAndReturn(ErrorHandler::ErrorType::INVALID_INDEX_ERROR); return; } + auto it = uniqueCountries.begin(); + std::advance(it, selectedIndex - 1); + std::string selectedCountry = *it; + + // Filter venues by selected country + for (const auto& venue : venues) { + if (venue.country == selectedCountry) { + temporaryFilteredVenues.push_back(venueUtilities.convertToSelectedVenue(venue)); + } + } + + for (const auto& filterType : filterTypes) { + temporaryFilteredVenuesBuffer.clear(); + + std::vector convertedVenues; + for (const auto& selectedVenue : temporaryFilteredVenues) { + convertedVenues.push_back(venueUtilities.convertToVenue(selectedVenue)); + } + auto uniqueOptionsVariant = venueUtilities.getUniqueOptions(convertedVenues, filterType); + output << "Available " << filterType << "s: " << endl; - istringstream iss(userInput); - string indexStr; - while (getline(iss, indexStr, ',')) { - try { - size_t selectedIndex = stoul(indexStr); - if (selectedIndex == 0) { - ErrorHandler::handleErrorAndReturn(ErrorHandler::ErrorType::INVALID_INDEX_FORMAT_ERROR); - cout << "Press return to continue..." << endl; - ConsoleUtils::clearInputBuffer(); - cin.get(); // This will wait for a key press - continue; + size_t localIndex = 1; // Reset the index for each filter type + std::visit([&](auto&& arg) { + for (const auto& option : arg) { + output << localIndex++ << ". " << option << " "; } - selectedIndex--; // Decrement index to match 0-based indexing - if (selectedIndex < temporaryFilteredVenues.size()) { - const SelectedVenue& selectedVenue = temporaryFilteredVenues[selectedIndex]; - - // Check if the selected venue is already in the selectedVenuesForEmail vector - bool isDuplicate = false; - for (const SelectedVenue& existingVenue : selectedVenuesForEmail) { - if (existingVenue.name == selectedVenue.name && existingVenue.email == selectedVenue.email) { - isDuplicate = true; - break; + }, uniqueOptionsVariant); + + output << "\nPlease type 'all' to select all, or select " << filterType << " indices (comma-separated): "; + input.ignore(); + std::string inputIndices; + std::getline(input, inputIndices); + std::transform(inputIndices.begin(), inputIndices.end(), inputIndices.begin(), ::tolower); + + std::vector selectedIndices; + size_t maxIndex = localIndex - 1; // maximum number of options available + + if (inputIndices != "all") { + std::istringstream iss(inputIndices); + std::string indexStr; + + while (std::getline(iss, indexStr, ',')) { + try { + size_t selectedIndex = std::stoul(indexStr); + if (selectedIndex < 1 || selectedIndex > maxIndex) { + ErrorHandler::handleErrorAndReturn(ErrorHandler::ErrorType::INVALID_INDEX_ERROR); + return; } + selectedIndices.push_back(selectedIndex); + } catch (const std::exception& e) { + ErrorHandler::handleErrorAndReturn(ErrorHandler::ErrorType::INVALID_INDEX_FORMAT_ERROR); + return; } - - if (!isDuplicate) { - selectedVenuesForEmail.push_back(selectedVenue); - selectedVenuesForTemplates.push_back(selectedVenue); // Add to selectedVenuesForTemplates - } else { - ErrorHandler::handleErrorAndReturn(ErrorHandler::ErrorType::VENUE_ALREADY_SELECTED_ERROR); - cout << "Press return to continue..." << endl; - ConsoleUtils::clearInputBuffer(); - cin.get(); // This will wait for a key press - } - } else { - ErrorHandler::handleErrorAndReturn(ErrorHandler::ErrorType::INVALID_INDEX_FORMAT_ERROR); - cout << "Press return to continue..." << endl; - ConsoleUtils::clearInputBuffer(); - cin.get(); // This will wait for a key press - continue; } - } catch (const invalid_argument& e) { - ErrorHandler::handleErrorAndReturn(ErrorHandler::ErrorType::INVALID_INPUT_ERROR); - cout << "Press return to continue..." << endl; - ConsoleUtils::clearInputBuffer(); - cin.get(); // This will wait for a key press - continue; } - } - ConsoleUtils::setColor(ConsoleUtils::Color::GREEN); - cout << "Venue Added"; - ConsoleUtils::resetColor(); - // Add a newline to separate the filtered venues from the main menu - output << endl; -} + for (size_t selectedIndex : selectedIndices) { + std::visit([&](auto&& arg) { + using T = std::decay_t; + auto it = arg.begin(); + std::advance(it, selectedIndex - 1); // "-1" because we started from 1 + + if constexpr (std::is_same_v>) { + for (const auto& venue : temporaryFilteredVenues) { + if ((filterType == "state" && venue.state == *it) || + (filterType == "city" && venue.city == *it) || + (filterType == "genre" && venue.genre == *it)) { + temporaryFilteredVenuesBuffer.push_back(venue); + } + } + } else if constexpr (std::is_same_v>) { + for (const auto& venue : temporaryFilteredVenues) { + if (filterType == "capacity" && venue.capacity == *it) { + temporaryFilteredVenuesBuffer.push_back(venue); + } + } + } + }, uniqueOptionsVariant); + } -// Function to display filtered venues to the user -void VenueFilter::displayFilteredVenues(const vector& selectedVenuesForDisplay) { - if (selectedVenuesForDisplay.empty()) { - ConsoleUtils::setColor(ConsoleUtils::Color::RED); - cout << "No venues found." << endl; - ConsoleUtils::resetColor(); - return; + if (inputIndices == "all" || std::find(selectedIndices.begin(), selectedIndices.end(), 1) != selectedIndices.end()) { + temporaryFilteredVenuesBuffer = temporaryFilteredVenues; + } + + temporaryFilteredVenues = temporaryFilteredVenuesBuffer; } - ConsoleUtils::setColor(ConsoleUtils::Color::CYAN); - cout << "==========================="<< endl; - cout << " Filtered Venues " << endl; - cout << "==========================="<< endl; - ConsoleUtils::resetColor(); - for (size_t i = 0; i < selectedVenuesForDisplay.size(); ++i) { - const auto& venue = selectedVenuesForDisplay[i]; - cout << setw(2) << i + 1 << ". Name: " << venue.name << endl; - cout << " Email: " << venue.email << endl; - cout << " Genre: " << venue.genre << endl; - cout << " Country: " << venue.country << endl; - cout << " Capacity: " << venue.capacity << endl; - cout << " State: " << venue.state << endl; - cout << " City: " << venue.city << endl; - cout << endl; + output << "--------- Final Venue Selection ---------\n"; + index = 1; + for (const auto& venue : temporaryFilteredVenues) { + output << index++ << ". " << venue.name << '\n'; + } + output << "Please select the final venue indices (comma-separated): "; + std::string finalIndices; + input >> finalIndices; + std::istringstream iss(finalIndices); + std::string indexStr; + std::vector finalSelectedIndices; + while (std::getline(iss, indexStr, ',')) { + try { + size_t finalIndex = std::stoul(indexStr); + finalSelectedIndices.push_back(finalIndex); + } catch (const std::exception& e) { + ErrorHandler::handleErrorAndReturn(ErrorHandler::ErrorType::INVALID_INDEX_FORMAT_ERROR); + return; + } + } + + for (size_t finalIndex : finalSelectedIndices) { + if (finalIndex < 1 || finalIndex > temporaryFilteredVenues.size()) { + ErrorHandler::handleErrorAndReturn(ErrorHandler::ErrorType::INVALID_INDEX_ERROR); + return; + } + selectedVenuesForEmail.push_back(temporaryFilteredVenues[finalIndex - 1]); + selectedVenuesForTemplates.push_back(temporaryFilteredVenues[finalIndex - 1]); } } @@ -163,23 +292,23 @@ vector VenueFilter::filterByOptionCommon(const vector& ven for (const Venue& venue : venues) { string venueValue; - if (filterType == "Genre") { - venueValue = venue.genre; - } else if (filterType == "Countries") { + if (filterType == "Countries") { venueValue = venue.country; } else if (filterType == "State") { venueValue = venue.state; } else if (filterType == "City") { venueValue = venue.city; + } else if (filterType == "Genre") { + venueValue = venue.genre; } - if ((filterType == "Genre" && venue.genre == filterValue) || - (filterType == "Countries" && venue.country == filterValue) || + if ((filterType == "Countries" && venue.country == filterValue) || (filterType == "State" && venue.state == filterValue) || - (filterType == "City" && venue.city == filterValue)) { + (filterType == "City" && venue.city == filterValue) || + (filterType == "Genre" && venue.genre == filterValue)) { - SelectedVenue selectedVenue = VenueUtilities::convertToSelectedVenue(venue); + SelectedVenue selectedVenue = venueUtilities.convertToSelectedVenue(venue); temporaryFilteredVenues.push_back(selectedVenue); } } @@ -249,7 +378,7 @@ vector VenueFilter::filterByCapacity(const vector& venues, int filterValue = filterOptions[selectedIndex]; for (const Venue& venue : venues) { if (venue.capacity == filterValue) { - SelectedVenue selectedVenue = VenueUtilities::convertToSelectedVenue(venue); + SelectedVenue selectedVenue = venueUtilities.convertToSelectedVenue(venue); temporaryFilteredVenues.push_back(selectedVenue); } } diff --git a/src/include/filtercriteria.h b/src/include/filtercriteria.h index 549af3a..d164977 100644 --- a/src/include/filtercriteria.h +++ b/src/include/filtercriteria.h @@ -7,88 +7,44 @@ #include #include #include +#include #include -extern std::vector temporaryFilteredVenues; - // Structure to hold filter criteria for venues struct FilterCriteria { - std::string genre; std::string country; - int capacity; std::string state; std::string city; + int capacity; + std::string genre; }; // Utility class to perform common venue-related operations class VenueUtilities { public: // Utility function to convert a Venue object to a SelectedVenue object - inline static SelectedVenue convertToSelectedVenue(const Venue& venue) { - // Create a SelectedVenue instance based on Venue data - SelectedVenue selectedVenue; - selectedVenue.name = venue.name; - selectedVenue.email = venue.email; - selectedVenue.genre = venue.genre; - selectedVenue.country = venue.country; - selectedVenue.capacity = venue.capacity; - selectedVenue.state = venue.state; - selectedVenue.city = venue.city; - return selectedVenue; - } - - // Utility function to get unique genres from a list of venues - inline std::set getUniqueGenres(const std::vector& venues) { - std::set uniqueGenres; - for (const auto& venue : venues) { - if (uniqueGenres.find(venue.genre) == uniqueGenres.end()) { - uniqueGenres.insert(venue.genre); - } - } - return uniqueGenres; - } + SelectedVenue convertToSelectedVenue(const Venue& venue); + + // Utility function to convert a SelectedVenue object to a Venue object + Venue convertToVenue(const SelectedVenue& selectedVenue); // Utility function to get unique countries from a list of venues - inline std::set getUniqueCountries(const std::vector& venues) { - std::set uniqueCountries; - for (const auto& venue : venues) { - if (uniqueCountries.find(venue.country) == uniqueCountries.end()) { - uniqueCountries.insert(venue.country); - } - } - return uniqueCountries; - } - - // Utility function to get unique capacities from a list of venues - inline std::set getUniqueCapacities(const std::vector& venues) { - std::set uniqueCapacities; - for (const Venue& venue : venues) { - uniqueCapacities.insert(venue.capacity); - } - return uniqueCapacities; - } + std::set getUniqueCountries(const std::vector& venues); // Utility function to get unique states from a list of venues - inline std::set getUniqueStates(const std::vector& venues) { - std::set uniqueStates; - for (const auto& venue : venues) { - if (uniqueStates.find(venue.state) == uniqueStates.end()) { - uniqueStates.insert(venue.state); - } - } - return uniqueStates; - } + std::set getUniqueStates(const std::vector& venues); // Utility function to get unique cities from a list of venues - inline std::set getUniqueCities(const std::vector& venues) { - std::set uniqueCities; - for (const auto& venue : venues) { - if (uniqueCities.find(venue.city) == uniqueCities.end()) { - uniqueCities.insert(venue.city); - } - } - return uniqueCities; - } + std::set getUniqueCities(const std::vector& venues); + + // Utility function to get unique capacities from a list of venues + std::set getUniqueCapacities(const std::vector& venues); + + // Utility function to get unique genres from a list of venues + std::set getUniqueGenres(const std::vector& venues); + + // Utility function to get unique options for a given filterType from a list of venues + std::variant, std::set> getUniqueOptions(const std::vector& venues, const std::string& filterType); }; // Class to handle venue filtering logic @@ -100,8 +56,12 @@ class VenueFilter { // Delimiter used in CSV files static constexpr char CSV_DELIMITER = ','; // Delimiter used in CSV files + VenueUtilities venueUtilities; + std::vector selectedVenuesForEmail; + std::vector selectedVenuesForTemplates; std::vector temporaryFilteredVenues; + std::vector temporaryFilteredVenuesBuffer; std::set uniqueOptions; std::string filterType; @@ -109,14 +69,9 @@ class VenueFilter { public: // Function to process user input and select venues based on it - static void processVenueSelection(const std::vector& temporaryFilteredVenues, - std::vector& selectedVenuesForEmail, - std::vector& selectedVenuesForTemplates, - std::istream& input = std::cin, - std::ostream& output = std::cout) ; - - // Function to display the filtered venues to the user - static void displayFilteredVenues(const std::vector& selectedVenuesForDisplay); + void processVenueSelection(const std::vector& venues, + std::istream& input = std::cin, + std::ostream& output = std::cout); // Common function to handle venue filtering by options like Genre, State, City std::vector filterByOptionCommon(const std::vector& venues, diff --git a/src/include/menu.h b/src/include/menu.h index c12b9a4..7fdf676 100644 --- a/src/include/menu.h +++ b/src/include/menu.h @@ -35,11 +35,7 @@ class MenuManager { }; enum class VenueSelectionOption { - FilterByGenre = 1, - FilterByCountry, - FilterByCapacity, - FilterByState, - FilterByCity, + SelectVenues = 1, ReturnToMainMenu }; @@ -66,11 +62,7 @@ class MenuManager { }; // Constants for Venue Filtering sub-menu options - static constexpr int FILTER_BY_GENRE_OPTION = static_cast(VenueSelectionOption::FilterByGenre); - static constexpr int FILTER_BY_COUNTRY_OPTION = static_cast(VenueSelectionOption::FilterByCountry); - static constexpr int FILTER_BY_CAPACITY_OPTION = static_cast(VenueSelectionOption::FilterByCapacity); - static constexpr int FILTER_BY_STATE_OPTION = static_cast(VenueSelectionOption::FilterByState); - static constexpr int FILTER_BY_CITY_OPTION = static_cast(VenueSelectionOption::FilterByCity); + static constexpr int SELECT_VENUES_OPTION = static_cast(VenueSelectionOption::SelectVenues); static constexpr int RETURN_TO_MAIN_MENU_FROM_VENUE_SELECTION = static_cast(VenueSelectionOption::ReturnToMainMenu); // Constants for Venue Options sub-menu options @@ -111,12 +103,6 @@ class MenuManager { std::vector& venues, std::vector& selectedVenuesForTemplates, std::vector& selectedVenuesForEmail, - std::set& uniqueGenres, - std::set& uniqueCountries, - std::set& uniqueCapacities, - std::set& uniqueStates, - std::set& uniqueCities, - std::vector& temporaryFilteredVenues, std::map>& emailToTemplate, std::string& subject, std::string& message, @@ -152,7 +138,7 @@ class MenuManager { #ifdef UNIT_TESTING // Function to validate if the user's choice is a valid menu option static inline bool isValidMenuChoice(int choice) { - return choice >= FILTER_BY_GENRE_OPTION && choice <= EXIT_OPTION; + return choice >= SELECT_VENUES_OPTION && choice <= EXIT_OPTION; } #endif }; diff --git a/src/include/structs.h b/src/include/structs.h index fa26b5f..ea0ae22 100644 --- a/src/include/structs.h +++ b/src/include/structs.h @@ -8,19 +8,19 @@ struct Venue { std::string name; std::string email; - std::string genre; std::string country; - int capacity = 0; std::string state; std::string city; + int capacity = 0; + std::string genre; // Default constructor to allow for uninitialized Venue objects Venue() = default; // Parameterized constructor to initialize all members of the struct - Venue(const std::string& name, const std::string& email, const std::string& genre, - const std::string& country, int capacity, const std::string& state, const std::string& city) - : name(name), email(email), genre(genre), country(country), capacity(capacity), state(state), city(city) {} + Venue(const std::string& name, const std::string& email, const std::string& country, + const std::string& state, const std::string& city, int capacity, const std::string& genre) + : name(name), email(email), country(country), state(state), city(city), capacity(capacity), genre(genre) {} }; @@ -28,18 +28,18 @@ struct Venue { struct SelectedVenue { std::string name; std::string email; - std::string genre; std::string country; - int capacity = 0; std::string state; - std::string city; + std::string city; + int capacity = 0; + std::string genre; // Default constructor to allow for uninitialized SelectedVenue objects SelectedVenue() = default; // Parameterized constructor to initialize all members of the struct - SelectedVenue(const std::string& name, const std::string& email, const std::string& genre, - const std::string& country, int capacity, const std::string& state, const std::string& city) - : name(name), email(email), genre(genre), country(country), capacity(capacity), state(state), city(city) {} + SelectedVenue(const std::string& name, const std::string& email, const std::string& country, + const std::string& state, const std::string& city, int capacity, const std::string& genre) + : name(name), email(email), country(country), state(state), city(city), capacity(capacity), genre(genre) {} }; #endif // STRUCTS_H \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index df1f647..7b84a1f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -59,6 +59,8 @@ int main() { FilterCriteria criteria; vector selectedVenuesForEmail; vector filteredVenues; + vector temporaryFilteredVenues; + vector temporaryFilteredVenuesBuffer; // Initialize map for booking templates map> emailToTemplate; @@ -75,12 +77,6 @@ int main() { venues, selectedVenuesForTemplates, selectedVenuesForEmail, - uniqueGenres, - uniqueCountries, - uniqueCapacities, - uniqueStates, - uniqueCities, - temporaryFilteredVenues, emailToTemplate, subject, message, diff --git a/src/menu.cpp b/src/menu.cpp index d117ec7..24ac08d 100644 --- a/src/menu.cpp +++ b/src/menu.cpp @@ -9,12 +9,6 @@ void MenuManager::navigateMenus(EmailManager& emailManager, vector& venues, vector& selectedVenuesForTemplates, vector& selectedVenuesForEmail, - set& uniqueGenres, - set& uniqueCountries, - set& uniqueCapacities, - set& uniqueStates, - set& uniqueCities, - vector& temporaryFilteredVenues, map>& emailToTemplate, string& subject, string& message, @@ -41,35 +35,8 @@ void MenuManager::navigateMenus(EmailManager& emailManager, int subChoice = displayVenueSelectionOptions(); switch (subChoice) { - case FILTER_BY_GENRE_OPTION: - venueFilter.filterByOption(venues, "Genre", uniqueGenres, temporaryFilteredVenues); - VenueFilter::displayFilteredVenues(temporaryFilteredVenues); // Display filtered venues - VenueFilter::processVenueSelection(temporaryFilteredVenues, selectedVenuesForEmail, selectedVenuesForTemplates, cin, cout); // Select venues - temporaryFilteredVenues.clear(); // Clear the temporary filtered list - break; - case FILTER_BY_COUNTRY_OPTION: - venueFilter.filterByOption(venues, "Countries", uniqueCountries, temporaryFilteredVenues); - VenueFilter::displayFilteredVenues(temporaryFilteredVenues); // Display filtered venues - VenueFilter::processVenueSelection(temporaryFilteredVenues, selectedVenuesForEmail, selectedVenuesForTemplates, cin, cout); // Select venues - temporaryFilteredVenues.clear(); // Clear the temporary filtered list - break; - case FILTER_BY_CAPACITY_OPTION: - venueFilter.filterByCapacity(venues, uniqueCapacities, temporaryFilteredVenues); - VenueFilter::displayFilteredVenues(temporaryFilteredVenues); // Display filtered venues - VenueFilter::processVenueSelection(temporaryFilteredVenues, selectedVenuesForEmail, selectedVenuesForTemplates, cin, cout); // Select venues - temporaryFilteredVenues.clear(); // Clear the temporary filtered list - break; - case FILTER_BY_STATE_OPTION: - venueFilter.filterByOption(venues, "State", uniqueStates, temporaryFilteredVenues); - VenueFilter::displayFilteredVenues(temporaryFilteredVenues); // Display filtered venues - VenueFilter::processVenueSelection(temporaryFilteredVenues, selectedVenuesForEmail, selectedVenuesForTemplates, cin, cout); // Select venues - temporaryFilteredVenues.clear(); // Clear the temporary filtered list - break; - case FILTER_BY_CITY_OPTION: - venueFilter.filterByOption(venues, "City", uniqueCities, temporaryFilteredVenues); - VenueFilter::displayFilteredVenues(temporaryFilteredVenues); // Display filtered venues - VenueFilter::processVenueSelection(temporaryFilteredVenues, selectedVenuesForEmail, selectedVenuesForTemplates, cin, cout); // Select venues - temporaryFilteredVenues.clear(); // Clear the temporary filtered list + case SELECT_VENUES_OPTION: + venueFilter.processVenueSelection(venues, cin, cout); break; case RETURN_TO_MAIN_MENU_FROM_VENUE_SELECTION: // Logic to return to the main menu @@ -237,11 +204,7 @@ int MenuManager::displayVenueSelectionOptions() { #ifndef UNIT_TESTING ConsoleUtils::resetColor(); // Reset to default color #endif - cout << FILTER_BY_GENRE_OPTION << ". Filter by Genre" << endl; - cout << FILTER_BY_COUNTRY_OPTION << ". Filter by Country" << endl; - cout << FILTER_BY_CAPACITY_OPTION << ". Filter by Capacity" << endl; - cout << FILTER_BY_STATE_OPTION << ". Filter by State" << endl; - cout << FILTER_BY_CITY_OPTION << ". Filter by City" << endl; + cout << SELECT_VENUES_OPTION << ". Select Venues" << endl; cout << RETURN_TO_MAIN_MENU_FROM_VENUE_SELECTION << ". Return to Main Menu" << endl; #ifndef UNIT_TESTING ConsoleUtils::setColor(ConsoleUtils::Color::ORANGE); // Blue for headers @@ -251,7 +214,7 @@ int MenuManager::displayVenueSelectionOptions() { #ifndef UNIT_TESTING ConsoleUtils::resetColor(); // Reset to default color #endif - if (choice >= FILTER_BY_GENRE_OPTION && choice <= RETURN_TO_MAIN_MENU_FROM_VENUE_SELECTION) { + if (choice >= SELECT_VENUES_OPTION && choice <= RETURN_TO_MAIN_MENU_FROM_VENUE_SELECTION) { break; } else { ErrorHandler::handleErrorAndReturn(ErrorHandler::ErrorType::INVALID_CHOICE_ERROR); diff --git a/src/test/mock_config.json b/src/test/mock_config.json index 3fdf655..640035a 100644 --- a/src/test/mock_config.json +++ b/src/test/mock_config.json @@ -1,13 +1,13 @@ { - "mock_email_pass_encrypted" : false, - "mock_email_password" : "mock_email_password", - "mock_sender_email" : "mock@example.com", - "mock_smtp_port" : 587, - "mock_smtp_server" : "mock_smtp_server", - "mock_smtp_username" : "mock_smtp_username", - "mock_venues_csv_path" : "mock_venues.csv", - "useSSL" : true, - "verbose" : true, - "verifyHost" : true, - "verifyPeer" : true + "email_pass_encrypted" : false, // DO NOT CHANGE + "email_password" : "enter_email_password", + "sender_email" : "enter_your_sender_email", + "smtp_port" : 587, + "smtp_server" : "enter_your_smtp_server", + "smtp_username" : "enter_your_smtp_username", + "useSSL" : false, + "venues_csv_path" : "venues.csv", + "verbose" : false, + "verifyHost" : false, + "verifyPeer" : false } \ No newline at end of file diff --git a/src/test/test_venuesender.cpp b/src/test/test_venuesender.cpp index 50b868a..c6e3bfa 100644 --- a/src/test/test_venuesender.cpp +++ b/src/test/test_venuesender.cpp @@ -346,7 +346,7 @@ TEST_CASE("VenueFilter::processVenueSelection() functionality", "[VenueFilter]") VenueFilter venueFilter; // Call the function - venueFilter.processVenueSelection(temporaryFilteredVenues, selectedVenuesForEmail, selectedVenuesForTemplates, mockInput, mockOutput); + venueFilter.processVenueSelection(temporaryFilteredVenues, temporaryFilteredVenuesBuffer, cin, cout); // Check results for emails REQUIRE(selectedVenuesForEmail.size() == 2);