Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 31 additions & 0 deletions Src/Food_Delivery_System/Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Makefile for Lecture 11 C++ Tomato App

CXX = g++
CXXFLAGS = -std=c++11 -Wall -Wextra
TARGET = tomato_app
SOURCE = main.cpp

# Default target
all: $(TARGET)

# Build the executable
$(TARGET): $(SOURCE)
$(CXX) $(CXXFLAGS) -I. -o $(TARGET) $(SOURCE)

# Run the application
run: $(TARGET)
./$(TARGET)

# Clean up compiled files
clean:
rm -f $(TARGET) $(TARGET).exe

# Help target
help:
@echo "Available targets:"
@echo " all - Build the application (default)"
@echo " run - Build and run the application"
@echo " clean - Remove compiled files"
@echo " help - Show this help message"

.PHONY: all run clean help
116 changes: 116 additions & 0 deletions Src/Food_Delivery_System/TomatoApp.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
#ifndef TOMATO_APP_H
#define TOMATO_APP_H

#include <vector>
#include <string>
#include "models/User.h"
#include "models/Restaurant.h"
#include "models/Cart.h"
#include "managers/RestaurantManager.h"
#include "managers/OrderManager.h"
#include "strategies/PaymentStrategy.h"
#include "strategies/UpiPaymentStrategy.h"
#include "factories/NowOrderFactory.h"
#include "factories/ScheduledOrderFactory.h"
#include "services/NotificationService.h"
#include "utils/TimeUtils.h"
using namespace std;

class TomatoApp {
public:
TomatoApp() {
initializeRestaurants();
}

void initializeRestaurants() {
Restaurant* restaurant1 = new Restaurant("Bikaner", "Delhi");
restaurant1->addMenuItem(MenuItem("P1", "Chole Bhature", 120));
restaurant1->addMenuItem(MenuItem("P2", "Samosa", 15));

Restaurant* restaurant2 = new Restaurant("Haldiram", "Kolkata");
restaurant2->addMenuItem(MenuItem("P1", "Raj Kachori", 80));
restaurant2->addMenuItem(MenuItem("P2", "Pav Bhaji", 100));
restaurant2->addMenuItem(MenuItem("P3", "Dhokla", 50));

Restaurant* restaurant3 = new Restaurant("Saravana Bhavan", "Chennai");
restaurant3->addMenuItem(MenuItem("P1", "Masala Dosa", 90));
restaurant3->addMenuItem(MenuItem("P2", "Idli Vada", 60));
restaurant3->addMenuItem(MenuItem("P3", "Filter Coffee", 30));

RestaurantManager* restaurantManager = RestaurantManager::getInstance();
restaurantManager->addRestaurant(restaurant1);
restaurantManager->addRestaurant(restaurant2);
restaurantManager->addRestaurant(restaurant3);

// Add other sample restaurants...
}

vector<Restaurant*> searchRestaurants(const string& location) {
return RestaurantManager::getInstance()->searchByLocation(location);
}

void selectRestaurant(User* user, Restaurant* restaurant) {
Cart* cart = user->getCart();
cart->setRestaurant(restaurant);
}

void addToCart(User* user, const string& itemCode) {
Restaurant* restaurant = user->getCart()->getRestaurant();
if (!restaurant) {
cout << "Please select a restaurant first." << endl;
return;
}
for (const auto& item : restaurant->getMenu()) {
if (item.getCode() == itemCode) {
user->getCart()->addItem(item);
break;
}
}
}

Order* checkoutNow(User* user, const string& orderType, PaymentStrategy* paymentStrategy) {
return checkout(user, orderType, paymentStrategy, new NowOrderFactory());
}

Order* checkoutScheduled(User* user, const string& orderType, PaymentStrategy* paymentStrategy, const string& scheduleTime) {
return checkout(user, orderType, paymentStrategy, new ScheduledOrderFactory(scheduleTime));
}

Order* checkout(User* user, const string& orderType,
PaymentStrategy* paymentStrategy, OrderFactory* orderFactory) {
if (user->getCart()->isEmpty())
return nullptr;

Cart* userCart = user->getCart();
Restaurant* orderedRestaurant = userCart->getRestaurant();
vector<MenuItem> itemsOrdered = userCart->getItems();
double totalCost = userCart->getTotalCost();

Order* order = orderFactory->createOrder(user, userCart, orderedRestaurant, itemsOrdered, paymentStrategy, totalCost, orderType);
OrderManager::getInstance()->addOrder(order);
return order;
}

void payForOrder(User* user, Order* order) {
bool isPaymentSuccess = order->processPayment();

// clear user cart if payment is successful.
if(isPaymentSuccess) {
NotificationService* notification = new NotificationService();
notification->notify(order);
user->getCart()->clear();
}
}

void printUserCart(User* user) {
cout << "Items in cart:" << endl;
cout << "------------------------------------" << endl;
for (const auto& item : user->getCart()->getItems()) {
cout << item.getCode() << " : " << item.getName() << " : ₹" << item.getPrice() << endl;
}
cout << "------------------------------------" << endl;
cout << "Grand total : ₹" << user->getCart()->getTotalCost() << endl;
}
};

