diff --git a/app/Rules/FuzzyBoolean.php b/app/Rules/FuzzyBoolean.php new file mode 100644 index 0000000..ec40d71 --- /dev/null +++ b/app/Rules/FuzzyBoolean.php @@ -0,0 +1,62 @@ +addStreamFilter('convert.mbstring.encoding.UTF-8:SJIS-win'); } - $header = ['日時', 'ノート', 'オカズリンク']; + $header = ['日時', 'ノート', 'オカズリンク', '非公開', 'センシティブ']; for ($i = 1; $i <= 32; $i++) { $header[] = "タグ{$i}"; } @@ -45,6 +45,8 @@ class CheckinCsvExporter $ejaculation->ejaculated_date->format('Y/m/d H:i'), $ejaculation->note, $ejaculation->link, + self::formatBoolean($ejaculation->is_private), + self::formatBoolean($ejaculation->is_too_sensitive), ]; foreach ($ejaculation->tags->take(32) as $tag) { $record[] = $tag->name; @@ -54,4 +56,9 @@ class CheckinCsvExporter }); }); } + + private static function formatBoolean($value): string + { + return $value ? 'true' : 'false'; + } } diff --git a/app/Services/CheckinCsvImporter.php b/app/Services/CheckinCsvImporter.php index 1a9572e..2ccf208 100644 --- a/app/Services/CheckinCsvImporter.php +++ b/app/Services/CheckinCsvImporter.php @@ -6,6 +6,7 @@ namespace App\Services; use App\Ejaculation; use App\Exceptions\CsvImportException; use App\Rules\CsvDateTime; +use App\Rules\FuzzyBoolean; use App\Tag; use App\User; use Carbon\Carbon; @@ -75,6 +76,8 @@ class CheckinCsvImporter '日時' => ['required', new CsvDateTime()], 'ノート' => 'nullable|string|max:500', 'オカズリンク' => 'nullable|url|max:2000', + '非公開' => ['nullable', new FuzzyBoolean()], + 'センシティブ' => ['nullable', new FuzzyBoolean()], ]); if ($validator->fails()) { @@ -88,6 +91,12 @@ class CheckinCsvImporter $ejaculation->note = str_replace(["\r\n", "\r"], "\n", $record['ノート'] ?? ''); $ejaculation->link = $record['オカズリンク'] ?? ''; $ejaculation->source = Ejaculation::SOURCE_CSV; + if (isset($record['非公開'])) { + $ejaculation->is_private = FuzzyBoolean::isTruthy($record['非公開']); + } + if (isset($record['センシティブ'])) { + $ejaculation->is_too_sensitive = FuzzyBoolean::isTruthy($record['センシティブ']); + } try { $tags = $this->parseTags($line, $record); diff --git a/tests/Unit/Services/CheckinCsvImporterTest.php b/tests/Unit/Services/CheckinCsvImporterTest.php index 8d208bf..f58ae7e 100644 --- a/tests/Unit/Services/CheckinCsvImporterTest.php +++ b/tests/Unit/Services/CheckinCsvImporterTest.php @@ -277,6 +277,48 @@ class CheckinCsvImporterTest extends TestCase $this->assertEquals(Ejaculation::SOURCE_CSV, $ejaculation->source); } + public function testIsPrivateUTF8() + { + $user = factory(User::class)->create(); + + $importer = new CheckinCsvImporter($user, __DIR__ . '/../../fixture/Csv/private.utf8.csv'); + $importer->execute(); + + $ejaculations = $user->ejaculations()->orderBy('ejaculated_date')->get(); + + $this->assertSame(9, $ejaculations->count()); + $this->assertTrue($ejaculations[0]->is_private); + $this->assertTrue($ejaculations[1]->is_private); + $this->assertTrue($ejaculations[2]->is_private); + $this->assertTrue($ejaculations[3]->is_private); + $this->assertFalse($ejaculations[4]->is_private); + $this->assertFalse($ejaculations[5]->is_private); + $this->assertFalse($ejaculations[6]->is_private); + $this->assertFalse($ejaculations[7]->is_private); + $this->assertFalse($ejaculations[8]->is_private); + } + + public function testIsTooSensitiveUTF8() + { + $user = factory(User::class)->create(); + + $importer = new CheckinCsvImporter($user, __DIR__ . '/../../fixture/Csv/too-sensitive.utf8.csv'); + $importer->execute(); + + $ejaculations = $user->ejaculations()->orderBy('ejaculated_date')->get(); + + $this->assertSame(9, $ejaculations->count()); + $this->assertTrue($ejaculations[0]->is_too_sensitive); + $this->assertTrue($ejaculations[1]->is_too_sensitive); + $this->assertTrue($ejaculations[2]->is_too_sensitive); + $this->assertTrue($ejaculations[3]->is_too_sensitive); + $this->assertFalse($ejaculations[4]->is_too_sensitive); + $this->assertFalse($ejaculations[5]->is_too_sensitive); + $this->assertFalse($ejaculations[6]->is_too_sensitive); + $this->assertFalse($ejaculations[7]->is_too_sensitive); + $this->assertFalse($ejaculations[8]->is_too_sensitive); + } + public function testDontThrowUniqueKeyViolation() { $user = factory(User::class)->create(); diff --git a/tests/fixture/Csv/private.utf8.csv b/tests/fixture/Csv/private.utf8.csv new file mode 100644 index 0000000..259b893 --- /dev/null +++ b/tests/fixture/Csv/private.utf8.csv @@ -0,0 +1,10 @@ +日時,非公開 +2020/01/23 06:01:00,true +2020/01/23 06:02:00,TRUE +2020/01/23 06:03:00,True +2020/01/23 06:04:00,1 +2020/01/23 07:01:00,false +2020/01/23 07:02:00,FALSE +2020/01/23 07:03:00,False +2020/01/23 07:04:00,0 +2020/01/23 07:05:00, diff --git a/tests/fixture/Csv/too-sensitive.utf8.csv b/tests/fixture/Csv/too-sensitive.utf8.csv new file mode 100644 index 0000000..24cd1ef --- /dev/null +++ b/tests/fixture/Csv/too-sensitive.utf8.csv @@ -0,0 +1,10 @@ +日時,センシティブ +2020/01/23 06:01:00,true +2020/01/23 06:02:00,TRUE +2020/01/23 06:03:00,True +2020/01/23 06:04:00,1 +2020/01/23 07:01:00,false +2020/01/23 07:02:00,FALSE +2020/01/23 07:03:00,False +2020/01/23 07:04:00,0 +2020/01/23 07:05:00,