fix(twofactor): avoid error in pgsql for duplicate entry

Signed-off-by: Benjamin Gaussorgues <benjamin.gaussorgues@nextcloud.com>
pull/40472/head
Benjamin Gaussorgues 2023-09-18 16:01:21 +07:00
parent d061e05b08
commit 4361019f2f
No known key found for this signature in database
GPG Key ID: 5DAC1CAFAA6DB883
1 changed files with 17 additions and 20 deletions

@ -25,8 +25,6 @@ declare(strict_types=1);
*/
namespace OC\Authentication\TwoFactorAuth\Db;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection;
use function array_map;
@ -70,25 +68,24 @@ class ProviderUserAssignmentDao {
* Persist a new/updated (provider_id, uid, enabled) tuple
*/
public function persist(string $providerId, string $uid, int $enabled): void {
$qb = $this->conn->getQueryBuilder();
try {
// Insert a new entry
$insertQuery = $qb->insert(self::TABLE_NAME)->values([
'provider_id' => $qb->createNamedParameter($providerId),
'uid' => $qb->createNamedParameter($uid),
'enabled' => $qb->createNamedParameter($enabled, IQueryBuilder::PARAM_INT),
]);
$insertQuery->execute();
} catch (UniqueConstraintViolationException $ex) {
// There is already an entry -> update it
$updateQuery = $qb->update(self::TABLE_NAME)
->set('enabled', $qb->createNamedParameter($enabled))
->where($qb->expr()->eq('provider_id', $qb->createNamedParameter($providerId)))
->andWhere($qb->expr()->eq('uid', $qb->createNamedParameter($uid)));
$updateQuery->execute();
$conn = $this->conn;
// Insert a new entry
if ($conn->insertIgnoreConflict(self::TABLE_NAME, [
'provider_id' => $providerId,
'uid' => $uid,
'enabled' => $enabled,
])) {
return;
}
// There is already an entry -> update it
$qb = $conn->getQueryBuilder();
$updateQuery = $qb->update(self::TABLE_NAME)
->set('enabled', $qb->createNamedParameter($enabled))
->where($qb->expr()->eq('provider_id', $qb->createNamedParameter($providerId)))
->andWhere($qb->expr()->eq('uid', $qb->createNamedParameter($uid)));
$updateQuery->executeStatement();
}
/**