Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
pull/24/head
Maxence Lange 2018-11-14 10:00:05 -01:00
rodzic af92d6e292
commit fe550a9643
8 zmienionych plików z 186 dodań i 22 usunięć

Wyświetl plik

@ -32,7 +32,9 @@ return [
['name' => 'Local#newPost', 'url' => '/api/v1/post', 'verb' => 'POST'],
['name' => 'Local#timeline', 'url' => '/api/v1/timeline', 'verb' => 'PUT'],
['name' => 'Local#direct', 'url' => '/api/v1/direct', 'verb' => 'PUT']
['name' => 'Local#direct', 'url' => '/api/v1/direct', 'verb' => 'PUT'],
['name' => 'Local#accountSearch', 'url' => '/api/v1/accounts/search', 'verb' => 'GET'],
['name' => 'Local#actorInfo', 'url' => '/api/v1/actor/info', 'verb' => 'GET']
]
];

Wyświetl plik

@ -36,6 +36,7 @@ use Exception;
use OCA\Social\AppInfo\Application;
use OCA\Social\Model\Post;
use OCA\Social\Service\ActivityPub\NoteService;
use OCA\Social\Service\ActivityPub\PersonService;
use OCA\Social\Service\ActorService;
use OCA\Social\Service\MiscService;
use OCA\Social\Service\PostService;
@ -59,6 +60,9 @@ class LocalController extends Controller {
/** @var string */
private $userId;
/** @var PersonService */
private $personService;
/** @var ActorService */
private $actorService;
@ -77,13 +81,15 @@ class LocalController extends Controller {
*
* @param IRequest $request
* @param string $userId
* @param PersonService $personService
* @param ActorService $actorService
* @param PostService $postService
* @param NoteService $noteService
* @param MiscService $miscService
*/
public function __construct(
IRequest $request, string $userId, ActorService $actorService, PostService $postService,
IRequest $request, string $userId, PersonService $personService, ActorService $actorService,
PostService $postService,
NoteService $noteService,
MiscService $miscService
) {
@ -92,6 +98,7 @@ class LocalController extends Controller {
$this->userId = $userId;
$this->actorService = $actorService;
$this->personService = $personService;
$this->postService = $postService;
$this->noteService = $noteService;
$this->miscService = $miscService;
@ -129,6 +136,8 @@ class LocalController extends Controller {
/**
* Get timeline
*
* // TODO: Delete the NoCSRF check
*
* @NoCSRFRequired
* @NoAdminRequired
* @NoSubAdminRequired
@ -165,8 +174,57 @@ class LocalController extends Controller {
} catch (Exception $e) {
return $this->fail($e->getMessage());
}
}
/**
*
* // TODO: Delete the NoCSRF check
*
* @NoCSRFRequired
* @NoAdminRequired
* @NoSubAdminRequired
*
* @param string $search
*
* @return DataResponse
*/
public function accountSearch(string $search): DataResponse {
try {
$local = $this->actorService->searchLocalAccounts($search);
$remote = $this->personService->searchCachedAccounts($search);
$accounts = [
'local' => $local,
'remote' => $remote
];
return $this->success(['accounts' => $accounts]);
} catch (Exception $e) {
return $this->fail($e->getMessage());
}
}
/**
*
* // TODO: Delete the NoCSRF check
*
* @NoCSRFRequired
* @NoAdminRequired
* @NoSubAdminRequired
*
* @param string $id
*
* @return DataResponse
*/
public function actorInfo(string $id): DataResponse {
try {
$actor = $this->personService->getFromId($id);
return $this->success(['actor' => $actor]);
} catch (Exception $e) {
return $this->fail($e->getMessage());
}
}
}

Wyświetl plik

@ -134,5 +134,24 @@ class ActorsRequest extends ActorsRequestBuilder {
}
/**
* @param string $search
*
* @return Person[]
*/
public function searchFromUsername(string $search): array {
$qb = $this->getActorsSelectSql();
$this->searchInPreferredUsername($qb, $search);
$accounts = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
$accounts[] = $this->parseActorsSelectSql($data);
}
$cursor->closeCursor();
return $accounts;
}
}

Wyświetl plik

@ -76,7 +76,8 @@ class ActorsRequestBuilder extends CoreRequestBuilder {
/** @noinspection PhpMethodParametersCountMismatchInspection */
$qb->select(
'sa.id', 'sa.user_id', 'sa.preferred_username', 'sa.name', 'sa.summary', 'sa.public_key',
'sa.id', 'sa.user_id', 'sa.preferred_username', 'sa.name', 'sa.summary',
'sa.public_key',
'sa.private_key', 'sa.creation'
)
->from(self::TABLE_SERVER_ACTORS, 'sa');

Wyświetl plik

@ -118,6 +118,30 @@ class CacheActorsRequest extends CacheActorsRequestBuilder {
/**
* get Cached version of an Actor, based on the UriId
*
* @param string $id
*
* @return Person
* @throws CacheActorDoesNotExistException
*/
public function getFromId(string $id): Person {
$qb = $this->getCacheActorsSelectSql();
$this->limitToIdString($qb, $id);
$cursor = $qb->execute();
$data = $cursor->fetch();
$cursor->closeCursor();
if ($data === false) {
throw new CacheActorDoesNotExistException();
}
return $this->parseCacheActorsSelectSql($data);
}
/**
* get Cached version of an Actor, based on the Account
*
* @param string $account
*
* @return Person
@ -139,5 +163,25 @@ class CacheActorsRequest extends CacheActorsRequestBuilder {
}
/**
* @param string $search
*
* @return Person[]
*/
public function searchAccounts(string $search): array {
$qb = $this->getCacheActorsSelectSql();
$this->searchInAccount($qb, $search);
$accounts = [];
$cursor = $qb->execute();
while ($data = $cursor->fetch()) {
$accounts[] = $this->parseCacheActorsSelectSql($data);
}
$cursor->closeCursor();
return $accounts;
}
}

Wyświetl plik

@ -118,6 +118,16 @@ class CoreRequestBuilder {
$this->limitToDBField($qb, 'preferred_username', $userId);
}
/**
* Limit the request to the OwnerId
*
* @param IQueryBuilder $qb
* @param string $username
*/
protected function searchInPreferredUsername(IQueryBuilder &$qb, $username) {
$this->searchInDBField($qb, 'preferred_username', $username . '%');
}
/**
* Limit the request to the OwnerId
@ -152,6 +162,17 @@ class CoreRequestBuilder {
}
/**
* Limit the request to the account
*
* @param IQueryBuilder $qb
* @param string $account
*/
protected function searchInAccount(IQueryBuilder &$qb, string $account) {
$this->searchInDBField($qb, 'account', $account . '%');
}
/**
* Limit the request to the url
*
@ -223,6 +244,18 @@ class CoreRequestBuilder {
$qb->andWhere($orX);
}
/**
* @param IQueryBuilder $qb
* @param string $field
* @param string $value
*/
private function searchInDBField(IQueryBuilder &$qb, string $field, string $value) {
$expr = $qb->expr();
$pf = ($qb->getType() === QueryBuilder::SELECT) ? $this->defaultSelectAlias . '.' : '';
$field = $pf . $field;
$qb->andWhere($expr->like($field, $qb->createNamedParameter($value)));
}
// /**
// * Left Join service to get info about the serviceId

Wyświetl plik

@ -87,7 +87,7 @@ class PersonService implements ICoreService {
*
* @return Person
* @throws RequestException
* @throws Exception
* @throws InvalidResourceException
*/
public function getFromId(string $id): Person {
@ -111,8 +111,11 @@ class PersonService implements ICoreService {
$actor->setPublicKey($this->get('publicKey.publicKeyPem', $object));
$actor->setSharedInbox($this->get('endpoints.sharedInbox', $object));
$actor->setAccount($actor->getPreferredUsername() . '@' . $this->get('_host', $object));
$this->save($actor);
try {
$this->save($actor);
} catch (Exception $e) {
throw new InvalidResourceException();
}
}
return $actor;
@ -150,6 +153,16 @@ class PersonService implements ICoreService {
}
/**
* @param string $search
*
* @return Person[]
*/
public function searchCachedAccounts(string $search): array {
return $this->cacheActorsRequest->searchAccounts($search);
}
/**
* This method is called when saving the Follow object
*
@ -163,21 +176,5 @@ class PersonService implements ICoreService {
}
// /**
// * @param Person $actor
// * @param int $type
// *
// * @return string
// */
// public function getPathFromActor(Person $actor, int $type) {
// switch ($type) {
// case InstancePath::INBOX:
// return parse_url($actor->getInbox(), PHP_URL_PATH);
// }
//
// return '';
// }
}

Wyświetl plik

@ -106,6 +106,16 @@ class ActorService {
}
/**
* @param string $search
*
* @return Person[]
*/
public function searchLocalAccounts(string $search): array {
return $this->actorsRequest->searchFromUsername($search);
}
/**