Skip to content

Commit

Permalink
Linear Filtering 95% Done
Browse files Browse the repository at this point in the history
  • Loading branch information
KonklaveTtv committed Aug 28, 2023
1 parent 1153a15 commit 7bb78c4
Show file tree
Hide file tree
Showing 10 changed files with 297 additions and 262 deletions.
8 changes: 4 additions & 4 deletions config.json
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
6 changes: 6 additions & 0 deletions src/curl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<string*>(userp);
Expand Down Expand Up @@ -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);

Expand Down
329 changes: 229 additions & 100 deletions src/filtercriteria.cpp

Large diffs are not rendered by default.

97 changes: 26 additions & 71 deletions src/include/filtercriteria.h
Original file line number Diff line number Diff line change
Expand Up @@ -7,88 +7,44 @@
#include <iomanip>
#include <iostream>
#include <set>
#include <variant>
#include <vector>

extern std::vector<SelectedVenue> 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<std::string> getUniqueGenres(const std::vector<Venue>& venues) {
std::set<std::string> 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<std::string> getUniqueCountries(const std::vector<Venue>& venues) {
std::set<std::string> 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<int> getUniqueCapacities(const std::vector<Venue>& venues) {
std::set<int> uniqueCapacities;
for (const Venue& venue : venues) {
uniqueCapacities.insert(venue.capacity);
}
return uniqueCapacities;
}
std::set<std::string> getUniqueCountries(const std::vector<Venue>& venues);

// Utility function to get unique states from a list of venues
inline std::set<std::string> getUniqueStates(const std::vector<Venue>& venues) {
std::set<std::string> uniqueStates;
for (const auto& venue : venues) {
if (uniqueStates.find(venue.state) == uniqueStates.end()) {
uniqueStates.insert(venue.state);
}
}
return uniqueStates;
}
std::set<std::string> getUniqueStates(const std::vector<Venue>& venues);

// Utility function to get unique cities from a list of venues
inline std::set<std::string> getUniqueCities(const std::vector<Venue>& venues) {
std::set<std::string> uniqueCities;
for (const auto& venue : venues) {
if (uniqueCities.find(venue.city) == uniqueCities.end()) {
uniqueCities.insert(venue.city);
}
}
return uniqueCities;
}
std::set<std::string> getUniqueCities(const std::vector<Venue>& venues);

// Utility function to get unique capacities from a list of venues
std::set<int> getUniqueCapacities(const std::vector<Venue>& venues);

// Utility function to get unique genres from a list of venues
std::set<std::string> getUniqueGenres(const std::vector<Venue>& venues);

// Utility function to get unique options for a given filterType from a list of venues
std::variant<std::set<std::string>, std::set<int>> getUniqueOptions(const std::vector<Venue>& venues, const std::string& filterType);
};

// Class to handle venue filtering logic
Expand All @@ -100,23 +56,22 @@ class VenueFilter {
// Delimiter used in CSV files
static constexpr char CSV_DELIMITER = ','; // Delimiter used in CSV files

VenueUtilities venueUtilities;

std::vector<SelectedVenue> selectedVenuesForEmail;
std::vector<SelectedVenue> selectedVenuesForTemplates;
std::vector<SelectedVenue> temporaryFilteredVenues;
std::vector<SelectedVenue> temporaryFilteredVenuesBuffer;

std::set<std::string> uniqueOptions;
std::string filterType;

public:

// Function to process user input and select venues based on it
static void processVenueSelection(const std::vector<SelectedVenue>& temporaryFilteredVenues,
std::vector<SelectedVenue>& selectedVenuesForEmail,
std::vector<SelectedVenue>& 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<SelectedVenue>& selectedVenuesForDisplay);
void processVenueSelection(const std::vector<Venue>& 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<SelectedVenue> filterByOptionCommon(const std::vector<Venue>& venues,
Expand Down
20 changes: 3 additions & 17 deletions src/include/menu.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,7 @@ class MenuManager {
};

enum class VenueSelectionOption {
FilterByGenre = 1,
FilterByCountry,
FilterByCapacity,
FilterByState,
FilterByCity,
SelectVenues = 1,
ReturnToMainMenu
};

Expand All @@ -66,11 +62,7 @@ class MenuManager {
};

// Constants for Venue Filtering sub-menu options
static constexpr int FILTER_BY_GENRE_OPTION = static_cast<int>(VenueSelectionOption::FilterByGenre);
static constexpr int FILTER_BY_COUNTRY_OPTION = static_cast<int>(VenueSelectionOption::FilterByCountry);
static constexpr int FILTER_BY_CAPACITY_OPTION = static_cast<int>(VenueSelectionOption::FilterByCapacity);
static constexpr int FILTER_BY_STATE_OPTION = static_cast<int>(VenueSelectionOption::FilterByState);
static constexpr int FILTER_BY_CITY_OPTION = static_cast<int>(VenueSelectionOption::FilterByCity);
static constexpr int SELECT_VENUES_OPTION = static_cast<int>(VenueSelectionOption::SelectVenues);
static constexpr int RETURN_TO_MAIN_MENU_FROM_VENUE_SELECTION = static_cast<int>(VenueSelectionOption::ReturnToMainMenu);

// Constants for Venue Options sub-menu options
Expand Down Expand Up @@ -111,12 +103,6 @@ class MenuManager {
std::vector<Venue>& venues,
std::vector<SelectedVenue>& selectedVenuesForTemplates,
std::vector<SelectedVenue>& selectedVenuesForEmail,
std::set<std::string>& uniqueGenres,
std::set<std::string>& uniqueCountries,
std::set<int>& uniqueCapacities,
std::set<std::string>& uniqueStates,
std::set<std::string>& uniqueCities,
std::vector<SelectedVenue>& temporaryFilteredVenues,
std::map<std::string, std::pair<std::string, std::string>>& emailToTemplate,
std::string& subject,
std::string& message,
Expand Down Expand Up @@ -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
};
Expand Down
22 changes: 11 additions & 11 deletions src/include/structs.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,38 +8,38 @@
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) {}
};


// Structure to represent a venue selected for email sending
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
8 changes: 2 additions & 6 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,8 @@ int main() {
FilterCriteria criteria;
vector<SelectedVenue> selectedVenuesForEmail;
vector<SelectedVenue> filteredVenues;
vector<SelectedVenue> temporaryFilteredVenues;
vector<SelectedVenue> temporaryFilteredVenuesBuffer;

// Initialize map for booking templates
map<string, pair<string, string>> emailToTemplate;
Expand All @@ -75,12 +77,6 @@ int main() {
venues,
selectedVenuesForTemplates,
selectedVenuesForEmail,
uniqueGenres,
uniqueCountries,
uniqueCapacities,
uniqueStates,
uniqueCities,
temporaryFilteredVenues,
emailToTemplate,
subject,
message,
Expand Down
45 changes: 4 additions & 41 deletions src/menu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,6 @@ void MenuManager::navigateMenus(EmailManager& emailManager,
vector<Venue>& venues,
vector<SelectedVenue>& selectedVenuesForTemplates,
vector<SelectedVenue>& selectedVenuesForEmail,
set<string>& uniqueGenres,
set<string>& uniqueCountries,
set<int>& uniqueCapacities,
set<string>& uniqueStates,
set<string>& uniqueCities,
vector<SelectedVenue>& temporaryFilteredVenues,
map<string, pair<string, string>>& emailToTemplate,
string& subject,
string& message,
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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);
Expand Down
22 changes: 11 additions & 11 deletions src/test/mock_config.json
Original file line number Diff line number Diff line change
@@ -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
}
Loading

0 comments on commit 7bb78c4

Please sign in to comment.