Files
sam-manage/app/Services/ClaudeCodeNewsService.php
김보곤 ab042cb132 feat: [claude-code] Claude Code 뉴스 페이지 추가
- GitHub Releases API 연동 서비스 (1시간 캐싱)
- 뉴스 컨트롤러 + Blade 뷰 (릴리즈 카드 목록)
- /claude-code/news 라우트 그룹 등록
2026-03-02 10:42:18 +09:00

75 lines
2.2 KiB
PHP

<?php
namespace App\Services;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Str;
class ClaudeCodeNewsService
{
private const CACHE_KEY = 'claude_code_releases';
private const CACHE_TTL = 3600; // 1시간
private const API_URL = 'https://api.github.com/repos/anthropics/claude-code/releases';
/**
* GitHub Releases 목록 조회 (캐싱)
*/
public function getReleases(int $perPage = 20): array
{
return Cache::remember(self::CACHE_KEY, self::CACHE_TTL, function () use ($perPage) {
return $this->fetchFromGitHub($perPage);
});
}
/**
* 캐시 클리어
*/
public function clearCache(): void
{
Cache::forget(self::CACHE_KEY);
}
/**
* GitHub API에서 릴리즈 정보 가져오기
*/
private function fetchFromGitHub(int $perPage): array
{
try {
$response = Http::withHeaders([
'Accept' => 'application/vnd.github.v3+json',
'User-Agent' => 'SAM-MNG-App',
])->timeout(10)->get(self::API_URL, [
'per_page' => $perPage,
]);
if (! $response->successful()) {
return [];
}
return collect($response->json())
->map(function ($release) {
return [
'id' => $release['id'],
'tag_name' => $release['tag_name'],
'name' => $release['name'] ?? $release['tag_name'],
'body_html' => Str::markdown($release['body'] ?? ''),
'published_at' => $release['published_at'],
'author' => $release['author']['login'] ?? 'unknown',
'author_avatar' => $release['author']['avatar_url'] ?? '',
'html_url' => $release['html_url'],
'prerelease' => $release['prerelease'] ?? false,
'draft' => $release['draft'] ?? false,
];
})
->toArray();
} catch (\Exception $e) {
report($e);
return [];
}
}
}