Compare commits

...

4 Commits

Author SHA1 Message Date
joelthomastrenser dbc9abae6c notification works 2026-06-16 03:37:29 +05:30
joelthomastrenser 9752a76cb2 Modularize 2026-06-16 03:20:49 +05:30
joelthomastrenser 505753cc77 disable working 2026-06-16 03:07:21 +05:30
joelthomastrenser 384a9b05b1 Somewhat working 2026-06-16 02:52:55 +05:30
14 changed files with 247 additions and 8 deletions
@@ -149,6 +149,7 @@
<ClCompile Include="utilities\Validator.cpp" />
<ClCompile Include="views\AdminMenu.cpp" />
<ClCompile Include="views\CustomerMenu.cpp" />
<ClCompile Include="views\Menu.cpp" />
<ClCompile Include="views\TechnicianMenu.cpp" />
<ClCompile Include="views\UserInterface.cpp" />
</ItemGroup>
@@ -193,6 +194,7 @@
<ClInclude Include="utilities\Vector.h" />
<ClInclude Include="views\AdminMenu.h" />
<ClInclude Include="views\CustomerMenu.h" />
<ClInclude Include="views\Menu.h" />
<ClInclude Include="views\MenuHelper.h" />
<ClInclude Include="views\TechnicianMenu.h" />
<ClInclude Include="views\UserInterface.h" />
@@ -622,3 +622,8 @@ void Controller::shutdown()
auto& dataStore = DataStore::getInstance();
dataStore.shutdown();
}
void Controller::registerEvents(HANDLE accountDisabledEvent, HANDLE notificationAvailableEvent)
{
m_authenticationManagementService.registerEvents(accountDisabledEvent, notificationAvailableEvent);
}
@@ -8,6 +8,7 @@ Date:19-May-2026
*/
#pragma once
#include <windows.h>
#include <string>
#include "AuthenticationManagementService.h"
#include "Enums.h"
@@ -72,4 +73,5 @@ public:
void configureNotifications(bool paymentNotifications, bool serviceNotifications);
bool initialize();
void shutdown();
void registerEvents(HANDLE accountDisabledEvent, HANDLE notificationAvailableEvent);
};
@@ -16,6 +16,8 @@ Date:19-May-2026
User* AuthenticationManagementService::m_authenticatedUser = nullptr;
EventManager AuthenticationManagementService::m_eventManager;
HANDLE AuthenticationManagementService::m_accountDisabledEvent = NULL;
HANDLE AuthenticationManagementService::m_notificationsAvailableEvent = NULL;
/*
Function: login
@@ -43,11 +45,18 @@ bool AuthenticationManagementService::login(const std::string& username, const s
user->getId(),
[]()
{
std::cout << "USER_DISABLED event received" << std::endl;
if (m_accountDisabledEvent)
{
SetEvent(m_accountDisabledEvent);
}
},
[]()
{
std::cout << "NOTIFICATION_AVAILABLE event received" << std::endl;
HANDLE eventHandle = OpenEventA(EVENT_MODIFY_STATE, FALSE, "VehicleServiceSystem_NotificationAvailable");
if (m_notificationsAvailableEvent)
{
SetEvent(m_notificationsAvailableEvent);
}
});
return true;
}
@@ -79,6 +88,8 @@ void AuthenticationManagementService::logout()
{
m_eventManager.shutdown();
m_authenticatedUser = nullptr;
m_accountDisabledEvent = NULL;
m_notificationsAvailableEvent = NULL;
}
/*
@@ -105,3 +116,9 @@ void AuthenticationManagementService::changePassword(const std::string& newPassw
trackedUsersMap.getValueAt(index).state = RecordState::MODIFIED;
m_dataStore.saveUsers();
}
void AuthenticationManagementService::registerEvents(HANDLE accountDisabledEvent, HANDLE notifictionAvailableEvent)
{
m_accountDisabledEvent = accountDisabledEvent;
m_notificationsAvailableEvent = notifictionAvailableEvent;
}
@@ -9,6 +9,7 @@ Date:19-May-2026
#pragma once
#include <string>
#include <windows.h>
#include "EventManager.h"
#include "DataStore.h"
@@ -19,6 +20,8 @@ class AuthenticationManagementService
private:
static User* m_authenticatedUser;
static EventManager m_eventManager;
static HANDLE m_accountDisabledEvent;
static HANDLE m_notificationsAvailableEvent;
DataStore& m_dataStore;
public:
AuthenticationManagementService() : m_dataStore(DataStore::getInstance()) {}
@@ -26,4 +29,5 @@ public:
void logout();
void changePassword(const std::string& newPassword);
User* getAuthenticatedUser();
void registerEvents(HANDLE accountDisabledEvent, HANDLE notificationAvailableEvent);
};
@@ -30,10 +30,16 @@ Return type: void
*/
void AdminMenu::showMenu()
{
startEventListener();
while (true)
{
try
{
if (!m_isMenuActive)
{
logout();
break;
}
int choice;
util::clear();
std::cout << "Admin Menu"
@@ -68,6 +74,7 @@ void AdminMenu::showMenu()
util::pressEnter();
}
}
stopEventListener();
}
/*
@@ -78,6 +85,11 @@ Return type: bool - true if menu continues, false if logout
*/
bool AdminMenu::handleOperation(int choice)
{
if (!m_isMenuActive)
{
logout();
return false;
}
switch (choice)
{
case 1:
@@ -141,6 +153,12 @@ bool AdminMenu::handleOperation(int choice)
return true;
}
void AdminMenu::handleNotificationEvent()
{
auto notifications = m_controller.getNotifications();
displayNewNotification(notifications);
}
/*
Function: logout
Description: Logs out the currently authenticated admin user.
@@ -9,12 +9,13 @@ Date:19-May-2026
#pragma once
#include "Controller.h"
#include "Menu.h"
class AdminMenu
class AdminMenu : Menu
{
private:
Controller m_controller;
bool handleOperation(int choice);
void handleNotificationEvent() override;
public:
void showMenu();
void logout();
@@ -32,10 +32,17 @@ Return type: void
*/
void CustomerMenu::showMenu()
{
startEventListener();
while (true)
{
try
{
if (!m_isMenuActive)
{
logout();
break;
}
int choice;
util::clear();
std::cout << "Customer Menu"
@@ -62,6 +69,7 @@ void CustomerMenu::showMenu()
util::pressEnter();
}
}
stopEventListener();
}
/*
@@ -72,6 +80,11 @@ Return type: bool - true if menu continues, false if logout
*/
bool CustomerMenu::handleOperation(int choice)
{
if (!m_isMenuActive)
{
logout();
return false;
}
switch (choice)
{
case 1:
@@ -111,6 +124,12 @@ bool CustomerMenu::handleOperation(int choice)
return true;
}
void CustomerMenu::handleNotificationEvent()
{
auto notifications = m_controller.getNotifications();
displayNewNotification(notifications);
}
/*
Function: logout
Description: Logs out the currently authenticated customer user.
@@ -9,13 +9,14 @@ Date:19-May-2026
*/
#pragma once
#include "Menu.h"
#include "Controller.h"
class CustomerMenu
class CustomerMenu : Menu
{
private:
Controller m_controller;
bool handleOperation(int choice);
void handleNotificationEvent();
public:
void showMenu();
void logout();
@@ -0,0 +1,91 @@
#include "Menu.h"
Menu::Menu()
:
m_isMenuActive(false),
m_accountDisabledEvent(NULL),
m_notificationAvailableEvent(NULL),
m_shutdownEvent(NULL) {}
Menu::~Menu()
{
stopEventListener();
}
void Menu::startEventListener()
{
if (m_isMenuActive.load())
{
return;
}
m_isMenuActive.store(true);
m_accountDisabledEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
m_notificationAvailableEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
m_shutdownEvent = CreateEventA(NULL, FALSE, FALSE, NULL);
m_controller.registerEvents(m_accountDisabledEvent, m_notificationAvailableEvent);
m_eventListenerThread = std::thread(&Menu::eventListenerLoop, this);
}
void Menu::eventListenerLoop()
{
HANDLE handles[3];
handles[0] = m_accountDisabledEvent;
handles[1] = m_notificationAvailableEvent;
handles[2] = m_shutdownEvent;
while (m_isMenuActive.load())
{
DWORD result = WaitForMultipleObjects(3, handles, FALSE, INFINITE);
switch (result)
{
case WAIT_OBJECT_0:
handleAccountDisabledEvent();
break;
case WAIT_OBJECT_0 + 1:
handleNotificationEvent();
break;
case WAIT_OBJECT_0 + 2:
return;
}
}
}
void Menu::stopEventListener()
{
m_isMenuActive.store(false);
if (m_shutdownEvent)
{
SetEvent(m_shutdownEvent);
}
if (m_eventListenerThread.joinable())
{
m_eventListenerThread.join();
}
if (m_accountDisabledEvent)
{
CloseHandle(m_accountDisabledEvent);
}
if (m_notificationAvailableEvent)
{
CloseHandle(m_notificationAvailableEvent);
}
if (m_shutdownEvent)
{
CloseHandle(m_shutdownEvent);
}
m_accountDisabledEvent = NULL;
m_notificationAvailableEvent = NULL;
m_shutdownEvent = NULL;
}
void Menu::handleAccountDisabledEvent()
{
m_isMenuActive.store(false);
MessageBoxA(
GetConsoleWindow(),
"Your account has been disabled.",
"Account Disabled",
MB_OK |
MB_ICONWARNING |
MB_SETFOREGROUND |
MB_TOPMOST);
}
@@ -0,0 +1,33 @@
/*
File: Menu.h
Description: Base class providing common event listener functionality
for all menu implementations.
Author: Trenser
Date:16-Jun-2026
*/
#pragma once
#include <windows.h>
#include <atomic>
#include <thread>
#include "Controller.h"
class Menu
{
protected:
Controller m_controller;
std::atomic<bool> m_isMenuActive;
HANDLE m_accountDisabledEvent;
HANDLE m_notificationAvailableEvent;
HANDLE m_shutdownEvent;
std::thread m_eventListenerThread;
void startEventListener();
void stopEventListener();
void eventListenerLoop();
void handleAccountDisabledEvent();
virtual void handleNotificationEvent() = 0;
public:
Menu();
virtual ~Menu();
};
@@ -1408,3 +1408,29 @@ inline std::string selectComboPackage(util::Map<std::string, const ComboPackage*
return "";
}
}
inline void displayNewNotification(util::Vector<const Notification*> notifications)
{
const Notification* notification = nullptr;
size_t numberOfNotifications = notifications.getSize();
for (int index = 0; index < numberOfNotifications; index++)
{
if (!notification)
{
notification = notifications[index];
}
else
{
if (notification->getId() < notifications[index]->getId())
{
notification = notifications[index];
}
}
}
MessageBoxA(
GetConsoleWindow(),
notification->getMessage().c_str(),
notification->getTitle().c_str(),
MB_OK |
MB_ICONINFORMATION);
}
@@ -27,10 +27,16 @@ Returns:
*/
void TechnicianMenu::showMenu()
{
startEventListener();
while (true)
{
try
{
if (!m_isMenuActive)
{
logout();
break;
}
int choice;
util::clear();
std::cout << "Technician Menu"
@@ -45,6 +51,7 @@ void TechnicianMenu::showMenu()
{
break;
}
stopEventListener();
}
catch (const std::exception& e)
{
@@ -52,6 +59,7 @@ void TechnicianMenu::showMenu()
util::pressEnter();
}
}
stopEventListener();
}
/*
@@ -62,6 +70,11 @@ Return type: bool - true if menu continues, false if logout
*/
bool TechnicianMenu::handleOperation(int choice)
{
if (!m_isMenuActive)
{
logout();
return false;
}
switch (choice)
{
case 1:
@@ -86,6 +99,12 @@ bool TechnicianMenu::handleOperation(int choice)
return true;
}
void TechnicianMenu::handleNotificationEvent()
{
auto notifications = m_controller.getNotifications();
displayNewNotification(notifications);
}
/*
Function: displayJobs
Description: Displays all Jobs assigned to a Technician
@@ -9,12 +9,13 @@ Date:19-May-2026
#pragma once
#include "Controller.h"
#include "Menu.h"
class TechnicianMenu
class TechnicianMenu : Menu
{
private:
Controller m_controller;
bool handleOperation(int choice);
void handleNotificationEvent();
public:
void showMenu();
void displayJobs();