refactor: Modularize load and persist states methods and minor code refactoring

- Modularize loadStates()
- Modularize persistStates()
- Do not convert size_t to int in isEmailValid()
- Make non state mutating functions const
- Make isPhoneNumberValid and isEmailValid static
This commit is contained in:
Joel Thomas
2026-02-25 09:39:35 +05:30
parent 766737dbcc
commit 4f977faf8b
2 changed files with 68 additions and 19 deletions
@@ -237,7 +237,7 @@ static deliveryAssignments::iterator selectDeliveryAssignmentFromList(deliveryAs
} }
bool isPhoneNumberValid(const std::string& phoneNumber) { static bool isPhoneNumberValid(const std::string& phoneNumber) {
if (phoneNumber.size() != 10) if (phoneNumber.size() != 10)
{ {
return false; return false;
@@ -250,8 +250,8 @@ bool isPhoneNumberValid(const std::string& phoneNumber) {
); );
} }
bool isEmailValid(const std::string& email) { static bool isEmailValid(const std::string& email) {
int index = email.find('@'); size_t index = email.find('@');
if (index == std::string::npos) return false; if (index == std::string::npos) return false;
if (email.find('@', index + 1) != std::string::npos) if (email.find('@', index + 1) != std::string::npos)
{ {
@@ -264,17 +264,17 @@ bool isEmailValid(const std::string& email) {
return true; return true;
} }
void FoodDeliveryController::loadStates() void FoodDeliveryController::loadUsers()
{ {
FileDatabase<User> userDatabase(USERS_FILE); FileDatabase<User> userDatabase(USERS_FILE);
m_users = userDatabase.load();
}
void FoodDeliveryController::loadRestaurants(objects<MenuItem>& menuItems)
{
FileDatabase<Restaurant> restaurantDatabase(RESTAURANTS_FILE); FileDatabase<Restaurant> restaurantDatabase(RESTAURANTS_FILE);
FileDatabase<MenuItem> menuItemDatabase(MENU_ITEMS_FILE); FileDatabase<MenuItem> menuItemDatabase(MENU_ITEMS_FILE);
FileDatabase<Order> orderDatabase(ORDERS_FILE);
FileDatabase<Item> itemDatabase(ITEMS_FILE);
FileDatabase<DeliveryAssignment> deliveryAssignmentsDatabase(DELIVERY_ASSIGNMENTS_FILE);
objects<MenuItem> menuItems;
objects<Item> items;
m_users = userDatabase.load();
m_restaurants = restaurantDatabase.load(); m_restaurants = restaurantDatabase.load();
for (const auto& restaurantPair : m_restaurants) for (const auto& restaurantPair : m_restaurants)
{ {
@@ -303,6 +303,13 @@ void FoodDeliveryController::loadStates()
throw std::runtime_error("MenuItem has invalid Restaurant ID"); throw std::runtime_error("MenuItem has invalid Restaurant ID");
} }
} }
}
void FoodDeliveryController::loadOrders(objects<MenuItem>& menuItems)
{
FileDatabase<Order> orderDatabase(ORDERS_FILE);
FileDatabase<Item> itemDatabase(ITEMS_FILE);
objects<Item> items = itemDatabase.load();
m_orders = orderDatabase.load(); m_orders = orderDatabase.load();
for (auto& orderPair : m_orders) for (auto& orderPair : m_orders)
{ {
@@ -326,7 +333,6 @@ void FoodDeliveryController::loadStates()
} }
restaurantIterator->second->addOrder(orderPair.second); restaurantIterator->second->addOrder(orderPair.second);
} }
items = itemDatabase.load();
for (auto& itemPair : items) for (auto& itemPair : items)
{ {
int itemId = itemPair.second->getMenuItemId(); int itemId = itemPair.second->getMenuItemId();
@@ -350,6 +356,11 @@ void FoodDeliveryController::loadStates()
throw std::runtime_error("Item has invalid Order ID"); throw std::runtime_error("Item has invalid Order ID");
} }
} }
}
void FoodDeliveryController::loadDeliveryAssignments()
{
FileDatabase<DeliveryAssignment> deliveryAssignmentsDatabase(DELIVERY_ASSIGNMENTS_FILE);
m_assignments = deliveryAssignmentsDatabase.load(); m_assignments = deliveryAssignmentsDatabase.load();
for (auto& assignmentPair : m_assignments) for (auto& assignmentPair : m_assignments)
{ {
@@ -381,18 +392,27 @@ void FoodDeliveryController::loadStates()
} }
} }
void FoodDeliveryController::persistStates() void FoodDeliveryController::loadStates()
{
loadUsers();
objects<MenuItem> menuItems;
loadRestaurants(menuItems);
loadOrders(menuItems);
loadDeliveryAssignments();
}
void FoodDeliveryController::persistUsers() const
{ {
FileDatabase<User> userDatabase(USERS_FILE); FileDatabase<User> userDatabase(USERS_FILE);
userDatabase.save(m_users);
}
void FoodDeliveryController::persistRestaurants() const
{
FileDatabase<Restaurant> restaurantDatabase(RESTAURANTS_FILE); FileDatabase<Restaurant> restaurantDatabase(RESTAURANTS_FILE);
FileDatabase<MenuItem> menuItemDatabase(MENU_ITEMS_FILE); FileDatabase<MenuItem> menuItemDatabase(MENU_ITEMS_FILE);
FileDatabase<Order> orderDatabase(ORDERS_FILE);
FileDatabase<Item> itemDatabase(ITEMS_FILE);
FileDatabase<DeliveryAssignment> deliveryAssignmentsDatabase(DELIVERY_ASSIGNMENTS_FILE);
userDatabase.save(m_users);
restaurantDatabase.save(m_restaurants);
objects<MenuItem> allMenuItems; objects<MenuItem> allMenuItems;
objects<Item> allItems; restaurantDatabase.save(m_restaurants);
for (const auto& restaurantPair : m_restaurants) for (const auto& restaurantPair : m_restaurants)
{ {
for (const auto& menuItemPair : restaurantPair.second->getMenuItems()) for (const auto& menuItemPair : restaurantPair.second->getMenuItems())
@@ -401,6 +421,13 @@ void FoodDeliveryController::persistStates()
} }
} }
menuItemDatabase.save(allMenuItems); menuItemDatabase.save(allMenuItems);
}
void FoodDeliveryController::persistOrders() const
{
FileDatabase<Order> orderDatabase(ORDERS_FILE);
FileDatabase<Item> itemDatabase(ITEMS_FILE);
objects<Item> allItems;
orderDatabase.save(m_orders); orderDatabase.save(m_orders);
for (const auto& orderPair : m_orders) for (const auto& orderPair : m_orders)
{ {
@@ -410,9 +437,22 @@ void FoodDeliveryController::persistStates()
} }
} }
itemDatabase.save(allItems); itemDatabase.save(allItems);
}
void FoodDeliveryController::persistDeliveryAssignments() const
{
FileDatabase<DeliveryAssignment> deliveryAssignmentsDatabase(DELIVERY_ASSIGNMENTS_FILE);
deliveryAssignmentsDatabase.save(m_assignments); deliveryAssignmentsDatabase.save(m_assignments);
} }
void FoodDeliveryController::persistStates() const
{
persistUsers();
persistRestaurants();
persistOrders();
persistDeliveryAssignments();
}
void FoodDeliveryController::run() void FoodDeliveryController::run()
{ {
bool isMenuActive = true; bool isMenuActive = true;
@@ -22,6 +22,7 @@ using menuItems = std::map<int, std::shared_ptr<MenuItem>>;
using items = std::vector<std::shared_ptr<Item>>; using items = std::vector<std::shared_ptr<Item>>;
using orders = std::map<int, std::shared_ptr<Order>>; using orders = std::map<int, std::shared_ptr<Order>>;
using deliveryAssignments = std::map<int, std::shared_ptr<DeliveryAssignment>>; using deliveryAssignments = std::map<int, std::shared_ptr<DeliveryAssignment>>;
template <typename T> using objects = std::map<int, std::shared_ptr<T>>;
class FoodDeliveryController class FoodDeliveryController
{ {
@@ -31,8 +32,16 @@ private:
orders m_orders; orders m_orders;
deliveryAssignments m_assignments; deliveryAssignments m_assignments;
std::shared_ptr<User> m_authenticatedUser; std::shared_ptr<User> m_authenticatedUser;
void loadUsers();
void loadRestaurants(objects<MenuItem>&);
void loadOrders(objects<MenuItem>&);
void loadDeliveryAssignments();
void persistUsers() const;
void persistRestaurants() const;
void persistOrders() const;
void persistDeliveryAssignments() const;
void loadStates(); void loadStates();
void persistStates(); void persistStates() const;
public: public:
void run(); void run();
void login(); void login();