Kaynağa Gözat

Update StatusTagsPipeline, fix object tags and slug normalization

Daniel Supernault 1 yıl önce
ebeveyn
işleme
d295e6059b

+ 9 - 4
app/Jobs/StatusPipeline/StatusTagsPipeline.php

@@ -45,6 +45,11 @@ class StatusTagsPipeline implements ShouldQueue
 	{
 		$res = $this->activity;
 		$status = $this->status;
+
+        if(isset($res['tag']['type'], $res['tag']['name'])) {
+            $res['tag'] = [$res['tag']];
+        }
+
 		$tags = collect($res['tag']);
 
 		// Emoji
@@ -73,19 +78,19 @@ class StatusTagsPipeline implements ShouldQueue
 
             if(config('database.default') === 'pgsql') {
             	$hashtag = Hashtag::where('name', 'ilike', $name)
-            		->orWhere('slug', 'ilike', str_slug($name))
+            		->orWhere('slug', 'ilike', str_slug($name, '-', false))
             		->first();
 
             	if(!$hashtag) {
             		$hashtag = new Hashtag;
             		$hashtag->name = $name;
-            		$hashtag->slug = str_slug($name);
+            		$hashtag->slug = str_slug($name, '-', false);
             		$hashtag->save();
             	}
             } else {
 				$hashtag = Hashtag::firstOrCreate([
-					'slug' => str_slug($name)
-				], [
+					'slug' => str_slug($name, '-', false),
+                ],[
 					'name' => $name
 				]);
             }

+ 133 - 0
tests/Unit/ActivityPubTagObjectTest.php

@@ -0,0 +1,133 @@
+<?php
+
+namespace Tests\Unit;
+
+use PHPUnit\Framework\TestCase;
+
+class ActivityPubTagObjectTest extends TestCase
+{
+    /**
+     * A basic unit test example.
+     */
+    public function test_gotosocial(): void
+    {
+        $res = [
+            "tag" => [
+                "href" => "https://gotosocial.example.org/users/GotosocialUser",
+                "name" => "@GotosocialUser@gotosocial.example.org",
+                "type" => "Mention"
+            ]
+        ];
+
+        if(isset($res['tag']['type'], $res['tag']['name'])) {
+            $res['tag'] = [$res['tag']];
+        }
+
+        $tags = collect($res['tag'])
+        ->filter(function($tag) {
+            return $tag &&
+                $tag['type'] == 'Mention' &&
+                isset($tag['href']) &&
+                substr($tag['href'], 0, 8) === 'https://';
+        });
+        $this->assertTrue($tags->count() === 1);
+    }
+
+    public function test_pixelfed_hashtags(): void
+    {
+        $res = [
+            "tag" => [
+                [
+                    "type" => "Mention",
+                    "href" => "https://pixelfed.social/dansup",
+                    "name" => "@dansup@pixelfed.social"
+                ],
+                [
+                    "type" => "Hashtag",
+                    "href" => "https://pixelfed.social/discover/tags/dogsofpixelfed",
+                    "name" => "#dogsOfPixelFed"
+                ],
+                [
+                    "type" => "Hashtag",
+                    "href" => "https://pixelfed.social/discover/tags/doggo",
+                    "name" => "#doggo"
+                ],
+                [
+                    "type" => "Hashtag",
+                    "href" => "https://pixelfed.social/discover/tags/dog",
+                    "name" => "#dog"
+                ],
+                [
+                    "type" => "Hashtag",
+                    "href" => "https://pixelfed.social/discover/tags/drake",
+                    "name" => "#drake"
+                ],
+                [
+                    "type" => "Hashtag",
+                    "href" => "https://pixelfed.social/discover/tags/blacklab",
+                    "name" => "#blacklab"
+                ],
+                [
+                    "type" => "Hashtag",
+                    "href" => "https://pixelfed.social/discover/tags/iconic",
+                    "name" => "#Iconic"
+                ],
+                [
+                    "type" => "Hashtag",
+                    "href" => "https://pixelfed.social/discover/tags/majestic",
+                    "name" => "#majestic"
+                ]
+            ]
+        ];
+
+        if(isset($res['tag']['type'], $res['tag']['name'])) {
+            $res['tag'] = [$res['tag']];
+        }
+
+        $tags = collect($res['tag'])
+        ->filter(function($tag) {
+            return $tag &&
+                $tag['type'] == 'Hashtag' &&
+                isset($tag['href']) &&
+                substr($tag['href'], 0, 8) === 'https://';
+        });
+        $this->assertTrue($tags->count() === 7);
+    }
+
+
+    public function test_pixelfed_mentions(): void
+    {
+        $res = [
+            "tag" => [
+                [
+                    "type" => "Mention",
+                    "href" => "https://pixelfed.social/dansup",
+                    "name" => "@dansup@pixelfed.social"
+                ],
+                [
+                    "type" => "Hashtag",
+                    "href" => "https://pixelfed.social/discover/tags/dogsofpixelfed",
+                    "name" => "#dogsOfPixelFed"
+                ],
+                [
+                    "type" => "Hashtag",
+                    "href" => "https://pixelfed.social/discover/tags/doggo",
+                    "name" => "#doggo"
+                ],
+            ]
+        ];
+
+        if(isset($res['tag']['type'], $res['tag']['name'])) {
+            $res['tag'] = [$res['tag']];
+        }
+
+        $tags = collect($res['tag'])
+        ->filter(function($tag) {
+            return $tag &&
+                $tag['type'] == 'Mention' &&
+                isset($tag['href']) &&
+                substr($tag['href'], 0, 8) === 'https://';
+        });
+        $this->assertTrue($tags->count() === 1);
+    }
+}