diff --git a/app/Services/Federation/ActiveSharedInboxService.php b/app/Services/Federation/ActiveSharedInboxService.php new file mode 100644 index 000000000..4f7020a8f --- /dev/null +++ b/app/Services/Federation/ActiveSharedInboxService.php @@ -0,0 +1,244 @@ +parse($res['updated'])->lt(now()->subMonths(6))) { + $res = self::getFromDatabase(); + } else { + if ($res['version'] === self::CACHE_FILE_VERSION) { + $res = $res['data']; + } else { + $res = self::getFromDatabase(); + } + } + } else { + $res = self::getFromDatabase(); + } + } + } else { + $res = self::getFromDatabase(); + } + + if (! $res) { + return []; + } + + $filteredList = []; + + foreach ($res as $value) { + if (! $value || ! str_starts_with($value, 'https://')) { + continue; + } + $passed = self::add($value); + if ($passed) { + $filteredList[] = $value; + } + } + + self::saveCacheToDisk($filteredList); + Cache::remember(self::CACHE_KEY_CHECK, 86400, function () { + return true; + }); + + return $res; + } + + public static function parseCacheFileData() + { + if (Storage::has(self::CACHE_FILE_NAME)) { + $res = Storage::get(self::CACHE_FILE_NAME); + if (! $res) { + return false; + } else { + $res = json_decode($res, true); + if (! $res || isset($res['version'], $res['data'], $res['created'], $res['updated'])) { + if (now()->parse($res['updated'])->lt(now()->subMonths(6))) { + return false; + } else { + if ($res['version'] === self::CACHE_FILE_VERSION) { + return $res; + } else { + return false; + } + } + } else { + return false; + } + } + } + + return false; + } + + public static function transformCacheFileData($res) + { + return [ + 'id' => 'pixelfed/storage/app/'.self::CACHE_FILE_NAME, + 'version' => self::CACHE_FILE_VERSION, + 'created' => now()->format('c'), + 'updated' => now()->format('c'), + 'length' => count($res), + 'data' => $res, + ]; + } + + public static function updateCacheFileData() + { + $res = self::parseCacheFileData(); + if (! $res) { + return false; + } + + $diff = []; + $nodes = $res['data']; + $latest = self::getFromDatabase(); + $merge = array_merge($nodes, $latest); + + foreach ($merge as $val) { + if (! in_array($val, $nodes)) { + if (self::add($val)) { + $nodes[] = $val; + } else { + unset($nodes[$val]); + } + } + } + + $data = [ + 'id' => 'pixelfed/storage/app/'.self::CACHE_FILE_NAME, + 'version' => self::CACHE_FILE_VERSION, + 'created' => $res['created'], + 'updated' => now()->format('c'), + 'length' => count($nodes), + 'data' => $nodes, + ]; + + $contents = json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); + Storage::put(self::CACHE_FILE_NAME, $contents); + + return 1; + } + + public static function saveCacheToDisk($res = false) + { + if (! $res) { + return; + } + + $contents = json_encode(self::transformCacheFileData($res), JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT); + Storage::put(self::CACHE_FILE_NAME, $contents); + } + + public static function getFromDatabase() + { + return Profile::whereNotNull('sharedInbox')->groupBy('sharedInbox')->pluck('sharedInbox')->toArray(); + } + + public static function scanForUpdates() + { + $res = self::getFromDatabase(); + $filteredList = []; + + foreach ($res as $value) { + if (! $value || ! str_starts_with($value, 'https://')) { + continue; + } + Redis::sadd(self::CACHE_KEY, $value); + $filteredList[] = $value; + } + + self::saveCacheToDisk($filteredList); + + return 1; + } +}