diff --git a/src/Model/Contact.php b/src/Model/Contact.php index e892c99f2a..9f6fa6264b 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -1418,13 +1418,22 @@ class Contact extends BaseObject $condition = ['nurl' => Strings::normaliseLink($data["url"]), 'uid' => $uid, 'deleted' => false]; - // This does an insert but should most likely prevent duplicates - DBA::update('contact', $fields, $condition, true); - + // Before inserting we do check if the entry does exist now. $contact = DBA::selectFirst('contact', ['id'], $condition, ['order' => ['id']]); if (!DBA::isResult($contact)) { - // Shouldn't happen - return 0; + Logger::info('Create new contact', $fields); + + DBA::insert('contact', $fields); + + // We intentionally aren't using lastInsertId here. There is a chance for duplicates. + $contact = DBA::selectFirst('contact', ['id'], $condition, ['order' => ['id']]); + if (!DBA::isResult($contact)) { + Logger::info('Contact creation failed', $fields); + // Shouldn't happen + return 0; + } + } else { + Logger::info('Contact had been created before', ['id' => $contact["id"], 'url' => $url, 'contact' => $fields]); } $contact_id = $contact["id"]; diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index 5f37684ad6..8e2e487796 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -191,15 +191,17 @@ class Diaspora $fields = array_merge($fields, $network_fields); $condition = ['uid' => 0, 'nurl' => Strings::normaliseLink($server_url)]; - $relay = DBA::selectFirst('contact', ['id'], $condition); - if (DBA::isResult($relay)) { + $old = DBA::selectFirst('contact', [], $condition); + if (DBA::isResult($old)) { unset($fields['created']); - $condition = ['id' => $relay['id']]; + $condition = ['id' => $old['id']]; + + Logger::info('Update relay contact', ['fields' => $fields, 'condition' => $condition]); + DBA::update('contact', $fields, $condition, $old); + } else { + Logger::info('Create relay contact', ['fields' => $fields]); + DBA::insert('contact', $fields); } - - Logger::info('Set relay contact', ['fields' => $fields, 'condition' => $condition]); - - DBA::update('contact', $fields, $condition, true); } /**