View file app/Controllers/TagController.php

File size: 2.17Kb
<?php

declare(strict_types=1);

namespace App\Controllers;

use App\Models\Tag;
use App\Repositories\StoryRepository;
use App\Repositories\TagRepository;
use App\Services\TagCloud;
use App\Services\View;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;

/**
 * FavoriteController
 */
class TagController extends Controller
{
    public function __construct(
        protected View $view,
        protected TagRepository $tagRepository,
        protected StoryRepository $storyRepository,
    ) {}

    /**
     * Tags
     *
     * @param Response $response
     * @param TagCloud $tagCloud
     *
     * @return Response
     */
    public function index(Response $response, TagCloud $tagCloud): Response
    {
        $tags = $this->tagRepository->getPopularTags(100);

        $tags = $tagCloud->generate($tags);

        return $this->view->render(
            $response,
            'tags/tags',
            compact('tags')
        );
    }

    /**
     * By tags
     *
     * @param string   $tag
     * @param Response $response
     *
     * @return Response
     */
    public function search(string $tag, Response $response): Response
    {
        $tag = urldecode(escape($tag));

        $stories = $this->storyRepository->getStoriesByTag($tag, setting('story.per_page'));

        return $this->view->render(
            $response,
            'tags/index',
            compact('stories', 'tag')
        );
    }

    /**
     * Search by tag
     *
     * @param Request  $request
     * @param Response $response
     *
     * @return Response
     */
    public function tag(Request $request, Response $response): Response
    {
        $query  = $request->getQueryParams();
        $search = urldecode(escape($query['query'] ?? ''));

        if (! $search) {
            return $this->json($response, []);
        }

        $tags = Tag::query()->where('tag', 'like', $search . '%')->limit(10)->get();
        $tags = array_unique($tags->pluck('tag'));

        $namedTags = [];
        foreach ($tags as $tag) {
            $namedTags[] = ['value' => $tag, 'label' => $tag];
        }

        return $this->json($response, $namedTags);
    }
}