diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj
index 7c4bfd3..b9a6f28 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj
@@ -140,7 +140,6 @@
-
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters
index 7e74b19..e9b5831 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters
@@ -114,9 +114,6 @@
Source Files\DataStores
-
- Source Files\Services
-
Source Files\Core\Patterns
@@ -278,5 +275,8 @@
Header Files\DataStores\SharedMemory
+
+ Header Files
+
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Observer.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Observer.h
index 7fd7262..e9eb955 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Observer.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/core/patterns/Observer.h
@@ -13,5 +13,4 @@ class Observer
{
public:
virtual ~Observer() = default;
- virtual void addNotification(Notification* notification) = 0;
};
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.cpp
index f09d367..f623fb4 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.cpp
@@ -230,20 +230,6 @@ util::Map>& DataStore::getUsers()
{
auto users = loadRecords(m_users);
refreshCache(m_userCache, users);
- auto& notifications = getNotifications();
- int numberOfNotifications = m_notificationCache.getSize();
- for (int index = 0; index < numberOfNotifications; index++)
- {
- Notification* notification = notifications.getValueAt(index).data;
- const std::string& recipientUserId = notification->getRecipientUserId();
- int userIndex = m_userCache.find(recipientUserId);
- if (userIndex == -1)
- {
- throw std::runtime_error("Invalid recipient user ID");
- }
- User* user = m_userCache.getValueAt(userIndex).data;
- user->addNotification(notification);
- }
return m_userCache;
}
@@ -421,7 +407,6 @@ Returns:
void DataStore::saveUsers()
{
saveRecords(m_users, m_userCache);
- saveNotifications();
}
/*
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.cpp
index ad1b416..83532ec 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.cpp
@@ -1,7 +1,7 @@
/*
File: Notification.cpp
Description: Implements the Notification class which represents system notifications in the Vehicle Service Management System.
- Provides constructors, accessors, and mutators for notification details such as ID, recipient, title, message, and timestamp.
+ Provides constructors, accessors, and mutators for notification details such as ID, recipientID, title, message, and timestamp.
Author: Trenser
Date: 19-May-2026
*/
@@ -23,9 +23,8 @@ Returns:
- A new Notification object.
*/
Notification::Notification()
- : m_id("NOT" + std::to_string(++m_uid)),
- m_recipient(nullptr), m_state(util::State::ACTIVE) {
-}
+ : m_id("NOT" + std::to_string(++m_uid)),
+ m_state(util::State::ACTIVE) {}
/*
Function: Notification
@@ -39,10 +38,9 @@ Parameters:
Returns:
- A new Notification object.
*/
-Notification::Notification(const std::string& recipientUserId, User* recipient, const std::string& title, const std::string& message, const util::Timestamp& createdAt)
+Notification::Notification(const std::string& recipientUserId, const std::string& title, const std::string& message, const util::Timestamp& createdAt)
: m_id("NOT" + std::to_string(++m_uid)),
m_recipientUserId(recipientUserId),
- m_recipient(recipient),
m_title(title),
m_message(message),
m_state(util::State::ACTIVE),
@@ -65,7 +63,6 @@ Returns:
Notification::Notification(const std::string& id, const std::string& recipientUserId, const std::string& title, const std::string& message, const util::Timestamp& createdAt, const util::State& state)
: m_id(id),
m_recipientUserId(recipientUserId),
- m_recipient(nullptr),
m_title(title),
m_message(message),
m_createdAt(createdAt),
@@ -100,17 +97,6 @@ const std::string& Notification::getRecipientUserId() const
return m_recipientUserId;
}
-/*
-Function: getRecipient
-Description: Retrieves the pointer to the recipient user.
-Returns:
- - User* representing the recipient.
-*/
-User* Notification::getRecipient() const
-{
- return m_recipient;
-}
-
/*
Function: getTitle
Description: Retrieves the title of the notification.
@@ -181,19 +167,6 @@ void Notification::setRecipientUserId(const std::string& recipientUserId)
m_recipientUserId = recipientUserId;
}
-/*
-Function: setRecipient
-Description: Sets the recipient user pointer for the notification.
-Parameters:
- - recipient: Pointer to the User object.
-Returns:
- - void
-*/
-void Notification::setRecipient(User* recipient)
-{
- m_recipient = recipient;
-}
-
/*
Function: setTitle
Description: Sets the title of the notification.
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.h
index d92bc2c..a102cc6 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/Notification.h
@@ -20,24 +20,21 @@ private:
static int m_uid;
std::string m_id;
std::string m_recipientUserId;
- User* m_recipient;
std::string m_title;
std::string m_message;
util::Timestamp m_createdAt;
util::State m_state;
public:
Notification();
- Notification(const std::string& recipientUserId, User* recipient, const std::string& title, const std::string& message, const util::Timestamp& createdAt);
+ Notification(const std::string& recipientUserId, const std::string& title, const std::string& message, const util::Timestamp& createdAt);
Notification(const std::string& id, const std::string& recipientUserId, const std::string& title, const std::string& message, const util::Timestamp& createdAt, const util::State& state);
const std::string& getId() const;
const std::string& getRecipientUserId() const;
- User* getRecipient() const;
const std::string& getTitle() const;
const std::string& getMessage() const;
const util::Timestamp& getCreatedAt() const;
void setId(const std::string& id);
void setRecipientUserId(const std::string& recipientUserId);
- void setRecipient(User* recipient);
void setTitle(const std::string& title);
void setMessage(const std::string& message);
void setCreatedAt(const util::Timestamp& createdAt);
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp
index c4dc928..5794259 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.cpp
@@ -89,23 +89,6 @@ User::User(const std::string& userId, const std::string& userName, const std::st
}
}
-/*
-Function: ~User
-Description: Destructor that cleans up dynamically allocated notifications associated with the user.
-Parameters:
- - None
-Returns:
- - void
-*/
-User::~User()
-{
- auto values = m_notifications.getValues();
- for (int index = 0; index < values.getSize(); index++)
- {
- delete values[index];
- }
-}
-
/*
Function: getId
Description: Retrieves the unique ID of the user.
@@ -172,17 +155,6 @@ const std::string& User::getEmail() const
return m_email;
}
-/*
-Function: getNotifications
-Description: Retrieves the map of notifications associated with the user.
-Returns:
- - util::Map& representing the notifications.
-*/
-util::Map& User::getNotifications()
-{
- return m_notifications;
-}
-
/*
Function: getUserType
Description: Retrieves the role of the user.
@@ -283,22 +255,6 @@ void User::setEmail(const std::string& email)
m_email = email;
}
-/*
-Function: addNotification
-Description: Adds a new notification to the user’s notification map.
-Parameters:
- - notification: Pointer to the Notification object.
-Returns:
- - void
-*/
-void User::addNotification(Notification* notification)
-{
- if (notification)
- {
- m_notifications.insert(notification->getId(), notification);
- }
-}
-
/*
Function: setRole
Description: Sets the role of the user.
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h
index 1026bd3..1a0f93f 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/models/User.h
@@ -26,21 +26,19 @@ private:
std::string m_name;
std::string m_phone;
std::string m_email;
- util::Map m_notifications;
util::UserType m_type;
util::State m_status;
public:
User();
User(const std::string& userName, const std::string& password, const std::string& name, const std::string& phone, const std::string& email, util::UserType role);
User(const std::string& userId, const std::string& userName, const std::string& password, const std::string& name, const std::string& phone, const std::string& email, util::UserType role, util::State status);
- ~User();
+ ~User() = default;
const std::string& getId() const;
const std::string& getUserName() const;
const std::string& getPassword() const;
const std::string& getName() const;
const std::string& getPhone() const;
const std::string& getEmail() const;
- util::Map& getNotifications();
util::UserType getUserType() const;
util::State getState() const;
void setId(const std::string& id);
@@ -49,7 +47,6 @@ public:
void setName(const std::string& name);
void setPhone(const std::string& phone);
void setEmail(const std::string& email);
- void addNotification(Notification* notification) override;
void setRole(util::UserType role);
void setState(util::State status);
SerializedUser serialize() const;
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp
index d08d957..aed6f3a 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/InventoryManagementService.cpp
@@ -19,7 +19,7 @@ Date: 22-May-2026
#include "User.h"
#include "Utility.h"
#include "Vector.h"
-
+#include "DataStoreLockGuard.h"
util::Map InventoryManagementService::m_observers{};
@@ -271,6 +271,9 @@ Returns:
*/
void InventoryManagementService::attach(User* user)
{
+ DataStoreLockGuard lock(m_dataStore);
+ m_observers.clear();
+ m_observers = m_dataStore.getInventoryManagementObservers();
if (user)
{
const std::string& userID = user->getId();
@@ -279,6 +282,7 @@ void InventoryManagementService::attach(User* user)
m_observers[userID] = user;
}
}
+ m_dataStore.saveInventoryManagementObservers(m_observers);
}
/*
@@ -291,6 +295,9 @@ Returns:
*/
void InventoryManagementService::detach(User* user)
{
+ DataStoreLockGuard lock(m_dataStore);
+ m_observers.clear();
+ m_observers = m_dataStore.getInventoryManagementObservers();
if (user)
{
const std::string& userID = user->getId();
@@ -299,6 +306,7 @@ void InventoryManagementService::detach(User* user)
m_observers.remove(userID);
}
}
+ m_dataStore.saveInventoryManagementObservers(m_observers);
}
/*
@@ -315,27 +323,27 @@ Throws:
*/
void InventoryManagementService::sendNotification(User* user, const std::string& title, const std::string& message)
{
- if (user)
+ if (!user)
{
- if (m_observers.find(user->getId()) != -1)
- {
- Notification* notification =
- Factory::getObject(
- user->getId(),
- user,
- title,
- message,
- util::Timestamp()
- );
- if (notification)
- {
- user->addNotification(notification);
- }
- else
- {
- throw std::runtime_error("Failed to create notification");
- }
- }
+ return;
}
+ DataStoreLockGuard lock(m_dataStore);
+ m_observers = m_dataStore.getInventoryManagementObservers();
+ if (m_observers.find(user->getId()) == -1)
+ {
+ return;
+ }
+ Notification* notification = Factory::getObject(
+ user->getId(),
+ title,
+ message,
+ util::Timestamp());
+ if (!notification)
+ {
+ throw std::runtime_error("Failed to create notification");
+ }
+ auto& trackedNotificationsMap = m_dataStore.getNotifications();
+ trackedNotificationsMap.insert(notification->getId(), util::createNewRecord(notification));
+ m_dataStore.saveNotifications();
}
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/NotificationManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/NotificationManagementService.cpp
deleted file mode 100644
index cc23059..0000000
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/NotificationManagementService.cpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "NotificationManagementService.h"
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.cpp
index 1fc1ff8..1ebb273 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/PaymentManagementService.cpp
@@ -21,6 +21,7 @@ Date: 20-May-2026
#include "Timestamp.h"
#include "User.h"
#include "Utility.h"
+#include "DataStoreLockGuard.h"
util::Map PaymentManagementService::m_observers{};
@@ -34,6 +35,9 @@ Returns:
*/
void PaymentManagementService::attach(User* user)
{
+ DataStoreLockGuard lock(m_dataStore);
+ m_observers.clear();
+ m_observers = m_dataStore.getPaymentManagementObservers();
if (user)
{
const std::string& userID = user->getId();
@@ -42,6 +46,7 @@ void PaymentManagementService::attach(User* user)
m_observers[userID] = user;
}
}
+ m_dataStore.savePaymentManagementObservers(m_observers);
}
/*
@@ -54,6 +59,9 @@ Returns:
*/
void PaymentManagementService::detach(User* user)
{
+ DataStoreLockGuard lock(m_dataStore);
+ m_observers.clear();
+ m_observers = m_dataStore.getPaymentManagementObservers();
if (user)
{
const std::string& userID = user->getId();
@@ -62,6 +70,7 @@ void PaymentManagementService::detach(User* user)
m_observers.remove(userID);
}
}
+ m_dataStore.savePaymentManagementObservers(m_observers);
}
/*
@@ -78,28 +87,28 @@ Throws:
*/
void PaymentManagementService::sendNotification(User* user, const std::string& title, const std::string& message)
{
- if (user)
+ if (!user)
{
- if (m_observers.find(user->getId()) != -1)
- {
- Notification* notification =
- Factory::getObject(
- user->getId(),
- user,
- title,
- message,
- util::Timestamp()
- );
- if (notification)
- {
- user->addNotification(notification);
- }
- else
- {
- throw std::runtime_error("Failed to create notification");
- }
- }
+ return;
}
+ DataStoreLockGuard lock(m_dataStore);
+ m_observers = m_dataStore.getPaymentManagementObservers();
+ if (m_observers.find(user->getId()) == -1)
+ {
+ return;
+ }
+ Notification* notification = Factory::getObject(
+ user->getId(),
+ title,
+ message,
+ util::Timestamp());
+ if (!notification)
+ {
+ throw std::runtime_error("Failed to create notification");
+ }
+ auto& trackedNotificationsMap = m_dataStore.getNotifications();
+ trackedNotificationsMap.insert(notification->getId(), util::createNewRecord(notification));
+ m_dataStore.saveNotifications();
}
/*
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp
index 2104ba0..102ba31 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp
@@ -134,6 +134,7 @@ void ServiceManagementService::attach(User* user)
m_observers[userID] = user;
}
}
+ m_dataStore.saveServiceManagementObservers(m_observers);
}
/*
@@ -146,6 +147,9 @@ Returns:
*/
void ServiceManagementService::detach(User* user)
{
+ DataStoreLockGuard lock(m_dataStore);
+ m_observers.clear();
+ m_observers = m_dataStore.getServiceManagementObservers();
if (user)
{
const std::string& userID = user->getId();
@@ -154,6 +158,7 @@ void ServiceManagementService::detach(User* user)
m_observers.remove(userID);
}
}
+ m_dataStore.saveServiceManagementObservers(m_observers);
}
/*
@@ -170,52 +175,28 @@ Throws:
*/
void ServiceManagementService::sendNotification(User* user, const std::string& title, const std::string& message)
{
- if (user)
- {
- if (m_observers.find(user->getId()) != -1)
- {
- Notification* notification =
- Factory::getObject(
- user->getId(),
- user,
- title,
- message,
- util::Timestamp()
- );
- if (notification)
- {
- user->addNotification(notification);
- }
- else
- {
- throw std::runtime_error("Failed to create notification");
- }
- }
- }
-}
-
-/*
-Function: getObserverIDs
-Description: Retrieves the IDs of all observers currently attached to the
- ServiceManagementService.
-Parameters:
- - None
-Returns:
- - util::Vector: Vector of observer user IDs
-*/
-util::Vector ServiceManagementService::getObserverIDs()
-{
- util::Vector observerIDs;
- int numberOfObservers = m_observers.getSize();
- for (int index = 0; index < numberOfObservers; index++)
- {
- User* observer = m_observers.getValueAt(index);
- if (observer)
- {
- observerIDs.push_back(observer->getId());
- }
- }
- return observerIDs;
+ if (!user)
+ {
+ return;
+ }
+ DataStoreLockGuard lock(m_dataStore);
+ m_observers = m_dataStore.getServiceManagementObservers();
+ if (m_observers.find(user->getId()) == -1)
+ {
+ return;
+ }
+ Notification* notification = Factory::getObject(
+ user->getId(),
+ title,
+ message,
+ util::Timestamp());
+ if (!notification)
+ {
+ throw std::runtime_error("Failed to create notification");
+ }
+ auto& trackedNotificationsMap = m_dataStore.getNotifications();
+ trackedNotificationsMap.insert(notification->getId(), util::createNewRecord(notification));
+ m_dataStore.saveNotifications();
}
/*
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp
index 3eeead8..4a043bb 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp
@@ -170,12 +170,16 @@ util::Vector UserManagementService::getUserNotifications(const st
User* user = trackedUsersMap[userID].data;
if (user)
{
- auto& notifications = user->getNotifications();
- int numberOfNotifications = notifications.getSize();
+ auto& trackedNotificationMap = m_dataStore.getNotifications();
+ int numberOfNotifications = trackedNotificationMap.getSize();
util::Vector notificationsVector;
for (int index = 0; index < numberOfNotifications; index++)
{
- notificationsVector.push_back(notifications.getValueAt(index));
+ Notification* notification = trackedNotificationMap.getValueAt(index).data;
+ if (notification->getRecipientUserId() == userID && notification->getState() == util::State::ACTIVE)
+ {
+ notificationsVector.push_back(notification);
+ }
}
m_dataStore.unlockDataStore();
return notificationsVector;
@@ -210,17 +214,12 @@ void UserManagementService::deleteNotification(const std::string& notificationID
throw std::runtime_error("No user found with given UserID");
}
User* user = trackedUsersMap.getValueAt(userIndex).data;
- auto& notifications = user->getNotifications();
- if (notifications.find(notificationID) == -1)
- {
- throw std::runtime_error("No notification found with given NotificationID");
- }
int notificationIndex = trackedNotificationsMap.find(notificationID);
if (notificationIndex == -1)
{
throw std::runtime_error("No notification found with given NotificationID");
}
- notifications[notificationID]->setState(util::State::INACTIVE);
+ trackedNotificationsMap.getValueAt(notificationIndex).data->setState(util::State::INACTIVE);
trackedNotificationsMap.getValueAt(notificationIndex).state = RecordState::MODIFIED;
m_dataStore.saveNotifications();
}