Update SearchApiV2Service

This commit is contained in:
Daniel Supernault 2020-02-07 01:27:05 -07:00
parent 1dac65fc10
commit 4573fd850f
No known key found for this signature in database
GPG key ID: 0DEF1C662C9033F7

View file

@ -11,6 +11,7 @@ use League\Fractal;
use League\Fractal\Serializer\ArraySerializer; use League\Fractal\Serializer\ArraySerializer;
use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use App\Util\ActivityPub\Helpers; use App\Util\ActivityPub\Helpers;
use Illuminate\Support\Str;
class SearchApiV2Service class SearchApiV2Service
{ {
@ -25,14 +26,11 @@ class SearchApiV2Service
{ {
$this->query = $query; $this->query = $query;
if($query->has('resolve') && $query->resolve == true && Helpers::validateUrl(urldecode($query))) { if($query->has('resolve') &&
return [ $query->resolve == true &&
'accounts' => [ Helpers::validateUrl(urldecode($query->input('q')))
$this->resolve() ) {
], return $this->resolve();
'hashtags' => [],
'statuses' => []
];
} }
if($query->has('type')) { if($query->has('type')) {
@ -78,7 +76,12 @@ class SearchApiV2Service
protected function resolve() protected function resolve()
{ {
return WebfingerService::lookup($this->query->input('q')); $query = urldecode($this->query->input('q'));
if(Str::startsWith($query, '@') == true) {
return WebfingerService::lookup($this->query->input('q'));
} else if (Str::startsWith($query, 'https://') == true) {
return $this->resolveQuery();
}
} }
protected function accounts() protected function accounts()
@ -124,6 +127,7 @@ class SearchApiV2Service
$limit = $this->query->input('limit', 20); $limit = $this->query->input('limit', 20);
$query = '%' . $this->query->input('q') . '%'; $query = '%' . $this->query->input('q') . '%';
$results = Status::where('caption', 'like', $query) $results = Status::where('caption', 'like', $query)
->whereScope('public')
->when($this->query->input('offset') != null, function($q, $offset) { ->when($this->query->input('offset') != null, function($q, $offset) {
return $q->offset($offset); return $q->offset($offset);
}) })
@ -155,4 +159,75 @@ class SearchApiV2Service
return $fractal->createData($resource)->toArray(); return $fractal->createData($resource)->toArray();
} }
protected function resolveQuery()
{
$query = urldecode($this->query->input('q'));
if(Helpers::validateLocalUrl($query, false)) {
if(Str::contains($query, '/p/')) {
return $this->resolveLocalStatus();
} else {
return $this->resolveLocalProfile();
}
} else {
return [
'accounts' => [],
'hashtags' => [],
'statuses' => []
];
}
}
protected function resolveLocalStatus()
{
$query = urldecode($this->query->input('q'));
$query = last(explode('/', $query));
$status = Status::whereNull('uri')
->whereScope('public')
->find($query);
if(!$status) {
return [
'accounts' => [],
'hashtags' => [],
'statuses' => []
];
}
$fractal = new Fractal\Manager();
$fractal->setSerializer(new ArraySerializer());
$resource = new Fractal\Resource\Item($status, new StatusTransformer());
return [
'accounts' => [],
'hashtags' => [],
'statuses' => $fractal->createData($resource)->toArray()
];
}
protected function resolveLocalProfile()
{
$query = urldecode($this->query->input('q'));
$query = last(explode('/', $query));
$profile = Profile::whereNull('status')
->whereNull('domain')
->whereUsername($query)
->first();
if(!$profile) {
return [
'accounts' => [],
'hashtags' => [],
'statuses' => []
];
}
$fractal = new Fractal\Manager();
$fractal->setSerializer(new ArraySerializer());
$resource = new Fractal\Resource\Item($profile, new AccountTransformer());
return [
'accounts' => $fractal->createData($resource)->toArray(),
'hashtags' => [],
'statuses' => []
];
}
} }