2020-06-07 19:04:43 +03:00
< ? php declare ( strict_types = 1 );
namespace openvk\Web\Models\Repositories ;
use openvk\Web\Models\Entities\User ;
2022-09-17 00:21:29 +03:00
use openvk\Web\Models\Repositories\Aliases ;
2020-06-07 19:04:43 +03:00
use Nette\Database\Table\ActiveRow ;
use Chandler\Database\DatabaseConnection ;
use Chandler\Security\User as ChandlerUser ;
class Users
{
private $context ;
private $users ;
2022-09-17 00:21:29 +03:00
private $aliases ;
2020-06-07 19:04:43 +03:00
function __construct ()
{
$this -> context = DatabaseConnection :: i () -> getContext ();
$this -> users = $this -> context -> table ( " profiles " );
2022-09-17 00:21:29 +03:00
$this -> aliases = $this -> context -> table ( " aliases " );
2020-06-07 19:04:43 +03:00
}
private function toUser ( ? ActiveRow $ar ) : ? User
{
return is_null ( $ar ) ? NULL : new User ( $ar );
}
function get ( int $id ) : ? User
{
return $this -> toUser ( $this -> users -> get ( $id ));
}
function getByShortURL ( string $url ) : ? User
{
2022-09-17 00:21:29 +03:00
$shortcode = $this -> toUser ( $this -> users -> where ( " shortcode " , $url ) -> fetch ());
if ( $shortcode )
return $shortcode ;
$alias = ( new Aliases ) -> getByShortcode ( $url );
if ( ! $alias ) return NULL ;
if ( $alias -> getType () !== " user " ) return NULL ;
return $alias -> getUser ();
2020-06-07 19:04:43 +03:00
}
2024-03-27 23:38:35 +03:00
function getByChandlerUserId ( string $cid ) : ? User
{
return $this -> toUser ( $this -> users -> where ( " user " , $cid ) -> fetch ());
}
2023-08-11 16:50:19 +03:00
function getByChandlerUser ( ? ChandlerUser $user ) : ? User
2020-06-07 19:04:43 +03:00
{
2024-03-27 23:38:35 +03:00
return $user ? $this -> getByChandlerUserId ( $user -> getId ()) : NULL ;
2020-06-07 19:04:43 +03:00
}
2024-10-18 22:29:40 +03:00
function find ( string $query , array $params = [], array $order = [ 'type' => 'id' , 'invert' => false ]) : Util\EntityStream
2020-06-07 19:04:43 +03:00
{
2024-10-18 22:29:40 +03:00
$result = $this -> users -> where ( " CONCAT_WS(' ', first_name, last_name, pseudo, shortcode) LIKE ? " , " % $query % " ) -> where ( " deleted " , 0 );
$order_str = 'id' ;
switch ( $order [ 'type' ]) {
case 'id' :
case 'reg_date' :
$order_str = 'since ' . ( $order [ 'invert' ] ? 'ASC' : 'DESC' );
break ;
case 'rating' :
$order_str = 'rating DESC' ;
break ;
}
2023-06-10 18:54:02 +03:00
2024-10-18 22:29:40 +03:00
foreach ( $params as $paramName => $paramValue ) {
if ( is_null ( $paramValue ) || $paramValue == '' ) continue ;
2023-06-10 18:54:02 +03:00
2024-10-18 22:29:40 +03:00
switch ( $paramName ) {
case " hometown " :
$result -> where ( " hometown LIKE ? " , " % $paramValue % " );
break ;
case " city " :
$result -> where ( " city LIKE ? " , " % $paramValue % " );
break ;
case " marital_status " :
$result -> where ( " marital_status ? " , $paramValue );
break ;
case " polit_views " :
$result -> where ( " polit_views ? " , $paramValue );
break ;
case " is_online " :
$result -> where ( " online >= ? " , time () - 900 );
break ;
case " fav_mus " :
$result -> where ( " fav_music LIKE ? " , " % $paramValue % " );
break ;
case " fav_films " :
$result -> where ( " fav_films LIKE ? " , " % $paramValue % " );
break ;
case " fav_shows " :
$result -> where ( " fav_shows LIKE ? " , " % $paramValue % " );
break ;
case " fav_books " :
$result -> where ( " fav_books LIKE ? " , " % $paramValue % " );
break ;
case " before " :
$result -> where ( " UNIX_TIMESTAMP(since) < ? " , $paramValue );
break ;
case " after " :
$result -> where ( " UNIX_TIMESTAMP(since) > ? " , $paramValue );
break ;
case " gender " :
if (( int ) $paramValue == 3 ) break ;
$result -> where ( " sex ? " , ( int ) $paramValue );
break ;
case " ignore_id " :
$result -> where ( " id != ? " , $paramValue );
break ;
case " ignore_private " :
$result -> where ( " profile_type " , 0 );
break ;
2023-06-10 18:54:02 +03:00
}
}
2024-10-18 22:29:40 +03:00
if ( $order_str )
$result -> order ( $order_str );
2023-06-10 18:54:02 +03:00
2024-10-18 22:29:40 +03:00
return new Util\EntityStream ( " User " , $result );
2020-06-07 19:04:43 +03:00
}
function getStatistics () : object
{
return ( object ) [
2023-12-10 21:55:28 +03:00
" all " => ( clone $this -> users ) -> count ( '*' ),
" active " => ( clone $this -> users ) -> where ( " online > 0 " ) -> count ( '*' ),
" online " => ( clone $this -> users ) -> where ( " online >= ? " , time () - 900 ) -> count ( '*' ),
2020-06-07 19:04:43 +03:00
];
}
2021-12-19 15:34:33 +03:00
function getByAddress ( string $address ) : ? User
{
if ( substr_compare ( $address , " / " , - 1 ) === 0 )
$address = substr ( $address , 0 , iconv_strlen ( $address ) - 1 );
$serverUrl = ovk_scheme ( true ) . $_SERVER [ " SERVER_NAME " ];
if ( strpos ( $address , $serverUrl . " / " ) === 0 )
$address = substr ( $address , iconv_strlen ( $serverUrl ) + 1 );
if ( strpos ( $address , " id " ) === 0 ) {
$user = $this -> get (( int ) substr ( $address , 2 ));
if ( $user ) return $user ;
}
return $this -> getByShortUrl ( $address );
}
2022-01-03 18:31:55 +03:00
/**
* If you need to check if the user is an instance administrator , use `$user->getChandlerUser()->can("access")->model("admin")->whichBelongsTo(NULL)` .
* This method is more suitable for instance administrators lists
*/
function getInstanceAdmins ( bool $excludeHidden = true ) : \Traversable
{
$query = " SELECT DISTINCT(`profiles`.`id`) FROM `ChandlerACLRelations` JOIN `profiles` ON `ChandlerACLRelations`.`user` = `profiles`.`user` COLLATE utf8mb4_unicode_520_ci WHERE `ChandlerACLRelations`.`group` IN (SELECT `group` FROM `ChandlerACLGroupsPermissions` WHERE `model` = \" admin \" AND `permission` = \" access \" ) " ;
if ( $excludeHidden )
$query .= " AND `ChandlerACLRelations`.`user` NOT IN (SELECT `user` FROM `ChandlerACLRelations` WHERE `group` IN (SELECT `group` FROM `ChandlerACLGroupsPermissions` WHERE `model` = \" hidden_admin \" AND `permission` = \" be \" )) " ;
$query .= " ORDER BY `profiles`.`id`; " ;
$result = DatabaseConnection :: i () -> getConnection () -> query ( $query );
foreach ( $result as $entry )
yield $this -> get ( $entry -> id );
}
2020-06-07 19:04:43 +03:00
use \Nette\SmartObject ;
}