diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj
index 6a269f5..7c4bfd3 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj
@@ -157,6 +157,7 @@
+
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters
index 7e74b19..94301c4 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem.vcxproj.filters
@@ -278,5 +278,8 @@
Header Files\DataStores\SharedMemory
+
+ Header Files\DataStores
+
\ 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 1cade32..f430184 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStore.cpp
@@ -228,6 +228,22 @@ Returns:
*/
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;
}
@@ -371,6 +387,8 @@ Returns:
*/
void DataStore::saveUsers()
{
+ saveRecords(m_users, m_userCache);
+ saveNotifications();
}
/*
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStoreLockGuard.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStoreLockGuard.h
new file mode 100644
index 0000000..2e04eb0
--- /dev/null
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/datastores/DataStoreLockGuard.h
@@ -0,0 +1,28 @@
+/*
+File: DataStoreLockGuard.h
+Description: Defines the DataStoreLockGuard class used to manage DataStore
+ locking and unlocking automatically within a scope.
+Author: Trenser
+Date: 12-June-2026
+*/
+
+#pragma once
+#include "DataStore.h"
+
+class DataStoreLockGuard
+{
+public:
+ explicit DataStoreLockGuard(DataStore& dataStore)
+ : m_dataStore(dataStore)
+ {
+ m_dataStore.lockDataStore();
+ }
+ ~DataStoreLockGuard()
+ {
+ m_dataStore.unlockDataStore();
+ }
+ DataStoreLockGuard(const DataStoreLockGuard&) = delete;
+ DataStoreLockGuard& operator=(const DataStoreLockGuard&) = delete;
+private:
+ DataStore& m_dataStore;
+};
\ No newline at end of file
diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp
index dc3a94c..27be89f 100644
--- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp
+++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/services/AuthenticationManagementService.cpp
@@ -10,6 +10,8 @@ Date:19-May-2026
#include
#include "AuthenticationManagementService.h"
#include "User.h"
+#include "Utility.h"
+#include "DataStoreLockGuard.h"
User* AuthenticationManagementService::m_authenticatedUser = nullptr;
@@ -24,11 +26,12 @@ Return type: bool - true if login successful, false otherwise
*/
bool AuthenticationManagementService::login(const std::string& username, const std::string& password)
{
- util::Map users = m_dataStore.getUsers();
- int usersMapSize = users.getSize();
- for (int index = 0; index < usersMapSize; index++)
+ DataStoreLockGuard lock(m_dataStore);
+ auto& trackedUserMap = m_dataStore.getUsers();
+ int trackedUserMapSize = trackedUserMap.getSize();
+ for (int index = 0; index < trackedUserMapSize; index++)
{
- User* user = users.getValueAt(index);
+ User* user = trackedUserMap.getValueAt(index).data;
if (username == user->getUserName())
{
if (password == user->getPassword())
@@ -74,9 +77,18 @@ Return type: void
*/
void AuthenticationManagementService::changePassword(const std::string& newPassword)
{
+ DataStoreLockGuard lock(m_dataStore);
+ auto& trackedUsersMap = m_dataStore.getUsers();
+ int index = trackedUsersMap.find(m_authenticatedUser->getId());
+ if (index == -1)
+ {
+ throw std::runtime_error("User does not exist!\n");
+ }
if (m_authenticatedUser == nullptr)
{
throw std::runtime_error("There is no user currently logged in!");
}
m_authenticatedUser->setPassword(newPassword);
+ trackedUsersMap.getValueAt(index).state = RecordState::MODIFIED;
+ m_dataStore.saveUsers();
}