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 bda9ac0..9f72555 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;
}
@@ -340,6 +326,37 @@ util::Map>& DataStore::getInvoices()
return m_invoiceCache;
}
+/*
+Function: getObservers
+Description: Retrieves observer records from the specified observer mapping
+ and resolves them to User objects.
+Parameters:
+ - mapping: Observer mapping to read from
+Returns:
+ - util::Map: Collection of observer records
+Throws:
+ - std::runtime_error if an observer references an invalid user ID
+*/
+util::Map DataStore::getObservers(MappingInfo& mapping)
+{
+ auto& users = getUsers();
+ util::Map observers;
+ SharedMemory::ensureLatestMapping(mapping);
+ size_t recordCount = SharedMemory::getRecordCount(mapping);
+ for (size_t index = 0; index < recordCount; index++)
+ {
+ const SerializedObserver* observer = static_cast(SharedMemory::getRecordAddress(mapping, index));
+ int userIndex = users.find(observer->id);
+ if (userIndex == -1)
+ {
+ throw std::runtime_error("Invalid observer user ID");
+ }
+ User* user = users.getValueAt(userIndex).data;
+ observers.insert(user->getId(), user);
+ }
+ return observers;
+}
+
/*
Function: getServiceManagementObservers
Description: Retrieves all service management observer records from the datastore.
@@ -350,7 +367,7 @@ Returns:
*/
util::Map DataStore::getServiceManagementObservers()
{
- return util::Map();
+ return getObservers(m_serviceManagementObservers);
}
/*
@@ -363,7 +380,7 @@ Returns:
*/
util::Map DataStore::getPaymentManagementObservers()
{
- return util::Map();
+ return getObservers(m_paymentManagementObservers);
}
/*
@@ -376,7 +393,7 @@ Returns:
*/
util::Map DataStore::getInventoryManagementObservers()
{
- return util::Map();
+ return getObservers(m_inventoryManagementObservers);
}
/*
@@ -390,7 +407,6 @@ Returns:
void DataStore::saveUsers()
{
saveRecords(m_users, m_userCache);
- saveNotifications();
}
/*
@@ -478,16 +494,49 @@ void DataStore::saveInvoices()
{
}
+/*
+Function: saveObservers
+Description: Persists observer records to the specified observer mapping.
+Parameters:
+ - mapping: MappingInfo&, observer mapping to save to
+ - observers: util::Map&, collection of observer records
+Returns:
+ - None
+*/
+void DataStore::saveObservers(MappingInfo& mapping, util::Map& observers)
+{
+ size_t observerCount = static_cast(observers.getSize());
+ size_t capacity = config::file::INITIAL_CAPACITY;
+ while (capacity < observerCount)
+ {
+ capacity *= config::file::GROWTH_FACTOR;
+ }
+ if (!SharedMemory::resizeMapping(mapping, capacity))
+ {
+ throw std::runtime_error("Failed to resize observer mapping");
+ }
+ SharedMemory::setRecordCount(mapping, observerCount);
+ for (size_t index = 0; index < observerCount; index++)
+ {
+ SerializedObserver serializedObserver;
+ User* user = observers.getValueAt(static_cast(index));
+ strcpy_s(serializedObserver.id, sizeof(serializedObserver.id), user->getId().c_str());
+ SerializedObserver* destination = static_cast(SharedMemory::getRecordAddress(mapping, index));
+ *destination = serializedObserver;
+ }
+}
+
/*
Function: saveServiceManagementObservers
Description: Persists all service management observer records to the datastore.
Parameters:
- - observers: util::Map>&, collection of observer records
+ - observers: util::Map&, collection of observer records
Returns:
- None
*/
void DataStore::saveServiceManagementObservers(util::Map& observers)
{
+ saveObservers(m_serviceManagementObservers, observers);
}
/*
@@ -500,6 +549,7 @@ Returns:
*/
void DataStore::savePaymentManagementObservers(util::Map& observers)
{
+ saveObservers(m_paymentManagementObservers, observers);
}
/*
@@ -512,6 +562,7 @@ Returns:
*/
void DataStore::saveInventoryManagementObservers(util::Map& observers)
{
+ saveObservers(m_inventoryManagementObservers, observers);
}
/*
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.h
index 3950b11..62c585d 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.h
@@ -86,6 +86,8 @@ private:
void saveRecords(MappingInfo& mapping, util::Map>& records);
template void clearCache(util::Map>&cache);
template void refreshCache(util::Map>&cache, util::Map>&refreshedCache);
+ util::Map getObservers(MappingInfo& mapping);
+ void saveObservers(MappingInfo& mapping, util::Map& observers);
};
/*
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp
index 4b151e3..0c5c7b1 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/sharedmemory/SharedMemory.cpp
@@ -320,7 +320,7 @@ bool SharedMemory::ensureCapacityForInsert(MappingInfo& mapping)
{
return true;
}
- return resizeMapping(mapping, capacity * 2);
+ return resizeMapping(mapping, capacity * config::file::GROWTH_FACTOR);
}
/*
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 1a9f753..102ba31 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.cpp
@@ -26,6 +26,7 @@ Date:19-May-2026
#include "User.h"
#include "UserManagementService.h"
#include "Utility.h"
+#include "DataStoreLockGuard.h"
/*
Function: purchaseService
@@ -122,6 +123,9 @@ Returns:
*/
void ServiceManagementService::attach(User* user)
{
+ DataStoreLockGuard lock(m_dataStore);
+ m_observers.clear();
+ m_observers = m_dataStore.getServiceManagementObservers();
if (user)
{
const std::string& userID = user->getId();
@@ -130,6 +134,7 @@ void ServiceManagementService::attach(User* user)
m_observers[userID] = user;
}
}
+ m_dataStore.saveServiceManagementObservers(m_observers);
}
/*
@@ -142,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();
@@ -150,6 +158,7 @@ void ServiceManagementService::detach(User* user)
m_observers.remove(userID);
}
}
+ m_dataStore.saveServiceManagementObservers(m_observers);
}
/*
@@ -166,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/ServiceManagementService.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h
index b2a4384..f1ff966 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/ServiceManagementService.h
@@ -53,6 +53,4 @@ public:
void saveServiceBookings();
void loadJobCards();
void saveJobCards();
- void loadObservers();
- void saveObservers();
};
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/UserManagementService.cpp
index 9b1c61c..1be3a40 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);
+ }
}
return notificationsVector;
}
@@ -208,20 +212,18 @@ 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).state = RecordState::MODIFIED;
- m_dataStore.saveNotifications();
+ Notification* notification = trackedNotificationsMap.getValueAt(notificationIndex).data;
+ if (notification->getRecipientUserId() == userID)
+ {
+ notification->setState(util::State::INACTIVE);
+ trackedNotificationsMap.getValueAt(notificationIndex).state = RecordState::MODIFIED;
+ m_dataStore.saveNotifications();
+ }
}
/*
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h
index 2eef19d..a2995b4 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/Config.h
@@ -29,6 +29,7 @@ namespace config
namespace file
{
const size_t INITIAL_CAPACITY = 100;
+ const size_t GROWTH_FACTOR = 2;
constexpr const char* DIRECTORY = "files/";
constexpr const char* INVENTORYITEM_FILE = "files/InventoryItem.dat";
constexpr const char* USER_FILE = "files/User.dat";