From 8681c328d02a0f1cba055c7de27afe5179b91e69 Mon Sep 17 00:00:00 2001 From: shibafu Date: Thu, 21 May 2020 23:13:39 +0900 Subject: [PATCH] =?UTF-8?q?ejaculated=5Fdate=E3=81=AE=E9=87=8D=E8=A4=87?= =?UTF-8?q?=E3=82=A8=E3=83=A9=E3=83=BC=E3=82=92catch?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Services/CheckinCsvImporter.php | 22 ++++++++++++++++--- .../Unit/Services/CheckinCsvImporterTest.php | 15 +++++++++++++ 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/app/Services/CheckinCsvImporter.php b/app/Services/CheckinCsvImporter.php index d99f51a..c424dd1 100644 --- a/app/Services/CheckinCsvImporter.php +++ b/app/Services/CheckinCsvImporter.php @@ -8,9 +8,11 @@ use App\Rules\CsvDateTime; use App\Tag; use App\User; use Carbon\Carbon; +use Illuminate\Database\QueryException; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; use League\Csv\Reader; +use Throwable; class CheckinCsvImporter { @@ -78,9 +80,23 @@ class CheckinCsvImporter continue; } - $ejaculation->save(); - if (!empty($tags)) { - $ejaculation->tags()->sync(collect($tags)->pluck('id')); + DB::beginTransaction(); + try { + $ejaculation->save(); + if (!empty($tags)) { + $ejaculation->tags()->sync(collect($tags)->pluck('id')); + } + DB::commit(); + } catch (QueryException $e) { + DB::rollBack(); + if ($e->errorInfo[0] === '23505') { + $errors[] = "{$line} 行 : すでにこの日時のチェックインデータが存在します。"; + continue; + } + throw $e; + } catch (Throwable $e) { + DB::rollBack(); + throw $e; } } diff --git a/tests/Unit/Services/CheckinCsvImporterTest.php b/tests/Unit/Services/CheckinCsvImporterTest.php index 51307da..07c9be4 100644 --- a/tests/Unit/Services/CheckinCsvImporterTest.php +++ b/tests/Unit/Services/CheckinCsvImporterTest.php @@ -265,4 +265,19 @@ class CheckinCsvImporterTest extends TestCase $this->assertSame(1, $user->ejaculations()->count()); $this->assertEquals(Ejaculation::SOURCE_CSV, $ejaculation->source); } + + public function testDontThrowUniqueKeyViolation() + { + $user = factory(User::class)->create(); + factory(Ejaculation::class)->create([ + 'user_id' => $user->id, + 'ejaculated_date' => Carbon::create(2020, 1, 23, 6, 1, 0, 'Asia/Tokyo') + ]); + + $this->expectException(CsvImportException::class); + $this->expectExceptionMessage('2 行 : すでにこの日時のチェックインデータが存在します。'); + + $importer = new CheckinCsvImporter($user, __DIR__ . '/../../fixture/Csv/date.utf8.csv'); + $importer->execute(); + } }