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)
{
return false;
@@ -250,8 +250,8 @@ bool isPhoneNumberValid(const std::string& phoneNumber) {
);
}
bool isEmailValid(const std::string& email) {
int index = email.find('@');
static bool isEmailValid(const std::string& email) {
size_t index = email.find('@');
if (index == std::string::npos) return false;
if (email.find('@', index + 1) != std::string::npos)
{
@@ -264,17 +264,17 @@ bool isEmailValid(const std::string& email) {
return true;
}
void FoodDeliveryController::loadStates()
void FoodDeliveryController::loadUsers()
{
FileDatabase<User> userDatabase(USERS_FILE);
m_users = userDatabase.load();
}
void FoodDeliveryController::loadRestaurants(objects<MenuItem>& menuItems)
{
FileDatabase<Restaurant> restaurantDatabase(RESTAURANTS_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();
for (const auto& restaurantPair : m_restaurants)
{
@@ -303,6 +303,13 @@ void FoodDeliveryController::loadStates()
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();
for (auto& orderPair : m_orders)
{
@@ -326,7 +333,6 @@ void FoodDeliveryController::loadStates()
}
restaurantIterator->second->addOrder(orderPair.second);
}
items = itemDatabase.load();
for (auto& itemPair : items)
{
int itemId = itemPair.second->getMenuItemId();
@@ -350,6 +356,11 @@ void FoodDeliveryController::loadStates()
throw std::runtime_error("Item has invalid Order ID");
}
}
}
void FoodDeliveryController::loadDeliveryAssignments()
{
FileDatabase<DeliveryAssignment> deliveryAssignmentsDatabase(DELIVERY_ASSIGNMENTS_FILE);
m_assignments = deliveryAssignmentsDatabase.load();
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);
userDatabase.save(m_users);
}
void FoodDeliveryController::persistRestaurants() const
{
FileDatabase<Restaurant> restaurantDatabase(RESTAURANTS_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<Item> allItems;
restaurantDatabase.save(m_restaurants);
for (const auto& restaurantPair : m_restaurants)
{
for (const auto& menuItemPair : restaurantPair.second->getMenuItems())
@@ -401,6 +421,13 @@ void FoodDeliveryController::persistStates()
}
}
menuItemDatabase.save(allMenuItems);
}
void FoodDeliveryController::persistOrders() const
{
FileDatabase<Order> orderDatabase(ORDERS_FILE);
FileDatabase<Item> itemDatabase(ITEMS_FILE);
objects<Item> allItems;
orderDatabase.save(m_orders);
for (const auto& orderPair : m_orders)
{
@@ -410,9 +437,22 @@ void FoodDeliveryController::persistStates()
}
}
itemDatabase.save(allItems);
}
void FoodDeliveryController::persistDeliveryAssignments() const
{
FileDatabase<DeliveryAssignment> deliveryAssignmentsDatabase(DELIVERY_ASSIGNMENTS_FILE);
deliveryAssignmentsDatabase.save(m_assignments);
}
void FoodDeliveryController::persistStates() const
{
persistUsers();
persistRestaurants();
persistOrders();
persistDeliveryAssignments();
}
void FoodDeliveryController::run()
{
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 orders = std::map<int, std::shared_ptr<Order>>;
using deliveryAssignments = std::map<int, std::shared_ptr<DeliveryAssignment>>;
template <typename T> using objects = std::map<int, std::shared_ptr<T>>;
class FoodDeliveryController
{
@@ -31,8 +32,16 @@ private:
orders m_orders;
deliveryAssignments m_assignments;
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 persistStates();
void persistStates() const;
public:
void run();
void login();