Version 4.5.0

This commit is contained in:
Neo committed 2025-12-19 05:51:58 -08:00
1 parent 1a0c7fd3c2
commit f79dcf067a
3791 files changed
+248032 -76372

No files matched your search

+98 -23
View File
@@ -11,7 +11,7 @@
namespace IPS\Content\Api;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
if ( !\defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
@@ -28,9 +28,10 @@ class _ItemController extends \IPS\Api\Controller
* @param array $where Extra WHERE clause
* @param string $containerParam The parameter which includes the container values
* @param bool $byPassPerms If permissions should be ignored
* @param string $customSort Custom sort by parameter to use
* @return \IPS\Api\PaginatedResponse
*/
protected function _list( $where = array(), $containerParam = 'categories', $byPassPerms=FALSE )
protected function _list( $where = array(), $containerParam = 'categories', $byPassPerms = FALSE, $customSort = NULL )
{
$class = $this->class;
@@ -47,7 +48,7 @@ class _ItemController extends \IPS\Api\Controller
}
/* Pinned? */
if ( isset( \IPS\Request::i()->pinned ) AND in_array( 'IPS\Content\Pinnable', class_implements( $class ) ) )
if ( isset( \IPS\Request::i()->pinned ) AND \in_array( 'IPS\Content\Pinnable', class_implements( $class ) ) )
{
if ( \IPS\Request::i()->pinned )
{
@@ -60,7 +61,7 @@ class _ItemController extends \IPS\Api\Controller
}
/* Featured? */
if ( isset( \IPS\Request::i()->featured ) AND in_array( 'IPS\Content\Featurable', class_implements( $class ) ) )
if ( isset( \IPS\Request::i()->featured ) AND \in_array( 'IPS\Content\Featurable', class_implements( $class ) ) )
{
if ( \IPS\Request::i()->featured )
{
@@ -73,11 +74,11 @@ class _ItemController extends \IPS\Api\Controller
}
/* Locked? */
if ( isset( \IPS\Request::i()->locked ) AND in_array( 'IPS\Content\Lockable', class_implements( $class ) ) )
if ( isset( \IPS\Request::i()->locked ) AND \in_array( 'IPS\Content\Lockable', class_implements( $class ) ) )
{
if ( isset( $class::$databaseColumnMap['locked'] ) )
{
$where[] = array( $class::$databasePrefix . $class::$databaseColumnMap['locked'] . '=?', intval( \IPS\Request::i()->locked ) );
$where[] = array( $class::$databasePrefix . $class::$databaseColumnMap['locked'] . '=?', \intval( \IPS\Request::i()->locked ) );
}
else
{
@@ -86,7 +87,7 @@ class _ItemController extends \IPS\Api\Controller
}
/* Hidden */
if ( isset( \IPS\Request::i()->hidden ) AND in_array( 'IPS\Content\Hideable', class_implements( $class ) ) )
if ( isset( \IPS\Request::i()->hidden ) AND \in_array( 'IPS\Content\Hideable', class_implements( $class ) ) )
{
if ( \IPS\Request::i()->hidden )
{
@@ -113,7 +114,7 @@ class _ItemController extends \IPS\Api\Controller
}
/* Has poll? */
if ( isset( \IPS\Request::i()->hasPoll ) AND in_array( 'IPS\Content\Polls', class_implements( $class ) ) )
if ( isset( \IPS\Request::i()->hasPoll ) AND \in_array( 'IPS\Content\Polls', class_implements( $class ) ) )
{
if ( \IPS\Request::i()->hasPoll )
{
@@ -126,7 +127,17 @@ class _ItemController extends \IPS\Api\Controller
}
/* Sort */
if ( isset( \IPS\Request::i()->sortBy ) and in_array( \IPS\Request::i()->sortBy, array( 'date', 'title' ) ) )
$supportedSortBy = array( 'date', 'title' );
if( $class::$databaseColumnMap['updated'] )
{
$supportedSortBy[] = 'updated';
}
if( $customSort !== NULL )
{
$sortBy = $customSort;
}
elseif ( isset( \IPS\Request::i()->sortBy ) and \in_array( \IPS\Request::i()->sortBy, $supportedSortBy ) )
{
$sortBy = $class::$databasePrefix . $class::$databaseColumnMap[ \IPS\Request::i()->sortBy ];
}
@@ -134,7 +145,7 @@ class _ItemController extends \IPS\Api\Controller
{
$sortBy = $class::$databasePrefix . $class::$databaseColumnId;
}
$sortDir = ( isset( \IPS\Request::i()->sortDir ) and in_array( mb_strtolower( \IPS\Request::i()->sortDir ), array( 'asc', 'desc' ) ) ) ? \IPS\Request::i()->sortDir : 'asc';
$sortDir = ( isset( \IPS\Request::i()->sortDir ) and \in_array( mb_strtolower( \IPS\Request::i()->sortDir ), array( 'asc', 'desc' ) ) ) ? \IPS\Request::i()->sortDir : 'asc';
/* Get results */
if ( $this->member and !$byPassPerms )
@@ -144,6 +155,18 @@ class _ItemController extends \IPS\Api\Controller
}
else
{
/* And no PBR or queued for deletion things either */
if ( isset( $class::$databaseColumnMap['hidden'] ) )
{
$col = $class::$databaseTable . '.' . $class::$databasePrefix . $class::$databaseColumnMap['hidden'];
$where[] = array( "{$col}!=-2 AND {$col} !=-3" );
}
else if ( isset( $class::$databaseColumnMap['approved'] ) )
{
$col = $class::$databaseTable . '.' . $class::$databasePrefix . $class::$databaseColumnMap['approved'];
$where[] = array( "{$col}!=-2 AND {$col}!=-3" );
}
$query = \IPS\Db::i()->select( '*', $class::$databaseTable, $where, "{$sortBy} {$sortDir}" );
$count = \IPS\Db::i()->select( 'COUNT(*)', $class::$databaseTable, $where )->first();
}
@@ -196,7 +219,7 @@ class _ItemController extends \IPS\Api\Controller
}
/* Tags */
if ( ( isset( \IPS\Request::i()->prefix ) or isset( \IPS\Request::i()->tags ) ) and in_array( 'IPS\Content\Tags', class_implements( get_class( $item ) ) ) )
if ( ( isset( \IPS\Request::i()->prefix ) or isset( \IPS\Request::i()->tags ) ) and \in_array( 'IPS\Content\Tags', class_implements( \get_class( $item ) ) ) )
{
if ( !$this->member or $item::canTag( $this->member, $item->containerWrapper() ) )
{
@@ -229,14 +252,14 @@ class _ItemController extends \IPS\Api\Controller
}
/* Open/closed */
if ( isset( \IPS\Request::i()->locked ) and in_array( 'IPS\Content\Lockable', class_implements( get_class( $item ) ) ) )
if ( isset( \IPS\Request::i()->locked ) and \in_array( 'IPS\Content\Lockable', class_implements( \get_class( $item ) ) ) )
{
if ( !$this->member or ( \IPS\Request::i()->locked and $item->canLock( $this->member ) ) or ( !\IPS\Request::i()->locked and $item->canUnlock( $this->member ) ) )
{
if ( isset( $item::$databaseColumnMap['locked'] ) )
{
$lockedColumn = $item::$databaseColumnMap['locked'];
$item->$lockedColumn = intval( \IPS\Request::i()->locked );
$item->$lockedColumn = \intval( \IPS\Request::i()->locked );
}
else
{
@@ -247,12 +270,12 @@ class _ItemController extends \IPS\Api\Controller
}
/* Hidden */
if ( isset( \IPS\Request::i()->hidden ) and in_array( 'IPS\Content\Hideable', class_implements( get_class( $item ) ) ) )
if ( isset( \IPS\Request::i()->hidden ) and \in_array( 'IPS\Content\Hideable', class_implements( \get_class( $item ) ) ) )
{
if ( !$this->member or ( \IPS\Request::i()->hidden and $item->canHide( $this->member ) ) or ( !\IPS\Request::i()->hidden and $item->canUnhide( $this->member ) ) )
{
$idColumn = $item::$databaseColumnId;
if ( \IPS\Request::i()->hidden )
if ( \IPS\Request::i()->hidden AND $item->hidden() != -1 )
{
if ( $item->$idColumn )
{
@@ -272,7 +295,8 @@ class _ItemController extends \IPS\Api\Controller
}
}
}
else
if ( !\IPS\Request::i()->hidden AND $item->hidden() == -1 )
{
if ( $item->$idColumn )
{
@@ -296,22 +320,22 @@ class _ItemController extends \IPS\Api\Controller
}
/* Pinned */
if ( isset( \IPS\Request::i()->pinned ) and in_array( 'IPS\Content\Pinnable', class_implements( get_class( $item ) ) ) )
if ( isset( \IPS\Request::i()->pinned ) and \in_array( 'IPS\Content\Pinnable', class_implements( \get_class( $item ) ) ) )
{
if ( !$this->member or ( \IPS\Request::i()->pinned and $item->canPin( $this->member ) ) or ( !\IPS\Request::i()->pinned and $item->canUnpin( $this->member ) ) )
{
$pinnedColumn = $item::$databaseColumnMap['pinned'];
$item->$pinnedColumn = intval( \IPS\Request::i()->pinned );
$item->$pinnedColumn = \intval( \IPS\Request::i()->pinned );
}
}
/* Featured */
if ( isset( \IPS\Request::i()->featured ) and in_array( 'IPS\Content\Featurable', class_implements( get_class( $item ) ) ) )
if ( isset( \IPS\Request::i()->featured ) and \in_array( 'IPS\Content\Featurable', class_implements( \get_class( $item ) ) ) )
{
if ( !$this->member or ( \IPS\Request::i()->featured and $item->canFeature( $this->member ) ) or ( !\IPS\Request::i()->featured and $item->canUnfeature( $this->member ) ) )
{
$featuredColumn = $item::$databaseColumnMap['featured'];
$item->$featuredColumn = intval( \IPS\Request::i()->featured );
$item->$featuredColumn = \intval( \IPS\Request::i()->featured );
}
}
@@ -404,7 +428,7 @@ class _ItemController extends \IPS\Api\Controller
{
$item->sendNotifications();
}
elseif( $item->hidden() !== -1 )
elseif( !\in_array( $item->hidden(), array( -1, -3 ) ) )
{
$item->sendUnapprovedNotification();
}
@@ -412,6 +436,57 @@ class _ItemController extends \IPS\Api\Controller
/* Output */
return $item;
}
/**
* Create or update poll
*
* @param \IPS\Content\Item $item The content item to attach the poll to
* @param string $type Whether we are adding or editing
* @return void
*/
protected function _createOrUpdatePoll( $item, $type )
{
/* Are we creating or updating a poll? */
if( isset( \IPS\Request::i()->poll_title ) AND isset( \IPS\Request::i()->poll_options ) AND \IPS\Request::i()->poll_title AND \IPS\Request::i()->poll_options AND ( !$this->member OR $item::canCreatePoll( $this->member, $item->container() ) ) )
{
$canCreatePoll = TRUE;
if( $type == 'edit' AND !$item->getPoll() )
{
$canCreatePoll = (bool) ( \IPS\Settings::i()->startpoll_cutoff == -1 or \IPS\DateTime::create()->sub( new \DateInterval( 'PT' . \IPS\Settings::i()->startpoll_cutoff . 'H' ) )->getTimestamp() < $item->mapped('date') );
}
if( $canCreatePoll === TRUE )
{
$poll = $item->getPoll() ?: new \IPS\Poll;
if( !$item->getPoll() )
{
$poll->starter_id = $item->author()->member_id;
}
$formatted = array(
'title' => \IPS\Request::i()->poll_title,
'questions' => \IPS\Request::i()->poll_options
);
if( isset( \IPS\Request::i()->poll_only ) AND \IPS\Request::i()->poll_only )
{
$formatted['poll_only'] = 1;
}
if( isset( \IPS\Request::i()->poll_public ) AND \IPS\Request::i()->poll_public )
{
$formatted['public'] = 1;
}
$poll->setDataFromForm( $formatted, TRUE );
$poll->save();
$item->poll_state = $poll->pid;
}
}
}
/**
* View Comments or Reviews
@@ -434,7 +509,7 @@ class _ItemController extends \IPS\Api\Controller
$where [] = array( $commentClass::$databasePrefix . $commentClass::$databaseColumnMap['item'] . '=?', $item->$itemIdColumn );
/* Hidden? */
if ( isset( \IPS\Request::i()->hidden ) AND in_array( 'IPS\Content\Hideable', class_implements( $commentClass ) ) )
if ( isset( \IPS\Request::i()->hidden ) AND \in_array( 'IPS\Content\Hideable', class_implements( $commentClass ) ) )
{
if ( \IPS\Request::i()->hidden )
{
@@ -467,7 +542,7 @@ class _ItemController extends \IPS\Api\Controller
/* Sort */
$sortBy = $commentClass::$databasePrefix . $commentClass::$databaseColumnMap['date'];
$sortDir = ( isset( \IPS\Request::i()->sortDir ) and in_array( mb_strtolower( \IPS\Request::i()->sortDir ), array( 'asc', 'desc' ) ) ) ? \IPS\Request::i()->sortDir : 'asc';
$sortDir = ( isset( \IPS\Request::i()->sortDir ) and \in_array( mb_strtolower( \IPS\Request::i()->sortDir ), array( 'asc', 'desc' ) ) ) ? \IPS\Request::i()->sortDir : 'asc';
return new \IPS\Api\PaginatedResponse(
200,