Post processing centralized

This commit is contained in:
Michael 2023-01-04 06:52:40 +00:00
parent 0d56f156f7
commit d1a951f0ac
3 changed files with 92 additions and 89 deletions

View file

@ -42,9 +42,7 @@ use Friendica\Model\Item;
use Friendica\Model\ItemURI; use Friendica\Model\ItemURI;
use Friendica\Model\Photo; use Friendica\Model\Photo;
use Friendica\Model\Post; use Friendica\Model\Post;
use Friendica\Model\Tag;
use Friendica\Network\HTTPException; use Friendica\Network\HTTPException;
use Friendica\Object\EMail\ItemCCEMail;
use Friendica\Protocol\Activity; use Friendica\Protocol\Activity;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
@ -99,25 +97,24 @@ function item_post(App $a) {
$post = DI::contentItem()->initializePost($post); $post = DI::contentItem()->initializePost($post);
$post['self'] = true; $post['edit'] = $orig_post;
$post['api_source'] = false; $post['self'] = true;
$post['edit'] = $orig_post; $post['api_source'] = false;
$post['file'] = ''; $post['file'] = '';
$post['attach'] = ''; $post['attach'] = '';
$post['inform'] = ''; $post['inform'] = '';
$post['postopts'] = ''; $post['postopts'] = '';
$post['wall'] = $_REQUEST['wall'] ?? true;
$post['wall'] = $_REQUEST['wall'] ?? true; $post['post-type'] = $_REQUEST['post_type'] ?? '';
$post['post-type'] = $_REQUEST['post_type'] ?? ''; $post['title'] = trim($_REQUEST['title'] ?? '');
$post['title'] = trim($_REQUEST['title'] ?? ''); $post['body'] = $_REQUEST['body'] ?? '';
$post['body'] = $_REQUEST['body'] ?? ''; $post['location'] = trim($_REQUEST['location'] ?? '');
$post['location'] = trim($_REQUEST['location'] ?? ''); $post['coord'] = trim($_REQUEST['coord'] ?? '');
$post['coord'] = trim($_REQUEST['coord'] ?? ''); $post['parent'] = intval($_REQUEST['parent'] ?? 0);
$post['parent'] = intval($_REQUEST['parent'] ?? 0); $post['pubmail'] = $_REQUEST['pubmail_enable'] ?? false;
$post['pubmail'] = $_REQUEST['pubmail_enable'] ?? false; $post['created'] = $_REQUEST['created_at'] ?? DateTimeFormat::utcNow();
$post['created'] = $_REQUEST['created_at'] ?? DateTimeFormat::utcNow(); $post['edited'] = $post['changed'] = $post['commented'] = $post['created'];
$post['edited'] = $post['changed'] = $post['commented'] = $post['created']; $post['app'] = '';
$post['app'] = '';
if ($post['parent']) { if ($post['parent']) {
if ($post['parent']) { if ($post['parent']) {
@ -168,7 +165,6 @@ function item_post(App $a) {
$post['pubmail'] = $post['pubmail'] && !$post['private']; $post['pubmail'] = $post['pubmail'] && !$post['private'];
if (!empty($orig_post)) { if (!empty($orig_post)) {
$post['uri'] = $orig_post['uri'];
$post['file'] = Post\Category::getTextByURIId($orig_post['uri-id'], $orig_post['uid']); $post['file'] = Post\Category::getTextByURIId($orig_post['uri-id'], $orig_post['uid']);
} }
@ -202,26 +198,20 @@ function item_post(App $a) {
throw new HTTPException\BadRequestException(DI::l10n()->t('Empty post discarded.')); throw new HTTPException\BadRequestException(DI::l10n()->t('Empty post discarded.'));
} }
// Check for hashtags in the body and repair or add hashtag links
if ($preview || $orig_post) {
$post['body'] = Item::setHashtags($post['body']);
}
// preview mode - prepare the body for display and send it via json // preview mode - prepare the body for display and send it via json
if ($preview) { if ($preview) {
// We set the datarray ID to -1 because in preview mode the dataray // We have to preset some fields, so that the conversation can be displayed
// doesn't have an ID. $post['id'] = -1;
$post['id'] = -1; $post['uri-id'] = -1;
$post['uri-id'] = -1;
$post['author-network'] = Protocol::DFRN; $post['author-network'] = Protocol::DFRN;
$post['author-updated'] = ''; $post['author-updated'] = '';
$post['author-gsid'] = 0; $post['author-gsid'] = 0;
$post['author-uri-id'] = ItemURI::getIdByURI($post['author-link']); $post['author-uri-id'] = ItemURI::getIdByURI($post['author-link']);
$post['owner-updated'] = ''; $post['owner-updated'] = '';
$post['has-media'] = false; $post['has-media'] = false;
$post['quote-uri-id'] = Item::getQuoteUriId($post['body'], $post['uid']); $post['quote-uri-id'] = Item::getQuoteUriId($post['body'], $post['uid']);
$post['body'] = BBCode::removeSharedData($post['body']); $post['body'] = BBCode::removeSharedData(Item::setHashtags($post['body']));
$post['writable'] = true; $post['writable'] = true;
$o = DI::conversation()->create([$post], 'search', false, true); $o = DI::conversation()->create([$post], 'search', false, true);
@ -230,6 +220,10 @@ function item_post(App $a) {
Hook::callAll('post_local',$post); Hook::callAll('post_local',$post);
unset($post['edit']);
unset($post['self']);
unset($post['api_source']);
if (!empty($_REQUEST['scheduled_at'])) { if (!empty($_REQUEST['scheduled_at'])) {
$scheduled_at = DateTimeFormat::convert($_REQUEST['scheduled_at'], 'UTC', $a->getTimeZone()); $scheduled_at = DateTimeFormat::convert($_REQUEST['scheduled_at'], 'UTC', $a->getTimeZone());
if ($scheduled_at > DateTimeFormat::utcNow()) { if ($scheduled_at > DateTimeFormat::utcNow()) {
@ -238,9 +232,6 @@ function item_post(App $a) {
unset($post['commented']); unset($post['commented']);
unset($post['received']); unset($post['received']);
unset($post['changed']); unset($post['changed']);
unset($post['edit']);
unset($post['self']);
unset($post['api_source']);
Post\Delayed::add($post['uri'], $post, Worker::PRIORITY_HIGH, Post\Delayed::PREPARED_NO_HOOK, $scheduled_at); Post\Delayed::add($post['uri'], $post, Worker::PRIORITY_HIGH, Post\Delayed::PREPARED_NO_HOOK, $scheduled_at);
item_post_return(DI::baseUrl(), $return_path); item_post_return(DI::baseUrl(), $return_path);
@ -261,26 +252,26 @@ function item_post(App $a) {
System::jsonExit($json); System::jsonExit($json);
} }
$post['uri-id'] = ItemURI::getIdByURI($post['uri']);
$quote_uri_id = Item::getQuoteUriId($post['body'], $post['uid']);
if (!empty($quote_uri_id)) {
$post['quote-uri-id'] = $quote_uri_id;
$post['body'] = BBCode::removeSharedData($post['body']);
}
if ($orig_post) { if ($orig_post) {
$fields = [ $fields = [
'title' => $post['title'], 'title' => $post['title'],
'body' => $post['body'], 'body' => $post['body'],
'attach' => $post['attach'], 'attach' => $post['attach'],
'file' => $post['file'], 'file' => $post['file'],
'edited' => DateTimeFormat::utcNow(), 'edited' => DateTimeFormat::utcNow(),
'changed' => DateTimeFormat::utcNow() 'changed' => DateTimeFormat::utcNow()
]; ];
$fields['body'] = Item::setHashtags($fields['body']);
$quote_uri_id = Item::getQuoteUriId($fields['body'], $post['uid']);
if (!empty($quote_uri_id)) {
$fields['quote-uri-id'] = $quote_uri_id;
$fields['body'] = BBCode::removeSharedData($post['body']);
}
Item::update($fields, ['id' => $post_id]); Item::update($fields, ['id' => $post_id]);
Item::updateDisplayCache($post['uri-id']); Item::updateDisplayCache($orig_post['uri-id']);
if ($return_path) { if ($return_path) {
DI::baseUrl()->redirect($return_path); DI::baseUrl()->redirect($return_path);
@ -289,10 +280,6 @@ function item_post(App $a) {
throw new HTTPException\OKException(DI::l10n()->t('Post updated.')); throw new HTTPException\OKException(DI::l10n()->t('Post updated.'));
} }
unset($post['edit']);
unset($post['self']);
unset($post['api_source']);
$post_id = Item::insert($post); $post_id = Item::insert($post);
if (!$post_id) { if (!$post_id) {
DI::sysmsg()->addNotice(DI::l10n()->t('Item wasn\'t stored.')); DI::sysmsg()->addNotice(DI::l10n()->t('Item wasn\'t stored.'));
@ -313,26 +300,9 @@ function item_post(App $a) {
throw new HTTPException\InternalServerErrorException(DI::l10n()->t('Item couldn\'t be fetched.')); throw new HTTPException\InternalServerErrorException(DI::l10n()->t('Item couldn\'t be fetched.'));
} }
if (!\Friendica\Content\Feature::isEnabled($post['uid'], 'explicit_mentions') && ($post['gravity'] == Item::GRAVITY_COMMENT)) {
Tag::createImplicitMentions($post['uri-id'], $post['thr-parent-id']);
}
Hook::callAll('post_local_end', $post);
$recipients = explode(',', $emailcc); $recipients = explode(',', $emailcc);
if (count($recipients)) {
foreach ($recipients as $recipient) {
$address = trim($recipient);
if (!strlen($address)) {
continue;
}
$author = DBA::selectFirst('contact', ['thumb'], ['uid' => $uid, 'self' => true]); DI::contentItem()->postProcessPost($post, $recipients);
DI::emailer()->send(new ItemCCEMail(DI::app(), DI::l10n(), DI::baseUrl(),
$post, $address, $author['thumb'] ?? ''));
}
}
Logger::debug('post_complete'); Logger::debug('post_complete');

View file

@ -21,6 +21,7 @@
namespace Friendica\Content; namespace Friendica\Content;
use Friendica\App;
use Friendica\App\BaseURL; use Friendica\App\BaseURL;
use Friendica\Content\Text\BBCode; use Friendica\Content\Text\BBCode;
use Friendica\Content\Text\BBCode\Video; use Friendica\Content\Text\BBCode\Video;
@ -44,9 +45,11 @@ use Friendica\Model\Tag;
use Friendica\Model\Post; use Friendica\Model\Post;
use Friendica\Model\User; use Friendica\Model\User;
use Friendica\Network\HTTPException; use Friendica\Network\HTTPException;
use Friendica\Object\EMail\ItemCCEMail;
use Friendica\Protocol\Activity; use Friendica\Protocol\Activity;
use Friendica\Util\ACLFormatter; use Friendica\Util\ACLFormatter;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\Emailer;
use Friendica\Util\ParseUrl; use Friendica\Util\ParseUrl;
use Friendica\Util\Profiler; use Friendica\Util\Profiler;
use Friendica\Util\Proxy; use Friendica\Util\Proxy;
@ -73,8 +76,12 @@ class Item
private $pConfig; private $pConfig;
/** @var BaseURL */ /** @var BaseURL */
private $baseURL; private $baseURL;
/** @var Emailer */
private $emailer;
/** @var App */
private $app;
public function __construct(Profiler $profiler, Activity $activity, L10n $l10n, IHandleUserSessions $userSession, Video $bbCodeVideo, ACLFormatter $aclFormatter, IManagePersonalConfigValues $pConfig, BaseURL $baseURL) public function __construct(Profiler $profiler, Activity $activity, L10n $l10n, IHandleUserSessions $userSession, Video $bbCodeVideo, ACLFormatter $aclFormatter, IManagePersonalConfigValues $pConfig, BaseURL $baseURL, Emailer $emailer, App $app)
{ {
$this->profiler = $profiler; $this->profiler = $profiler;
$this->activity = $activity; $this->activity = $activity;
@ -84,6 +91,8 @@ class Item
$this->aclFormatter = $aclFormatter; $this->aclFormatter = $aclFormatter;
$this->baseURL = $baseURL; $this->baseURL = $baseURL;
$this->pConfig = $pConfig; $this->pConfig = $pConfig;
$this->emailer = $emailer;
$this->app = $app;
} }
/** /**
@ -823,10 +832,10 @@ class Item
// get the "fileas" tags for this post // get the "fileas" tags for this post
$filedas = FileTag::fileToArray($post['file']); $filedas = FileTag::fileToArray($post['file']);
} }
$list_array = explode(',', trim($category)); $list_array = explode(',', trim($category));
$post['file'] = FileTag::arrayToFile($list_array, 'category'); $post['file'] = FileTag::arrayToFile($list_array, 'category');
if (!empty($filedas) && is_array($filedas)) { if (!empty($filedas) && is_array($filedas)) {
// append the fileas stuff to the new categories list // append the fileas stuff to the new categories list
$post['file'] .= FileTag::arrayToFile($filedas); $post['file'] .= FileTag::arrayToFile($filedas);
@ -850,12 +859,12 @@ class Item
if (!DBA::isResult($user)) { if (!DBA::isResult($user)) {
throw new HTTPException\NotFoundException($this->l10n->t('Unable to locate original post.')); throw new HTTPException\NotFoundException($this->l10n->t('Unable to locate original post.'));
} }
$post['allow_cid'] = isset($request['contact_allow']) ? $this->aclFormatter->toString($request['contact_allow']) : $user['allow_cid'] ?? ''; $post['allow_cid'] = isset($request['contact_allow']) ? $this->aclFormatter->toString($request['contact_allow']) : $user['allow_cid'] ?? '';
$post['allow_gid'] = isset($request['group_allow']) ? $this->aclFormatter->toString($request['group_allow']) : $user['allow_gid'] ?? ''; $post['allow_gid'] = isset($request['group_allow']) ? $this->aclFormatter->toString($request['group_allow']) : $user['allow_gid'] ?? '';
$post['deny_cid'] = isset($request['contact_deny']) ? $this->aclFormatter->toString($request['contact_deny']) : $user['deny_cid'] ?? ''; $post['deny_cid'] = isset($request['contact_deny']) ? $this->aclFormatter->toString($request['contact_deny']) : $user['deny_cid'] ?? '';
$post['deny_gid'] = isset($request['group_deny']) ? $this->aclFormatter->toString($request['group_deny']) : $user['deny_gid'] ?? ''; $post['deny_gid'] = isset($request['group_deny']) ? $this->aclFormatter->toString($request['group_deny']) : $user['deny_gid'] ?? '';
$visibility = $request['visibility'] ?? ''; $visibility = $request['visibility'] ?? '';
if ($visibility === 'public') { if ($visibility === 'public') {
// The ACL selector introduced in version 2019.12 sends ACL input data even when the Public visibility is selected // The ACL selector introduced in version 2019.12 sends ACL input data even when the Public visibility is selected
@ -874,7 +883,7 @@ class Item
} else { } else {
$post['private'] = ItemModel::PUBLIC; $post['private'] = ItemModel::PUBLIC;
} }
return $post; return $post;
} }
@ -947,7 +956,7 @@ class Item
$post['guid'] = System::createUUID(); $post['guid'] = System::createUUID();
$post['uri'] = ItemModel::newURI($post['guid']); $post['uri'] = ItemModel::newURI($post['guid']);
$post['verb'] = Activity::POST; $post['verb'] = Activity::POST;
$post['received'] = DateTimeFormat::utcNow(); $post['received'] = DateTimeFormat::utcNow();
$owner = User::getOwnerDataById($post['uid']); $owner = User::getOwnerDataById($post['uid']);
if (empty($post['contact-id'])) { if (empty($post['contact-id'])) {
@ -991,4 +1000,25 @@ class Item
return $post; return $post;
} }
public function postProcessPost(array $post, array $recipients = [])
{
if (!\Friendica\Content\Feature::isEnabled($post['uid'], 'explicit_mentions') && ($post['gravity'] == ItemModel::GRAVITY_COMMENT)) {
Tag::createImplicitMentions($post['uri-id'], $post['thr-parent-id']);
}
Hook::callAll('post_local_end', $post);
$author = DBA::selectFirst('contact', ['thumb'], ['uid' => $post['uid'], 'self' => true]);
foreach ($recipients as $recipient) {
$address = trim($recipient);
if (!strlen($address)) {
continue;
}
$this->emailer->send(new ItemCCEMail($this->app, $this->l10n, $this->baseURL,
$post, $address, $author['thumb'] ?? ''));
}
}
} }

View file

@ -820,6 +820,12 @@ class Item
private static function prepareOriginPost(array $item): array private static function prepareOriginPost(array $item): array
{ {
$item = DI::contentItem()->initializePost($item); $item = DI::contentItem()->initializePost($item);
if (Photo::setPermissionFromBody($item['body'], $item['uid'], $item['contact-id'], $item['allow_cid'], $item['allow_gid'], $item['deny_cid'], $item['deny_gid'])) {
$item['object-type'] = Activity\ObjectType::IMAGE;
}
$item = DI::contentItem()->moveAttachmentsFromBodyToAttach($item);
$item = DI::contentItem()->finalizePost($item); $item = DI::contentItem()->finalizePost($item);
return $item; return $item;
@ -1301,10 +1307,7 @@ class Item
} }
if ($notify) { if ($notify) {
if (!\Friendica\Content\Feature::isEnabled($posted_item['uid'], 'explicit_mentions') && ($posted_item['gravity'] == self::GRAVITY_COMMENT)) { DI::contentItem()->postProcessPost($posted_item);
Tag::createImplicitMentions($posted_item['uri-id'], $posted_item['thr-parent-id']);
}
Hook::callAll('post_local_end', $posted_item);
} else { } else {
Hook::callAll('post_remote_end', $posted_item); Hook::callAll('post_remote_end', $posted_item);
} }