forked from mirror/pixelfed
138 lines
3.8 KiB
PHP
138 lines
3.8 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace App\Services\Status;
|
||
|
|
||
|
use App\Media;
|
||
|
use App\ModLog;
|
||
|
use App\Status;
|
||
|
use App\Models\StatusEdit;
|
||
|
use Purify;
|
||
|
use App\Util\Lexer\Autolink;
|
||
|
use App\Services\MediaService;
|
||
|
use App\Services\MediaStorageService;
|
||
|
use App\Services\StatusService;
|
||
|
|
||
|
class UpdateStatusService
|
||
|
{
|
||
|
public static function call(Status $status, $attributes)
|
||
|
{
|
||
|
self::createPreviousEdit($status);
|
||
|
self::updateMediaAttachements($status, $attributes);
|
||
|
self::handleImmediateAttributes($status, $attributes);
|
||
|
self::createEdit($status, $attributes);
|
||
|
|
||
|
return StatusService::get($status->id);
|
||
|
}
|
||
|
|
||
|
public static function updateMediaAttachements(Status $status, $attributes)
|
||
|
{
|
||
|
$count = $status->media()->count();
|
||
|
if($count === 0 || $count === 1) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$oids = $status->media()->orderBy('order')->pluck('id')->map(function($m) { return (string) $m; });
|
||
|
$nids = collect($attributes['media_ids']);
|
||
|
|
||
|
if($oids->toArray() === $nids->toArray()) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
foreach($oids->diff($nids)->values()->toArray() as $mid) {
|
||
|
$media = Media::find($mid);
|
||
|
if(!$media) {
|
||
|
continue;
|
||
|
}
|
||
|
$media->status_id = null;
|
||
|
$media->save();
|
||
|
MediaStorageService::delete($media, true);
|
||
|
}
|
||
|
|
||
|
$nids->each(function($nid, $idx) {
|
||
|
$media = Media::find($nid);
|
||
|
if(!$media) {
|
||
|
return;
|
||
|
}
|
||
|
$media->order = $idx;
|
||
|
$media->save();
|
||
|
});
|
||
|
MediaService::del($status->id);
|
||
|
}
|
||
|
|
||
|
public static function handleImmediateAttributes(Status $status, $attributes)
|
||
|
{
|
||
|
if(isset($attributes['status'])) {
|
||
|
$cleaned = Purify::clean($attributes['status']);
|
||
|
$status->caption = $cleaned;
|
||
|
$status->rendered = Autolink::create()->autolink($cleaned);
|
||
|
} else {
|
||
|
$status->caption = null;
|
||
|
$status->rendered = null;
|
||
|
}
|
||
|
if(isset($attributes['sensitive'])) {
|
||
|
if($status->is_nsfw != (bool) $attributes['sensitive'] &&
|
||
|
(bool) $attributes['sensitive'] == false)
|
||
|
{
|
||
|
$exists = ModLog::whereObjectType('App\Status::class')
|
||
|
->whereObjectId($status->id)
|
||
|
->whereAction('admin.status.moderate')
|
||
|
->exists();
|
||
|
if(!$exists) {
|
||
|
$status->is_nsfw = (bool) $attributes['sensitive'];
|
||
|
}
|
||
|
} else {
|
||
|
$status->is_nsfw = (bool) $attributes['sensitive'];
|
||
|
}
|
||
|
}
|
||
|
if(isset($attributes['spoiler_text'])) {
|
||
|
$status->cw_summary = Purify::clean($attributes['spoiler_text']);
|
||
|
} else {
|
||
|
$status->cw_summary = null;
|
||
|
}
|
||
|
if(isset($attributes['location'])) {
|
||
|
if (isset($attributes['location']['id'])) {
|
||
|
$status->place_id = $attributes['location']['id'];
|
||
|
} else {
|
||
|
$status->place_id = null;
|
||
|
}
|
||
|
}
|
||
|
if($status->cw_summary && !$status->is_nsfw) {
|
||
|
$status->cw_summary = null;
|
||
|
}
|
||
|
$status->edited_at = now();
|
||
|
$status->save();
|
||
|
StatusService::del($status->id);
|
||
|
}
|
||
|
|
||
|
public static function createPreviousEdit(Status $status)
|
||
|
{
|
||
|
if(!$status->edits()->count()) {
|
||
|
StatusEdit::create([
|
||
|
'status_id' => $status->id,
|
||
|
'profile_id' => $status->profile_id,
|
||
|
'caption' => $status->caption,
|
||
|
'spoiler_text' => $status->cw_summary,
|
||
|
'is_nsfw' => $status->is_nsfw,
|
||
|
'ordered_media_attachment_ids' => $status->media()->orderBy('order')->pluck('id')->toArray(),
|
||
|
'created_at' => $status->created_at
|
||
|
]);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static function createEdit(Status $status, $attributes)
|
||
|
{
|
||
|
$cleaned = isset($attributes['status']) ? Purify::clean($attributes['status']) : null;
|
||
|
$spoiler_text = isset($attributes['spoiler_text']) ? Purify::clean($attributes['spoiler_text']) : null;
|
||
|
$sensitive = isset($attributes['sensitive']) ? $attributes['sensitive'] : null;
|
||
|
$mids = $status->media()->count() ? $status->media()->orderBy('order')->pluck('id')->toArray() : null;
|
||
|
StatusEdit::create([
|
||
|
'status_id' => $status->id,
|
||
|
'profile_id' => $status->profile_id,
|
||
|
'caption' => $cleaned,
|
||
|
'spoiler_text' => $spoiler_text,
|
||
|
'is_nsfw' => $sensitive,
|
||
|
'ordered_media_attachment_ids' => $mids
|
||
|
]);
|
||
|
}
|
||
|
}
|