From e0309b12539da79aaaf7c137943721411358f3e6 Mon Sep 17 00:00:00 2001 From: Jose Andres Tejerina Date: Wed, 28 Jan 2026 20:52:06 -0300 Subject: [PATCH] feat: add new formatters for attendees and add audit_log config for doctrine event listener --- .../AffiliationAuditLogFormatter.php | 54 ++++++++++++++++++ ...sentationAttendeeVoteAuditLogFormatter.php | 51 +++++++++++++++++ .../SummitAttendeeAuditLogFormatter.php | 52 ++++++++++++++++++ .../SummitAttendeeBadgeAuditLogFormatter.php | 52 ++++++++++++++++++ .../SummitAttendeeNoteAuditLogFormatter.php | 51 +++++++++++++++++ .../SummitAttendeeTicketAuditLogFormatter.php | 51 +++++++++++++++++ ...mmitAttendeeTicketTaxAuditLogFormatter.php | 55 +++++++++++++++++++ ...ummitSponsorshipAddOnAuditLogFormatter.php | 53 ++++++++++++++++++ config/audit_log.php | 32 +++++++++++ 9 files changed, 451 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..bfc8f5144 --- /dev/null +++ b/app/Audit/ConcreteFormatters/AffiliationAuditLogFormatter.php @@ -0,0 +1,54 @@ +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..f38d67379 --- /dev/null +++ b/app/Audit/ConcreteFormatters/PresentationAttendeeVoteAuditLogFormatter.php @@ -0,0 +1,51 @@ +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..1e092a621 --- /dev/null +++ b/app/Audit/ConcreteFormatters/SummitAttendeeAuditLogFormatter.php @@ -0,0 +1,52 @@ +getId() ?? 'unknown'; + $name = trim(($subject->getFirstName() ?? '') . ' ' . ($subject->getSurname() ?? '')) ?: '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..41d919d03 --- /dev/null +++ b/app/Audit/ConcreteFormatters/SummitAttendeeBadgeAuditLogFormatter.php @@ -0,0 +1,52 @@ +getId() ?? 'unknown'; + $ticket = $subject->getTicket(); + $owner = $ticket ? $ticket->getOwner() : null; + $owner_name = $owner ? trim(($owner->getFirstName() ?? '') . ' ' . ($owner->getSurname() ?? '')) : '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..20ada397e --- /dev/null +++ b/app/Audit/ConcreteFormatters/SummitAttendeeNoteAuditLogFormatter.php @@ -0,0 +1,51 @@ +getId() ?? 'unknown'; + $owner = $subject->getOwner(); + $owner_name = $owner ? trim(($owner->getFirstName() ?? '') . ' ' . ($owner->getSurname() ?? '')) : '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..f3298f8e1 --- /dev/null +++ b/app/Audit/ConcreteFormatters/SummitAttendeeTicketAuditLogFormatter.php @@ -0,0 +1,51 @@ +getId() ?? 'unknown'; + $owner = $subject->getOwner(); + $owner_name = $owner ? trim(($owner->getFirstName() ?? '') . ' ' . ($owner->getSurname() ?? '')) : '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..680f380f4 --- /dev/null +++ b/app/Audit/ConcreteFormatters/SummitAttendeeTicketTaxAuditLogFormatter.php @@ -0,0 +1,55 @@ +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..7bdaa4c49 --- /dev/null +++ b/app/Audit/ConcreteFormatters/SummitSponsorshipAddOnAuditLogFormatter.php @@ -0,0 +1,53 @@ +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 4488990f9..e3ffa0635 100644 --- a/config/audit_log.php +++ b/config/audit_log.php @@ -172,5 +172,37 @@ 'enabled' => true, 'strategy' => \App\Audit\ConcreteFormatters\SummitRegistrationFeedMetadataAuditLogFormatter::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, + ], ] ];