Fix being able to remove all images from post through Mastodon edit endpoint

This commit is contained in:
Hank Grabowski 2023-03-16 14:01:36 -04:00
parent b3d779ef7b
commit e7058ffe8c

View file

@ -110,43 +110,42 @@ class Statuses extends BaseApi
$item = DI::contentItem()->expandTags($item, $request['visibility'] == 'direct'); $item = DI::contentItem()->expandTags($item, $request['visibility'] == 'direct');
if (!empty($request['media_ids'])) { /*
/* The provided ids in the request value consists of these two sources:
The provided ids in the request value consists of these two sources: - The id in the "photo" table for newly uploaded media
- The id in the "photo" table for newly uploaded media - The id in the "post-media" table for already attached media
- The id in the "post-media" table for already attached media
Because of this we have to add all media that isn't already attached. Because of this we have to add all media that isn't already attached.
Also we have to delete all media that isn't provided anymore. Also we have to delete all media that isn't provided anymore.
There is a possible situation where the newly uploaded media There is a possible situation where the newly uploaded media
could have the same id as an existing, but deleted media. could have the same id as an existing, but deleted media.
We can't do anything about this, but the probability for this is extremely low. We can't do anything about this, but the probability for this is extremely low.
*/ */
$media_ids = []; $media_ids = [];
$existing_media = array_column(Post\Media::getByURIId($post['uri-id'], [Post\Media::AUDIO, Post\Media::VIDEO, Post\Media::IMAGE]), 'id'); $existing_media = array_column(Post\Media::getByURIId($post['uri-id'], [Post\Media::AUDIO, Post\Media::VIDEO, Post\Media::IMAGE]), 'id');
foreach ($request['media_ids'] as $media) { foreach ($request['media_ids'] as $media) {
if (!in_array($media, $existing_media)) { if (!in_array($media, $existing_media)) {
$media_ids[] = $media; $media_ids[] = $media;
}
} }
foreach ($existing_media as $media) {
if (!in_array($media, $request['media_ids'])) {
Post\Media::deleteById($media);
}
}
$item = $this->storeMediaIds($media_ids, array_merge($post, $item));
foreach ($item['attachments'] as $attachment) {
$attachment['uri-id'] = $post['uri-id'];
Post\Media::insert($attachment);
}
unset($item['attachments']);
} }
foreach ($existing_media as $media) {
if (!in_array($media, $request['media_ids'])) {
Post\Media::deleteById($media);
}
}
$item = $this->storeMediaIds($media_ids, array_merge($post, $item));
foreach ($item['attachments'] as $attachment) {
$attachment['uri-id'] = $post['uri-id'];
Post\Media::insert($attachment);
}
unset($item['attachments']);
if (!Item::isValid($item)) { if (!Item::isValid($item)) {
throw new \Exception('Missing parameters in definition'); throw new \Exception('Missing parameters in definition');
} }