UpdateStatusService.php 4.5 KB

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