Compare commits

...

5 Commits

Author SHA1 Message Date
joelthomastrenser 0b8fc01dbd Merge branch 'develop' into develop-sm-authentication-management 2026-06-15 15:21:41 +05:30
joelthomastrenser 8c2a67a42c Merged PR 1167: Notification Management Refactoring - 1928
User Story #1953
User Story #1954

**Changes**
- Refactored Notification model to use SerializedNotification for shared memory persistence.
- Removed notification ownership from the User model and stored notifications separately in the DataStore.
- Added notification state tracking to support soft deletion.
- Updated notification creation, retrieval, and deletion flows to use DataStore-managed notifications.
- Refactored observer persistence for Service, Payment, and Inventory Management services to use shared memory mappings.
- Removed file-based observer loading and saving logic.
- Updated notification services to persist notifications directly through the DataStore.
- Added observer load/save support in DataStore.
- Removed legacy FileManager and file-based notification persistence utilities.
- Simplified observer interfaces and removed unused observer ID persistence methods.
- Updated application startup and shutdown flow to use DataStore initialization and cleanup.

Related work items: #1953, #1954
2026-06-15 15:17:22 +05:30
Avinash Rajesh d44cc86af0 Implement the review fixes 2026-06-15 14:43:48 +05:30
Avinash Rajesh 74dbbd9e82 Implement Service Refactoring
<UserStory> 1952: Service Refactoring </UserStory>
UserStory #1952
<Changes>

1. Enhanced DataStore::getUsers to load SerializedUser records, refresh cache,
   and attach notifications to recipient users with validation for recipient IDs.

2. Updated DataStore::saveUsers to persist SerializedUser records and save
   notifications alongside user data.

3. Refactored AuthenticationManagementService::login to use DataStoreLockGuard
   and tracked user map with SerializedUser-backed records.

4. Modified AuthenticationManagementService::changePassword to ensure thread-safe
   updates, mark user record as MODIFIED, and persist changes via DataStore::saveUsers.

5. Added dependencies for Utility.h and DataStoreLockGuard.h in
   AuthenticationManagementService.cpp to support safe record handling.

</Changes>

<Test>

N/A

</Test>

<Review>

Sreeja Reghukumar

</Review>
2026-06-12 14:38:28 +05:30
Avinash Rajesh 6dea303b92 Implement Model Refactoring
<UserStory> 1951: Model Refactoring</UserStory>

UserStory #1951

<Changes>

1. Replaced CSV-based serialization and deserialization in ComboPackage,
   JobCard, Service, and ServiceBooking models with fixed-size SerializedRecord
   structures for shared memory storage.

2. Implemented serialize() methods to convert objects into SerializedComboPackage,
   SerializedJobCard, SerializedService, and SerializedServiceBooking records.

3. Implemented deserialize() methods to reconstruct objects directly from
   SerializedRecord types instead of parsing CSV strings.

4. Updated model class interfaces to use SerializedRecord types, removing
   legacy CSV serialization APIs and header generation functions.

5. Added SerializedRecords.h dependencies and forward declarations for
   Serialized structures across affected models.

</Changes>

<Test>

N/A

</Test>

<Review>

Sreeja Reghukumar

</Review>
2026-06-12 11:09:35 +05:30
@@ -10,6 +10,8 @@ Date:19-May-2026
#include <stdexcept>
#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<std::string, User*> 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();
if (m_authenticatedUser == nullptr)
{
throw std::runtime_error("There is no user currently logged in!");
}
int index = trackedUsersMap.find(m_authenticatedUser->getId());
if (index == -1)
{
throw std::runtime_error("User does not exist!\n");
}
m_authenticatedUser->setPassword(newPassword);
trackedUsersMap.getValueAt(index).state = RecordState::MODIFIED;
m_dataStore.saveUsers();
}