mirror of
https://codeberg.org/streams/streams.git
synced 2024-09-19 01:55:13 +00:00
more heavy lifting on conversation collections. This optionally brings collection support into item_store() and also performs clone sync, removing a lot of duplicate code. Events needed significant refactoring. We cannot combine message delivery of standard items and collection activities, so this will have an impact on outgoing message queue size and processing.
This commit is contained in:
parent
14291ec1b9
commit
9aa7da034f
22 changed files with 171 additions and 222 deletions
|
@ -4273,11 +4273,11 @@ class Activity
|
|||
}
|
||||
} else {
|
||||
ObjCache::Set($item['mid'], $act->raw);
|
||||
$x = item_store($item, deliver: false);
|
||||
$x = item_store($item, deliver: false, addAndSync: false);
|
||||
}
|
||||
|
||||
if ($relay && $channel['channel_hash'] === $x['item']['owner_xchan'] && $x['item']['verb'] !== 'Add' && !$isCollectionOperation) {
|
||||
$x = Activity::addToCollection($channel, json_decode($act->raw,true), $x['item']['parent_mid'], $x['item'], deliver: false);
|
||||
$approval = Activity::addToCollection($channel, json_decode($act->raw,true), $x['item']['parent_mid'], $x['item'], deliver: false);
|
||||
}
|
||||
|
||||
|
||||
|
@ -4318,10 +4318,16 @@ class Activity
|
|||
if ($item['owner_xchan'] === $channel['channel_hash']) {
|
||||
// We are the owner of this conversation, so send all received comments back downstream
|
||||
Run::Summon(['Notifier', 'comment-import', $x['item_id']]);
|
||||
if (!empty($approval['item_id'])) {
|
||||
Run::Summon(['Notifier', 'comment-import', $approval['item_id']]);
|
||||
}
|
||||
}
|
||||
}
|
||||
elseif ($act->client && $channel['channel_hash'] === $observer_hash && !$force) {
|
||||
Run::Summon(['Notifier', 'wall-new', $x['item_id']]);
|
||||
if (!empty($approval['item_id'])) {
|
||||
Run::Summon(['Notifier', 'wall-new', $approval['item_id']]);
|
||||
}
|
||||
}
|
||||
$r = q(
|
||||
"select * from item where id = %d limit 1",
|
||||
|
|
|
@ -2097,7 +2097,7 @@ class Libzot
|
|||
// IConfig::Set($arr, 'activitypub', 'signed_data', $act->meta['signed_data'], false);
|
||||
ObjCache::Set($arr['mid'], $act->raw);
|
||||
|
||||
$item_result = item_store($arr);
|
||||
$item_result = item_store($arr, addAndSync: false);
|
||||
if ($item_result['success']) {
|
||||
$item_id = $item_result['item_id'];
|
||||
|
||||
|
@ -2325,7 +2325,7 @@ class Libzot
|
|||
}
|
||||
|
||||
|
||||
$x = item_store_update($item);
|
||||
$x = item_store_update($item, addAndSync: false);
|
||||
|
||||
// If we're updating an event that we've saved locally, we store the item info first
|
||||
// because event_addtocal will parse the body to get the 'new' event details
|
||||
|
|
|
@ -134,22 +134,16 @@ class Share
|
|||
$post = item_store($arr);
|
||||
|
||||
$post_id = $post['item_id'];
|
||||
$approval_id = $post['approval_id'] ?? 0;
|
||||
|
||||
$arr['id'] = $post_id;
|
||||
|
||||
Hook::call('post_local_end', $arr);
|
||||
|
||||
$r = q(
|
||||
"select * from item where id = %d",
|
||||
intval($post_id)
|
||||
);
|
||||
if ($r) {
|
||||
xchan_query($r);
|
||||
$sync_item = fetch_post_tags($r);
|
||||
Libsync::build_sync_packet($channel['channel_id'], [ 'item' => [ encode_item($sync_item[0], true) ] ]);
|
||||
}
|
||||
|
||||
Run::Summon([ 'Notifier','like',$post_id ]);
|
||||
if ($approval_id) {
|
||||
Run::Summon(['Notifier', 'like', $approval_id]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -207,28 +207,15 @@ class Calendar extends Controller
|
|||
$datarray['term'] = $post_tags;
|
||||
}
|
||||
|
||||
$item_id = event_store_item($datarray, $event);
|
||||
$post = event_store_item($datarray, $event);
|
||||
|
||||
if ($item_id) {
|
||||
$r = q(
|
||||
"select * from item where id = %d",
|
||||
intval($item_id)
|
||||
);
|
||||
if ($r) {
|
||||
xchan_query($r);
|
||||
$sync_item = fetch_post_tags($r);
|
||||
$z = q(
|
||||
"select * from event where event_hash = '%s' and uid = %d limit 1",
|
||||
dbesc($r[0]['resource_id']),
|
||||
intval($channel['channel_id'])
|
||||
);
|
||||
if ($z) {
|
||||
Libsync::build_sync_packet($channel['channel_id'], ['event_item' => [encode_item($sync_item[0], true)], 'event' => $z]);
|
||||
}
|
||||
}
|
||||
if (!empty($post['item_id'])) {
|
||||
Run::Summon(['Notifier', 'event', $post['item_id']]);
|
||||
}
|
||||
if (!empty($post['approval_id'])) {
|
||||
Run::Summon(['Notifier', 'event', $post['approval_id']]);
|
||||
}
|
||||
|
||||
Run::Summon(['Notifier', 'event', $item_id]);
|
||||
killme();
|
||||
}
|
||||
|
||||
|
|
|
@ -251,31 +251,17 @@ class Events extends Controller
|
|||
if ($post_tags) {
|
||||
$datarray['term'] = $post_tags;
|
||||
}
|
||||
$post = event_store_item($datarray, $event);
|
||||
|
||||
$item_id = event_store_item($datarray, $event);
|
||||
|
||||
if ($item_id) {
|
||||
$r = q(
|
||||
"select * from item where id = %d",
|
||||
intval($item_id)
|
||||
);
|
||||
if ($r) {
|
||||
xchan_query($r);
|
||||
$sync_item = fetch_post_tags($r);
|
||||
$z = q(
|
||||
"select * from event where event_hash = '%s' and uid = %d limit 1",
|
||||
dbesc($r[0]['resource_id']),
|
||||
intval($channel['channel_id'])
|
||||
);
|
||||
if ($z) {
|
||||
Libsync::build_sync_packet($channel['channel_id'], ['event_item' => [encode_item($sync_item[0], true)], 'event' => $z]);
|
||||
}
|
||||
if ($share) {
|
||||
if (!empty($post['item_id'])) {
|
||||
Run::Summon(['Notifier', 'event', $post['item_id']]);
|
||||
}
|
||||
if (!empty($post['approval_id'])) {
|
||||
Run::Summon(['Notifier', 'event', $post['approval_id']]);
|
||||
}
|
||||
}
|
||||
|
||||
if ($share) {
|
||||
Run::Summon(['Notifier', 'event', $item_id]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -175,7 +175,7 @@ class Impel extends Controller
|
|||
$arr['id'] = $i[0]['id'];
|
||||
// don't update if it has the same timestamp as the original
|
||||
if ($arr['edited'] > $i[0]['edited']) {
|
||||
$x = item_store_update($arr);
|
||||
$x = item_store_update($arr, deliver: false, addAndSync: false);
|
||||
}
|
||||
} else {
|
||||
if (($i) && (intval($i[0]['item_deleted']))) {
|
||||
|
@ -186,7 +186,7 @@ class Impel extends Controller
|
|||
intval(local_channel())
|
||||
);
|
||||
} else {
|
||||
$x = item_store($arr);
|
||||
$x = item_store($arr, deliver: false, addAndSync: false);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1679,12 +1679,6 @@ class Item extends Controller
|
|||
Run::Summon(['Notifier', 'edit_post', $post_id]);
|
||||
}
|
||||
|
||||
if ($channel['channel_hash'] === $datarray['owner_xchan'] && $datarray['verb'] !== 'Add') {
|
||||
$items = [$datarray];
|
||||
xchan_query($items);
|
||||
Activity::addToCollection($channel, Activity::encode_activity(array_shift($items), true), $datarray['parent_mid'], $datarray);
|
||||
}
|
||||
|
||||
if ($api_source) {
|
||||
return ($x);
|
||||
}
|
||||
|
@ -1786,23 +1780,6 @@ class Item extends Controller
|
|||
killme();
|
||||
}
|
||||
|
||||
if (($parent) && ($parent != $post_id)) {
|
||||
// Store the comment signature information in case we need to relay to Diaspora
|
||||
//$ditem = $datarray;
|
||||
//$ditem['author'] = $observer;
|
||||
//store_diaspora_comment_sig($ditem,$channel,$parent_item, $post_id, (($walltowall_comment) ? 1 : 0));
|
||||
} else {
|
||||
$r = q(
|
||||
"select * from item where id = %d",
|
||||
intval($post_id)
|
||||
);
|
||||
if ($r) {
|
||||
xchan_query($r);
|
||||
$sync_item = fetch_post_tags($r);
|
||||
Libsync::build_sync_packet($profile_uid, ['item' => [encode_item($sync_item[0], true)]]);
|
||||
}
|
||||
}
|
||||
|
||||
$datarray['id'] = $post_id;
|
||||
$datarray['llink'] = z_root() . '/display/?mid=' . gen_link_id($datarray['mid']);
|
||||
|
||||
|
@ -1814,25 +1791,15 @@ class Item extends Controller
|
|||
|
||||
if (!$nopush) {
|
||||
Run::Summon(['Notifier', $notify_type, $post_id]);
|
||||
if (intval($post['approval_id'])) {
|
||||
Run::Summon(['Notifier', $notify_type, $post['approval_id']]);
|
||||
}
|
||||
}
|
||||
logger('post_complete');
|
||||
|
||||
if ($moderated) {
|
||||
info(t('Your post/comment is awaiting approval.') . EOL);
|
||||
}
|
||||
elseif ($channel['channel_hash'] === $datarray['owner_xchan'] && $datarray['verb'] !== 'Add') {
|
||||
$items = [$datarray];
|
||||
xchan_query($items);
|
||||
for ($x = 0; $x < count($items); $x ++) {
|
||||
$items[$x] = array_merge(Activity::ap_context(), Activity::encode_activity($items[$x]));
|
||||
$items[$x]['proof'] = (new JcsEddsa2022())->sign($items[$x], $channel);
|
||||
}
|
||||
Activity::addToCollection($channel, array_shift($items), $datarray['parent_mid'], $datarray);
|
||||
|
||||
// @fixme: if this is a local top-level post, sign the original but don't deliver it.!!!
|
||||
|
||||
}
|
||||
|
||||
|
||||
// figure out how to return, depending on from whence we came
|
||||
|
||||
|
@ -2090,7 +2057,7 @@ class Item extends Controller
|
|||
$expire_unit = $poll['expire_unit'];
|
||||
$question = $poll['question'];
|
||||
$answers = $poll['answers'];
|
||||
$term = isset($poll['tags']) ? $poll_tags : [];
|
||||
$term = isset($poll['tags']) ? $poll['tags'] : [];
|
||||
|
||||
$obj = [];
|
||||
$ptr = [];
|
||||
|
|
|
@ -291,6 +291,7 @@ class Like extends Controller
|
|||
|
||||
$post = item_store($arr);
|
||||
$post_id = $post['item_id'];
|
||||
$approval_id = $post['approval_id'] ?? 0;
|
||||
|
||||
// save the conversation from expiration
|
||||
|
||||
|
@ -300,19 +301,14 @@ class Like extends Controller
|
|||
|
||||
$arr['id'] = $post_id;
|
||||
|
||||
|
||||
Hook::call('post_local_end', $arr);
|
||||
|
||||
$r = q(
|
||||
"select * from item where id = %d",
|
||||
intval($post_id)
|
||||
);
|
||||
if ($r) {
|
||||
xchan_query($r);
|
||||
$sync_item = fetch_post_tags($r);
|
||||
Libsync::build_sync_packet($channel['channel_id'], [ 'item' => [ encode_item($sync_item[0], true) ] ]);
|
||||
Run::Summon([ 'Notifier', 'like', $post_id ]);
|
||||
if ($approval_id) {
|
||||
Run::Summon([ 'Notifier', 'like', $approval_id ]);
|
||||
}
|
||||
|
||||
Run::Summon([ 'Notifier', 'like', $post_id ]);
|
||||
|
||||
killme();
|
||||
}
|
||||
|
|
|
@ -114,9 +114,13 @@ class Mood extends Controller
|
|||
|
||||
$post = item_store($arr);
|
||||
$item_id = $post['item_id'];
|
||||
$approval_id = $post['approval_id'] ?? 0;
|
||||
|
||||
if ($item_id) {
|
||||
Run::Summon(['Notifier', 'activity', $item_id]);
|
||||
if ($approval_id) {
|
||||
Run::Summon(['Notifier', 'activity', $approval_id]);
|
||||
}
|
||||
}
|
||||
|
||||
Hook::call('post_local_end', $arr);
|
||||
|
|
|
@ -259,6 +259,7 @@ class Plike extends Controller
|
|||
|
||||
$post = item_store($arr);
|
||||
$post_id = $post['item_id'];
|
||||
$approval_id = $post['approval_id'] ?? 0;
|
||||
|
||||
// save the conversation from expiration
|
||||
|
||||
|
@ -270,16 +271,6 @@ class Plike extends Controller
|
|||
|
||||
Hook::call('post_local_end', $arr);
|
||||
|
||||
$r = q(
|
||||
"select * from item where id = %d",
|
||||
intval($post_id)
|
||||
);
|
||||
if ($r) {
|
||||
xchan_query($r);
|
||||
$sync_item = fetch_post_tags($r);
|
||||
Libsync::build_sync_packet($channel['channel_id'], [ 'item' => [ encode_item($sync_item[0], true) ] ]);
|
||||
}
|
||||
|
||||
$r = q(
|
||||
"insert into likes (channel_id,liker,likee,iid,i_mid,verb,target_type,target_id,target) values (%d,'%s','%s',%d,'%s','%s','%s','%s','%s')",
|
||||
intval($channel['channel_id']),
|
||||
|
@ -306,6 +297,9 @@ class Plike extends Controller
|
|||
}
|
||||
|
||||
Run::Summon([ 'Notifier', 'like', $post_id ]);
|
||||
if ($approval_id) {
|
||||
Run::Summon(['Notifier', 'like', $approval_id]);
|
||||
}
|
||||
|
||||
killme();
|
||||
}
|
||||
|
|
|
@ -95,6 +95,9 @@ class React extends Controller
|
|||
if ($x['success']) {
|
||||
$nid = $x['item_id'];
|
||||
Run::Summon(['Notifier', 'like', $nid]);
|
||||
if (!empty($x['approval_id'])) {
|
||||
Run::Summon(['Notifier', 'like', $x['approval_id']]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -765,6 +765,9 @@ class Profile_edit
|
|||
|
||||
if ($i) {
|
||||
Run::Summon(['Notifier', 'wall-new', $i]);
|
||||
if (!empty($res['approval_id'])) {
|
||||
Run::Summon(['Notifier', 'wall-new', $res['approval_id']]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -126,6 +126,7 @@ class Share extends Controller
|
|||
$post = item_store($arr);
|
||||
|
||||
$post_id = $post['item_id'];
|
||||
$approval_id = $post['approval_id'] ?? 0;
|
||||
|
||||
$arr['id'] = $post_id;
|
||||
|
||||
|
@ -133,17 +134,10 @@ class Share extends Controller
|
|||
|
||||
info(t('Post repeated') . EOL);
|
||||
|
||||
$r = q(
|
||||
"select * from item where id = %d",
|
||||
intval($post_id)
|
||||
);
|
||||
if ($r) {
|
||||
xchan_query($r);
|
||||
$sync_item = fetch_post_tags($r);
|
||||
Libsync::build_sync_packet($channel['channel_id'], ['item' => [encode_item($sync_item[0], true)]]);
|
||||
}
|
||||
|
||||
Run::Summon(['Notifier', 'wall-new', $post_id]);
|
||||
if ($approval_id) {
|
||||
Run::Summon(['Notifier', 'wall-new', $approval_id]);
|
||||
}
|
||||
|
||||
killme();
|
||||
}
|
||||
|
|
|
@ -179,7 +179,7 @@ class Subthread extends Controller
|
|||
$arr['deny_cid'] = $item['deny_cid'];
|
||||
$arr['deny_gid'] = $item['deny_gid'];
|
||||
|
||||
$post = item_store($arr);
|
||||
$post = item_store($arr, deliver: false, addAndSync: false);
|
||||
$post_id = $post['item_id'];
|
||||
|
||||
$arr['id'] = $post_id;
|
||||
|
|
|
@ -54,7 +54,7 @@ class Tagrm extends Controller
|
|||
unset($item['term']);
|
||||
}
|
||||
|
||||
item_store_update($item);
|
||||
item_store_update($item, deliver: false, addAndSync: false);
|
||||
|
||||
info(t('Tag removed') . EOL);
|
||||
goaway(z_root() . '/' . $_SESSION['photo_return']);
|
||||
|
@ -106,7 +106,7 @@ class Tagrm extends Controller
|
|||
unset($item['term']);
|
||||
}
|
||||
|
||||
item_store_update($item);
|
||||
item_store_update($item, deliver: false, addAndSync: false);
|
||||
|
||||
info(t('Tag removed') . EOL);
|
||||
goaway(z_root() . '/' . $_SESSION['photo_return']);
|
||||
|
|
|
@ -140,17 +140,11 @@ class Vote extends Controller
|
|||
if ($x['success']) {
|
||||
$itemid = $x['item_id'];
|
||||
Run::Summon(['Notifier', 'like', $itemid]);
|
||||
if (!empty($x['approval_id'])) {
|
||||
Run::Summon(['Notifier', 'like', $x['approval_id']]);
|
||||
}
|
||||
}
|
||||
|
||||
$r = q(
|
||||
"select * from item where id = %d",
|
||||
intval($itemid)
|
||||
);
|
||||
if ($r) {
|
||||
xchan_query($r);
|
||||
$sync_item = fetch_post_tags($r);
|
||||
Libsync::build_sync_packet($channel['channel_id'], ['item' => [encode_item($sync_item[0], true)]]);
|
||||
}
|
||||
}
|
||||
$ret['success'] = true;
|
||||
$ret['message'] = t('Response submitted. Updates may not appear instantly.');
|
||||
|
|
|
@ -579,7 +579,7 @@ function update_birthdays()
|
|||
|
||||
$z = event_store_event($ev);
|
||||
if ($z) {
|
||||
event_store_item($ev, $z);
|
||||
event_store_item($ev, $z, deliver: false, addAndSync: false);
|
||||
q(
|
||||
"update abook set abook_dob = '%s' where abook_id = %d",
|
||||
dbesc(intval($rr['abook_dob']) + 1 . substr($rr['abook_dob'], 4)),
|
||||
|
|
|
@ -994,7 +994,7 @@ function event_import_ical($ical, $uid)
|
|||
logger('storing event: ' . print_r($ev, true), LOGGER_ALL);
|
||||
$event = event_store_event($ev);
|
||||
if ($event) {
|
||||
$item_id = event_store_item($ev, $event);
|
||||
event_store_item($ev, $event, deliver: false, addAndSync: false);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -1144,10 +1144,10 @@ function event_import_ical_task($ical, $uid)
|
|||
$ev['private'] = 1;
|
||||
$ev['allow_cid'] = '<' . $channel['channel_hash'] . '>';
|
||||
|
||||
logger('storing event: ' . print_r($ev, true), LOGGER_ALL);
|
||||
logger('storing task event: ' . print_r($ev, true), LOGGER_ALL);
|
||||
$event = event_store_event($ev);
|
||||
if ($event) {
|
||||
$item_id = event_store_item($ev, $event);
|
||||
event_store_item($ev, $event, deliver: false, addAndSync: false);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -1156,7 +1156,7 @@ function event_import_ical_task($ical, $uid)
|
|||
}
|
||||
|
||||
|
||||
function event_store_item($arr, $event)
|
||||
function event_store_item($arr, $event, $deliver = true, $addAndSync = true)
|
||||
{
|
||||
|
||||
require_once('include/datetime.php');
|
||||
|
@ -1179,7 +1179,6 @@ function event_store_item($arr, $event)
|
|||
|
||||
$item_arr = [];
|
||||
$prefix = '';
|
||||
// $birthday = false;
|
||||
|
||||
if (($event) && array_key_exists('event_hash', $event) && (! array_key_exists('event_hash', $arr))) {
|
||||
$arr['event_hash'] = $event['event_hash'];
|
||||
|
@ -1189,7 +1188,6 @@ function event_store_item($arr, $event)
|
|||
if (! Channel::is_system($arr['uid'])) {
|
||||
$prefix = t('This event has been added to your calendar.');
|
||||
}
|
||||
// $birthday = true;
|
||||
|
||||
// The event is created on your own site by the system, but appears to belong
|
||||
// to the birthday person. It also isn't propagated - so we need to prevent
|
||||
|
@ -1230,62 +1228,29 @@ function event_store_item($arr, $event)
|
|||
$x['eventRepeat'] = $event['event_repeat'];
|
||||
}
|
||||
$object = json_encode($x);
|
||||
$item_arr = [];
|
||||
$item_arr['obj'] = $object;
|
||||
$item_arr['edited'] = $arr['edited'];
|
||||
$item_arr['allow_cid'] = $arr['allow_cid'];
|
||||
$item_arr['allow_gid'] = $arr['allow_gid'];
|
||||
$item_arr['deny_cid'] = $arr['deny_cid'];
|
||||
$item_arr['deny_gid'] = $arr['deny_gid'];
|
||||
$item_arr['item_private'] = (($arr['allow_cid'] || $arr['allow_gid'] || $arr['deny_cid'] || $arr['deny_gid']) ? 1 : 0);
|
||||
$item_arr['title'] = $arr['summary'];
|
||||
$item_arr['sig'] = '';
|
||||
$item_arr['id'] = $r[0]['id'];
|
||||
$item_arr['body'] = $prefix . format_event_bbcode($arr);
|
||||
$item_arr['term'] = $arr['term'];
|
||||
|
||||
$private = (($arr['allow_cid'] || $arr['allow_gid'] || $arr['deny_cid'] || $arr['deny_gid']) ? 1 : 0);
|
||||
$post = item_store_update($item_arr, $deliver, $addAndSync);
|
||||
|
||||
/**
|
||||
* @FIXME can only update sig if we have the author's channel on this site
|
||||
* Until fixed, set it to nothing so it won't give us signature errors.
|
||||
*/
|
||||
$sig = '';
|
||||
|
||||
q(
|
||||
"UPDATE item SET title = '%s', body = '%s', obj = '%s', allow_cid = '%s', allow_gid = '%s', deny_cid = '%s', deny_gid = '%s', edited = '%s', sig = '%s', item_flags = %d, item_private = %d, obj_type = '%s' WHERE id = %d AND uid = %d",
|
||||
dbesc($arr['summary']),
|
||||
dbesc($prefix . format_event_bbcode($arr)),
|
||||
dbesc($object),
|
||||
dbesc($arr['allow_cid']),
|
||||
dbesc($arr['allow_gid']),
|
||||
dbesc($arr['deny_cid']),
|
||||
dbesc($arr['deny_gid']),
|
||||
dbesc($arr['edited']),
|
||||
dbesc($sig),
|
||||
intval($r[0]['item_flags']),
|
||||
intval($private),
|
||||
dbesc(ACTIVITY_OBJ_EVENT),
|
||||
intval($r[0]['id']),
|
||||
intval($arr['uid'])
|
||||
);
|
||||
|
||||
q(
|
||||
"delete from term where oid = %d and otype = %d",
|
||||
intval($r[0]['id']),
|
||||
intval(TERM_OBJ_POST)
|
||||
);
|
||||
|
||||
if (($arr['term']) && (is_array($arr['term']))) {
|
||||
foreach ($arr['term'] as $t) {
|
||||
q(
|
||||
"insert into term (uid,oid,otype,ttype,term,url)
|
||||
values(%d,%d,%d,%d,'%s','%s') ",
|
||||
intval($arr['uid']),
|
||||
intval($r[0]['id']),
|
||||
intval(TERM_OBJ_POST),
|
||||
intval($t['ttype']),
|
||||
dbesc($t['term']),
|
||||
dbesc($t['url'])
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
$item_id = $r[0]['id'];
|
||||
/**
|
||||
* @hooks event_updated
|
||||
* Called when an event record is modified.
|
||||
*/
|
||||
Hook::call('event_updated', $event['id']);
|
||||
|
||||
return $item_id;
|
||||
return $post;
|
||||
} else {
|
||||
$z = Channel::from_id($arr['uid']);
|
||||
|
||||
|
@ -1312,7 +1277,6 @@ function event_store_item($arr, $event)
|
|||
|
||||
$item_arr['aid'] = $z['channel_account_id'];
|
||||
$item_arr['uid'] = $arr['uid'];
|
||||
$item_arr['author_xchan'] = $arr['event_xchan'];
|
||||
$item_arr['mid'] = $arr['mid'];
|
||||
$item_arr['parent_mid'] = $arr['mid'];
|
||||
$item_arr['uuid'] = $event['event_hash'];
|
||||
|
@ -1398,9 +1362,7 @@ function event_store_item($arr, $event)
|
|||
|
||||
set_iconfig($item_arr, 'system', 'event_id', $event['event_hash'], true);
|
||||
|
||||
$res = item_store($item_arr);
|
||||
|
||||
$item_id = $res['item_id'];
|
||||
$post = item_store($item_arr, $deliver, $addAndSync);
|
||||
|
||||
/**
|
||||
* @hooks event_created
|
||||
|
@ -1408,7 +1370,7 @@ function event_store_item($arr, $event)
|
|||
*/
|
||||
Hook::call('event_created', $event['id']);
|
||||
|
||||
return $item_id;
|
||||
return $post;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -262,11 +262,11 @@ function store_doc_file($s)
|
|||
if ($r) {
|
||||
$item['id'] = $r[0]['id'];
|
||||
$item['mid'] = $item['parent_mid'] = $r[0]['mid'];
|
||||
$x = item_store_update($item);
|
||||
$x = item_store_update($item, deliver: false, addAndSync: false);
|
||||
} else {
|
||||
$item['uuid'] = new_uuid();
|
||||
$item['mid'] = $item['parent_mid'] = z_root() . '/item/' . $item['uuid'];
|
||||
$x = item_store($item);
|
||||
$x = item_store($item, deliver: false, addAndSync: false);
|
||||
}
|
||||
|
||||
return $x;
|
||||
|
|
|
@ -1030,12 +1030,12 @@ function import_items($channel, $items, $sync = false, $relocate = null)
|
|||
if ($item['edited'] >= $r[0]['edited']) {
|
||||
$item['id'] = $r[0]['id'];
|
||||
$item['uid'] = $channel['channel_id'];
|
||||
$item_result = item_store_update($item, $deliver);
|
||||
$item_result = item_store_update($item, $deliver, addAndSync: false);
|
||||
}
|
||||
} else {
|
||||
$item['aid'] = $channel['channel_account_id'];
|
||||
$item['uid'] = $channel['channel_id'];
|
||||
$item_result = item_store($item, $deliver);
|
||||
$item_result = item_store($item, $deliver, addAndSync: false);
|
||||
}
|
||||
|
||||
// preserve conversations you've been involved in from being expired
|
||||
|
@ -1983,11 +1983,11 @@ function import_webpage_element($element, $channel, $type)
|
|||
$arr['id'] = $i[0]['id'];
|
||||
// don't update if it has the same timestamp as the original
|
||||
if ($arr['edited'] > $i[0]['edited']) {
|
||||
$x = item_store_update($arr);
|
||||
$x = item_store_update($arr, deliver: false, addAndSync: false);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$x = item_store($arr);
|
||||
$x = item_store($arr, deliver: false, addAndSync: false);
|
||||
}
|
||||
|
||||
if ($x && $x['success']) {
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
* @brief Items related functions.
|
||||
*/
|
||||
|
||||
use Code\Lib\JcsEddsa2022;
|
||||
use Code\Lib\Libzot;
|
||||
use Code\Lib\Libsync;
|
||||
use Code\Lib\AccessList;
|
||||
|
@ -467,11 +468,13 @@ function post_activity_item($arr, $deliver = true, $channel = null, $observer =
|
|||
* * \e array - the item returned from item_store()
|
||||
*/
|
||||
Hook::call('post_local_end', $ret['activity']);
|
||||
sync_an_item($channel ? $channel['channel_id'] : $arr['uid'], $post_id);
|
||||
}
|
||||
|
||||
if($post_id && $deliver) {
|
||||
Run::Summon([ 'Notifier','activity',$post_id ]);
|
||||
if (!empty($post['approval_id'])) {
|
||||
Run::Summon([ 'Notifier','activity',$post['approval_id']]);
|
||||
}
|
||||
}
|
||||
|
||||
return $ret;
|
||||
|
@ -1410,7 +1413,7 @@ function item_json_encapsulate($arr,$k) {
|
|||
* * \e boolean \b success
|
||||
* * \e int \b item_id
|
||||
*/
|
||||
function item_store($arr, $deliver = true) {
|
||||
function item_store($arr, $deliver = true, $addAndSync = true) {
|
||||
|
||||
$d = [
|
||||
'item' => $arr,
|
||||
|
@ -1892,6 +1895,12 @@ function item_store($arr, $deliver = true) {
|
|||
Run::Summon([ 'Cache_embeds', $current_post ]);
|
||||
}
|
||||
|
||||
$ret['success'] = true;
|
||||
$ret['item_id'] = $current_post;
|
||||
|
||||
if ($addAndSync) {
|
||||
$ret = addToCollectionAndSync($ret);
|
||||
}
|
||||
// If _creating_ a deleted item, don't propagate it further or send out notifications.
|
||||
// We need to store the item details just in case the delete came in before the original post,
|
||||
// so that we have an item in the DB that's marked deleted and won't store a fresh post
|
||||
|
@ -1902,9 +1911,7 @@ function item_store($arr, $deliver = true) {
|
|||
tag_deliver($arr['uid'],$current_post);
|
||||
}
|
||||
|
||||
$ret['success'] = true;
|
||||
$ret['item_id'] = $current_post;
|
||||
|
||||
// experimental future use
|
||||
// if($linkid) {
|
||||
// $li = [ $ret['item'] ];
|
||||
// xchan_query($li);
|
||||
|
@ -1915,7 +1922,54 @@ function item_store($arr, $deliver = true) {
|
|||
return $ret;
|
||||
}
|
||||
|
||||
function addToCollectionAndSync($ret)
|
||||
{
|
||||
if (!$ret['success']) {
|
||||
return $ret;
|
||||
}
|
||||
$channel = Channel::from_id($ret['item']['uid']);
|
||||
if ($channel && $channel['channel_hash'] === $ret['item']['owner_xchan']) {
|
||||
$items = [$ret['item']];
|
||||
xchan_query($items);
|
||||
$items = fetch_post_tags($items);
|
||||
$sync_items = [];
|
||||
$sync_items[] = encode_item($items[0], true);
|
||||
|
||||
if (!in_array($ret['item']['verb'], ['Add', 'Remove'])) {
|
||||
$items[0] = array_merge(Activity::ap_context(), Activity::encode_activity($items[0]));
|
||||
$items[0]['proof'] = (new JcsEddsa2022())->sign($items[0], $channel);
|
||||
$approval = Activity::addToCollection($channel,
|
||||
$items[0],
|
||||
$ret['item']['parent_mid'], $ret['item'], deliver: false);
|
||||
if ($approval['success']) {
|
||||
$ret['approval_id'] = $approval['item_id'];
|
||||
$ret['approval'] = $approval['activity'];
|
||||
$addItems = [$approval['activity']];
|
||||
xchan_query($addItems);
|
||||
$addItems = fetch_post_tags($addItems);
|
||||
$sync_items[] = encode_item($addItems[0], true);
|
||||
}
|
||||
}
|
||||
$resource_type = $ret['item']['resource_type'];
|
||||
if ($resource_type === 'event') {
|
||||
$z = q(
|
||||
"select * from event where event_hash = '%s' and uid = %d limit 1",
|
||||
dbesc($ret['item']['resource_id']),
|
||||
intval($channel['channel_id'])
|
||||
);
|
||||
if ($z) {
|
||||
Libsync::build_sync_packet($channel['channel_id'], ['event_item' => $sync_items, 'event' => $z]);
|
||||
}
|
||||
}
|
||||
elseif ($resource_type === 'photo') {
|
||||
// reserved for future use, currently handled in the photo upload workflow
|
||||
}
|
||||
else {
|
||||
Libsync::build_sync_packet($ret['item']['uid'], ['item' => $sync_items]);
|
||||
}
|
||||
}
|
||||
return $ret;
|
||||
}
|
||||
/**
|
||||
* @brief Update a stored item.
|
||||
*
|
||||
|
@ -1923,7 +1977,7 @@ function item_store($arr, $deliver = true) {
|
|||
* @param boolean $deliver (optional) default true
|
||||
* @return array
|
||||
*/
|
||||
function item_store_update($arr, $deliver = true) {
|
||||
function item_store_update($arr, $deliver = true, $addAndSync = true) {
|
||||
|
||||
$d = [
|
||||
'item' => $arr,
|
||||
|
@ -2236,15 +2290,21 @@ function item_store_update($arr, $deliver = true) {
|
|||
Run::Summon([ 'Cache_embeds', $orig_post_id ]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
$ret['success'] = true;
|
||||
$ret['item_id'] = $orig_post_id;
|
||||
|
||||
if ($addAndSync) {
|
||||
$ret = addToCollectionAndSync($ret);
|
||||
}
|
||||
|
||||
if($deliver) {
|
||||
// don't send notify_comment for edits
|
||||
// send_status_notifications($orig_post_id,$arr);
|
||||
tag_deliver($uid,$orig_post_id);
|
||||
}
|
||||
|
||||
$ret['success'] = true;
|
||||
$ret['item_id'] = $orig_post_id;
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
|
@ -3082,17 +3142,6 @@ function start_delivery_chain($channel, $item, $item_id, bool|array $parent, $gr
|
|||
$post = item_store($arr);
|
||||
}
|
||||
|
||||
$arr['target'] = [
|
||||
'id' => str_replace('/item/', '/conversation/', $arr['mid']),
|
||||
'type' => 'Collection',
|
||||
'attributedTo' => z_root() . '/channel/' . $channel['channel_address'],
|
||||
];
|
||||
$arr['tgt_type'] = 'Collection';
|
||||
|
||||
$items = [$post['item']];
|
||||
xchan_query($items);
|
||||
$targetCollection = Activity::addToCollection($channel, Activity::encode_activity(array_shift($items), true), $arr['target']['id'], $arr,false);
|
||||
|
||||
$post_id = $post['item_id'];
|
||||
|
||||
if ($source && $post_id && !$edit) {
|
||||
|
@ -3121,6 +3170,10 @@ function start_delivery_chain($channel, $item, $item_id, bool|array $parent, $gr
|
|||
$post_id = $targetCollection ? $targetCollection['item_id'] : 0;
|
||||
if($post_id) {
|
||||
Run::Summon(['Notifier', 'tgroup', $post_id ]);
|
||||
if (!empty($post['approval_id'])) {
|
||||
Run::Summon(['Notifier', 'tgroup', $post['approval_id']]);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
q("update channel set channel_lastpost = '%s' where channel_id = %d",
|
||||
|
@ -3204,6 +3257,9 @@ function start_delivery_chain($channel, $item, $item_id, bool|array $parent, $gr
|
|||
|
||||
if ($post_id) {
|
||||
Run::Summon([ 'Notifier','tgroup',$post_id ]);
|
||||
if (!empty($post['approval_id'])) {
|
||||
Run::Summon(['Notifier', 'tgroup', $post['approval_id']]);
|
||||
}
|
||||
}
|
||||
|
||||
q("update channel set channel_lastpost = '%s' where channel_id = %d",
|
||||
|
@ -4831,12 +4887,11 @@ function copy_of_pubitem($channel,$mid) {
|
|||
$rv['item_wall'] = 0;
|
||||
$rv['item_origin'] = 0;
|
||||
|
||||
$x = item_store($rv);
|
||||
$x = item_store($rv, deliver: false, addAndSync: false);
|
||||
if ($x['item_id'] && $x['item']['mid'] === $mid) {
|
||||
$result = $x['item'];
|
||||
sync_an_item($channel['channel_id'],$x['item_id']);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
|
|
|
@ -569,6 +569,10 @@ function photo_upload($channel, $observer, $args)
|
|||
|
||||
if ($visible && $deliver) {
|
||||
Run::Summon([ 'Notifier', 'wall-new', $item_id ]);
|
||||
if (!empty($result['approval_id'])) {
|
||||
Run::Summon(['Notifier', 'wall-new', $result['approval_id']]);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue