changes
This commit is contained in:
-1
@@ -140,7 +140,6 @@
|
||||
<ClCompile Include="models\User.cpp" />
|
||||
<ClCompile Include="services\AuthenticationManagementService.cpp" />
|
||||
<ClCompile Include="services\InventoryManagementService.cpp" />
|
||||
<ClCompile Include="services\NotificationManagementService.cpp" />
|
||||
<ClCompile Include="services\PaymentManagementService.cpp" />
|
||||
<ClCompile Include="services\ServiceManagementService.cpp" />
|
||||
<ClCompile Include="services\UserManagementService.cpp" />
|
||||
|
||||
+3
-3
@@ -114,9 +114,6 @@
|
||||
<ClCompile Include="datastores\DataStore.cpp">
|
||||
<Filter>Source Files\DataStores</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="services\NotificationManagementService.cpp">
|
||||
<Filter>Source Files\Services</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="core\patterns\Observer.cpp">
|
||||
<Filter>Source Files\Core\Patterns</Filter>
|
||||
</ClCompile>
|
||||
@@ -278,5 +275,8 @@
|
||||
<ClInclude Include="datastores\sharedmemory\SharedMemory.h">
|
||||
<Filter>Header Files\DataStores\SharedMemory</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="datastores\DataStoreLockGuard.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -13,5 +13,4 @@ class Observer
|
||||
{
|
||||
public:
|
||||
virtual ~Observer() = default;
|
||||
virtual void addNotification(Notification* notification) = 0;
|
||||
};
|
||||
@@ -230,20 +230,6 @@ util::Map<std::string, TrackedRecord<User>>& DataStore::getUsers()
|
||||
{
|
||||
auto users = loadRecords<User, SerializedUser>(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<User, SerializedUser>(m_users, m_userCache);
|
||||
saveNotifications();
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<std::string, Notification*>& representing the notifications.
|
||||
*/
|
||||
util::Map<std::string, Notification*>& 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.
|
||||
|
||||
@@ -26,21 +26,19 @@ private:
|
||||
std::string m_name;
|
||||
std::string m_phone;
|
||||
std::string m_email;
|
||||
util::Map<std::string, Notification*> 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<std::string, Notification*>& 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;
|
||||
|
||||
+29
-21
@@ -19,7 +19,7 @@ Date: 22-May-2026
|
||||
#include "User.h"
|
||||
#include "Utility.h"
|
||||
#include "Vector.h"
|
||||
|
||||
#include "DataStoreLockGuard.h"
|
||||
|
||||
util::Map<std::string, User*> 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<Notification>(
|
||||
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<Notification>(
|
||||
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();
|
||||
}
|
||||
|
||||
|
||||
-1
@@ -1 +0,0 @@
|
||||
#include "NotificationManagementService.h"
|
||||
+29
-20
@@ -21,6 +21,7 @@ Date: 20-May-2026
|
||||
#include "Timestamp.h"
|
||||
#include "User.h"
|
||||
#include "Utility.h"
|
||||
#include "DataStoreLockGuard.h"
|
||||
|
||||
util::Map<std::string, User*> 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<Notification>(
|
||||
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<Notification>(
|
||||
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();
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+27
-46
@@ -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<Notification>(
|
||||
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<std::string>: Vector of observer user IDs
|
||||
*/
|
||||
util::Vector<std::string> ServiceManagementService::getObserverIDs()
|
||||
{
|
||||
util::Vector<std::string> 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<Notification>(
|
||||
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();
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
+8
-9
@@ -170,12 +170,16 @@ util::Vector<Notification*> 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<Notification*> 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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user