From 7c660e5d0139927dd3ed47298158f1b191fd1d3d Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Tue, 13 Jan 2026 19:53:30 +0000 Subject: [PATCH] feat: add new formatters for attendees and add audit_log config for doctrine event listener Signed-off-by: Matias Perrone --- .../AffiliationAuditLogFormatter.php | 41 ++++++++++++++++++ ...sentationAttendeeVoteAuditLogFormatter.php | 38 +++++++++++++++++ .../SummitAttendeeAuditLogFormatter.php | 39 +++++++++++++++++ .../SummitAttendeeBadgeAuditLogFormatter.php | 38 +++++++++++++++++ .../SummitAttendeeNoteAuditLogFormatter.php | 38 +++++++++++++++++ .../SummitAttendeeTicketAuditLogFormatter.php | 38 +++++++++++++++++ ...mmitAttendeeTicketTaxAuditLogFormatter.php | 42 +++++++++++++++++++ ...ummitSponsorshipAddOnAuditLogFormatter.php | 40 ++++++++++++++++++ config/audit_log.php | 32 ++++++++++++++ 9 files changed, 346 insertions(+) create mode 100644 app/Audit/ConcreteFormatters/AffiliationAuditLogFormatter.php create mode 100644 app/Audit/ConcreteFormatters/PresentationAttendeeVoteAuditLogFormatter.php create mode 100644 app/Audit/ConcreteFormatters/SummitAttendeeAuditLogFormatter.php create mode 100644 app/Audit/ConcreteFormatters/SummitAttendeeBadgeAuditLogFormatter.php create mode 100644 app/Audit/ConcreteFormatters/SummitAttendeeNoteAuditLogFormatter.php create mode 100644 app/Audit/ConcreteFormatters/SummitAttendeeTicketAuditLogFormatter.php create mode 100644 app/Audit/ConcreteFormatters/SummitAttendeeTicketTaxAuditLogFormatter.php create mode 100644 app/Audit/ConcreteFormatters/SummitSponsorshipAddOnAuditLogFormatter.php diff --git a/app/Audit/ConcreteFormatters/AffiliationAuditLogFormatter.php b/app/Audit/ConcreteFormatters/AffiliationAuditLogFormatter.php new file mode 100644 index 000000000..2952c03c6 --- /dev/null +++ b/app/Audit/ConcreteFormatters/AffiliationAuditLogFormatter.php @@ -0,0 +1,41 @@ +getId() ?? 'unknown'; + $owner = $subject->getOwner(); + $owner_name = $owner ? trim(($owner->getFirstName() ?? '') . ' ' . ($owner->getLastName() ?? '')) : 'Unknown Owner'; + $job_title = $subject->getJobTitle() ?? 'Unknown Job Title'; + + switch ($this->event_type) { + case IAuditStrategy::EVENT_ENTITY_CREATION: + return sprintf("Affiliation (%s) for '%s' (%s) created by user %s", $id, $owner_name, $job_title, $this->getUserInfo()); + + case IAuditStrategy::EVENT_ENTITY_UPDATE: + $details = $this->buildChangeDetails($change_set); + return sprintf("Affiliation (%s) for '%s' (%s) updated: %s by user %s", $id, $owner_name, $job_title, $details, $this->getUserInfo()); + + case IAuditStrategy::EVENT_ENTITY_DELETION: + return sprintf("Affiliation (%s) for '%s' (%s) deleted by user %s", $id, $owner_name, $job_title, $this->getUserInfo()); + } + } catch (\Exception $ex) { + Log::warning("AffiliationAuditLogFormatter error: " . $ex->getMessage()); + } + + return null; + } +} diff --git a/app/Audit/ConcreteFormatters/PresentationAttendeeVoteAuditLogFormatter.php b/app/Audit/ConcreteFormatters/PresentationAttendeeVoteAuditLogFormatter.php new file mode 100644 index 000000000..73a8ce282 --- /dev/null +++ b/app/Audit/ConcreteFormatters/PresentationAttendeeVoteAuditLogFormatter.php @@ -0,0 +1,38 @@ +getId() ?? 'unknown'; + $presentation = $subject->getPresentation(); + $title = $presentation ? ($presentation->getTitle() ?? 'Unknown Presentation') : 'Unknown Presentation'; + + switch ($this->event_type) { + case IAuditStrategy::EVENT_ENTITY_CREATION: + return sprintf("Presentation Attendee Vote (%s) for '%s' created by user %s", $id, $title, $this->getUserInfo()); + case IAuditStrategy::EVENT_ENTITY_UPDATE: + $details = $this->buildChangeDetails($change_set); + return sprintf("Presentation Attendee Vote (%s) for '%s' updated: %s by user %s", $id, $title, $details, $this->getUserInfo()); + case IAuditStrategy::EVENT_ENTITY_DELETION: + return sprintf("Presentation Attendee Vote (%s) for '%s' deleted by user %s", $id, $title, $this->getUserInfo()); + } + } catch (\Exception $ex) { + Log::warning("PresentationAttendeeVoteAuditLogFormatter error: " . $ex->getMessage()); + } + + return null; + } +} diff --git a/app/Audit/ConcreteFormatters/SummitAttendeeAuditLogFormatter.php b/app/Audit/ConcreteFormatters/SummitAttendeeAuditLogFormatter.php new file mode 100644 index 000000000..91d7dedd7 --- /dev/null +++ b/app/Audit/ConcreteFormatters/SummitAttendeeAuditLogFormatter.php @@ -0,0 +1,39 @@ +getId() ?? 'unknown'; + $name = trim(($subject->getFirstName() ?? '') . ' ' . ($subject->getLastName() ?? '')) ?: 'Unknown Attendee'; + + switch ($this->event_type) { + case IAuditStrategy::EVENT_ENTITY_CREATION: + return sprintf("Attendee (%s) '%s' created by user %s", $id, $name, $this->getUserInfo()); + + case IAuditStrategy::EVENT_ENTITY_UPDATE: + $details = $this->buildChangeDetails($change_set); + return sprintf("Attendee (%s) '%s' updated: %s by user %s", $id, $name, $details, $this->getUserInfo()); + + case IAuditStrategy::EVENT_ENTITY_DELETION: + return sprintf("Attendee (%s) '%s' deleted by user %s", $id, $name, $this->getUserInfo()); + } + } catch (\Exception $ex) { + Log::warning("SummitAttendeeAuditLogFormatter error: " . $ex->getMessage()); + } + + return null; + } +} diff --git a/app/Audit/ConcreteFormatters/SummitAttendeeBadgeAuditLogFormatter.php b/app/Audit/ConcreteFormatters/SummitAttendeeBadgeAuditLogFormatter.php new file mode 100644 index 000000000..eba6aa51e --- /dev/null +++ b/app/Audit/ConcreteFormatters/SummitAttendeeBadgeAuditLogFormatter.php @@ -0,0 +1,38 @@ +getId() ?? 'unknown'; + $owner = $subject->getOwner(); + $owner_name = $owner ? trim(($owner->getFirstName() ?? '') . ' ' . ($owner->getLastName() ?? '')) : 'Unknown Owner'; + + switch ($this->event_type) { + case IAuditStrategy::EVENT_ENTITY_CREATION: + return sprintf("Attendee Badge (%s) for '%s' created by user %s", $id, $owner_name, $this->getUserInfo()); + case IAuditStrategy::EVENT_ENTITY_UPDATE: + $details = $this->buildChangeDetails($change_set); + return sprintf("Attendee Badge (%s) for '%s' updated: %s by user %s", $id, $owner_name, $details, $this->getUserInfo()); + case IAuditStrategy::EVENT_ENTITY_DELETION: + return sprintf("Attendee Badge (%s) for '%s' deleted by user %s", $id, $owner_name, $this->getUserInfo()); + } + } catch (\Exception $ex) { + Log::warning("SummitAttendeeBadgeAuditLogFormatter error: " . $ex->getMessage()); + } + + return null; + } +} diff --git a/app/Audit/ConcreteFormatters/SummitAttendeeNoteAuditLogFormatter.php b/app/Audit/ConcreteFormatters/SummitAttendeeNoteAuditLogFormatter.php new file mode 100644 index 000000000..163bfdb0b --- /dev/null +++ b/app/Audit/ConcreteFormatters/SummitAttendeeNoteAuditLogFormatter.php @@ -0,0 +1,38 @@ +getId() ?? 'unknown'; + $owner = $subject->getOwner(); + $owner_name = $owner ? trim(($owner->getFirstName() ?? '') . ' ' . ($owner->getLastName() ?? '')) : 'Unknown Owner'; + + switch ($this->event_type) { + case IAuditStrategy::EVENT_ENTITY_CREATION: + return sprintf("Attendee Note (%s) for '%s' created by user %s", $id, $owner_name, $this->getUserInfo()); + case IAuditStrategy::EVENT_ENTITY_UPDATE: + $details = $this->buildChangeDetails($change_set); + return sprintf("Attendee Note (%s) for '%s' updated: %s by user %s", $id, $owner_name, $details, $this->getUserInfo()); + case IAuditStrategy::EVENT_ENTITY_DELETION: + return sprintf("Attendee Note (%s) for '%s' deleted by user %s", $id, $owner_name, $this->getUserInfo()); + } + } catch (\Exception $ex) { + Log::warning("SummitAttendeeNoteAuditLogFormatter error: " . $ex->getMessage()); + } + + return null; + } +} diff --git a/app/Audit/ConcreteFormatters/SummitAttendeeTicketAuditLogFormatter.php b/app/Audit/ConcreteFormatters/SummitAttendeeTicketAuditLogFormatter.php new file mode 100644 index 000000000..e39a486a1 --- /dev/null +++ b/app/Audit/ConcreteFormatters/SummitAttendeeTicketAuditLogFormatter.php @@ -0,0 +1,38 @@ +getId() ?? 'unknown'; + $owner = $subject->getOwner(); + $owner_name = $owner ? trim(($owner->getFirstName() ?? '') . ' ' . ($owner->getLastName() ?? '')) : 'Unknown Owner'; + + switch ($this->event_type) { + case IAuditStrategy::EVENT_ENTITY_CREATION: + return sprintf("Attendee Ticket (%s) for '%s' created by user %s", $id, $owner_name, $this->getUserInfo()); + case IAuditStrategy::EVENT_ENTITY_UPDATE: + $details = $this->buildChangeDetails($change_set); + return sprintf("Attendee Ticket (%s) for '%s' updated: %s by user %s", $id, $owner_name, $details, $this->getUserInfo()); + case IAuditStrategy::EVENT_ENTITY_DELETION: + return sprintf("Attendee Ticket (%s) for '%s' deleted by user %s", $id, $owner_name, $this->getUserInfo()); + } + } catch (\Exception $ex) { + Log::warning("SummitAttendeeTicketAuditLogFormatter error: " . $ex->getMessage()); + } + + return null; + } +} diff --git a/app/Audit/ConcreteFormatters/SummitAttendeeTicketTaxAuditLogFormatter.php b/app/Audit/ConcreteFormatters/SummitAttendeeTicketTaxAuditLogFormatter.php new file mode 100644 index 000000000..a91cc1698 --- /dev/null +++ b/app/Audit/ConcreteFormatters/SummitAttendeeTicketTaxAuditLogFormatter.php @@ -0,0 +1,42 @@ +getId() ?? 'unknown'; + $tax = $subject->getTax(); + $tax_name = $tax ? ($tax->getName() ?? 'Unknown Tax') : 'Unknown Tax'; + $ticket = $subject->getTicket(); + $ticket_id = $ticket ? $ticket->getId() : 'unknown'; + + switch ($this->event_type) { + case IAuditStrategy::EVENT_ENTITY_CREATION: + return sprintf("Attendee Ticket Tax (%s) '%s' for ticket %s created by user %s", $id, $tax_name, $ticket_id, $this->getUserInfo()); + + case IAuditStrategy::EVENT_ENTITY_UPDATE: + $details = $this->buildChangeDetails($change_set); + return sprintf("Attendee Ticket Tax (%s) '%s' for ticket %s updated: %s by user %s", $id, $tax_name, $ticket_id, $details, $this->getUserInfo()); + + case IAuditStrategy::EVENT_ENTITY_DELETION: + return sprintf("Attendee Ticket Tax (%s) '%s' for ticket %s deleted by user %s", $id, $tax_name, $ticket_id, $this->getUserInfo()); + } + } catch (\Exception $ex) { + Log::warning("SummitAttendeeTicketTaxAuditLogFormatter error: " . $ex->getMessage()); + } + + return null; + } +} diff --git a/app/Audit/ConcreteFormatters/SummitSponsorshipAddOnAuditLogFormatter.php b/app/Audit/ConcreteFormatters/SummitSponsorshipAddOnAuditLogFormatter.php new file mode 100644 index 000000000..12ddfd4dc --- /dev/null +++ b/app/Audit/ConcreteFormatters/SummitSponsorshipAddOnAuditLogFormatter.php @@ -0,0 +1,40 @@ +getId() ?? 'unknown'; + $name = $subject->getName() ?? 'Unknown Add-On'; + $type = $subject->getType() ?? 'Unknown Type'; + + switch ($this->event_type) { + case IAuditStrategy::EVENT_ENTITY_CREATION: + return sprintf("Sponsorship Add-On (%s) '%s' (%s) created by user %s", $id, $name, $type, $this->getUserInfo()); + + case IAuditStrategy::EVENT_ENTITY_UPDATE: + $details = $this->buildChangeDetails($change_set); + return sprintf("Sponsorship Add-On (%s) '%s' (%s) updated: %s by user %s", $id, $name, $type, $details, $this->getUserInfo()); + + case IAuditStrategy::EVENT_ENTITY_DELETION: + return sprintf("Sponsorship Add-On (%s) '%s' (%s) deleted by user %s", $id, $name, $type, $this->getUserInfo()); + } + } catch (\Exception $ex) { + Log::warning("SummitSponsorshipAddOnAuditLogFormatter error: " . $ex->getMessage()); + } + + return null; + } +} diff --git a/config/audit_log.php b/config/audit_log.php index 8923ec688..61e89d44b 100644 --- a/config/audit_log.php +++ b/config/audit_log.php @@ -152,5 +152,37 @@ 'enabled' => true, 'strategy' => \App\Audit\ConcreteFormatters\SummitSelectedPresentationListAuditLogFormatter::class, ], + \models\main\Affiliation::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\AffiliationAuditLogFormatter::class, + ], + \models\summit\SummitSponsorshipAddOn::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\SummitSponsorshipAddOnAuditLogFormatter::class, + ], + \models\summit\SummitAttendeeTicket::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\SummitAttendeeTicketAuditLogFormatter::class, + ], + \models\summit\SummitAttendeeTicketTax::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\SummitAttendeeTicketTaxAuditLogFormatter::class, + ], + \models\summit\SummitAttendeeNote::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\SummitAttendeeNoteAuditLogFormatter::class, + ], + \models\summit\SummitAttendeeBadge::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\SummitAttendeeBadgeAuditLogFormatter::class, + ], + \models\summit\SummitAttendee::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\SummitAttendeeAuditLogFormatter::class, + ], + \models\summit\PresentationAttendeeVote::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\PresentationAttendeeVoteAuditLogFormatter::class, + ], ] ];