// Step 1: Update ApprovalService constructor
func NewApprovalService(
leaveRequestRepo ports.LeaveRequestRepository,
leaveBalanceRepo ports.LeaveBalanceRepository,
leaveTypeRepo ports.LeaveTypeRepository,
userRepo ports.UserRepository,
auditService *AuditService, // Add this
) *ApprovalService {
return &ApprovalService{
leaveRequestRepo: leaveRequestRepo,
leaveBalanceRepo: leaveBalanceRepo,
leaveTypeRepo: leaveTypeRepo,
userRepo: userRepo,
auditService: auditService, // Add this
}
}
// Step 2: Add audit logging to ApproveRequest
func (s *ApprovalService) ApproveRequest(ctx context.Context, requestID, approverID, approverName, comment string) error {
// Get BEFORE state
request, err := s.leaveRequestRepo.FindByID(ctx, requestID)
if err != nil {
return err
}
beforeState := map[string]interface{}{
"status": string(request.Status),
"approver_id": request.ApproverID,
}
// ... existing approval logic ...
// Create audit log
defer func() {
afterState := map[string]interface{}{
"status": string(request.Status),
"approver_id": approverID,
}
s.auditService.CreateAuditLog(ctx, CreateAuditLogParams{
ID: "audit_" + generateID(),
UserID: approverID,
UserName: approverName,
UserRole: "manager",
Action: coreDomain.AuditActionApprove,
EntityType: coreDomain.AuditEntityLeaveRequest,
EntityID: requestID,
Before: beforeState,
After: afterState,
Details: map[string]interface{}{
"comment": comment,
},
})
}()
return nil
}