diff --git a/app/Services/SearchApiV2Service.php b/app/Services/SearchApiV2Service.php new file mode 100644 index 00000000..2123ff3b --- /dev/null +++ b/app/Services/SearchApiV2Service.php @@ -0,0 +1,164 @@ +run($query); + } + + protected function run($query) + { + $this->query = $query; + + if($query->has('resolve') && $query->resolve == true) { + return [ + 'accounts' => [ + $this->resolve() + ], + 'hashtags' => [], + 'statuses' => [] + ]; + } + + if($query->has('type')) { + switch ($query->input('type')) { + case 'accounts': + return [ + 'accounts' => [ + $this->accounts() + ], + 'hashtags' => [], + 'statuses' => [] + ]; + break; + case 'hashtags': + return [ + 'accounts' => [], + 'hashtags' => [ + $this->hashtags() + ], + 'statuses' => [] + ]; + break; + case 'statuses': + return [ + 'accounts' => [], + 'hashtags' => [], + 'statuses' => [ + $this->statuses() + ] + ]; + break; + } + } + + if($query->has('account_id')) { + return [ + 'accounts' => [], + 'hashtags' => [], + 'statuses' => $this->statusesById() + ]; + } + + return [ + 'accounts' => $this->accounts(), + 'hashtags' => $this->hashtags(), + 'statuses' => $this->statuses() + ]; + } + + protected function resolve() + { + return WebfingerService::lookup($this->query->input('q')); + } + + protected function accounts() + { + $limit = $this->query->input('limit', 20); + $query = '%' . $this->query->input('q') . '%'; + $results = Profile::whereNull('status') + ->where('username', 'like', $query) + ->when($this->query->input('offset') != null, function($q, $offset) { + return $q->offset($offset); + }) + ->limit($limit) + ->get(); + + $fractal = new Fractal\Manager(); + $fractal->setSerializer(new ArraySerializer()); + $resource = new Fractal\Resource\Collection($results, new AccountTransformer()); + return $fractal->createData($resource)->toArray(); + } + + protected function hashtags() + { + $limit = $this->query->input('limit', 20); + $query = '%' . $this->query->input('q') . '%'; + return Hashtag::whereIsBanned(false) + ->where('name', 'like', $query) + ->when($this->query->input('offset') != null, function($q, $offset) { + return $q->offset($offset); + }) + ->limit($limit) + ->get() + ->map(function($tag) { + return [ + 'name' => $tag->name, + 'url' => $tag->url(), + 'history' => [] + ]; + }); + } + + protected function statuses() + { + $limit = $this->query->input('limit', 20); + $query = '%' . $this->query->input('q') . '%'; + $results = Status::where('caption', 'like', $query) + ->when($this->query->input('offset') != null, function($q, $offset) { + return $q->offset($offset); + }) + ->limit($limit) + ->get(); + + $fractal = new Fractal\Manager(); + $fractal->setSerializer(new ArraySerializer()); + $resource = new Fractal\Resource\Collection($results, new StatusTransformer()); + return $fractal->createData($resource)->toArray(); + } + + protected function statusesById() + { + $accountId = $this->query->input('account_id'); + $limit = $this->query->input('limit', 20); + $query = '%' . $this->query->input('q') . '%'; + $results = Status::where('caption', 'like', $query) + ->whereProfileId($accountId) + ->when($this->query->input('offset') != null, function($q, $offset) { + return $q->offset($offset); + }) + ->limit($limit) + ->get(); + + $fractal = new Fractal\Manager(); + $fractal->setSerializer(new ArraySerializer()); + $resource = new Fractal\Resource\Collection($results, new StatusTransformer()); + return $fractal->createData($resource)->toArray(); + } + +} \ No newline at end of file