Version 5.0.0 beta 1

This commit is contained in:
Neo committed 2025-12-19 16:27:35 -08:00
1 parent 25ddeb65d6
commit 15c7beabc5
6736 files changed
+627902 -497943

No files matched your search

+34 -21
View File
@@ -11,23 +11,36 @@
namespace IPS\Content\Search;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
use IPS\Api\PaginatedResponse;
use IPS\Content\Reaction;
use IPS\Db;
use IPS\Http\Url;
use IPS\Member;
use IPS\Request;
use IPS\Settings;
use OutOfRangeException;
use function count;
use function defined;
use function in_array;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Abstract Search Query
*/
class _ApiResponse extends \IPS\Api\PaginatedResponse
class ApiResponse extends PaginatedResponse
{
/**
* Data to output
*
* @return array
*/
public function getOutput()
public function getOutput(): array
{
/* Get the query object from the stored select */
$queryObject = $this->iterator[0];
@@ -40,20 +53,20 @@ class _ApiResponse extends \IPS\Api\PaginatedResponse
$searchResults = $queryObject->search(
$this->iterator[2],
$this->iterator[3],
$this->iterator[1] + \IPS\Content\Search\Query::TAGS_MATCH_ITEMS_ONLY,
$this->iterator[1] + Query::TAGS_MATCH_ITEMS_ONLY,
$this->iterator[4]
);
$this->count = $searchResults->count( TRUE );
/* Search tracking, only if there's a term for a non-member search and we're on the first page */
if( \IPS\Request::i()->q AND $this->page == 1 AND ( !isset( \IPS\Request::i()->doNotTrack ) OR \IPS\Request::i()->doNotTrack != 1 ) )
if( Request::i()->q AND $this->page == 1 AND ( !isset( Request::i()->doNotTrack ) OR Request::i()->doNotTrack != 1 ) )
{
$memberPermissions = $this->authorizedMember;
if( !$this->authorizedMember AND isset( \IPS\Request::i()->search_as ) )
if( !$this->authorizedMember AND isset( Request::i()->search_as ) )
{
$memberPermissions = \IPS\Member::load( \IPS\Request::i()->search_as );
$memberPermissions = Member::load( Request::i()->search_as );
if( !$memberPermissions->member_id )
{
@@ -61,10 +74,10 @@ class _ApiResponse extends \IPS\Api\PaginatedResponse
}
}
\IPS\Db::i()->insert( 'core_statistics', array(
Db::i()->insert( 'core_statistics', array(
'type' => 'search',
'time' => time(),
'value_4' => \IPS\Request::i()->q,
'value_4' => Request::i()->q,
'value_2' => $this->count,
'extra_data' => $memberPermissions ? md5( $memberPermissions->email . $memberPermissions->joined ) : md5( 'rest-api' ) // Intentionally anonymized
) );
@@ -75,7 +88,7 @@ class _ApiResponse extends \IPS\Api\PaginatedResponse
{
$resultData = $result->asArray();
$indexClass = $resultData['indexData']['index_class'];
$itemClass = ( \in_array( 'IPS\Content\Comment', class_parents( $indexClass ) ) ) ? $indexClass::$itemClass : $indexClass;
$itemClass = ( in_array( 'IPS\Content\Comment', class_parents( $indexClass ) ) ) ? $indexClass::$itemClass : $indexClass;
/* Container details */
$containerUrl = NULL;
@@ -83,26 +96,26 @@ class _ApiResponse extends \IPS\Api\PaginatedResponse
if ( isset( $itemClass::$containerNodeClass ) )
{
$containerClass = $itemClass::$containerNodeClass;
$containerTitle = \IPS\Member::loggedIn()->language()->addToStack( $containerClass::$titleLangPrefix . $resultData['indexData']['index_container_id'], 'NULL', array( 'escape' => true ) );
$containerTitle = Member::loggedIn()->language()->addToStack( $containerClass::$titleLangPrefix . $resultData['indexData']['index_container_id'], 'NULL', array( 'escape' => true ) );
$containerUrl = $containerClass::urlFromIndexData( $resultData['indexData'], $resultData['itemData'], $resultData['containerData'] );
}
/* Reputation - if we are showing the total value, then we need to load them up and total up all of the values */
if ( \IPS\Settings::i()->reaction_count_display == 'count' )
if ( Settings::i()->reaction_count_display == 'count' )
{
$repCount = 0;
foreach( $resultData['reputationData'] AS $memberId => $reactionId )
{
try
{
$repCount += \IPS\Content\Reaction::load( $reactionId )->value;
$repCount += Reaction::load( $reactionId )->value;
}
catch( \OutOfRangeException $e ) {}
catch( OutOfRangeException $e ) {}
}
}
else
{
$repCount = \count( $resultData['reputationData'] );
$repCount = count( $resultData['reputationData'] );
}
$commentCount = NULL;
@@ -133,17 +146,17 @@ class _ApiResponse extends \IPS\Api\PaginatedResponse
'itemId' => $resultData['indexData']['index_item_id'],
'started' => $result->createdDate->rfc3339(),
'updated' => $result->lastUpdatedDate->rfc3339(),
'itemUrl' => (string) $itemClass::urlFromIndexData( $resultData['indexData'], $resultData['itemData'] ),
'objectUrl' => (string) $itemClass::urlFromIndexData( $resultData['indexData'], $resultData['itemData'] )->setQueryString( array( 'do' => 'findComment', 'comment' => $resultData['indexData']['index_object_id'] ) ),
'itemUrl' => (string) $resultData['url'],
'objectUrl' => (string) $resultData['url']->setQueryString( array( 'do' => 'findComment', 'comment' => $resultData['indexData']['index_object_id'] ) ),
'reputation' => $repCount,
'comments' => $commentCount,
'reviews' => $reviewCount,
'container' => $containerTitle,
'containerUrl' => (string) $containerUrl,
'author' => $resultData['authorData']['name'],
'authorUrl' => $resultData['authorData']['member_id'] ? (string) \IPS\Http\Url::internal( "app=core&module=members&controller=profile&id={$resultData['authorData']['member_id']}", 'front', 'profile', $resultData['authorData']['members_seo_name'] ) : NULL,
'authorPhoto' => \IPS\Member::photoUrl( $resultData['authorData'], FALSE ),
'authorPhotoThumbnail' => \IPS\Member::photoUrl( $resultData['authorData'] ),
'authorUrl' => $resultData['authorData']['member_id'] ? (string) Url::internal( "app=core&module=members&controller=profile&id={$resultData['authorData']['member_id']}", 'front', 'profile', $resultData['authorData']['members_seo_name'] ) : NULL,
'authorPhoto' => Member::photoUrl( $resultData['authorData'], FALSE ),
'authorPhotoThumbnail' => Member::photoUrl( $resultData['authorData'] ),
'tags' => ( !empty( $resultData['indexData']['index_tags'] ) ) ? explode( ',', $resultData['indexData']['index_tags'] ) : array()
);
}