terminal42 / contao-notification_center

The most popular notification configuration extension for the Contao Open Source CMS!
63 stars 38 forks source link

Integrity constraint violation while subscribing to newsletter #341

Closed de-es closed 2 months ago

de-es commented 3 months ago

Aufgetretener Fehler:

[2024-06-13T17:02:18.801166+02:00] request.INFO: Matched route "tl_page.61". {"route":"tl_page.61","route_parameters":{"_token_check":true,"_controller":"Contao\\FrontendIndex::renderPage","_scope":"frontend","_locale":"en","_format":"html","_canonical_route":"tl_page.61","parameters":"","pageModel":{"Contao\\PageModel":[]},"_route":"tl_page.61","_route_object":{"Contao\\CoreBundle\\Routing\\Page\\PageRoute":[]}},"request_uri":"https://contao4.contao.internal/newsletter.html","method":"POST"} []
[2024-06-13T17:02:18.802981+02:00] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
[2024-06-13T17:02:18.833039+02:00] request.CRITICAL: Uncaught PHP Exception Doctrine\DBAL\Exception\UniqueConstraintViolationException: "An exception occurred while executing a query: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '3-test@example.com' for key 'pid_email'" at /srv/contao/contao4/vendor/doctrine/dbal/src/Driver/API/MySQL/ExceptionConverter.php line 62 {"exception":"[object] (Doctrine\\DBAL\\Exception\\UniqueConstraintViolationException(code: 1062): An exception occurred while executing a query: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '3-test@example.com' for key 'pid_email' at /srv/contao/contao4/vendor/doctrine/dbal/src/Driver/API/MySQL/ExceptionConverter.php:62)\n[previous exception] [object] (Doctrine\\DBAL\\Driver\\PDO\\Exception(code: 1062): SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '3-test@example.com' for key 'pid_email' at /srv/contao/contao4/vendor/doctrine/dbal/src/Driver/PDO/Exception.php:28)\n[previous exception] [object] (PDOException(code: 23000): SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '3-test@example.com' for key 'pid_email' at /srv/contao/contao4/vendor/doctrine/dbal/src/Driver/PDO/Statement.php:130)"} []

Es ist etwas schwieriger, den Fehler auf einem lokalen Testsystem zuverlässig nachzustellen, da er eine gewisse Latenz benötigt, um ausgelöst zu werden. Aufgefallen ist er zuerst auf einem Produktivsystem.

Zum Nachstellen:

Nun die Seite mit dem Modul im FE aufrufen. Chrome zum Testen nehmen (FF funktioniert nicht) und Network throtteling auf mindestens Slow 3G setzen. Dann Mailadresse eintragen und mehrfach ganz schnell hintereinander auf Subscribe klicken, um mehrere Requests auszulösen, wovon ab dem zweiten am Server eintreffenden dann jeder den Error triggert.

Auf dem Produktivsystem ist natürlich weder die Spam protection deaktiviert noch novalidate aktiv. Die Besucher haben das, soweit ich gesehen habe, einfach mit dem iPhone - und einem zu träge reagierenden Server - geschafft.

Der Fehler tritt nicht im von Contao mitglieferten Standard-Subscribe-Modul auf. Daher konnte ich auch die Ursache schnell ausfindig machen, da sich die Module in https://github.com/terminal42/contao-notification_center/blob/8bccbb96ddb8420311531e8841ad4ad7297d4a2c/src/Controller/FrontendModule/Newsletter/SubscribeController.php#L52 unterscheiden. Im Standard-Modul wird hier

$objRecipient->active = '';

verwendet, was das Problem auch direkt behebt.

Toflar commented 2 months ago

Im Standardmodul wird auch $objRecipient->active = false; verwendet (Contao 5.3). Vielleicht müssten wir also ein version_compare() nutzen wie an anderen Stellen im NC auch? Gerne PR stellen :)

fritzmg commented 2 months ago

Closing in favor of #350