浏览代码

Update Helpers, cache profiles

Daniel Supernault 4 年之前
父节点
当前提交
1f672ecfb8
共有 1 个文件被更改,包括 68 次插入59 次删除
  1. 68 59
      app/Util/ActivityPub/Helpers.php

+ 68 - 59
app/Util/ActivityPub/Helpers.php

@@ -403,69 +403,78 @@ class Helpers {
 	public static function profileFirstOrNew($url, $runJobs = false)
 	public static function profileFirstOrNew($url, $runJobs = false)
 	{
 	{
 		$url = self::validateUrl($url);
 		$url = self::validateUrl($url);
-		if($url == false) {
-			abort(400, 'Invalid url');
-		}
-		$host = parse_url($url, PHP_URL_HOST);
-		$local = config('pixelfed.domain.app') == $host ? true : false;
-
-		if($local == true) {
-			$id = last(explode('/', $url));
-			return Profile::whereNull('status')
-				->whereNull('domain')
-				->whereUsername($id)
-				->firstOrFail();
-		}
-		$res = self::fetchProfileFromUrl($url);
-		if(isset($res['id']) == false) {
+		if($url == false || strlen($url) > 190) {
 			return;
 			return;
 		}
 		}
-		$domain = parse_url($res['id'], PHP_URL_HOST);
-		if(!isset($res['preferredUsername']) && !isset($res['nickname'])) {
-			return;
-		}
-		$username = (string) Purify::clean($res['preferredUsername'] ?? $res['nickname']);
-		if(empty($username)) {
-			return;
-		}
-		$remoteUsername = $username;
-		$webfinger = "@{$username}@{$domain}";
-
-		abort_if(!self::validateUrl($res['inbox']), 400);
-		abort_if(!self::validateUrl($res['id']), 400);
-
-		$profile = Profile::whereRemoteUrl($res['id'])->first();
-		if(!$profile) {
-			$profile = new Profile();
-			$profile->domain = strtolower($domain);
-			$profile->username = strtolower(Purify::clean($webfinger));
-			$profile->name = isset($res['name']) ? Purify::clean($res['name']) : 'user';
-			$profile->bio = isset($res['summary']) ? Purify::clean($res['summary']) : null;
-			$profile->sharedInbox = isset($res['endpoints']) && isset($res['endpoints']['sharedInbox']) ? $res['endpoints']['sharedInbox'] : null;
-			$profile->inbox_url = strtolower($res['inbox']);
-			$profile->outbox_url = strtolower($res['outbox']);
-			$profile->remote_url = strtolower($res['id']);
-			$profile->public_key = $res['publicKey']['publicKeyPem'];
-			$profile->key_id = $res['publicKey']['id'];
-			$profile->webfinger = strtolower(Purify::clean($webfinger));
-			$profile->last_fetched_at = now();
-			$profile->save();
-			if($runJobs == true) {
-				// RemoteFollowImportRecent::dispatch($res, $profile);
-				CreateAvatar::dispatch($profile);
+		$hash = base64_encode($url);
+		$key = 'ap:profile:by_url:' . $hash;
+		$ttl = now()->addMinutes(5);
+		$profile = Cache::remember($key, $ttl, function() use($url, $runJobs) {
+			$host = parse_url($url, PHP_URL_HOST);
+			$local = config('pixelfed.domain.app') == $host ? true : false;
+
+			if($local == true) {
+				$id = last(explode('/', $url));
+				return Profile::whereNull('status')
+					->whereNull('domain')
+					->whereUsername($id)
+					->firstOrFail();
 			}
 			}
-		} else {
-			// Update info after 24 hours
-			if($profile->last_fetched_at == null || 
-			   $profile->last_fetched_at->lt(now()->subHours(24)) == true
-			) {
-				$profile->name = isset($res['name']) ? Purify::clean($res['name']) : 'user';
-				$profile->bio = isset($res['summary']) ? Purify::clean($res['summary']) : null;
-				$profile->last_fetched_at = now();
-				$profile->sharedInbox = isset($res['endpoints']) && isset($res['endpoints']['sharedInbox']) && Helpers::validateUrl($res['endpoints']['sharedInbox']) ? $res['endpoints']['sharedInbox'] : null;
-				$profile->save();
+			$res = self::fetchProfileFromUrl($url);
+			if(isset($res['id']) == false) {
+				return;
 			}
 			}
-		}
+			$domain = parse_url($res['id'], PHP_URL_HOST);
+			if(!isset($res['preferredUsername']) && !isset($res['nickname'])) {
+				return;
+			}
+			$username = (string) Purify::clean($res['preferredUsername'] ?? $res['nickname']);
+			if(empty($username)) {
+				return;
+			}
+			$remoteUsername = $username;
+			$webfinger = "@{$username}@{$domain}";
+
+			abort_if(!self::validateUrl($res['inbox']), 400);
+			abort_if(!self::validateUrl($res['id']), 400);
+
+			$profile = Profile::whereRemoteUrl($res['id'])->first();
+			if(!$profile) {
+				$profile = DB::transaction(function() use($domain, $webfinger, $res, $runJobs) {
+					$profile = new Profile();
+					$profile->domain = strtolower($domain);
+					$profile->username = strtolower(Purify::clean($webfinger));
+					$profile->name = isset($res['name']) ? Purify::clean($res['name']) : 'user';
+					$profile->bio = isset($res['summary']) ? Purify::clean($res['summary']) : null;
+					$profile->sharedInbox = isset($res['endpoints']) && isset($res['endpoints']['sharedInbox']) ? $res['endpoints']['sharedInbox'] : null;
+					$profile->inbox_url = strtolower($res['inbox']);
+					$profile->outbox_url = strtolower($res['outbox']);
+					$profile->remote_url = strtolower($res['id']);
+					$profile->public_key = $res['publicKey']['publicKeyPem'];
+					$profile->key_id = $res['publicKey']['id'];
+					$profile->webfinger = strtolower(Purify::clean($webfinger));
+					$profile->last_fetched_at = now();
+					$profile->save();
+					if($runJobs == true) {
+						// RemoteFollowImportRecent::dispatch($res, $profile);
+						CreateAvatar::dispatch($profile);
+					}
+					return $profile;
+				});
+			} else {
+				// Update info after 24 hours
+				if($profile->last_fetched_at == null || 
+				   $profile->last_fetched_at->lt(now()->subHours(24)) == true
+				) {
+					$profile->name = isset($res['name']) ? Purify::clean($res['name']) : 'user';
+					$profile->bio = isset($res['summary']) ? Purify::clean($res['summary']) : null;
+					$profile->last_fetched_at = now();
+					$profile->sharedInbox = isset($res['endpoints']) && isset($res['endpoints']['sharedInbox']) && Helpers::validateUrl($res['endpoints']['sharedInbox']) ? $res['endpoints']['sharedInbox'] : null;
+					$profile->save();
+				}
+			}
+			return $profile;
+		});
 		return $profile;
 		return $profile;
 	}
 	}