diff --git a/app/Http/Controllers/Api/CardController.php b/app/Http/Controllers/Api/CardController.php index a336830..aeaa37a 100644 --- a/app/Http/Controllers/Api/CardController.php +++ b/app/Http/Controllers/Api/CardController.php @@ -44,7 +44,7 @@ class CardController ]); $tagIds = []; - foreach ($resolved->tags as $tagName) { + foreach ($resolved->normalizedTags() as $tagName) { $tag = Tag::firstOrCreate(['name' => $tagName]); $tagIds[] = $tag->id; } diff --git a/app/Listeners/LinkCollector.php b/app/Listeners/LinkCollector.php index 1ca8682..867938f 100644 --- a/app/Listeners/LinkCollector.php +++ b/app/Listeners/LinkCollector.php @@ -56,7 +56,7 @@ class LinkCollector ]); $tagIds = []; - foreach ($resolved->tags as $tagName) { + foreach ($resolved->normalizedTags() as $tagName) { $tag = Tag::firstOrCreate(['name' => $tagName]); $tagIds[] = $tag->id; } diff --git a/app/MetadataResolver/Metadata.php b/app/MetadataResolver/Metadata.php index 62d16e8..c9b5e05 100644 --- a/app/MetadataResolver/Metadata.php +++ b/app/MetadataResolver/Metadata.php @@ -23,4 +23,30 @@ class Metadata * チェックインタグと同様に保存されるため、スペースや改行文字を含めてはいけません。 */ public $tags = []; + + /** + * 重複を排除し、正規化を行ったタグの集合を返します。 + * @return string[] + */ + public function normalizedTags(): array + { + $tags = []; + foreach ($this->tags as $tag) { + $tag = $this->sanitize($tag); + $tag = $this->trim($tag); + $tags[$tag] = true; + } + + return array_keys($tags); + } + + private function sanitize(string $value): string + { + return preg_replace('/\r?\n/u', ' ', $value); + } + + private function trim(string $value): string + { + return trim($value); + } } diff --git a/tests/Unit/MetadataResolver/MetadataTest.php b/tests/Unit/MetadataResolver/MetadataTest.php new file mode 100644 index 0000000..6d517ac --- /dev/null +++ b/tests/Unit/MetadataResolver/MetadataTest.php @@ -0,0 +1,33 @@ +tags = ['foo ', ' bar', ' foo bar ']; + + $this->assertEquals(['foo', 'bar', 'foo bar'], $metadata->normalizedTags()); + } + + public function testNormalizedTagsCanSanitize() + { + $metadata = new Metadata(); + $metadata->tags = ["foo \n", " \nbar", " foo\n bar "]; + + $this->assertEquals(['foo', 'bar', 'foo bar'], $metadata->normalizedTags()); + } + + public function testNormalizedTagsCanDeduplication() + { + $metadata = new Metadata(); + $metadata->tags = ['foo ', ' foo', ' bar']; + + $this->assertEquals(['foo', 'bar'], $metadata->normalizedTags()); + } +}