Compare commits

..

11 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
joelthomastrenser f484c62a1e Fix cache refresh handling for unsaved records
- Preserve NEW_RECORD entries during cache refresh
- Prevent accidental deletion of pending datastore changes
- Clean up only stale persisted records
2026-06-15 15:16:56 +05:30
joelthomastrenser 404d217504 Clean up legacy code
- Remove FileManager and related file-based persistence logic
- Remove obsolete observer persistence utilities
- Remove unused service APIs and includes
- Delete duplicate DataStore mutex stubs
- Perform general dead-code cleanup
2026-06-15 15:16:55 +05:30
joelthomastrenser 67ac7f6625 Implement Service Refactoring
<UserStory> 1954: Implement Service Refactoring </UserStory>

UserStory #1954

<Changes>
1. Refactored notification handling to persist notifications directly in the datastore instead of maintaining notification collections within User objects.
2. Removed recipient User pointer dependencies from Notification and retained recipient user identification through recipientUserId.
3. Implemented generic observer persistence support in DataStore with shared helper methods for loading and saving observer subscriptions.
4. Added datastore-backed observer management for ServiceManagementService, PaymentManagementService, and InventoryManagementService.
5. Updated attach() and detach() operations to load, modify, and persist observer subscriptions using shared memory mappings.
6. Refactored sendNotification() implementations to create and persist Notification records directly to the datastore for subscribed observers.
7. Updated UserManagementService notification retrieval and deletion logic to operate on datastore notification records filtered by recipient user ID.
8. Removed notification ownership and observer-specific notification APIs from User and Observer classes.
9. Added configurable shared memory growth factor support and updated mapping expansion logic to use centralized configuration values.
10. Removed obsolete NotificationManagementService implementation and updated project configuration references.
11. Added DataStoreLockGuard integration for observer and notification persistence operations to ensure synchronized datastore access.
</Changes>

<Test>
N/A
</Test>

<Review>
Sreeja Reghukumar, please review
</Review>
2026-06-15 15:16:55 +05:30
joelthomastrenser 5f4ee72ffe Implement Notification Model Refactoring
<UserStory> 1953: Model Refactoring </UserStory>

UserStory #1953

<Changes>
1. Replaced CSV-based Notification serialization and deserialization with SerializedNotification record-based serialization for shared memory storage.
2. Implemented Notification::serialize() to convert Notification objects into fixed-size SerializedNotification structures.
3. Implemented Notification::deserialize() to reconstruct Notification objects directly from SerializedNotification records.
4. Added Notification state persistence by introducing util::State support in constructors, serialization, and deserialization flows.
5. Updated Notification class interfaces to use SerializedNotification types instead of std::string serialization APIs.
6. Removed legacy CSV serialization support, including CSV parsing logic and header generation functionality.
7. Added SerializedNotification dependencies through SerializedRecords.h inclusion and forward declaration support.
8. Initialized Notification objects with ACTIVE state by default and added state getter/setter APIs.
</Changes>

<Test>
N/A
</Test>

<Review>
Sreeja Reghukumar, please review
</Review>
2026-06-15 15:16:55 +05:30
joelthomastrenser 1a4821ea8a Merged PR 1166: User Management Refactoring - 1925
User Story #1959
User Story #1960

**Changes**
- Refactored User serialization/deserialization to use SerializedUser.
- Removed user loading and saving responsibilities from UserManagementService.
- Added DataStoreLockGuard for automatic datastore locking/unlocking.
- Updated user operations to work with tracked records.
- Added persistence support for user creation, updates, notification changes, and user removal.
- Refactored notification handling to use datastore-managed notifications.
- Updated DataStore to load and save users and notifications using shared memory records.
- Reworked application startup and shutdown flow using Controller::initialize() and Controller::shutdown().
- Updated UI flow to use the new initialization and shutdown methods.
- Added required project and shared memory updates to support the refactoring.

Related work items: #1925, #1959, #1960
2026-06-15 15:16:15 +05:30
joelthomastrenser b5c8b1ee9b Implement review fixes 2026-06-15 14:46:37 +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
2 changed files with 16 additions and 5 deletions
@@ -10,6 +10,8 @@ Date:19-May-2026
#include <stdexcept> #include <stdexcept>
#include "AuthenticationManagementService.h" #include "AuthenticationManagementService.h"
#include "User.h" #include "User.h"
#include "Utility.h"
#include "DataStoreLockGuard.h"
User* AuthenticationManagementService::m_authenticatedUser = nullptr; 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) bool AuthenticationManagementService::login(const std::string& username, const std::string& password)
{ {
util::Map<std::string, User*> users = m_dataStore.getUsers(); DataStoreLockGuard lock(m_dataStore);
int usersMapSize = users.getSize(); auto& trackedUserMap = m_dataStore.getUsers();
for (int index = 0; index < usersMapSize; index++) 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 (username == user->getUserName())
{ {
if (password == user->getPassword()) if (password == user->getPassword())
@@ -74,9 +77,18 @@ Return type: void
*/ */
void AuthenticationManagementService::changePassword(const std::string& newPassword) void AuthenticationManagementService::changePassword(const std::string& newPassword)
{ {
DataStoreLockGuard lock(m_dataStore);
auto& trackedUsersMap = m_dataStore.getUsers();
if (m_authenticatedUser == nullptr) if (m_authenticatedUser == nullptr)
{ {
throw std::runtime_error("There is no user currently logged in!"); 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); m_authenticatedUser->setPassword(newPassword);
trackedUsersMap.getValueAt(index).state = RecordState::MODIFIED;
m_dataStore.saveUsers();
} }
@@ -180,7 +180,6 @@ util::Vector<Notification*> UserManagementService::getUserNotifications(const st
notificationsVector.push_back(notification); notificationsVector.push_back(notification);
} }
} }
m_dataStore.unlockDataStore();
return notificationsVector; return notificationsVector;
} }
else else