127 lines
4.0 KiB
PHP
127 lines
4.0 KiB
PHP
<?php
|
|
|
|
namespace App\Jobs;
|
|
|
|
use Carbon\Carbon;
|
|
use Illuminate\Bus\Queueable;
|
|
use Illuminate\Contracts\Queue\ShouldBeEncrypted;
|
|
use Illuminate\Contracts\Queue\ShouldQueue;
|
|
use Illuminate\Foundation\Bus\Dispatchable;
|
|
use Illuminate\Queue\InteractsWithQueue;
|
|
use Illuminate\Queue\SerializesModels;
|
|
use Illuminate\Support\Facades\File;
|
|
use Illuminate\Support\Facades\Http;
|
|
use Illuminate\Support\Facades\Log;
|
|
|
|
class PullChangelog implements ShouldBeEncrypted, ShouldQueue
|
|
{
|
|
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
|
|
|
|
public $timeout = 30;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->onQueue('high');
|
|
}
|
|
|
|
public function handle(): void
|
|
{
|
|
try {
|
|
// Fetch from CDN instead of GitHub API to avoid rate limits
|
|
$cdnUrl = config('constants.coolify.releases_url');
|
|
|
|
$response = Http::retry(3, 1000)
|
|
->timeout(30)
|
|
->get($cdnUrl);
|
|
|
|
if ($response->successful()) {
|
|
$releases = $response->json();
|
|
|
|
// Limit to 10 releases for processing (same as before)
|
|
$releases = array_slice($releases, 0, 10);
|
|
|
|
$changelog = $this->transformReleasesToChangelog($releases);
|
|
|
|
// Group entries by month and save them
|
|
$this->saveChangelogEntries($changelog);
|
|
} else {
|
|
// Log error instead of sending notification
|
|
Log::error('PullChangelogFromGitHub: Failed to fetch from CDN', [
|
|
'status' => $response->status(),
|
|
'url' => $cdnUrl,
|
|
]);
|
|
}
|
|
} catch (\Throwable $e) {
|
|
// Log error instead of sending notification
|
|
Log::error('PullChangelogFromGitHub: Exception occurred', [
|
|
'message' => $e->getMessage(),
|
|
'trace' => $e->getTraceAsString(),
|
|
]);
|
|
}
|
|
}
|
|
|
|
private function transformReleasesToChangelog(array $releases): array
|
|
{
|
|
$entries = [];
|
|
|
|
foreach ($releases as $release) {
|
|
// Skip drafts and pre-releases if desired
|
|
if ($release['draft']) {
|
|
continue;
|
|
}
|
|
|
|
$publishedAt = Carbon::parse($release['published_at']);
|
|
|
|
$entry = [
|
|
'tag_name' => $release['tag_name'],
|
|
'title' => $release['name'] ?: $release['tag_name'],
|
|
'content' => $release['body'] ?: 'No release notes available.',
|
|
'published_at' => $publishedAt->toISOString(),
|
|
];
|
|
|
|
$entries[] = $entry;
|
|
}
|
|
|
|
return $entries;
|
|
}
|
|
|
|
private function saveChangelogEntries(array $entries): void
|
|
{
|
|
// Create changelogs directory if it doesn't exist
|
|
$changelogsDir = base_path('changelogs');
|
|
if (! File::exists($changelogsDir)) {
|
|
File::makeDirectory($changelogsDir, 0755, true);
|
|
}
|
|
|
|
// Group entries by year-month
|
|
$groupedEntries = [];
|
|
foreach ($entries as $entry) {
|
|
$date = Carbon::parse($entry['published_at']);
|
|
$monthKey = $date->format('Y-m');
|
|
|
|
if (! isset($groupedEntries[$monthKey])) {
|
|
$groupedEntries[$monthKey] = [];
|
|
}
|
|
|
|
$groupedEntries[$monthKey][] = $entry;
|
|
}
|
|
|
|
// Save each month's entries to separate files
|
|
foreach ($groupedEntries as $month => $monthEntries) {
|
|
// Sort entries by published date (newest first)
|
|
usort($monthEntries, function ($a, $b) {
|
|
return Carbon::parse($b['published_at'])->timestamp - Carbon::parse($a['published_at'])->timestamp;
|
|
});
|
|
|
|
$monthData = [
|
|
'entries' => $monthEntries,
|
|
'last_updated' => now()->toISOString(),
|
|
];
|
|
|
|
$filePath = base_path("changelogs/{$month}.json");
|
|
File::put($filePath, json_encode($monthData, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
|
|
}
|
|
|
|
}
|
|
}
|