Update (kernel): Auto submit index
This commit is contained in:
@@ -5,6 +5,8 @@
|
|||||||
use App\Jobs\BrowseDFSAndWriteWithAIJob;
|
use App\Jobs\BrowseDFSAndWriteWithAIJob;
|
||||||
use App\Jobs\BrowseRSSPostJob;
|
use App\Jobs\BrowseRSSPostJob;
|
||||||
use App\Jobs\PublishIndexPostJob;
|
use App\Jobs\PublishIndexPostJob;
|
||||||
|
use App\Jobs\PublishRssSearchResultJob;
|
||||||
|
use App\Models\HybridTopRssPostKeywords;
|
||||||
use App\Models\Post;
|
use App\Models\Post;
|
||||||
use Illuminate\Console\Scheduling\Schedule;
|
use Illuminate\Console\Scheduling\Schedule;
|
||||||
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
|
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
|
||||||
@@ -22,6 +24,17 @@ protected function schedule(Schedule $schedule): void
|
|||||||
BrowseRSSPostJob::dispatch(1)->onQueue('default')->onConnection('default');
|
BrowseRSSPostJob::dispatch(1)->onQueue('default')->onConnection('default');
|
||||||
})->hourly()->name('browse-rss-post-job-hourly');
|
})->hourly()->name('browse-rss-post-job-hourly');
|
||||||
|
|
||||||
|
$schedule->call(function () {
|
||||||
|
|
||||||
|
$top_rss_keywords = HybridTopRssPostKeywords::get(1, 20);
|
||||||
|
|
||||||
|
foreach ($top_rss_keywords as $rss_keyword)
|
||||||
|
{
|
||||||
|
PublishRssSearchResultJob::dispatch($rss_keyword->value_lowercased)->onQueue('default')->onConnection('default');
|
||||||
|
}
|
||||||
|
|
||||||
|
})->twiceDaily(0, 12)->name('top-rss-keywords-indexing-daily');
|
||||||
|
|
||||||
// $schedule->call(function () {
|
// $schedule->call(function () {
|
||||||
// BrowseDFSAndWriteWithAIJob::dispatch()->onQueue('default')->onConnection('default');
|
// BrowseDFSAndWriteWithAIJob::dispatch()->onQueue('default')->onConnection('default');
|
||||||
// })->everySixHours()->name('write-a-job-6hrs');
|
// })->everySixHours()->name('write-a-job-6hrs');
|
||||||
|
|||||||
@@ -5,6 +5,8 @@
|
|||||||
use App\Http\Controllers\Controller;
|
use App\Http\Controllers\Controller;
|
||||||
use App\Models\Post;
|
use App\Models\Post;
|
||||||
use App\Models\RssPost;
|
use App\Models\RssPost;
|
||||||
|
use App\Models\HybridTopRssPostKeywords;
|
||||||
|
|
||||||
use Artesaos\SEOTools\Facades\SEOMeta;
|
use Artesaos\SEOTools\Facades\SEOMeta;
|
||||||
use Artesaos\SEOTools\Facades\SEOTools;
|
use Artesaos\SEOTools\Facades\SEOTools;
|
||||||
use GrahamCampbell\Markdown\Facades\Markdown;
|
use GrahamCampbell\Markdown\Facades\Markdown;
|
||||||
@@ -25,9 +27,11 @@ public function home(Request $request)
|
|||||||
// $query->whereNotIn('id', $featured_posts->pluck('id')->toArray());
|
// $query->whereNotIn('id', $featured_posts->pluck('id')->toArray());
|
||||||
// })->where('status', 'publish')->where('published_at', '<=', now())->orderBy('published_at', 'desc')->limit(10)->get();
|
// })->where('status', 'publish')->where('published_at', '<=', now())->orderBy('published_at', 'desc')->limit(10)->get();
|
||||||
|
|
||||||
|
$top_rss_keywords = HybridTopRssPostKeywords::get(1, 10);
|
||||||
|
|
||||||
$rss_posts = RssPost::with('entities_keywords')->where('status', 'published')->orderBy('published_at', 'desc')->paginate(15);
|
$rss_posts = RssPost::with('entities_keywords')->where('status', 'published')->orderBy('published_at', 'desc')->paginate(15);
|
||||||
|
|
||||||
return response(view('front.welcome', compact('rss_posts')), 200);
|
return response(view('front.welcome', compact('rss_posts','top_rss_keywords')), 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function terms(Request $request)
|
public function terms(Request $request)
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ public function searchResults(Request $request, $query)
|
|||||||
$breadcrumbs = collect([
|
$breadcrumbs = collect([
|
||||||
['name' => 'Home', 'url' => route('front.home')],
|
['name' => 'Home', 'url' => route('front.home')],
|
||||||
['name' => 'News Bites', 'url' => route('front.all')],
|
['name' => 'News Bites', 'url' => route('front.all')],
|
||||||
['name' => $query, 'url' => null],
|
['name' => '#'.$query, 'url' => null],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$title = 'Latest News about '.ucwords($query).' in FutureWalker';
|
$title = 'Latest News about '.ucwords($query).' in FutureWalker';
|
||||||
|
|||||||
52
app/Jobs/PublishRssSearchResultJob.php
Normal file
52
app/Jobs/PublishRssSearchResultJob.php
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Jobs;
|
||||||
|
|
||||||
|
use App\Jobs\Tasks\PublishIndexPostTask;
|
||||||
|
use Illuminate\Bus\Queueable;
|
||||||
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||||
|
use Illuminate\Foundation\Bus\Dispatchable;
|
||||||
|
use Illuminate\Queue\InteractsWithQueue;
|
||||||
|
use Illuminate\Queue\SerializesModels;
|
||||||
|
|
||||||
|
use LaravelFreelancerNL\LaravelIndexNow\Facades\IndexNow;
|
||||||
|
use LaravelGoogleIndexing;
|
||||||
|
use Exception;
|
||||||
|
|
||||||
|
class PublishRssSearchResultJob implements ShouldQueue
|
||||||
|
{
|
||||||
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
||||||
|
|
||||||
|
protected $query;
|
||||||
|
|
||||||
|
public $timeout = 30;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new job instance.
|
||||||
|
*/
|
||||||
|
public function __construct(string $query)
|
||||||
|
{
|
||||||
|
$this->query = $query;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the job.
|
||||||
|
*/
|
||||||
|
public function handle(): void
|
||||||
|
{
|
||||||
|
if ((app()->environment() == 'production') && (config('platform.global.indexing'))) {
|
||||||
|
$url = get_route_search_result(strtolower($this->query));
|
||||||
|
|
||||||
|
try {
|
||||||
|
IndexNow::submit($url);
|
||||||
|
} catch (Exception) {
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
LaravelGoogleIndexing::create()->update($url);
|
||||||
|
} catch (Exception) {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
42
app/Models/HybridTopRssPostKeywords.php
Normal file
42
app/Models/HybridTopRssPostKeywords.php
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Facades\Cache;
|
||||||
|
|
||||||
|
class HybridTopRssPostKeywords extends Model
|
||||||
|
{
|
||||||
|
// Disable timestamps as this is not a table model
|
||||||
|
public $timestamps = false;
|
||||||
|
|
||||||
|
// Define fillable attributes
|
||||||
|
protected $fillable = ['value', 'value_lowercased', 'value_count'];
|
||||||
|
|
||||||
|
// Override the table and primary key as this is an abstract model
|
||||||
|
protected $table = null;
|
||||||
|
protected $primaryKey = null;
|
||||||
|
|
||||||
|
// Disable incrementing as this is an abstract model
|
||||||
|
public $incrementing = false;
|
||||||
|
|
||||||
|
// Static method to get top keywords
|
||||||
|
public static function get($days = 1, $limit = 10)
|
||||||
|
{
|
||||||
|
|
||||||
|
return Cache::remember('top_rss_post_keywords_by_day_'.$days.'_'.$limit, 180, function () use ($days, $limit) {
|
||||||
|
|
||||||
|
$queryResults = DB::table('rss_post_keywords')
|
||||||
|
->select('value', 'value_lowercased', DB::raw('COUNT(value_lowercased) as value_count'))
|
||||||
|
->where('created_at', '>=', now()->subDays($days))
|
||||||
|
->groupBy('value', 'value_lowercased')
|
||||||
|
->orderBy(DB::raw('COUNT(value_lowercased)'), 'desc')
|
||||||
|
->limit($limit)
|
||||||
|
->get();
|
||||||
|
|
||||||
|
return self::hydrate($queryResults->toArray());
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,9 +2,9 @@
|
|||||||
|
|
||||||
@foreach ($rss_posts as $key => $post)
|
@foreach ($rss_posts as $key => $post)
|
||||||
<div class="accordion-item">
|
<div class="accordion-item">
|
||||||
<h2 class="accordion-header" id="heading{{ $post->id }}">
|
<h2 class="accordion-header" id="heading{{ $key }}">
|
||||||
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
|
<button class="accordion-button collapsed" type="button" data-bs-toggle="collapse"
|
||||||
data-bs-target="#collapse{{ $post->id }}" aria-controls="collapse{{ $post->id }}">
|
data-bs-target="#collapse{{ $key }}" aria-controls="collapse{{ $key }}">
|
||||||
<div>
|
<div>
|
||||||
<h3 class="h6 mb-2 fw fw-semibold font-family-roboto-condensed">
|
<h3 class="h6 mb-2 fw fw-semibold font-family-roboto-condensed">
|
||||||
{{ $post->title }}
|
{{ $post->title }}
|
||||||
@@ -55,8 +55,8 @@ class="font-family-roboto-condensed mb-1 pb-1 d-inline badge bg-danger border-da
|
|||||||
</div>
|
</div>
|
||||||
</button>
|
</button>
|
||||||
</h2>
|
</h2>
|
||||||
<div id="collapse{{ $post->id }}" class="accordion-collapse collapse"
|
<div id="collapse{{ $key }}" class="accordion-collapse collapse"
|
||||||
aria-labelledby="heading{{ $post->id }}" data-bs-parent="#accordionTechBites">
|
aria-labelledby="heading{{ $key }}" data-bs-parent="#accordionTechBites">
|
||||||
<div class="accordion-body small">
|
<div class="accordion-body small">
|
||||||
<div class="fw-bold">The Bite:</div>
|
<div class="fw-bold">The Bite:</div>
|
||||||
<div class="mb-3">{{ $post->bites }}</div>
|
<div class="mb-3">{{ $post->bites }}</div>
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
<main>
|
<main>
|
||||||
<div class="w-full py-5 bg-hero">
|
<div class="w-full py-5 bg-hero">
|
||||||
<div class="container-lg">
|
<div class="container-lg">
|
||||||
<div class="text-center row justify-content-center">
|
<div class="text-center row justify-content-center mb-4">
|
||||||
<div class="col-12 col-md-10 col-lg-8">
|
<div class="col-12 col-md-10 col-lg-8">
|
||||||
<div class="display-6 fw-bold font-family-roboto-condensed mb-2">Your Future Depends<wbr> on Today's
|
<div class="display-6 fw-bold font-family-roboto-condensed mb-2">Your Future Depends<wbr> on Today's
|
||||||
News</div>
|
News</div>
|
||||||
@@ -11,10 +11,24 @@
|
|||||||
optional—it's critical for your future success. Stay updated with daily news 🍪 bites from
|
optional—it's critical for your future success. Stay updated with daily news 🍪 bites from
|
||||||
<strong>FutureWalker</strong>.
|
<strong>FutureWalker</strong>.
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<a href="#latest-news" class="btn btn-primary px-4 rounded-pill text-decoration-none">Start reading
|
<a href="#latest-news" class="btn btn-primary px-4 rounded-pill text-decoration-none">Start reading
|
||||||
now</a>
|
now</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="text-center row justify-content-center">
|
||||||
|
<div class="col-12 col-md-10 col-lg-6">
|
||||||
|
|
||||||
|
<h2 class="h4 fw-semibold mb-3">Monitoring top tags for the past 24 hours</h2>
|
||||||
|
|
||||||
|
@foreach ($top_rss_keywords as $rss_keyword)
|
||||||
|
<a href="{{ get_route_search_result($rss_keyword->value_lowercased) }}" class="mb-1 pb-1 badge text-bg-light border me-1 fw-bold shadow">
|
||||||
|
<span class="h6">#{{ $rss_keyword->value }}</span>
|
||||||
|
</a>
|
||||||
|
@endforeach
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -53,7 +67,7 @@ class="text-secondary">{{ $post->published_at->diffForHumans() }}</small>
|
|||||||
@endif --}}
|
@endif --}}
|
||||||
|
|
||||||
|
|
||||||
<div class="container-lg py-4">
|
<div id="latest-news" class="container-lg py-4">
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 col-lg-8 mb-3">
|
<div class="col-12 col-lg-8 mb-3">
|
||||||
@@ -61,7 +75,7 @@ class="text-secondary">{{ $post->published_at->diffForHumans() }}</small>
|
|||||||
@if ($rss_posts->count() > 0)
|
@if ($rss_posts->count() > 0)
|
||||||
<div class="text-start mb-3">
|
<div class="text-start mb-3">
|
||||||
<div class="d-flex">
|
<div class="d-flex">
|
||||||
<h2 id="latest-news" class="align-self-center fw-bold font-family-roboto-condensed mb-1 h2">
|
<h2 class="align-self-center fw-bold font-family-roboto-condensed mb-1 h2">
|
||||||
🍪 Tech Bites </h2>
|
🍪 Tech Bites </h2>
|
||||||
<div class="align-self-center">
|
<div class="align-self-center">
|
||||||
<span
|
<span
|
||||||
@@ -71,7 +85,10 @@ class="bi bi-clock-history me-1"></i> UPDATED HOURLY</span>
|
|||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<h5>1 minute news bites worth every second</h5>
|
<h5 class="h6">
|
||||||
|
Tap on <i class="bi bi-chevron-down"></i> to read the 1 minute news bite worth every second
|
||||||
|
</h5>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user