This is an automated email from the ASF dual-hosted git repository.

lahirujayathilake pushed a commit to branch access-integration
in repository https://gitbox.apache.org/repos/asf/airavata-custos.git

commit 04e2e69df2179dc6deb7af7b7ea0f2a4740a3228
Author: lahiruj <[email protected]>
AuthorDate: Fri Mar 27 12:18:49 2026 -0400

    add eventId to handler interface and audit logging to packet handlers
---
 .../handler/amie/DataAccountCreateHandler.java     | 14 ++++++++++--
 .../handler/amie/DataProjectCreateHandler.java     | 14 ++++++++++--
 .../amie/InformTransactionCompleteHandler.java     | 14 +++++++++++-
 .../ci/service/handler/amie/NoOpHandler.java       |  2 +-
 .../ci/service/handler/amie/PacketHandler.java     |  3 ++-
 .../ci/service/handler/amie/PacketRouter.java      |  7 ++++--
 .../handler/amie/RequestAccountCreateHandler.java  | 21 ++++++++++++++++--
 .../amie/RequestAccountInactivateHandler.java      | 15 +++++++++++--
 .../amie/RequestAccountReactivateHandler.java      | 15 +++++++++++--
 .../handler/amie/RequestPersonMergeHandler.java    | 14 ++++++++++--
 .../handler/amie/RequestProjectCreateHandler.java  | 25 ++++++++++++++++++++--
 .../amie/RequestProjectInactivateHandler.java      | 22 ++++++++++++++++---
 .../amie/RequestProjectReactivateHandler.java      | 22 ++++++++++++++++---
 .../handler/amie/RequestUserModifyHandler.java     | 17 +++++++++++++--
 .../handler/amie/DataAccountCreateHandlerTest.java | 18 ++++++++++------
 .../handler/amie/DataProjectCreateHandlerTest.java | 18 ++++++++++------
 .../amie/InformTransactionCompleteHandlerTest.java | 15 ++++++++-----
 .../ci/service/handler/amie/NoOpHandlerTest.java   |  6 +++---
 .../ci/service/handler/amie/PacketRouterTest.java  | 24 ++++++++++-----------
 .../amie/RequestAccountCreateHandlerTest.java      | 14 +++++++-----
 .../amie/RequestAccountInactivateHandlerTest.java  | 18 ++++++++++------
 .../amie/RequestAccountReactivateHandlerTest.java  | 16 ++++++++------
 .../amie/RequestPersonMergeHandlerTest.java        | 18 ++++++++++------
 .../amie/RequestProjectCreateHandlerTest.java      | 16 ++++++++------
 .../amie/RequestProjectInactivateHandlerTest.java  | 14 +++++++-----
 .../amie/RequestProjectReactivateHandlerTest.java  | 14 +++++++-----
 .../handler/amie/RequestUserModifyHandlerTest.java | 18 ++++++++++------
 27 files changed, 305 insertions(+), 109 deletions(-)

diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/DataAccountCreateHandler.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/DataAccountCreateHandler.java
index 943f26a45..d50d1e45b 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/DataAccountCreateHandler.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/DataAccountCreateHandler.java
@@ -20,7 +20,9 @@ package org.apache.custos.access.ci.service.handler.amie;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
+import org.apache.custos.access.ci.service.model.amie.AuditAction;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.PersonService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,10 +44,12 @@ public class DataAccountCreateHandler implements 
PacketHandler {
 
     private final AmieClient amieClient;
     private final PersonService personService;
+    private final AuditService auditService;
 
-    public DataAccountCreateHandler(AmieClient amieClient, PersonService 
personService) {
+    public DataAccountCreateHandler(AmieClient amieClient, PersonService 
personService, AuditService auditService) {
         this.amieClient = amieClient;
         this.personService = personService;
+        this.auditService = auditService;
     }
 
     @Override
@@ -54,7 +58,7 @@ public class DataAccountCreateHandler implements 
PacketHandler {
     }
 
     @Override
-    public void handle(JsonNode packetJson, PacketEntity packetEntity) {
+    public void handle(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) {
         LOGGER.info("Starting 'data_account_create' handler for packet amie_id 
[{}].", packetEntity.getAmieId());
 
         JsonNode body = packetJson.path("body");
@@ -69,10 +73,16 @@ public class DataAccountCreateHandler implements 
PacketHandler {
         if (dnList.isArray() && !dnList.isEmpty()) {
             LOGGER.info("Persisting DnList for person [{}] from 
data_account_create.", personId);
             personService.persistDnsForPerson(personId, dnList);
+            auditService.log(packetEntity.getId(), eventId, 
AuditAction.PERSIST_DNS,
+                    "person", personId,
+                    "Persisted " + dnList.size() + " DN(s) for person " + 
personId + " from data_account_create");
         }
 
         // Send the 'inform_transaction_complete' reply to close the 
transaction.
         sendSuccessReply(packetEntity.getAmieId());
+        auditService.log(packetEntity.getId(), eventId, AuditAction.REPLY_SENT,
+                "packet", packetEntity.getId(),
+                "Sent inform_transaction_complete reply for 
data_account_create");
     }
 
     private void sendSuccessReply(long packetRecId) {
diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/DataProjectCreateHandler.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/DataProjectCreateHandler.java
index 2a96d05dc..6ea5db41e 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/DataProjectCreateHandler.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/DataProjectCreateHandler.java
@@ -20,7 +20,9 @@ package org.apache.custos.access.ci.service.handler.amie;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
+import org.apache.custos.access.ci.service.model.amie.AuditAction;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.PersonService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,10 +42,12 @@ public class DataProjectCreateHandler implements 
PacketHandler {
 
     private final AmieClient amieClient;
     private final PersonService personService;
+    private final AuditService auditService;
 
-    public DataProjectCreateHandler(AmieClient amieClient, PersonService 
personService) {
+    public DataProjectCreateHandler(AmieClient amieClient, PersonService 
personService, AuditService auditService) {
         this.amieClient = amieClient;
         this.personService = personService;
+        this.auditService = auditService;
     }
 
     @Override
@@ -52,7 +56,7 @@ public class DataProjectCreateHandler implements 
PacketHandler {
     }
 
     @Override
-    public void handle(JsonNode packetJson, PacketEntity packetEntity) {
+    public void handle(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) {
         LOGGER.info("Starting 'data_project_create' handler for packet amie_id 
[{}].", packetEntity.getAmieId());
 
         JsonNode body = packetJson.path("body");
@@ -67,9 +71,15 @@ public class DataProjectCreateHandler implements 
PacketHandler {
         if (dnList.isArray() && !dnList.isEmpty()) {
             LOGGER.info("Persisting DnList for person [{}] from 
data_project_create.", personId);
             personService.persistDnsForPerson(personId, dnList);
+            auditService.log(packetEntity.getId(), eventId, 
AuditAction.PERSIST_DNS,
+                    "person", personId,
+                    "Persisted " + dnList.size() + " DN(s) for person " + 
personId + " from data_project_create");
         }
 
         sendSuccessReply(packetEntity.getAmieId());
+        auditService.log(packetEntity.getId(), eventId, AuditAction.REPLY_SENT,
+                "packet", packetEntity.getId(),
+                "Sent inform_transaction_complete reply for 
data_project_create");
     }
 
     private void sendSuccessReply(long packetRecId) {
diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/InformTransactionCompleteHandler.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/InformTransactionCompleteHandler.java
index e9b5b555c..8300c2be7 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/InformTransactionCompleteHandler.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/InformTransactionCompleteHandler.java
@@ -19,7 +19,9 @@
 package org.apache.custos.access.ci.service.handler.amie;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import org.apache.custos.access.ci.service.model.amie.AuditAction;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -34,13 +36,19 @@ public class InformTransactionCompleteHandler implements 
PacketHandler {
 
     private static final Logger LOGGER = 
LoggerFactory.getLogger(InformTransactionCompleteHandler.class);
 
+    private final AuditService auditService;
+
+    public InformTransactionCompleteHandler(AuditService auditService) {
+        this.auditService = auditService;
+    }
+
     @Override
     public String supportsType() {
         return "inform_transaction_complete";
     }
 
     @Override
-    public void handle(JsonNode packetJson, PacketEntity packetEntity) {
+    public void handle(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) {
         // This packet is purely informational and completes the transaction
         JsonNode body = packetJson.path("body");
         String statusCode = body.path("StatusCode").asText("Unknown");
@@ -48,5 +56,9 @@ public class InformTransactionCompleteHandler implements 
PacketHandler {
 
         LOGGER.info("Received 'inform_transaction_complete' for packet amie_id 
[{}]. Status: [{}], Message: [{}]. Transaction is now closed.",
                 packetEntity.getAmieId(), statusCode, message);
+
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.TRANSACTION_COMPLETE,
+                "packet", packetEntity.getId(),
+                "Transaction complete received. Status: " + statusCode);
     }
 }
diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/NoOpHandler.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/NoOpHandler.java
index d391c9fb8..bf0ce659f 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/NoOpHandler.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/NoOpHandler.java
@@ -33,7 +33,7 @@ public class NoOpHandler implements PacketHandler {
     private static final Logger LOGGER = 
LoggerFactory.getLogger(NoOpHandler.class);
 
     @Override
-    public void handle(JsonNode packetJson, PacketEntity packetEntity) {
+    public void handle(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) {
         LOGGER.info("NoOpHandler executed for packet with amie_packet_rec_id 
[{}] and type [{}]. No action taken.", packetEntity.getAmieId(), 
packetEntity.getType());
         // No operations
     }
diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/PacketHandler.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/PacketHandler.java
index 16ef89cf9..a984204ab 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/PacketHandler.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/PacketHandler.java
@@ -28,9 +28,10 @@ public interface PacketHandler {
      *
      * @param packetJson   The raw packet content
      * @param packetEntity The entity for the packet
+     * @param eventId      The processing event ID for audit logging
      * @throws Exception if processing fails
      */
-    void handle(JsonNode packetJson, PacketEntity packetEntity) throws 
Exception;
+    void handle(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) throws Exception;
 
     /**
      * Define which packet type this handler is responsible for.
diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/PacketRouter.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/PacketRouter.java
index 8b7716d88..8b9255ea4 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/PacketRouter.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/PacketRouter.java
@@ -20,6 +20,7 @@ package org.apache.custos.access.ci.service.handler.amie;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.slf4j.MDC;
 import org.springframework.stereotype.Component;
 
 import java.util.List;
@@ -43,11 +44,13 @@ public class PacketRouter {
      *
      * @param packetJson   The raw packet content
      * @param packetEntity The Packet entity
+     * @param eventId      The processing event ID for audit logging
      * @throws Exception if the handler logic fails
      */
-    public void route(JsonNode packetJson, PacketEntity packetEntity) throws 
Exception {
+    public void route(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) throws Exception {
         PacketHandler handler = findHandlerFor(packetEntity.getType());
-        handler.handle(packetJson, packetEntity);
+        MDC.put("handler", handler.getClass().getSimpleName());
+        handler.handle(packetJson, packetEntity, eventId);
     }
 
     private PacketHandler findHandlerFor(String packetType) {
diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountCreateHandler.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountCreateHandler.java
index 3aa10ea3b..a43017720 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountCreateHandler.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountCreateHandler.java
@@ -22,7 +22,9 @@ import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
 import org.apache.custos.access.ci.service.model.ClusterAccountEntity;
 import org.apache.custos.access.ci.service.model.PersonEntity;
+import org.apache.custos.access.ci.service.model.amie.AuditAction;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.PersonService;
 import org.apache.custos.access.ci.service.service.ProjectMembershipService;
 import org.apache.custos.access.ci.service.service.ProjectService;
@@ -52,15 +54,17 @@ public class RequestAccountCreateHandler implements 
PacketHandler {
     private final UserAccountService userAccountService;
     private final ProjectService projectService;
     private final ProjectMembershipService membershipService;
+    private final AuditService auditService;
 
     public RequestAccountCreateHandler(AmieClient amieClient, PersonService 
personService,
                                        UserAccountService userAccountService, 
ProjectService projectService,
-                                       ProjectMembershipService 
membershipService) {
+                                       ProjectMembershipService 
membershipService, AuditService auditService) {
         this.amieClient = amieClient;
         this.personService = personService;
         this.userAccountService = userAccountService;
         this.projectService = projectService;
         this.membershipService = membershipService;
+        this.auditService = auditService;
     }
 
     @Override
@@ -69,7 +73,7 @@ public class RequestAccountCreateHandler implements 
PacketHandler {
     }
 
     @Override
-    public void handle(JsonNode packetJson, PacketEntity packetEntity) throws 
Exception {
+    public void handle(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) throws Exception {
         LOGGER.info("Starting 'request_account_create' handler for packet 
amie_id [{}].", packetEntity.getAmieId());
 
         JsonNode body = packetJson.path("body");
@@ -84,17 +88,30 @@ public class RequestAccountCreateHandler implements 
PacketHandler {
 
         PersonEntity person = personService.findOrCreatePersonFromPacket(body);
         LOGGER.info("Ensured person record exists with local ID [{}].", 
person.getId());
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.CREATE_PERSON,
+                "person", person.getId(),
+                "Created person '" + person.getFirstName() + " " + 
person.getLastName() + "'");
 
         ClusterAccountEntity clusterAccount = 
userAccountService.provisionClusterAccount(person);
         LOGGER.info("Provisioned new cluster account [{}] with username 
[{}].", clusterAccount.getId(), clusterAccount.getUsername());
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.CREATE_ACCOUNT,
+                "account", clusterAccount.getId(),
+                "Created cluster account '" + clusterAccount.getUsername() + 
"' for person " + person.getId());
 
         projectService.createOrFindProject(projectId, grantNumber);
         LOGGER.info("Ensured project [{}] exists.", projectId);
 
         membershipService.createMembership(projectId, clusterAccount.getId(), 
"USER");
         LOGGER.info("Created 'USER' membership for cluster account [{}] on 
project [{}].", clusterAccount.getId(), projectId);
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.CREATE_MEMBERSHIP,
+                "membership", clusterAccount.getId(),
+                "Created USER membership for account " + 
clusterAccount.getId() + " on project " + projectId);
 
         sendSuccessReply(packetEntity.getAmieId(), body, person.getId(), 
clusterAccount.getUsername());
+        auditService.log(packetEntity.getId(), eventId, AuditAction.REPLY_SENT,
+                "packet", packetEntity.getId(),
+                "Sent notify_account_create reply for project " + projectId);
+
         LOGGER.info("Successfully completed 'request_account_create' handler 
and sent reply for packet amie_id [{}].", packetEntity.getAmieId());
     }
 
diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountInactivateHandler.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountInactivateHandler.java
index 03dffbf53..842036cd0 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountInactivateHandler.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountInactivateHandler.java
@@ -20,7 +20,9 @@ package org.apache.custos.access.ci.service.handler.amie;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
+import org.apache.custos.access.ci.service.model.amie.AuditAction;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.ProjectMembershipService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,10 +47,13 @@ public class RequestAccountInactivateHandler implements 
PacketHandler {
 
     private final AmieClient amieClient;
     private final ProjectMembershipService membershipService;
+    private final AuditService auditService;
 
-    public RequestAccountInactivateHandler(AmieClient amieClient, 
ProjectMembershipService membershipService) {
+    public RequestAccountInactivateHandler(AmieClient amieClient, 
ProjectMembershipService membershipService,
+                                           AuditService auditService) {
         this.amieClient = amieClient;
         this.membershipService = membershipService;
+        this.auditService = auditService;
     }
 
     @Override
@@ -57,7 +62,7 @@ public class RequestAccountInactivateHandler implements 
PacketHandler {
     }
 
     @Override
-    public void handle(JsonNode packetJson, PacketEntity packetEntity) {
+    public void handle(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) {
         LOGGER.info("Starting 'request_account_inactivate' handler for packet 
amie_id [{}].", packetEntity.getAmieId());
 
         JsonNode body = packetJson.path("body");
@@ -69,8 +74,14 @@ public class RequestAccountInactivateHandler implements 
PacketHandler {
         LOGGER.info("Packet validated. Inactivating account for user [{}] on 
project [{}].", personId, projectId);
 
         membershipService.inactivateMembershipsByPersonAndProject(projectId, 
personId);
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.INACTIVATE_MEMBERSHIP,
+                "person", personId,
+                "Inactivated membership for person " + personId + " on project 
" + projectId);
 
         sendSuccessReply(packetEntity.getAmieId(), body);
+        auditService.log(packetEntity.getId(), eventId, AuditAction.REPLY_SENT,
+                "packet", packetEntity.getId(),
+                "Sent notify_account_inactivate reply for person " + personId 
+ " on project " + projectId);
 
         LOGGER.info("Successfully completed 'request_account_inactivate' 
handler and sent reply for packet amie_id [{}].", packetEntity.getAmieId());
     }
diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountReactivateHandler.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountReactivateHandler.java
index 28103a5a2..ecd87b557 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountReactivateHandler.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountReactivateHandler.java
@@ -19,7 +19,9 @@ package org.apache.custos.access.ci.service.handler.amie;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
+import org.apache.custos.access.ci.service.model.amie.AuditAction;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.ProjectMembershipService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -44,10 +46,13 @@ public class RequestAccountReactivateHandler implements 
PacketHandler {
 
     private final AmieClient amieClient;
     private final ProjectMembershipService membershipService;
+    private final AuditService auditService;
 
-    public RequestAccountReactivateHandler(AmieClient amieClient, 
ProjectMembershipService membershipService) {
+    public RequestAccountReactivateHandler(AmieClient amieClient, 
ProjectMembershipService membershipService,
+                                           AuditService auditService) {
         this.amieClient = amieClient;
         this.membershipService = membershipService;
+        this.auditService = auditService;
     }
 
     @Override
@@ -56,7 +61,7 @@ public class RequestAccountReactivateHandler implements 
PacketHandler {
     }
 
     @Override
-    public void handle(JsonNode packetJson, PacketEntity packetEntity) {
+    public void handle(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) {
         LOGGER.info("Starting 'request_account_reactivate' handler for packet 
amie_id [{}].", packetEntity.getAmieId());
 
         JsonNode body = packetJson.path("body");
@@ -68,8 +73,14 @@ public class RequestAccountReactivateHandler implements 
PacketHandler {
         LOGGER.info("Packet validated. Reactivating account for user [{}] on 
project [{}].", personId, projectId);
 
         membershipService.reactivateMembershipsByPersonAndProject(projectId, 
personId);
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.REACTIVATE_MEMBERSHIP,
+                "person", personId,
+                "Reactivated membership for person " + personId + " on project 
" + projectId);
 
         sendSuccessReply(packetEntity.getAmieId(), body);
+        auditService.log(packetEntity.getId(), eventId, AuditAction.REPLY_SENT,
+                "packet", packetEntity.getId(),
+                "Sent notify_account_reactivate reply for person " + personId 
+ " on project " + projectId);
 
         LOGGER.info("Successfully completed 'request_account_reactivate' 
handler and sent reply for packet amie_id [{}].", packetEntity.getAmieId());
     }
diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestPersonMergeHandler.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestPersonMergeHandler.java
index 3f539e2c5..9e1240baa 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestPersonMergeHandler.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestPersonMergeHandler.java
@@ -20,7 +20,9 @@ package org.apache.custos.access.ci.service.handler.amie;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
+import org.apache.custos.access.ci.service.model.amie.AuditAction;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.PersonService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,10 +49,12 @@ public class RequestPersonMergeHandler implements 
PacketHandler {
 
     private final AmieClient amieClient;
     private final PersonService personService;
+    private final AuditService auditService;
 
-    public RequestPersonMergeHandler(AmieClient amieClient, PersonService 
personService) {
+    public RequestPersonMergeHandler(AmieClient amieClient, PersonService 
personService, AuditService auditService) {
         this.amieClient = amieClient;
         this.personService = personService;
+        this.auditService = auditService;
     }
 
     @Override
@@ -60,7 +64,7 @@ public class RequestPersonMergeHandler implements 
PacketHandler {
 
     @Override
     @Transactional
-    public void handle(JsonNode packetJson, PacketEntity packetEntity) {
+    public void handle(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) {
         LOGGER.info("Starting 'request_person_merge' handler for packet 
amie_id [{}].", packetEntity.getAmieId());
 
         JsonNode body = packetJson.path("body");
@@ -75,8 +79,14 @@ public class RequestPersonMergeHandler implements 
PacketHandler {
                 retiringPersonLocalId, retiringPersonGlobalId, 
survivingPersonLocalId, survivingPersonGlobalId);
 
         personService.mergePersons(survivingPersonLocalId, 
retiringPersonLocalId);
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.MERGE_PERSONS,
+                "person", survivingPersonLocalId,
+                "Merged person " + retiringPersonLocalId + " into " + 
survivingPersonLocalId);
 
         sendSuccessReply(packetEntity.getAmieId());
+        auditService.log(packetEntity.getId(), eventId, AuditAction.REPLY_SENT,
+                "packet", packetEntity.getId(),
+                "Sent inform_transaction_complete reply for person merge");
     }
 
     private void sendSuccessReply(long packetRecId) {
diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectCreateHandler.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectCreateHandler.java
index a2fb6d8b9..d312db3f4 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectCreateHandler.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectCreateHandler.java
@@ -24,7 +24,9 @@ import 
org.apache.custos.access.ci.service.client.amie.AmieClient;
 import org.apache.custos.access.ci.service.model.ClusterAccountEntity;
 import org.apache.custos.access.ci.service.model.PersonEntity;
 import org.apache.custos.access.ci.service.model.ProjectEntity;
+import org.apache.custos.access.ci.service.model.amie.AuditAction;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.PersonService;
 import org.apache.custos.access.ci.service.service.ProjectMembershipService;
 import org.apache.custos.access.ci.service.service.ProjectService;
@@ -50,14 +52,17 @@ public class RequestProjectCreateHandler implements 
PacketHandler {
     private final UserAccountService userAccountService;
     private final ProjectService projectService;
     private final ProjectMembershipService membershipService;
+    private final AuditService auditService;
 
     public RequestProjectCreateHandler(AmieClient amieClient, PersonService 
personService, UserAccountService userAccountService,
-                                       ProjectService projectService, 
ProjectMembershipService membershipService) {
+                                       ProjectService projectService, 
ProjectMembershipService membershipService,
+                                       AuditService auditService) {
         this.amieClient = amieClient;
         this.personService = personService;
         this.userAccountService = userAccountService;
         this.projectService = projectService;
         this.membershipService = membershipService;
+        this.auditService = auditService;
     }
 
     @Override
@@ -66,7 +71,7 @@ public class RequestProjectCreateHandler implements 
PacketHandler {
     }
 
     @Override
-    public void handle(JsonNode packetJson, PacketEntity packetEntity) throws 
Exception {
+    public void handle(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) throws Exception {
         LOGGER.info("Starting 'request_project_create' handler for packet 
amie_id [{}].", packetEntity.getAmieId());
 
         // TODO - refactor the sanity checks into Packet Router (if all the 
packets follow the same style)
@@ -96,18 +101,34 @@ public class RequestProjectCreateHandler implements 
PacketHandler {
         ObjectNode piAsUserNode = createPiAsUserNode(body);
         PersonEntity piPerson = 
personService.findOrCreatePersonFromPacket(piAsUserNode);
         LOGGER.info("PI person record exists with local ID [{}].", 
piPerson.getId());
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.CREATE_PERSON,
+                "person", piPerson.getId(),
+                "Created person '" + piPerson.getFirstName() + " " + 
piPerson.getLastName() + "'");
 
         ClusterAccountEntity piClusterAccount = 
userAccountService.provisionClusterAccount(piPerson);
         LOGGER.info("Provisioned cluster account for PI [{}] with username 
[{}].", piPerson.getId(), piClusterAccount.getUsername());
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.CREATE_ACCOUNT,
+                "account", piClusterAccount.getId(),
+                "Created cluster account '" + piClusterAccount.getUsername() + 
"' for person " + piPerson.getId());
 
         String localProjectId = "PRJ-" + grantNumber;
         ProjectEntity project = 
projectService.createOrFindProject(localProjectId, grantNumber);
         LOGGER.info("Project [{}] exists.", project.getId());
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.CREATE_PROJECT,
+                "project", project.getId(),
+                "Created project '" + project.getId() + "' for grant " + 
grantNumber);
 
         membershipService.createMembership(project.getId(), 
piClusterAccount.getId(), "PI");
         LOGGER.info("Created 'PI' membership for cluster account [{}] on 
project [{}].", piClusterAccount.getId(), project.getId());
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.CREATE_MEMBERSHIP,
+                "membership", piClusterAccount.getId(),
+                "Created PI membership for account " + 
piClusterAccount.getId() + " on project " + project.getId());
 
         sendSuccessReply(packetEntity.getAmieId(), body, project.getId(), 
piPerson.getId(), piClusterAccount.getUsername());
+        auditService.log(packetEntity.getId(), eventId, AuditAction.REPLY_SENT,
+                "packet", packetEntity.getId(),
+                "Sent notify_project_create reply for grant " + grantNumber);
+
         LOGGER.info("Successfully completed 'request_project_create' handler 
and sent reply for packet amie_id [{}].", packetEntity.getAmieId());
     }
 
diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectInactivateHandler.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectInactivateHandler.java
index 542418f83..710170329 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectInactivateHandler.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectInactivateHandler.java
@@ -20,7 +20,9 @@ package org.apache.custos.access.ci.service.handler.amie;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
+import org.apache.custos.access.ci.service.model.amie.AuditAction;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.ProjectMembershipService;
 import org.apache.custos.access.ci.service.service.ProjectService;
 import org.slf4j.Logger;
@@ -42,11 +44,14 @@ public class RequestProjectInactivateHandler implements 
PacketHandler {
     private final AmieClient amieClient;
     private final ProjectService projectService;
     private final ProjectMembershipService membershipService;
+    private final AuditService auditService;
 
-    public RequestProjectInactivateHandler(AmieClient amieClient, 
ProjectService projectService, ProjectMembershipService membershipService) {
+    public RequestProjectInactivateHandler(AmieClient amieClient, 
ProjectService projectService,
+                                           ProjectMembershipService 
membershipService, AuditService auditService) {
         this.amieClient = amieClient;
         this.projectService = projectService;
         this.membershipService = membershipService;
+        this.auditService = auditService;
     }
 
     @Override
@@ -55,7 +60,7 @@ public class RequestProjectInactivateHandler implements 
PacketHandler {
     }
 
     @Override
-    public void handle(JsonNode packetJson, PacketEntity packetEntity) {
+    public void handle(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) {
         LOGGER.info("Starting 'request_project_inactivate' handler for packet 
amie_id [{}].", packetEntity.getAmieId());
 
         JsonNode body = packetJson.path("body");
@@ -65,10 +70,21 @@ public class RequestProjectInactivateHandler implements 
PacketHandler {
         LOGGER.info("Packet validated. ProjectID to inactivate: [{}].", 
projectId);
 
         projectService.inactivateProject(projectId);
+        LOGGER.info("Inactivated project [{}].", projectId);
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.INACTIVATE_PROJECT,
+                "project", projectId,
+                "Inactivated project " + projectId);
+
         membershipService.inactivateAllMembershipsForProject(projectId);
-        LOGGER.info("Inactivated project [{}] and all associated 
memberships.", projectId);
+        LOGGER.info("Inactivated all memberships for project [{}].", 
projectId);
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.INACTIVATE_MEMBERSHIP,
+                "project", projectId,
+                "Inactivated all memberships for project " + projectId);
 
         sendSuccessReply(packetEntity.getAmieId(), body);
+        auditService.log(packetEntity.getId(), eventId, AuditAction.REPLY_SENT,
+                "packet", packetEntity.getId(),
+                "Sent notify_project_inactivate reply for project " + 
projectId);
 
         LOGGER.info("Successfully completed 'request_project_inactivate' 
handler and sent reply for packet amie_id [{}].", packetEntity.getAmieId());
     }
diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectReactivateHandler.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectReactivateHandler.java
index e842418a8..c2ec02b68 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectReactivateHandler.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectReactivateHandler.java
@@ -20,7 +20,9 @@ package org.apache.custos.access.ci.service.handler.amie;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
+import org.apache.custos.access.ci.service.model.amie.AuditAction;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.ProjectMembershipService;
 import org.apache.custos.access.ci.service.service.ProjectService;
 import org.slf4j.Logger;
@@ -45,11 +47,14 @@ public class RequestProjectReactivateHandler implements 
PacketHandler {
     private final AmieClient amieClient;
     private final ProjectService projectService;
     private final ProjectMembershipService membershipService;
+    private final AuditService auditService;
 
-    public RequestProjectReactivateHandler(AmieClient amieClient, 
ProjectService projectService, ProjectMembershipService membershipService) {
+    public RequestProjectReactivateHandler(AmieClient amieClient, 
ProjectService projectService,
+                                           ProjectMembershipService 
membershipService, AuditService auditService) {
         this.amieClient = amieClient;
         this.projectService = projectService;
         this.membershipService = membershipService;
+        this.auditService = auditService;
     }
 
     @Override
@@ -59,7 +64,7 @@ public class RequestProjectReactivateHandler implements 
PacketHandler {
 
 
     @Override
-    public void handle(JsonNode packetJson, PacketEntity packetEntity) {
+    public void handle(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) {
         LOGGER.info("Starting 'request_project_reactivate' handler for packet 
amie_id [{}].", packetEntity.getAmieId());
 
         JsonNode body = packetJson.path("body");
@@ -69,10 +74,21 @@ public class RequestProjectReactivateHandler implements 
PacketHandler {
         LOGGER.info("Packet validated. ProjectID to reactivate: [{}].", 
projectId);
 
         projectService.reactivateProject(projectId);
+        LOGGER.info("Reactivated project [{}].", projectId);
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.REACTIVATE_PROJECT,
+                "project", projectId,
+                "Reactivated project " + projectId);
+
         membershipService.reactivatePiMembership(projectId);
-        LOGGER.info("Reactivated project [{}] and PI membership(s).", 
projectId);
+        LOGGER.info("Reactivated PI membership(s) for project [{}].", 
projectId);
+        auditService.log(packetEntity.getId(), eventId, 
AuditAction.REACTIVATE_MEMBERSHIP,
+                "project", projectId,
+                "Reactivated PI membership(s) for project " + projectId);
 
         sendSuccessReply(packetEntity.getAmieId(), body);
+        auditService.log(packetEntity.getId(), eventId, AuditAction.REPLY_SENT,
+                "packet", packetEntity.getId(),
+                "Sent notify_project_reactivate reply for project " + 
projectId);
 
         LOGGER.info("Successfully completed 'request_project_reactivate' 
handler and sent reply for packet amie_id [{}].", packetEntity.getAmieId());
     }
diff --git 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestUserModifyHandler.java
 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestUserModifyHandler.java
index 8c04270e4..397e248ad 100644
--- 
a/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestUserModifyHandler.java
+++ 
b/allocations/access-ci-service/src/main/java/org/apache/custos/access/ci/service/handler/amie/RequestUserModifyHandler.java
@@ -20,7 +20,9 @@ package org.apache.custos.access.ci.service.handler.amie;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
+import org.apache.custos.access.ci.service.model.amie.AuditAction;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.PersonService;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,10 +42,12 @@ public class RequestUserModifyHandler implements 
PacketHandler {
 
     private final AmieClient amieClient;
     private final PersonService personService;
+    private final AuditService auditService;
 
-    public RequestUserModifyHandler(AmieClient amieClient, PersonService 
personService) {
+    public RequestUserModifyHandler(AmieClient amieClient, PersonService 
personService, AuditService auditService) {
         this.amieClient = amieClient;
         this.personService = personService;
+        this.auditService = auditService;
     }
 
     @Override
@@ -52,7 +56,7 @@ public class RequestUserModifyHandler implements 
PacketHandler {
     }
 
     @Override
-    public void handle(JsonNode packetJson, PacketEntity packetEntity) throws 
Exception {
+    public void handle(JsonNode packetJson, PacketEntity packetEntity, String 
eventId) throws Exception {
         LOGGER.info("Starting 'request_user_modify' handler for packet amie_id 
[{}].", packetEntity.getAmieId());
 
         JsonNode body = packetJson.path("body");
@@ -62,15 +66,24 @@ public class RequestUserModifyHandler implements 
PacketHandler {
         switch (actionType.toLowerCase()) {
             case "replace":
                 personService.replaceFromModifyPacket(body);
+                auditService.log(packetEntity.getId(), eventId, 
AuditAction.UPDATE_PERSON,
+                        "person", body.path("UserGlobalID").asText(null),
+                        "Updated person via request_user_modify (replace)");
                 break;
             case "delete":
                 personService.deleteFromModifyPacket(body);
+                auditService.log(packetEntity.getId(), eventId, 
AuditAction.DELETE_PERSON,
+                        "person", body.path("UserGlobalID").asText(null),
+                        "Deleted person via request_user_modify (delete)");
                 break;
             default:
                 throw new IllegalArgumentException("Unsupported ActionType: " 
+ actionType);
         }
 
         sendSuccessReply(packetEntity.getAmieId());
+        auditService.log(packetEntity.getId(), eventId, AuditAction.REPLY_SENT,
+                "packet", packetEntity.getId(),
+                "Sent inform_transaction_complete reply for 
request_user_modify (" + actionType + ")");
     }
 
     private void sendSuccessReply(long packetRecId) {
diff --git 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/DataAccountCreateHandlerTest.java
 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/DataAccountCreateHandlerTest.java
index ded76306d..190bbd7f2 100644
--- 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/DataAccountCreateHandlerTest.java
+++ 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/DataAccountCreateHandlerTest.java
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.PersonService;
 import org.apache.custos.access.ci.service.util.JsonTestUtils;
 import org.junit.jupiter.api.BeforeEach;
@@ -52,12 +53,15 @@ class DataAccountCreateHandlerTest {
     @Mock
     private PersonService personService;
 
+    @Mock
+    private AuditService auditService;
+
     private DataAccountCreateHandler handler;
     private ObjectMapper objectMapper;
 
     @BeforeEach
     void setUp() {
-        handler = new DataAccountCreateHandler(amieClient, personService);
+        handler = new DataAccountCreateHandler(amieClient, personService, 
auditService);
         objectMapper = new ObjectMapper();
     }
 
@@ -75,7 +79,7 @@ class DataAccountCreateHandlerTest {
         packetEntity.setAmieId(233497918L);
         packetEntity.setType("data_account_create");
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
 
         @SuppressWarnings("unchecked")
         ArgumentCaptor<Map<String, Object>> replyCaptor = 
ArgumentCaptor.forClass(Map.class);
@@ -104,7 +108,7 @@ class DataAccountCreateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("ProjectID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'ProjectID' must not be empty");
     }
@@ -114,7 +118,7 @@ class DataAccountCreateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("PersonID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'PersonID' must not be empty");
     }
@@ -124,7 +128,7 @@ class DataAccountCreateHandlerTest {
         JsonNode packetJson = createValidPacketJson();
         PacketEntity packetEntity = createPacketEntity();
 
-        handler.handle(packetJson, packetEntity);
+        handler.handle(packetJson, packetEntity, null);
 
         verify(personService, never()).persistDnsForPerson(any(), any());
         //noinspection unchecked
@@ -136,7 +140,7 @@ class DataAccountCreateHandlerTest {
         JsonNode packetJson = createPacketJsonWithDnList();
         PacketEntity packetEntity = createPacketEntity();
 
-        handler.handle(packetJson, packetEntity);
+        handler.handle(packetJson, packetEntity, null);
 
         // Verify personService.persistDnsForPerson was called with the 
correct personId
         ArgumentCaptor<String> personIdCaptor = 
ArgumentCaptor.forClass(String.class);
@@ -159,7 +163,7 @@ class DataAccountCreateHandlerTest {
         packetEntity.setAmieId(233497918L);
         packetEntity.setType("data_account_create");
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
 
         ArgumentCaptor<JsonNode> dnListCaptor = 
ArgumentCaptor.forClass(JsonNode.class);
         verify(personService).persistDnsForPerson(eq("test-user-person-123"), 
dnListCaptor.capture());
diff --git 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/DataProjectCreateHandlerTest.java
 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/DataProjectCreateHandlerTest.java
index a1f911fdf..0bf7191c5 100644
--- 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/DataProjectCreateHandlerTest.java
+++ 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/DataProjectCreateHandlerTest.java
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.PersonService;
 import org.apache.custos.access.ci.service.util.JsonTestUtils;
 import org.junit.jupiter.api.BeforeEach;
@@ -52,12 +53,15 @@ class DataProjectCreateHandlerTest {
     @Mock
     private PersonService personService;
 
+    @Mock
+    private AuditService auditService;
+
     private DataProjectCreateHandler handler;
     private ObjectMapper objectMapper;
 
     @BeforeEach
     void setUp() {
-        handler = new DataProjectCreateHandler(amieClient, personService);
+        handler = new DataProjectCreateHandler(amieClient, personService, 
auditService);
         objectMapper = new ObjectMapper();
     }
 
@@ -75,7 +79,7 @@ class DataProjectCreateHandlerTest {
         packetEntity.setAmieId(233497909L);
         packetEntity.setType("data_project_create");
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
 
         @SuppressWarnings("unchecked")
         ArgumentCaptor<Map<String, Object>> replyCaptor = 
ArgumentCaptor.forClass(Map.class);
@@ -104,7 +108,7 @@ class DataProjectCreateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("ProjectID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'ProjectID' must not be empty");
     }
@@ -114,7 +118,7 @@ class DataProjectCreateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("PersonID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'PersonID' must not be empty");
     }
@@ -124,7 +128,7 @@ class DataProjectCreateHandlerTest {
         JsonNode packetJson = createValidPacketJson();
         PacketEntity packetEntity = createPacketEntity();
 
-        handler.handle(packetJson, packetEntity);
+        handler.handle(packetJson, packetEntity, null);
 
         verify(personService, never()).persistDnsForPerson(any(), any());
         //noinspection unchecked
@@ -136,7 +140,7 @@ class DataProjectCreateHandlerTest {
         JsonNode packetJson = createPacketJsonWithDnList();
         PacketEntity packetEntity = createPacketEntity();
 
-        handler.handle(packetJson, packetEntity);
+        handler.handle(packetJson, packetEntity, null);
 
         ArgumentCaptor<String> personIdCaptor = 
ArgumentCaptor.forClass(String.class);
         ArgumentCaptor<JsonNode> dnListCaptor = 
ArgumentCaptor.forClass(JsonNode.class);
@@ -158,7 +162,7 @@ class DataProjectCreateHandlerTest {
         packetEntity.setAmieId(233497909L);
         packetEntity.setType("data_project_create");
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
 
         ArgumentCaptor<JsonNode> dnListCaptor = 
ArgumentCaptor.forClass(JsonNode.class);
         verify(personService).persistDnsForPerson(eq("test-person-456"), 
dnListCaptor.capture());
diff --git 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/InformTransactionCompleteHandlerTest.java
 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/InformTransactionCompleteHandlerTest.java
index 6abb349dc..e34622045 100644
--- 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/InformTransactionCompleteHandlerTest.java
+++ 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/InformTransactionCompleteHandlerTest.java
@@ -21,11 +21,13 @@ package org.apache.custos.access.ci.service.handler.amie;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.util.JsonTestUtils;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
 import org.mockito.junit.jupiter.MockitoExtension;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -35,12 +37,15 @@ import static 
org.assertj.core.api.Assertions.assertThatThrownBy;
 @Tag("unit")
 class InformTransactionCompleteHandlerTest {
 
+    @Mock
+    private AuditService auditService;
+
     private InformTransactionCompleteHandler handler;
     private ObjectMapper objectMapper;
 
     @BeforeEach
     void setUp() {
-        handler = new InformTransactionCompleteHandler();
+        handler = new InformTransactionCompleteHandler(auditService);
         objectMapper = new ObjectMapper();
     }
 
@@ -57,7 +62,7 @@ class InformTransactionCompleteHandlerTest {
         packetEntity.setAmieId(233497913L);
         packetEntity.setType("inform_transaction_complete");
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
     }
 
     @Test
@@ -65,7 +70,7 @@ class InformTransactionCompleteHandlerTest {
         JsonNode packetJson = createMinimalPacketJson();
         PacketEntity packetEntity = createPacketEntity();
 
-        handler.handle(packetJson, packetEntity);
+        handler.handle(packetJson, packetEntity, null);
     }
 
     @Test
@@ -73,7 +78,7 @@ class InformTransactionCompleteHandlerTest {
         PacketEntity packetEntity = createPacketEntity();
 
         //noinspection DataFlowIssue
-        assertThatThrownBy(() -> handler.handle(null, 
packetEntity)).isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> handler.handle(null, packetEntity, 
null)).isInstanceOf(NullPointerException.class);
     }
 
     @Test
@@ -81,7 +86,7 @@ class InformTransactionCompleteHandlerTest {
         JsonNode packetJson = createValidPacketJson();
 
         //noinspection DataFlowIssue
-        assertThatThrownBy(() -> handler.handle(packetJson, 
null)).isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> handler.handle(packetJson, null, 
null)).isInstanceOf(NullPointerException.class);
     }
 
     private JsonNode createValidPacketJson() {
diff --git 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/NoOpHandlerTest.java
 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/NoOpHandlerTest.java
index e91572e6d..ec8739346 100644
--- 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/NoOpHandlerTest.java
+++ 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/NoOpHandlerTest.java
@@ -55,7 +55,7 @@ class NoOpHandlerTest {
         packetEntity.setAmieId(12345L);
         packetEntity.setType("unknown_type");
 
-        handler.handle(packetJson, packetEntity);
+        handler.handle(packetJson, packetEntity, null);
     }
 
     @Test
@@ -64,7 +64,7 @@ class NoOpHandlerTest {
         packetEntity.setAmieId(12345L);
         packetEntity.setType("unknown_type");
 
-        handler.handle(null, packetEntity);
+        handler.handle(null, packetEntity, null);
     }
 
     @Test
@@ -72,6 +72,6 @@ class NoOpHandlerTest {
         JsonNode packetJson = objectMapper.createObjectNode();
 
         //noinspection DataFlowIssue
-        assertThatThrownBy(() -> handler.handle(packetJson, 
null)).isInstanceOf(NullPointerException.class);
+        assertThatThrownBy(() -> handler.handle(packetJson, null, 
null)).isInstanceOf(NullPointerException.class);
     }
 }
diff --git 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/PacketRouterTest.java
 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/PacketRouterTest.java
index c1d788bee..b94800ebb 100644
--- 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/PacketRouterTest.java
+++ 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/PacketRouterTest.java
@@ -63,10 +63,10 @@ class PacketRouterTest {
         PacketEntity packetEntity = new PacketEntity();
         packetEntity.setType("request_project_create");
 
-        router.route(packetJson, packetEntity);
+        router.route(packetJson, packetEntity, null);
 
-        verify(mockHandler1).handle(packetJson, packetEntity);
-        verify(mockHandler2, never()).handle(any(), any());
+        verify(mockHandler1).handle(packetJson, packetEntity, null);
+        verify(mockHandler2, never()).handle(any(), any(), any());
     }
 
     @Test
@@ -75,10 +75,10 @@ class PacketRouterTest {
         PacketEntity packetEntity = new PacketEntity();
         packetEntity.setType("request_account_create");
 
-        router.route(packetJson, packetEntity);
+        router.route(packetJson, packetEntity, null);
 
-        verify(mockHandler2).handle(packetJson, packetEntity);
-        verify(mockHandler1, never()).handle(any(), any());
+        verify(mockHandler2).handle(packetJson, packetEntity, null);
+        verify(mockHandler1, never()).handle(any(), any(), any());
     }
 
     @Test
@@ -87,10 +87,10 @@ class PacketRouterTest {
         PacketEntity packetEntity = new PacketEntity();
         packetEntity.setType("unknown_packet_type");
 
-        router.route(packetJson, packetEntity);
+        router.route(packetJson, packetEntity, null);
 
-        verify(mockHandler1, never()).handle(any(), any());
-        verify(mockHandler2, never()).handle(any(), any());
+        verify(mockHandler1, never()).handle(any(), any(), any());
+        verify(mockHandler2, never()).handle(any(), any(), any());
     }
 
     @Test
@@ -100,9 +100,9 @@ class PacketRouterTest {
         PacketEntity packetEntity = new PacketEntity();
         packetEntity.setType("REQUEST_PROJECT_CREATE");
 
-        router.route(packetJson, packetEntity);
+        router.route(packetJson, packetEntity, null);
 
-        verify(mockHandler1).handle(packetJson, packetEntity);
-        verify(mockHandler2, never()).handle(any(), any());
+        verify(mockHandler1).handle(packetJson, packetEntity, null);
+        verify(mockHandler2, never()).handle(any(), any(), any());
     }
 }
diff --git 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountCreateHandlerTest.java
 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountCreateHandlerTest.java
index 9e6da05f0..17340443e 100644
--- 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountCreateHandlerTest.java
+++ 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountCreateHandlerTest.java
@@ -24,6 +24,7 @@ import 
org.apache.custos.access.ci.service.client.amie.AmieClient;
 import org.apache.custos.access.ci.service.model.ClusterAccountEntity;
 import org.apache.custos.access.ci.service.model.PersonEntity;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.PersonService;
 import org.apache.custos.access.ci.service.service.ProjectMembershipService;
 import org.apache.custos.access.ci.service.service.ProjectService;
@@ -65,12 +66,15 @@ class RequestAccountCreateHandlerTest {
     @Mock
     private ProjectMembershipService membershipService;
 
+    @Mock
+    private AuditService auditService;
+
     private RequestAccountCreateHandler handler;
     private ObjectMapper objectMapper;
 
     @BeforeEach
     void setUp() {
-        handler = new RequestAccountCreateHandler(amieClient, personService, 
userAccountService, projectService, membershipService);
+        handler = new RequestAccountCreateHandler(amieClient, personService, 
userAccountService, projectService, membershipService, auditService);
         objectMapper = new ObjectMapper();
     }
 
@@ -93,7 +97,7 @@ class RequestAccountCreateHandlerTest {
         
when(personService.findOrCreatePersonFromPacket(any(JsonNode.class))).thenReturn(personEntity);
         
when(userAccountService.provisionClusterAccount(personEntity)).thenReturn(createClusterAccount());
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
 
         
verify(personService).findOrCreatePersonFromPacket(any(JsonNode.class));
         verify(userAccountService).provisionClusterAccount(personEntity);
@@ -130,7 +134,7 @@ class RequestAccountCreateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("ProjectID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'ProjectID' (the local project ID) must 
not be empty");
     }
@@ -140,7 +144,7 @@ class RequestAccountCreateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("GrantNumber");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'GrantNumber' must not be empty");
     }
@@ -150,7 +154,7 @@ class RequestAccountCreateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("UserGlobalID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'UserGlobalID' must not be empty");
     }
diff --git 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountInactivateHandlerTest.java
 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountInactivateHandlerTest.java
index fe96a2aa6..b79d01b76 100644
--- 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountInactivateHandlerTest.java
+++ 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountInactivateHandlerTest.java
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.ProjectMembershipService;
 import org.apache.custos.access.ci.service.util.JsonTestUtils;
 import org.junit.jupiter.api.BeforeEach;
@@ -51,12 +52,15 @@ class RequestAccountInactivateHandlerTest {
     @Mock
     private ProjectMembershipService membershipService;
 
+    @Mock
+    private AuditService auditService;
+
     private RequestAccountInactivateHandler handler;
     private ObjectMapper objectMapper;
 
     @BeforeEach
     void setUp() {
-        handler = new RequestAccountInactivateHandler(amieClient, 
membershipService);
+        handler = new RequestAccountInactivateHandler(amieClient, 
membershipService, auditService);
         objectMapper = new ObjectMapper();
     }
 
@@ -74,7 +78,7 @@ class RequestAccountInactivateHandlerTest {
         packetEntity.setAmieId(233497919L);
         packetEntity.setType("request_account_inactivate");
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
 
         
verify(membershipService).inactivateMembershipsByPersonAndProject("test-project-456",
 "test-user-person-123");
 
@@ -104,7 +108,7 @@ class RequestAccountInactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("ProjectID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'ProjectID' must not be empty");
     }
@@ -114,7 +118,7 @@ class RequestAccountInactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("PersonID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'PersonID' must not be empty");
     }
@@ -124,7 +128,7 @@ class RequestAccountInactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithEmptyField("ProjectID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'ProjectID' must not be empty");
     }
@@ -134,7 +138,7 @@ class RequestAccountInactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithEmptyField("PersonID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'PersonID' must not be empty");
     }
@@ -144,7 +148,7 @@ class RequestAccountInactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithResourceList();
         PacketEntity packetEntity = createPacketEntity();
 
-        handler.handle(packetJson, packetEntity);
+        handler.handle(packetJson, packetEntity, null);
 
         
verify(membershipService).inactivateMembershipsByPersonAndProject("PRJ-TEST123",
 "person-123");
         //noinspection unchecked
diff --git 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountReactivateHandlerTest.java
 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountReactivateHandlerTest.java
index 38be5ac0b..bc508bc23 100644
--- 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountReactivateHandlerTest.java
+++ 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestAccountReactivateHandlerTest.java
@@ -22,6 +22,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.ProjectMembershipService;
 import org.apache.custos.access.ci.service.util.JsonTestUtils;
 import org.junit.jupiter.api.BeforeEach;
@@ -50,12 +51,15 @@ class RequestAccountReactivateHandlerTest {
     @Mock
     private ProjectMembershipService membershipService;
 
+    @Mock
+    private AuditService auditService;
+
     private RequestAccountReactivateHandler handler;
     private ObjectMapper objectMapper;
 
     @BeforeEach
     void setUp() {
-        handler = new RequestAccountReactivateHandler(amieClient, 
membershipService);
+        handler = new RequestAccountReactivateHandler(amieClient, 
membershipService, auditService);
         objectMapper = new ObjectMapper();
     }
 
@@ -73,7 +77,7 @@ class RequestAccountReactivateHandlerTest {
         packetEntity.setAmieId(233497923L);
         packetEntity.setType("request_account_reactivate");
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
 
         
verify(membershipService).reactivateMembershipsByPersonAndProject("test-project-456",
 "test-user-person-123");
 
@@ -103,7 +107,7 @@ class RequestAccountReactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("ProjectID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'ProjectID' must not be empty");
     }
@@ -113,7 +117,7 @@ class RequestAccountReactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("PersonID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'PersonID' must not be empty");
     }
@@ -123,7 +127,7 @@ class RequestAccountReactivateHandlerTest {
         JsonNode packetJson = createValidPacketJson();
         PacketEntity packetEntity = createPacketEntity();
 
-        handler.handle(packetJson, packetEntity);
+        handler.handle(packetJson, packetEntity, null);
 
         
verify(membershipService).reactivateMembershipsByPersonAndProject("test-project-456",
 "test-user-person-123");
         verify(amieClient).replyToPacket(eq(12345L), any(Map.class));
@@ -134,7 +138,7 @@ class RequestAccountReactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithResourceList();
         PacketEntity packetEntity = createPacketEntity();
 
-        handler.handle(packetJson, packetEntity);
+        handler.handle(packetJson, packetEntity, null);
 
         
verify(membershipService).reactivateMembershipsByPersonAndProject("test-project-456",
 "test-user-person-123");
         verify(amieClient).replyToPacket(eq(12345L), any(Map.class));
diff --git 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestPersonMergeHandlerTest.java
 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestPersonMergeHandlerTest.java
index 3bb6e9df6..532e3b690 100644
--- 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestPersonMergeHandlerTest.java
+++ 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestPersonMergeHandlerTest.java
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.PersonService;
 import org.apache.custos.access.ci.service.util.JsonTestUtils;
 import org.junit.jupiter.api.BeforeEach;
@@ -51,12 +52,15 @@ class RequestPersonMergeHandlerTest {
     @Mock
     private PersonService personService;
 
+    @Mock
+    private AuditService auditService;
+
     private RequestPersonMergeHandler handler;
     private ObjectMapper objectMapper;
 
     @BeforeEach
     void setUp() {
-        handler = new RequestPersonMergeHandler(amieClient, personService);
+        handler = new RequestPersonMergeHandler(amieClient, personService, 
auditService);
         objectMapper = new ObjectMapper();
     }
 
@@ -74,7 +78,7 @@ class RequestPersonMergeHandlerTest {
         packetEntity.setAmieId(233497920L);
         packetEntity.setType("request_person_merge");
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
 
         verify(personService).mergePersons("test-person-primary-123", 
"test-person-secondary-456");
 
@@ -105,7 +109,7 @@ class RequestPersonMergeHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("KeepPersonID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'KeepPersonID' (the surviving user's 
local ID) must not be empty");
     }
@@ -115,7 +119,7 @@ class RequestPersonMergeHandlerTest {
         JsonNode packetJson = 
createPacketJsonWithMissingField("DeletePersonID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'DeletePersonID' (the retiring user's 
local ID) must not be empty");
     }
@@ -125,7 +129,7 @@ class RequestPersonMergeHandlerTest {
         JsonNode packetJson = createPacketJsonWithEmptyField("KeepPersonID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'KeepPersonID' (the surviving user's 
local ID) must not be empty");
     }
@@ -135,7 +139,7 @@ class RequestPersonMergeHandlerTest {
         JsonNode packetJson = createPacketJsonWithEmptyField("DeletePersonID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'DeletePersonID' (the retiring user's 
local ID) must not be empty");
     }
@@ -145,7 +149,7 @@ class RequestPersonMergeHandlerTest {
         JsonNode packetJson = createPacketJsonWithGlobalIds();
         PacketEntity packetEntity = createPacketEntity();
 
-        handler.handle(packetJson, packetEntity);
+        handler.handle(packetJson, packetEntity, null);
 
         verify(personService).mergePersons("person-surviving", 
"person-retiring");
         //noinspection unchecked
diff --git 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectCreateHandlerTest.java
 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectCreateHandlerTest.java
index 18d47cd3a..eb825e236 100644
--- 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectCreateHandlerTest.java
+++ 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectCreateHandlerTest.java
@@ -26,6 +26,7 @@ import 
org.apache.custos.access.ci.service.model.ClusterAccountEntity;
 import org.apache.custos.access.ci.service.model.PersonEntity;
 import org.apache.custos.access.ci.service.model.ProjectEntity;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.PersonService;
 import org.apache.custos.access.ci.service.service.ProjectMembershipService;
 import org.apache.custos.access.ci.service.service.ProjectService;
@@ -68,12 +69,15 @@ class RequestProjectCreateHandlerTest {
     @Mock
     private ProjectMembershipService membershipService;
 
+    @Mock
+    private AuditService auditService;
+
     private RequestProjectCreateHandler handler;
     private ObjectMapper objectMapper;
 
     @BeforeEach
     void setUp() {
-        handler = new RequestProjectCreateHandler(amieClient, personService, 
userAccountService, projectService, membershipService);
+        handler = new RequestProjectCreateHandler(amieClient, personService, 
userAccountService, projectService, membershipService, auditService);
         objectMapper = new ObjectMapper();
     }
 
@@ -98,7 +102,7 @@ class RequestProjectCreateHandlerTest {
         
when(userAccountService.provisionClusterAccount(personEntity)).thenReturn(createClusterAccount());
         when(projectService.createOrFindProject(anyString(), 
anyString())).thenReturn(projectEntity);
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
         
verify(personService).findOrCreatePersonFromPacket(any(JsonNode.class));
         verify(userAccountService).provisionClusterAccount(personEntity);
         verify(projectService).createOrFindProject(anyString(), anyString());
@@ -134,7 +138,7 @@ class RequestProjectCreateHandlerTest {
     void handle_withNullPacketJson_shouldThrowException() {
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(null, packetEntity))
+        assertThatThrownBy(() -> handler.handle(null, packetEntity, null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessage("packetJson is null");
     }
@@ -144,7 +148,7 @@ class RequestProjectCreateHandlerTest {
         JsonNode packetJson = objectMapper.createObjectNode();
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessage("packetJson.body is missing");
     }
@@ -154,7 +158,7 @@ class RequestProjectCreateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("GrantNumber");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'GrantNumber' must not be empty");
     }
@@ -164,7 +168,7 @@ class RequestProjectCreateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("PiGlobalID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'PiGlobalID' must not be empty");
     }
diff --git 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectInactivateHandlerTest.java
 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectInactivateHandlerTest.java
index 4fd32379c..4d1d84303 100644
--- 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectInactivateHandlerTest.java
+++ 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectInactivateHandlerTest.java
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.ProjectMembershipService;
 import org.apache.custos.access.ci.service.service.ProjectService;
 import org.apache.custos.access.ci.service.util.JsonTestUtils;
@@ -55,12 +56,15 @@ class RequestProjectInactivateHandlerTest {
     @Mock
     private ProjectMembershipService membershipService;
 
+    @Mock
+    private AuditService auditService;
+
     private RequestProjectInactivateHandler handler;
     private ObjectMapper objectMapper;
 
     @BeforeEach
     void setUp() {
-        handler = new RequestProjectInactivateHandler(amieClient, 
projectService, membershipService);
+        handler = new RequestProjectInactivateHandler(amieClient, 
projectService, membershipService, auditService);
         objectMapper = new ObjectMapper();
     }
 
@@ -78,7 +82,7 @@ class RequestProjectInactivateHandlerTest {
         packetEntity.setAmieId(233497911L);
         packetEntity.setType("request_project_inactivate");
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
 
         verify(projectService).inactivateProject("test-project-123");
         
verify(membershipService).inactivateAllMembershipsForProject("test-project-123");
@@ -109,7 +113,7 @@ class RequestProjectInactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingProjectIdField();
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'ProjectID' must not be empty");
     }
@@ -119,7 +123,7 @@ class RequestProjectInactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithEmptyField("ProjectID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'ProjectID' must not be empty");
     }
@@ -129,7 +133,7 @@ class RequestProjectInactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithOptionalFields();
         PacketEntity packetEntity = createPacketEntity();
 
-        handler.handle(packetJson, packetEntity);
+        handler.handle(packetJson, packetEntity, null);
 
         verify(projectService).inactivateProject("PRJ-TEST123");
         
verify(membershipService).inactivateAllMembershipsForProject("PRJ-TEST123");
diff --git 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectReactivateHandlerTest.java
 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectReactivateHandlerTest.java
index 2a5fddc02..48d9af5e8 100644
--- 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectReactivateHandlerTest.java
+++ 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestProjectReactivateHandlerTest.java
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.ProjectMembershipService;
 import org.apache.custos.access.ci.service.service.ProjectService;
 import org.apache.custos.access.ci.service.util.JsonTestUtils;
@@ -55,12 +56,15 @@ class RequestProjectReactivateHandlerTest {
     @Mock
     private ProjectMembershipService membershipService;
 
+    @Mock
+    private AuditService auditService;
+
     private RequestProjectReactivateHandler handler;
     private ObjectMapper objectMapper;
 
     @BeforeEach
     void setUp() {
-        handler = new RequestProjectReactivateHandler(amieClient, 
projectService, membershipService);
+        handler = new RequestProjectReactivateHandler(amieClient, 
projectService, membershipService, auditService);
         objectMapper = new ObjectMapper();
     }
 
@@ -78,7 +82,7 @@ class RequestProjectReactivateHandlerTest {
         packetEntity.setAmieId(233497914L);
         packetEntity.setType("request_project_reactivate");
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
 
         verify(projectService).reactivateProject("test-project-123");
         verify(membershipService).reactivatePiMembership("test-project-123");
@@ -109,7 +113,7 @@ class RequestProjectReactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingProjectIdField();
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'ProjectID' must not be empty");
     }
@@ -119,7 +123,7 @@ class RequestProjectReactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithEmptyField("ProjectID");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'ProjectID' must not be empty");
     }
@@ -129,7 +133,7 @@ class RequestProjectReactivateHandlerTest {
         JsonNode packetJson = createPacketJsonWithOptionalFields();
         PacketEntity packetEntity = createPacketEntity();
 
-        handler.handle(packetJson, packetEntity);
+        handler.handle(packetJson, packetEntity, null);
 
         verify(projectService).reactivateProject("PRJ-TEST123");
         verify(membershipService).reactivatePiMembership("PRJ-TEST123");
diff --git 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestUserModifyHandlerTest.java
 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestUserModifyHandlerTest.java
index a992b4543..e998b2b3e 100644
--- 
a/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestUserModifyHandlerTest.java
+++ 
b/allocations/access-ci-service/src/test/java/org/apache/custos/access/ci/service/handler/amie/RequestUserModifyHandlerTest.java
@@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import org.apache.custos.access.ci.service.client.amie.AmieClient;
 import org.apache.custos.access.ci.service.model.amie.PacketEntity;
+import org.apache.custos.access.ci.service.service.AuditService;
 import org.apache.custos.access.ci.service.service.PersonService;
 import org.apache.custos.access.ci.service.util.JsonTestUtils;
 import org.junit.jupiter.api.BeforeEach;
@@ -51,12 +52,15 @@ class RequestUserModifyHandlerTest {
     @Mock
     private PersonService personService;
 
+    @Mock
+    private AuditService auditService;
+
     private RequestUserModifyHandler handler;
     private ObjectMapper objectMapper;
 
     @BeforeEach
     void setUp() {
-        handler = new RequestUserModifyHandler(amieClient, personService);
+        handler = new RequestUserModifyHandler(amieClient, personService, 
auditService);
         objectMapper = new ObjectMapper();
     }
 
@@ -74,7 +78,7 @@ class RequestUserModifyHandlerTest {
         packetEntity.setAmieId(233497921L);
         packetEntity.setType("request_user_modify");
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
 
         verify(personService).replaceFromModifyPacket(any(JsonNode.class));
 
@@ -109,7 +113,7 @@ class RequestUserModifyHandlerTest {
         packetEntity.setAmieId(233497922L);
         packetEntity.setType("request_user_modify");
 
-        handler.handle(incomingPacket, packetEntity);
+        handler.handle(incomingPacket, packetEntity, null);
 
         verify(personService).deleteFromModifyPacket(any(JsonNode.class));
 
@@ -140,7 +144,7 @@ class RequestUserModifyHandlerTest {
         JsonNode packetJson = createValidPacketJson("REPLACE");
         PacketEntity packetEntity = createPacketEntity();
 
-        handler.handle(packetJson, packetEntity);
+        handler.handle(packetJson, packetEntity, null);
 
         verify(personService).replaceFromModifyPacket(any(JsonNode.class));
         //noinspection unchecked
@@ -152,7 +156,7 @@ class RequestUserModifyHandlerTest {
         JsonNode packetJson = createPacketJsonWithMissingField("ActionType");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'ActionType' must not be empty 
(replace|delete)");
     }
@@ -162,7 +166,7 @@ class RequestUserModifyHandlerTest {
         JsonNode packetJson = createPacketJsonWithEmptyField("ActionType");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("'ActionType' must not be empty 
(replace|delete)");
     }
@@ -172,7 +176,7 @@ class RequestUserModifyHandlerTest {
         JsonNode packetJson = createValidPacketJson("unsupported");
         PacketEntity packetEntity = createPacketEntity();
 
-        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity))
+        assertThatThrownBy(() -> handler.handle(packetJson, packetEntity, 
null))
                 .isInstanceOf(IllegalArgumentException.class)
                 .hasMessageContaining("Unsupported ActionType: unsupported");
     }


Reply via email to