Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions Controllers/api/v2/search/suggest/user.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?php
/**
* Minds Core Search API
*
* @version 2
* @author Theodore R. Smith <[email protected]>
*/

namespace Minds\Controllers\api\v2\search\suggest;

use Minds\Core;
use Minds\Core\Di\Di;
use Minds\Interfaces;
use Minds\Api\Factory;
use Minds\Entities;

class user implements Interfaces\Api, Interfaces\ApiIgnorePam
{
/**
* Equivalent to HTTP GET method
* @param array $pages
* @return mixed|null
*/
public function get($pages)
{
$usernames = Entities\Repositories\UserRepository::getUsersList();

// Filter by the ones that match.
if (!empty($_GET['username'])) {
$userSearch = $_GET['username'];
$usernames = array_filter($usernames, function($username) use ($userSearch) {
return strpos($username, $userSearch) === 0;
});
}

return Factory::response([
'entities' => $usernames
]);

}

/**
* Equivalent to HTTP POST method
* @param array $pages
* @return mixed|null
*/
public function post($pages)
{
return Factory::response([]);
}

/**
* Equivalent to HTTP PUT method
* @param array $pages
* @return mixed|null
*/
public function put($pages)
{
return Factory::response([]);
}

/**
* Equivalent to HTTP DELETE method
* @param array $pages
* @return mixed|null
*/
public function delete($pages)
{
return Factory::response([]);
}
}
59 changes: 59 additions & 0 deletions Entities/Repositories/UserRepository.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
<?php declare(strict_types=1);

namespace Minds\Entities\Repositories;

use Cassandra\Rows;
use Minds\Core;
use Minds\Core\Data\cache\abstractCacher;
use Minds\Core\Data\Cassandra\Client as Cassandra_Client;
use Minds\Core\Data\Cassandra\Prepared\Custom as Cassandra_Prep_Statement;

class UserRepository
{
public static function getUsersList(Cassandra_Client $cql = null): array
{
/** @var abstractCacher $cache */
$cache = Core\Di\Di::_()->get('Cache');

$usernames = $cache->get('usernames');
Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm wondering if the key name needs to be a lot more ... unique ...

if (!empty($usernames)) {
return $usernames;
}

$usernames = self::fetchUsernames($cql);

// Cache for 5 minutes.
$cache->set('usernames', $usernames, 300);

return $usernames;
}

protected static function fetchUsernames(Cassandra_Client $cql = null): array
{
/** @var Cassandra_Client $cql */
$cql = $cql ?: Core\Di\Di::_()->get('Database\Cassandra\Cql');
$sql = <<<SQL
SELECT value AS username FROM minds.entities WHERE column1='username' ALLOW FILTERING;
SQL;

$query = new Cassandra_Prep_Statement();
$query->query($sql);

try {
/** @var Rows $results */
$results = $cql->request($query);
if (empty($results)) {
return [];
}
} catch (\Exception $e) {
return [];
}

$usernames = [];
foreach ($results as $row) {
$usernames[] = $row['username'];
}

return $usernames;
}
}