Sync
This commit is contained in:
@@ -3,7 +3,9 @@
|
||||
namespace App\Http\Controllers\Front;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\AiTool;
|
||||
use App\Models\Category;
|
||||
use Artesaos\SEOTools\Facades\SEOMeta;
|
||||
use Artesaos\SEOTools\Facades\SEOTools;
|
||||
use Illuminate\Http\Request;
|
||||
use JsonLd\Context;
|
||||
@@ -36,7 +38,7 @@ public function discover(Request $request, $category_slug = null)
|
||||
SEOTools::opengraph();
|
||||
SEOTools::jsonLd();
|
||||
SEOTools::setTitle($category->name.' AI Tools', false);
|
||||
//SEOTools::setDescription($description);
|
||||
//SEOTools::setDescription($description);
|
||||
} else {
|
||||
$breadcrumbs = collect([
|
||||
['name' => 'Home', 'url' => route('front.home')],
|
||||
@@ -65,6 +67,15 @@ public function discover(Request $request, $category_slug = null)
|
||||
'itemListElement' => $listItems,
|
||||
]);
|
||||
|
||||
return view('front.discover', compact('breadcrumbs', 'breadcrumb_context', 'category'));
|
||||
$ai_tools = AiTool::when(! is_null($category), function ($query) use ($category) {
|
||||
$query->where('category_id', $category->id);
|
||||
})
|
||||
->orderBy('updated_at', 'DESC')->paginate(6);
|
||||
|
||||
if ($ai_tools->count() <= 0) {
|
||||
SEOMeta::setRobots('noindex');
|
||||
}
|
||||
|
||||
return view('front.discover', compact('breadcrumbs', 'breadcrumb_context', 'category', 'ai_tools'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Http\Controllers\Front;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\AiTool;
|
||||
use Artesaos\SEOTools\Facades\SEOMeta;
|
||||
use Artesaos\SEOTools\Facades\SEOTools;
|
||||
use GrahamCampbell\Markdown\Facades\Markdown;
|
||||
@@ -12,7 +13,9 @@ class FrontHomeController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
return view('front.home');
|
||||
$latest_ai_tools = AiTool::orderBy('created_at', 'DESC')->take(12)->get();
|
||||
|
||||
return view('front.home', compact('latest_ai_tools'));
|
||||
}
|
||||
|
||||
public function terms(Request $request)
|
||||
|
||||
@@ -2,9 +2,107 @@
|
||||
|
||||
namespace App\Http\Controllers\Front;
|
||||
|
||||
use App\Helpers\FirstParty\Aictio\Aictio;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\SearchEmbedding;
|
||||
use App\Models\SearchResult;
|
||||
use Artesaos\SEOTools\Facades\SEOTools;
|
||||
use Illuminate\Http\Request;
|
||||
use JsonLd\Context;
|
||||
|
||||
class FrontSearchController extends Controller
|
||||
{
|
||||
//
|
||||
public function search(Request $request)
|
||||
{
|
||||
if (is_empty($request->input('query'))) {
|
||||
return redirect()->back();
|
||||
}
|
||||
|
||||
return redirect()->to(get_route_search_result($request->input('query')));
|
||||
}
|
||||
|
||||
public function searchResult(Request $request, $query)
|
||||
{
|
||||
if ($request->input('page') > 10) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
if (is_empty(trim($query))) {
|
||||
return abort(404);
|
||||
}
|
||||
|
||||
$query = trim($query);
|
||||
|
||||
$pagination_results = 10;
|
||||
|
||||
$search_result = SearchResult::where('query', $query)
|
||||
->orderBy('id', 'desc')
|
||||
->first();
|
||||
|
||||
$embedding = null;
|
||||
|
||||
if (! is_null($search_result) && ! is_null($search_result->embedding)) {
|
||||
$embedding = $search_result->embedding;
|
||||
$search_result->increment('counts');
|
||||
} else {
|
||||
$embedding = Aictio::getVectorEmbedding($query);
|
||||
|
||||
$search_result = new SearchResult;
|
||||
$search_result->query = $query;
|
||||
$search_result->counts = 1;
|
||||
$search_result->embedding = $embedding;
|
||||
|
||||
if ($search_result->save()) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
$results = SearchEmbedding::query()
|
||||
->with('ai_tool')
|
||||
->selectRaw('DISTINCT ON (ai_tool_id) ai_tool_id, embedding <-> ? AS distance', [$embedding])
|
||||
->orderBy('ai_tool_id')
|
||||
->orderByRaw('embedding <-> ? ASC', [$embedding])
|
||||
->whereRaw('embedding <-> ? < 0.65', [$embedding])
|
||||
->where('ai_tool_id', '!=', null)
|
||||
->paginate($pagination_results);
|
||||
|
||||
//dd($results->toArray());
|
||||
|
||||
if ($results->total() < $pagination_results) {
|
||||
// TODO: Signal Serp Crawling Engine
|
||||
}
|
||||
|
||||
$query = strtolower(urldecode($query));
|
||||
|
||||
session()->put('query', $query);
|
||||
|
||||
SEOTools::metatags();
|
||||
SEOTools::twitter();
|
||||
SEOTools::opengraph();
|
||||
SEOTools::jsonLd();
|
||||
SEOTools::setTitle(ucwords($query).' AI Tool');
|
||||
|
||||
$breadcrumbs = collect([
|
||||
['name' => 'Home', 'url' => route('front.home')],
|
||||
['name' => 'AI Tool Search', 'url' => null],
|
||||
['name' => ucwords($query), 'url' => null],
|
||||
]);
|
||||
|
||||
// breadcrumb json ld
|
||||
$listItems = [];
|
||||
|
||||
foreach ($breadcrumbs as $index => $breadcrumb) {
|
||||
$listItems[] = [
|
||||
'name' => $breadcrumb['name'],
|
||||
'url' => $breadcrumb['url'],
|
||||
];
|
||||
}
|
||||
|
||||
$breadcrumb_context = Context::create('breadcrumb_list', [
|
||||
'itemListElement' => $listItems,
|
||||
]);
|
||||
|
||||
return view('front.search_results', compact('results', 'query', 'breadcrumbs', 'breadcrumb_context'));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
81
app/Http/Controllers/Front/FrontToolController.php
Normal file
81
app/Http/Controllers/Front/FrontToolController.php
Normal file
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Front;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\JsonLd\FAQPage;
|
||||
use App\Models\AiTool;
|
||||
use Illuminate\Http\Request;
|
||||
use JsonLd\Context;
|
||||
use Artesaos\SEOTools\Facades\SEOTools;
|
||||
|
||||
class FrontToolController extends Controller
|
||||
{
|
||||
public function show(Request $request, $ai_tool_slug)
|
||||
{
|
||||
$ai_tool = AiTool::where('slug', $ai_tool_slug)->first();
|
||||
|
||||
if (is_null($ai_tool)) {
|
||||
return abort(404);
|
||||
}
|
||||
|
||||
$ai_tool->load('category');
|
||||
|
||||
$breadcrumbs = collect([
|
||||
['name' => 'Home', 'url' => route('front.home')],
|
||||
['name' => 'AI Tools', 'url' => route('front.discover.home')],
|
||||
['name' => $ai_tool->category->name, 'url' => route('front.discover.category', ['category_slug' => $ai_tool->category->slug])],
|
||||
['name' => $ai_tool->tool_name, 'url' => null],
|
||||
]);
|
||||
|
||||
// breadcrumb json ld
|
||||
$listItems = [];
|
||||
|
||||
foreach ($breadcrumbs as $index => $breadcrumb) {
|
||||
$listItems[] = [
|
||||
'name' => $breadcrumb['name'],
|
||||
'url' => $breadcrumb['url'],
|
||||
];
|
||||
}
|
||||
|
||||
$breadcrumb_context = Context::create('breadcrumb_list', [
|
||||
'itemListElement' => $listItems,
|
||||
]);
|
||||
|
||||
$applicationCategory = '';
|
||||
|
||||
if ($ai_tool->is_app_web_both == 'both') {
|
||||
$applicationCategory = 'App & Web Application';
|
||||
} else {
|
||||
$applicationCategory = ucwords($ai_tool->is_app_web_both).' Application';
|
||||
}
|
||||
|
||||
$qnaMainEntity = [];
|
||||
|
||||
foreach ($ai_tool->qna as $qna) {
|
||||
$qnaMainEntity[] = [
|
||||
'@type' => 'Question',
|
||||
'name' => $qna->q,
|
||||
'acceptedAnswer' => [
|
||||
'@type' => 'Answer',
|
||||
'text' => $qna->a,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
$faqData = [
|
||||
'mainEntity' => $qnaMainEntity,
|
||||
];
|
||||
|
||||
$faq_context = Context::create(FAQPage::class, $faqData);
|
||||
|
||||
SEOTools::metatags();
|
||||
SEOTools::twitter()->addImage($ai_tool->screenshot_img);
|
||||
SEOTools::opengraph()->addImage($ai_tool->screenshot_img);
|
||||
SEOTools::jsonLd()->addImage($ai_tool->screenshot_img);
|
||||
|
||||
//dd($faq_context);
|
||||
|
||||
return view('front.aitool', compact('ai_tool', 'breadcrumb_context', 'breadcrumbs', 'faq_context'));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user