UpdateStatusService.php 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. <?php
  2. namespace App\Services\Status;
  3. use App\Media;
  4. use App\ModLog;
  5. use App\Status;
  6. use App\Models\StatusEdit;
  7. use Purify;
  8. use App\Util\Lexer\Autolink;
  9. use App\Services\MediaService;
  10. use App\Services\MediaStorageService;
  11. use App\Services\StatusService;
  12. class UpdateStatusService
  13. {
  14. public static function call(Status $status, $attributes)
  15. {
  16. self::createPreviousEdit($status);
  17. self::updateMediaAttachements($status, $attributes);
  18. self::handleImmediateAttributes($status, $attributes);
  19. self::createEdit($status, $attributes);
  20. return StatusService::get($status->id);
  21. }
  22. public static function updateMediaAttachements(Status $status, $attributes)
  23. {
  24. $count = $status->media()->count();
  25. if($count === 0 || $count === 1) {
  26. return;
  27. }
  28. $oids = $status->media()->orderBy('order')->pluck('id')->map(function($m) { return (string) $m; });
  29. $nids = collect($attributes['media_ids']);
  30. if($oids->toArray() === $nids->toArray()) {
  31. return;
  32. }
  33. foreach($oids->diff($nids)->values()->toArray() as $mid) {
  34. $media = Media::find($mid);
  35. if(!$media) {
  36. continue;
  37. }
  38. $media->status_id = null;
  39. $media->save();
  40. MediaStorageService::delete($media, true);
  41. }
  42. $nids->each(function($nid, $idx) {
  43. $media = Media::find($nid);
  44. if(!$media) {
  45. return;
  46. }
  47. $media->order = $idx;
  48. $media->save();
  49. });
  50. MediaService::del($status->id);
  51. }
  52. public static function handleImmediateAttributes(Status $status, $attributes)
  53. {
  54. if(isset($attributes['status'])) {
  55. $cleaned = Purify::clean($attributes['status']);
  56. $status->caption = $cleaned;
  57. $status->rendered = nl2br(Autolink::create()->autolink($cleaned));
  58. } else {
  59. $status->caption = null;
  60. $status->rendered = null;
  61. }
  62. if(isset($attributes['sensitive'])) {
  63. if($status->is_nsfw != (bool) $attributes['sensitive'] &&
  64. (bool) $attributes['sensitive'] == false)
  65. {
  66. $exists = ModLog::whereObjectType('App\Status::class')
  67. ->whereObjectId($status->id)
  68. ->whereAction('admin.status.moderate')
  69. ->exists();
  70. if(!$exists) {
  71. $status->is_nsfw = (bool) $attributes['sensitive'];
  72. }
  73. } else {
  74. $status->is_nsfw = (bool) $attributes['sensitive'];
  75. }
  76. }
  77. if(isset($attributes['spoiler_text'])) {
  78. $status->cw_summary = Purify::clean($attributes['spoiler_text']);
  79. } else {
  80. $status->cw_summary = null;
  81. }
  82. if(isset($attributes['location'])) {
  83. if (isset($attributes['location']['id'])) {
  84. $status->place_id = $attributes['location']['id'];
  85. } else {
  86. $status->place_id = null;
  87. }
  88. }
  89. if($status->cw_summary && !$status->is_nsfw) {
  90. $status->cw_summary = null;
  91. }
  92. $status->edited_at = now();
  93. $status->save();
  94. StatusService::del($status->id);
  95. }
  96. public static function createPreviousEdit(Status $status)
  97. {
  98. if(!$status->edits()->count()) {
  99. StatusEdit::create([
  100. 'status_id' => $status->id,
  101. 'profile_id' => $status->profile_id,
  102. 'caption' => $status->caption,
  103. 'spoiler_text' => $status->cw_summary,
  104. 'is_nsfw' => $status->is_nsfw,
  105. 'ordered_media_attachment_ids' => $status->media()->orderBy('order')->pluck('id')->toArray(),
  106. 'created_at' => $status->created_at
  107. ]);
  108. }
  109. }
  110. public static function createEdit(Status $status, $attributes)
  111. {
  112. $cleaned = isset($attributes['status']) ? Purify::clean($attributes['status']) : null;
  113. $spoiler_text = isset($attributes['spoiler_text']) ? Purify::clean($attributes['spoiler_text']) : null;
  114. $sensitive = isset($attributes['sensitive']) ? $attributes['sensitive'] : null;
  115. $mids = $status->media()->count() ? $status->media()->orderBy('order')->pluck('id')->toArray() : null;
  116. StatusEdit::create([
  117. 'status_id' => $status->id,
  118. 'profile_id' => $status->profile_id,
  119. 'caption' => $cleaned,
  120. 'spoiler_text' => $spoiler_text,
  121. 'is_nsfw' => $sensitive,
  122. 'ordered_media_attachment_ids' => $mids
  123. ]);
  124. }
  125. }