aboutsummaryrefslogtreecommitdiffstats
path: root/apps/contactsinteraction
diff options
context:
space:
mode:
authorChristoph Wurst <ChristophWurst@users.noreply.github.com>2023-05-12 14:02:10 +0200
committerGitHub <noreply@github.com>2023-05-12 14:02:10 +0200
commit7e3d5d6c70dd3c90bc95831e4bdd24d80ce8f3fd (patch)
tree84bb4a51efd6ea53bee6765e0eda69fbf9ee4b29 /apps/contactsinteraction
parent3aa3d7fa2f71b342c00bedef765224415be6da94 (diff)
parent48edc27d25f830fadeeca096989466a6a913116b (diff)
downloadnextcloud-server-7e3d5d6c70dd3c90bc95831e4bdd24d80ce8f3fd.tar.gz
nextcloud-server-7e3d5d6c70dd3c90bc95831e4bdd24d80ce8f3fd.zip
Merge pull request #37933 from nextcloud/fix/contactsinteraction/transactional-read-update-insert
fix(contactsinteraction): Read, update or insert in DB transaction
Diffstat (limited to 'apps/contactsinteraction')
-rw-r--r--apps/contactsinteraction/lib/Listeners/ContactInteractionListener.php111
1 files changed, 62 insertions, 49 deletions
diff --git a/apps/contactsinteraction/lib/Listeners/ContactInteractionListener.php b/apps/contactsinteraction/lib/Listeners/ContactInteractionListener.php
index 0d776bb9fcc..2064136c392 100644
--- a/apps/contactsinteraction/lib/Listeners/ContactInteractionListener.php
+++ b/apps/contactsinteraction/lib/Listeners/ContactInteractionListener.php
@@ -28,10 +28,12 @@ namespace OCA\ContactsInteraction\Listeners;
use OCA\ContactsInteraction\Db\CardSearchDao;
use OCA\ContactsInteraction\Db\RecentContact;
use OCA\ContactsInteraction\Db\RecentContactMapper;
+use OCP\AppFramework\Db\TTransactional;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\Contacts\Events\ContactInteractedWithEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventListener;
+use OCP\IDBConnection;
use OCP\IL10N;
use OCP\IUserManager;
use Psr\Log\LoggerInterface;
@@ -41,9 +43,13 @@ use Sabre\VObject\UUIDUtil;
use Throwable;
class ContactInteractionListener implements IEventListener {
+
+ use TTransactional;
+
private RecentContactMapper $mapper;
private CardSearchDao $cardSearchDao;
private IUserManager $userManager;
+ private IDBConnection $dbConnection;
private ITimeFactory $timeFactory;
private IL10N $l10n;
private LoggerInterface $logger;
@@ -51,12 +57,14 @@ class ContactInteractionListener implements IEventListener {
public function __construct(RecentContactMapper $mapper,
CardSearchDao $cardSearchDao,
IUserManager $userManager,
+ IDBConnection $connection,
ITimeFactory $timeFactory,
IL10N $l10nFactory,
LoggerInterface $logger) {
$this->mapper = $mapper;
$this->cardSearchDao = $cardSearchDao;
$this->userManager = $userManager;
+ $this->dbConnection = $connection;
$this->timeFactory = $timeFactory;
$this->l10n = $l10nFactory;
$this->logger = $logger;
@@ -77,58 +85,63 @@ class ContactInteractionListener implements IEventListener {
return;
}
- $existing = $this->mapper->findMatch(
- $event->getActor(),
- $event->getUid(),
- $event->getEmail(),
- $event->getFederatedCloudId()
- );
- if (!empty($existing)) {
- $now = $this->timeFactory->getTime();
- foreach ($existing as $c) {
- $c->setLastContact($now);
- $this->mapper->update($c);
+ $this->atomic(function () use ($event) {
+ $uid = $event->getUid();
+ $email = $event->getEmail();
+ $federatedCloudId = $event->getFederatedCloudId();
+ $existing = $this->mapper->findMatch(
+ $event->getActor(),
+ $uid,
+ $email,
+ $federatedCloudId
+ );
+ if (!empty($existing)) {
+ $now = $this->timeFactory->getTime();
+ foreach ($existing as $c) {
+ $c->setLastContact($now);
+ $this->mapper->update($c);
+ }
+
+ return;
}
- return;
- }
-
- $contact = new RecentContact();
- $contact->setActorUid($event->getActor()->getUID());
- if ($event->getUid() !== null) {
- $contact->setUid($event->getUid());
- }
- if ($event->getEmail() !== null) {
- $contact->setEmail($event->getEmail());
- }
- if ($event->getFederatedCloudId() !== null) {
- $contact->setFederatedCloudId($event->getFederatedCloudId());
- }
- $contact->setLastContact($this->timeFactory->getTime());
-
- $copy = $this->cardSearchDao->findExisting(
- $event->getActor(),
- $event->getUid(),
- $event->getEmail(),
- $event->getFederatedCloudId()
- );
- if ($copy !== null) {
- try {
- $parsed = Reader::read($copy, Reader::OPTION_FORGIVING);
- $parsed->CATEGORIES = $this->l10n->t('Recently contacted');
- $contact->setCard($parsed->serialize());
- } catch (Throwable $e) {
- $this->logger->warning(
- 'Could not parse card to add recent category: ' . $e->getMessage(),
- [
- 'exception' => $e,
- ]);
- $contact->setCard($copy);
+ $contact = new RecentContact();
+ $contact->setActorUid($event->getActor()->getUID());
+ if ($uid !== null) {
+ $contact->setUid($uid);
}
- } else {
- $contact->setCard($this->generateCard($contact));
- }
- $this->mapper->insert($contact);
+ if ($email !== null) {
+ $contact->setEmail($email);
+ }
+ if ($federatedCloudId !== null) {
+ $contact->setFederatedCloudId($federatedCloudId);
+ }
+ $contact->setLastContact($this->timeFactory->getTime());
+
+ $copy = $this->cardSearchDao->findExisting(
+ $event->getActor(),
+ $uid,
+ $email,
+ $federatedCloudId
+ );
+ if ($copy !== null) {
+ try {
+ $parsed = Reader::read($copy, Reader::OPTION_FORGIVING);
+ $parsed->CATEGORIES = $this->l10n->t('Recently contacted');
+ $contact->setCard($parsed->serialize());
+ } catch (Throwable $e) {
+ $this->logger->warning(
+ 'Could not parse card to add recent category: ' . $e->getMessage(),
+ [
+ 'exception' => $e,
+ ]);
+ $contact->setCard($copy);
+ }
+ } else {
+ $contact->setCard($this->generateCard($contact));
+ }
+ $this->mapper->insert($contact);
+ }, $this->dbConnection);
}
private function getDisplayName(?string $uid): ?string {