#endif // TOMATO_APP_H
17 changes: 17 additions & 0 deletions Src/Food_Delivery_System/compile.bat
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
@echo off
echo Compiling C++ Food Delivery App...

REM Compile the main program
g++ -std=c++11 -I. -o tomato_app main.cpp

if %errorlevel% equ 0 (
echo Compilation successful!
echo Running the application...
echo.
tomato_app.exe
) else (
echo Compilation failed!
echo Please check for any syntax errors.
)

pause
15 changes: 15 additions & 0 deletions Src/Food_Delivery_System/compile.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/bin/bash
echo "Compiling Lecture 11 C++ Tomato App..."

# Compile the main program
g++ -std=c++11 -I. -o tomato_app main.cpp

if [ $? -eq 0 ]; then
echo "Compilation successful!"
echo "Running the application..."
echo
./tomato_app
else
echo "Compilation failed!"
echo "Please check for any syntax errors."
fi
35 changes: 35 additions & 0 deletions Src/Food_Delivery_System/factories/NowOrderFactory.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
#ifndef NOW_ORDER_FACTORY_H
#define NOW_ORDER_FACTORY_H

#include "OrderFactory.h"
#include "../models/DeliveryOrder.h"
#include "../models/PickupOrder.h"
#include "../utils/TimeUtils.h"
using namespace std;

class NowOrderFactory : public OrderFactory {
public:
Order* createOrder(User* user, Cart* cart, Restaurant* restaurant, const vector<MenuItem>& menuItems,
PaymentStrategy* paymentStrategy, double totalCost, const string& orderType) override {
Order* order = nullptr;
if (orderType == "Delivery") {
auto deliveryOrder = new DeliveryOrder();
deliveryOrder->setUserAddress(user->getAddress());
order = deliveryOrder;
}
else {
auto pickupOrder = new PickupOrder();
pickupOrder->setRestaurantAddress(restaurant->getLocation());
order = pickupOrder;
}
order->setUser(user);
order->setRestaurant(restaurant);
order->setItems(menuItems);
order->setPaymentStrategy(paymentStrategy);
order->setScheduled(TimeUtils::getCurrentTime());
order->setTotal(totalCost);
return order;
}
};

#endif // NOW_ORDER_FACTORY_H
19 changes: 19 additions & 0 deletions Src/Food_Delivery_System/factories/OrderFactory.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#ifndef ORDER_FACTORY_H
#define ORDER_FACTORY_H

#include "../models/Order.h"
#include "../models/Cart.h"
#include "../models/Restaurant.h"
#include "../strategies/PaymentStrategy.h"
#include <vector>
#include <string>
using namespace std;

class OrderFactory {
public:
virtual Order* createOrder(User* user, Cart* cart, Restaurant* restaurant, const vector<MenuItem>& menuItems,
PaymentStrategy* paymentStrategy, double totalCost, const string& orderType) = 0;
virtual ~OrderFactory() {}
};

