From 2e6a6c52b81d746c668741ff5cf01f3515605015 Mon Sep 17 00:00:00 2001 From: Jose Andres Tejerina Date: Wed, 7 Jan 2026 16:14:54 -0300 Subject: [PATCH 1/2] feat: add new formatters for attendees --- .../AffiliationAuditLogFormatter.php | 41 ++++++++++++++++++ ...sentationAttendeeVoteAuditLogFormatter.php | 38 +++++++++++++++++ .../SummitAttendeeAuditLogFormatter.php | 39 +++++++++++++++++ .../SummitAttendeeBadgeAuditLogFormatter.php | 38 +++++++++++++++++ .../SummitAttendeeNoteAuditLogFormatter.php | 38 +++++++++++++++++ .../SummitAttendeeTagAuditLogFormatter.php | 34 +++++++++++++++ .../SummitAttendeeTicketAuditLogFormatter.php | 38 +++++++++++++++++ ...mmitAttendeeTicketTaxAuditLogFormatter.php | 42 +++++++++++++++++++ ...ummitSponsorshipAddOnAuditLogFormatter.php | 40 ++++++++++++++++++ .../SummitSponsorshipAuditLogFormatter.php | 2 +- 10 files changed, 349 insertions(+), 1 deletion(-) 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/SummitAttendeeTagAuditLogFormatter.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/SummitAttendeeTagAuditLogFormatter.php b/app/Audit/ConcreteFormatters/SummitAttendeeTagAuditLogFormatter.php new file mode 100644 index 000000000..af1cbd965 --- /dev/null +++ b/app/Audit/ConcreteFormatters/SummitAttendeeTagAuditLogFormatter.php @@ -0,0 +1,34 @@ +getId(); + } + $id = $id ?? 'unknown'; + + switch ($this->event_type) { + case IAuditStrategy::EVENT_ENTITY_CREATION: + return sprintf("Attendee Tag (%s) created by user %s", $id, $this->getUserInfo()); + case IAuditStrategy::EVENT_ENTITY_DELETION: + return sprintf("Attendee Tag (%s) deleted by user %s", $id, $this->getUserInfo()); + } + } catch (\Exception $ex) { + Log::warning("SummitAttendeeTagAuditLogFormatter 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/app/Audit/ConcreteFormatters/SummitSponsorshipAuditLogFormatter.php b/app/Audit/ConcreteFormatters/SummitSponsorshipAuditLogFormatter.php index 280f0e224..f5682df6c 100644 --- a/app/Audit/ConcreteFormatters/SummitSponsorshipAuditLogFormatter.php +++ b/app/Audit/ConcreteFormatters/SummitSponsorshipAuditLogFormatter.php @@ -71,4 +71,4 @@ public function format($subject, array $change_set): ?string return null; } -} +} \ No newline at end of file From b26ad08d372954157f3ad2334eed2ec59878dde8 Mon Sep 17 00:00:00 2001 From: Matias Perrone Date: Mon, 12 Jan 2026 22:10:18 +0000 Subject: [PATCH 2/2] chore: Add auditlog config relation to entity <=> formatter Signed-off-by: Matias Perrone --- config/audit_log.php | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/config/audit_log.php b/config/audit_log.php index 8923ec688..3d22ef766 100644 --- a/config/audit_log.php +++ b/config/audit_log.php @@ -152,5 +152,41 @@ 'enabled' => true, 'strategy' => \App\Audit\ConcreteFormatters\SummitSelectedPresentationListAuditLogFormatter::class, ], + \models\summit\SummitSelectedPresentationList::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\AffiliationAuditLogFormatter::class, + ], + \models\summit\SummitSponsorshipAddOn::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\SummitSponsorshipAddOnAuditLogFormatter::class, + ], + \models\summit\SummitAttendeeTicketTax::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\SummitAttendeeTicketTaxAuditLogFormatter::class, + ], + \models\summit\SummitAttendeeTicket::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\SummitAttendeeTicketAuditLogFormatter::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, + ], + \models\main\Affiliation::class => [ + 'enabled' => true, + 'strategy' => \App\Audit\ConcreteFormatters\AffiliationAuditLogFormatter::class, + ], ] ];