LandingService.php 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <?php
  2. namespace App\Services;
  3. use App\User;
  4. use App\Util\Site\Nodeinfo;
  5. use Illuminate\Support\Facades\Cache;
  6. use Illuminate\Support\Str;
  7. class LandingService
  8. {
  9. public static function get($json = true)
  10. {
  11. $activeMonth = Nodeinfo::activeUsersMonthly();
  12. $totalUsers = Cache::remember('api:nodeinfo:users', 43200, function () {
  13. return User::count();
  14. });
  15. $postCount = InstanceService::totalLocalStatuses();
  16. $contactAccount = Cache::remember('api:v1:instance-data:contact', 604800, function () {
  17. if (config_cache('instance.admin.pid')) {
  18. return AccountService::getMastodon(config_cache('instance.admin.pid'), true);
  19. }
  20. $admin = User::whereIsAdmin(true)->first();
  21. return $admin && isset($admin->profile_id) ?
  22. AccountService::getMastodon($admin->profile_id, true) :
  23. null;
  24. });
  25. $rules = Cache::remember('api:v1:instance-data:rules', 604800, function () {
  26. return config_cache('app.rules') ?
  27. collect(json_decode(config_cache('app.rules'), true))
  28. ->map(function ($rule, $key) {
  29. $id = $key + 1;
  30. return [
  31. 'id' => "{$id}",
  32. 'text' => $rule,
  33. ];
  34. })
  35. ->toArray() : [];
  36. });
  37. $openReg = (bool) config_cache('pixelfed.open_registration');
  38. $res = [
  39. 'name' => config_cache('app.name'),
  40. 'url' => config_cache('app.url'),
  41. 'domain' => config('pixelfed.domain.app'),
  42. 'show_directory' => (bool) config_cache('instance.landing.show_directory'),
  43. 'show_explore_feed' => (bool) config_cache('instance.landing.show_explore'),
  44. 'show_legal_notice_link' => (bool) config('instance.has_legal_notice'),
  45. 'open_registration' => (bool) $openReg,
  46. 'curated_onboarding' => (bool) config_cache('instance.curated_registration.enabled'),
  47. 'version' => config('pixelfed.version'),
  48. 'about' => [
  49. 'banner_image' => config_cache('app.banner_image') ?? url('/storage/headers/default.jpg'),
  50. 'short_description' => config_cache('app.short_description'),
  51. 'description' => config_cache('app.description'),
  52. ],
  53. 'stats' => [
  54. 'active_users' => (int) $activeMonth,
  55. 'posts_count' => (int) $postCount,
  56. 'total_users' => (int) $totalUsers,
  57. ],
  58. 'contact' => [
  59. 'account' => $contactAccount,
  60. 'email' => config('instance.email'),
  61. ],
  62. 'rules' => $rules,
  63. 'uploader' => [
  64. 'max_photo_size' => (int) (config_cache('pixelfed.max_photo_size') * 1024),
  65. 'max_caption_length' => (int) config_cache('pixelfed.max_caption_length'),
  66. 'max_altext_length' => (int) config_cache('pixelfed.max_altext_length', 150),
  67. 'album_limit' => (int) config_cache('pixelfed.max_album_length'),
  68. 'image_quality' => (int) config_cache('pixelfed.image_quality'),
  69. 'max_collection_length' => (int) config('pixelfed.max_collection_length', 18),
  70. 'optimize_image' => (bool) config_cache('pixelfed.optimize_image'),
  71. 'optimize_video' => (bool) config_cache('pixelfed.optimize_video'),
  72. 'media_types' => config_cache('pixelfed.media_types'),
  73. ],
  74. 'features' => [
  75. 'federation' => (bool) config_cache('federation.activitypub.enabled'),
  76. 'timelines' => [
  77. 'local' => true,
  78. 'network' => (bool) config_cache('federation.network_timeline'),
  79. ],
  80. 'mobile_apis' => (bool) config_cache('pixelfed.oauth_enabled'),
  81. 'stories' => (bool) config_cache('instance.stories.enabled'),
  82. 'video' => Str::contains(config_cache('pixelfed.media_types'), 'video/mp4'),
  83. ],
  84. ];
  85. if ($json) {
  86. return json_encode($res);
  87. }
  88. return $res;
  89. }
  90. }