#endif // ORDER_FACTORY_H
41 changes: 41 additions & 0 deletions Src/Food_Delivery_System/factories/ScheduledOrderFactory.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#ifndef SCHEDULED_ORDER_FACTORY_H
#define SCHEDULED_ORDER_FACTORY_H

#include "OrderFactory.h"
#include "../models/DeliveryOrder.h"
#include "../models/PickupOrder.h"
#include "../utils/TimeUtils.h"
using namespace std;

class ScheduledOrderFactory : public OrderFactory {
private:
string scheduleTime;
public:
ScheduledOrderFactory(string scheduleTime) {
this->scheduleTime = scheduleTime;
}

Order* createOrder(User* user, Cart* cart, Restaurant* restaurant, const vector<MenuItem>& menuItems,
PaymentStrategy* paymentStrategy, double totalCost, const string& orderType) override {
Order* order = nullptr;

if(orderType == "Delivery") {
auto deliveryOrder = new DeliveryOrder();
deliveryOrder->setUserAddress(user->getAddress());
order = deliveryOrder;
}
else {
auto pickupOrder = new PickupOrder();
pickupOrder->setRestaurantAddress(restaurant->getLocation());
}
order->setUser(user);
order->setRestaurant(restaurant);
order->setItems(menuItems);
order->setPaymentStrategy(paymentStrategy);
order->setScheduled(scheduleTime);
order->setTotal(totalCost);
return order;
}
};

#endif // SCHEDULED_ORDER_FACTORY_H
33 changes: 33 additions & 0 deletions Src/Food_Delivery_System/folderStructure.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
OnlineFoodOrderingSystem/
├── main.cpp # Composition root and entry point
├── TomatoApp.h # Facade class (main orchestrator)
├── models/
│ ├── MenuItem.h
│ ├── Restaurant.h
│ ├── User.h
│ ├── Cart.h
│ ├── Order.h # Abstract Order
│ ├── DeliveryOrder.h
│ ├── PickupOrder.h
├── managers/
│ ├── RestaurantManager.h
│ ├── OrderManager.h
├── strategies/
│ ├── PaymentStrategy.h # Base class
│ ├── CreditCardPaymentStrategy.h
│ ├── UpiPaymentStrategy.h
├── factories/
│ ├── OrderFactory.h # Abstract factory
│ ├── NowOrderFactory.h
│ ├── ScheduledOrderFactory.h
├── services/
│ └── NotificationService.h
├── utils/
│ └── TimeUtils.h
47 changes: 47 additions & 0 deletions Src/Food_Delivery_System/main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
#include <iostream>
#include "TomatoApp.h"
using namespace std;

int main() {
// Create TomatoApp Object
TomatoApp* tomato = new TomatoApp();

// Simulate a user coming in (Happy Flow)
User* user = new User(101, "Aditya", "Delhi");
cout << "User: " << user->getName() << " is active." << endl;

// User searches for restaurants by location
vector<Restaurant*> restaurantList = tomato->searchRestaurants("Delhi");

if (restaurantList.empty()) {
cout << "No restaurants found!" << endl;
return 0;
}
cout << "Found Restaurants:" << endl;
for (auto restaurant : restaurantList) {
cout << " - " << restaurant->getName() << endl;
}

// User selects a restaurant
tomato->selectRestaurant(user, restaurantList[0]);

cout << "Selected restaurant: " << restaurantList[0]->getName() << endl;

// User adds items to the cart
tomato->addToCart(user, "P1");
tomato->addToCart(user, "P2");

tomato->printUserCart(user);

// User checkout the cart
Order* order = tomato->checkoutNow(user, "Delivery", new UpiPaymentStrategy("1234567890"));

// User pay for the cart. If payment is success, notification is sent.
tomato->payForOrder(user, order);

// Cleanup Code.
delete tomato;
delete user;

return 0;
}
Loading
Loading