68 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Http\Controllers;
 | 
						|
 | 
						|
use App\Ejaculation;
 | 
						|
use App\Tag;
 | 
						|
use App\Utilities\Formatter;
 | 
						|
use Illuminate\Http\Request;
 | 
						|
use Illuminate\Support\Facades\Auth;
 | 
						|
 | 
						|
class SearchController extends Controller
 | 
						|
{
 | 
						|
    /** @var Formatter */
 | 
						|
    private $formatter;
 | 
						|
 | 
						|
    public function __construct(Formatter $formatter)
 | 
						|
    {
 | 
						|
        $this->formatter = $formatter;
 | 
						|
    }
 | 
						|
 | 
						|
    public function index(Request $request)
 | 
						|
    {
 | 
						|
        $inputs = $request->validate([
 | 
						|
            'q' => 'required'
 | 
						|
        ]);
 | 
						|
 | 
						|
        $q = $this->normalizeQuery($inputs['q']);
 | 
						|
        $results = Ejaculation::query()
 | 
						|
            ->whereHas('tags', function ($query) use ($q) {
 | 
						|
                $query->where('normalized_name', 'like', "%{$q}%");
 | 
						|
            })
 | 
						|
            ->whereHas('user', function ($query) {
 | 
						|
                $query->where('is_protected', false);
 | 
						|
                if (Auth::check()) {
 | 
						|
                    $query->orWhere('id', Auth::id());
 | 
						|
                }
 | 
						|
            })
 | 
						|
            ->where('is_private', false)
 | 
						|
            ->orderBy('ejaculated_date', 'desc')
 | 
						|
            ->with(['user', 'tags'])
 | 
						|
            ->withLikes()
 | 
						|
            ->paginate(20)
 | 
						|
            ->appends($inputs);
 | 
						|
 | 
						|
        return view('search.index')->with(compact('inputs', 'results'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function relatedTag(Request $request)
 | 
						|
    {
 | 
						|
        $inputs = $request->validate([
 | 
						|
            'q' => 'required'
 | 
						|
        ]);
 | 
						|
 | 
						|
        $q = $this->normalizeQuery($inputs['q']);
 | 
						|
        $results = Tag::query()
 | 
						|
            ->where('normalized_name', 'like', "%{$q}%")
 | 
						|
            ->paginate(50)
 | 
						|
            ->appends($inputs);
 | 
						|
 | 
						|
        return view('search.relatedTag')->with(compact('inputs', 'results'));
 | 
						|
    }
 | 
						|
 | 
						|
    private function normalizeQuery(string $query): string
 | 
						|
    {
 | 
						|
        return $this->formatter->normalizeTagName($query);
 | 
						|
    }
 | 
						|
}
 |