StatusService.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. <?php
  2. namespace App\Services;
  3. use Illuminate\Support\Facades\Cache;
  4. use Illuminate\Support\Facades\Redis;
  5. use DB;
  6. use App\Status;
  7. use App\Transformer\Api\StatusStatelessTransformer;
  8. use App\Transformer\Api\StatusTransformer;
  9. use League\Fractal;
  10. use League\Fractal\Serializer\ArraySerializer;
  11. use League\Fractal\Pagination\IlluminatePaginatorAdapter;
  12. class StatusService
  13. {
  14. const CACHE_KEY = 'pf:services:status:';
  15. public static function key($id, $publicOnly = true)
  16. {
  17. $p = $publicOnly ? 'pub:' : 'all:';
  18. return self::CACHE_KEY . $p . $id;
  19. }
  20. public static function get($id, $publicOnly = true, $mastodonMode = false)
  21. {
  22. $res = Cache::remember(self::key($id, $publicOnly), 21600, function() use($id, $publicOnly) {
  23. if($publicOnly) {
  24. $status = Status::whereScope('public')->find($id);
  25. } else {
  26. $status = Status::whereIn('scope', ['public', 'private', 'unlisted', 'group'])->find($id);
  27. }
  28. if(!$status) {
  29. return null;
  30. }
  31. $fractal = new Fractal\Manager();
  32. $fractal->setSerializer(new ArraySerializer());
  33. $resource = new Fractal\Resource\Item($status, new StatusStatelessTransformer());
  34. $res = $fractal->createData($resource)->toArray();
  35. $res['_pid'] = isset($res['account']) && isset($res['account']['id']) ? $res['account']['id'] : null;
  36. if(isset($res['_pid'])) {
  37. unset($res['account']);
  38. }
  39. return $res;
  40. });
  41. if($res && isset($res['_pid'])) {
  42. $res['account'] = $mastodonMode === true ? AccountService::getMastodon($res['_pid'], true) : AccountService::get($res['_pid'], true);
  43. unset($res['_pid']);
  44. }
  45. return $res;
  46. }
  47. public static function getMastodon($id, $publicOnly = true)
  48. {
  49. $status = self::get($id, $publicOnly, true);
  50. if(!$status) {
  51. return null;
  52. }
  53. if(!isset($status['account'])) {
  54. return null;
  55. }
  56. $status['replies_count'] = $status['reply_count'];
  57. if(config('exp.emc') == false) {
  58. return $status;
  59. }
  60. unset(
  61. $status['_v'],
  62. $status['comments_disabled'],
  63. $status['content_text'],
  64. $status['gid'],
  65. $status['label'],
  66. $status['liked_by'],
  67. $status['local'],
  68. $status['parent'],
  69. $status['pf_type'],
  70. $status['place'],
  71. $status['replies'],
  72. $status['reply_count'],
  73. $status['shortcode'],
  74. $status['taggedPeople'],
  75. $status['thread'],
  76. $status['pinned'],
  77. $status['account']['header_bg'],
  78. $status['account']['is_admin'],
  79. $status['account']['last_fetched_at'],
  80. $status['account']['local'],
  81. $status['account']['location'],
  82. $status['account']['note_text'],
  83. $status['account']['pronouns'],
  84. $status['account']['website'],
  85. $status['media_attachments'],
  86. );
  87. $status['account']['avatar_static'] = $status['account']['avatar'];
  88. $status['account']['bot'] = false;
  89. $status['account']['emojis'] = [];
  90. $status['account']['fields'] = [];
  91. $status['account']['header'] = url('/storage/headers/missing.png');
  92. $status['account']['header_static'] = url('/storage/headers/missing.png');
  93. $status['account']['last_status_at'] = null;
  94. $status['media_attachments'] = array_values(MediaService::getMastodon($status['id']));
  95. $status['muted'] = false;
  96. $status['reblogged'] = false;
  97. return $status;
  98. }
  99. public static function getState($id, $pid)
  100. {
  101. $status = self::get($id, false);
  102. if(!$status) {
  103. return [
  104. 'liked' => false,
  105. 'shared' => false,
  106. 'bookmarked' => false
  107. ];
  108. }
  109. return [
  110. 'liked' => LikeService::liked($pid, $id),
  111. 'shared' => self::isShared($id, $pid),
  112. 'bookmarked' => self::isBookmarked($id, $pid)
  113. ];
  114. }
  115. public static function getFull($id, $pid, $publicOnly = true)
  116. {
  117. $res = self::get($id, $publicOnly);
  118. if(!$res || !isset($res['account']) || !isset($res['account']['id'])) {
  119. return $res;
  120. }
  121. $res['relationship'] = RelationshipService::get($pid, $res['account']['id']);
  122. return $res;
  123. }
  124. public static function getDirectMessage($id)
  125. {
  126. $status = Status::whereScope('direct')->find($id);
  127. if(!$status) {
  128. return null;
  129. }
  130. $fractal = new Fractal\Manager();
  131. $fractal->setSerializer(new ArraySerializer());
  132. $resource = new Fractal\Resource\Item($status, new StatusStatelessTransformer());
  133. return $fractal->createData($resource)->toArray();
  134. }
  135. public static function del($id, $purge = false)
  136. {
  137. if($purge) {
  138. $status = self::get($id);
  139. if($status && isset($status['account']) && isset($status['account']['id'])) {
  140. Cache::forget('profile:embed:' . $status['account']['id']);
  141. }
  142. Cache::forget('status:transformer:media:attachments:' . $id);
  143. MediaService::del($id);
  144. Cache::forget('pf:services:sh:id:' . $id);
  145. PublicTimelineService::rem($id);
  146. NetworkTimelineService::rem($id);
  147. }
  148. Cache::forget(self::key($id, false));
  149. return Cache::forget(self::key($id));
  150. }
  151. public static function refresh($id)
  152. {
  153. Cache::forget(self::key($id, false));
  154. Cache::forget(self::key($id, true));
  155. self::get($id, false);
  156. self::get($id, true);
  157. }
  158. public static function isShared($id, $pid = null)
  159. {
  160. return $pid ?
  161. ReblogService::get($pid, $id) :
  162. false;
  163. }
  164. public static function isBookmarked($id, $pid = null)
  165. {
  166. return $pid ?
  167. BookmarkService::get($pid, $id) :
  168. false;
  169. }
  170. }