This commit is contained in:
Doar Mihai
2026-05-30 18:56:17 +03:00
parent 17a2211952
commit afc49488a9
5 changed files with 93 additions and 33 deletions
+23 -9
View File
@@ -12,22 +12,36 @@ use Illuminate\Console\Command;
class ImportGamesCommand extends Command
{
protected $signature = 'games:import {--limit=100} {--offset=0} {--popular} {--new}';
protected $signature = 'games:import {--limit=100} {--offset=0} {--popular} {--new} {--year=} {--platform=}';
protected $description = 'Import games from IGDB into the local database';
public function handle(IgdbService $igdb): int
{
$limit = (int) $this->option('limit');
$offset = (int) $this->option('offset');
$limit = (int) $this->option('limit');
$offset = (int) $this->option('offset');
$year = $this->option('year') ? (int) $this->option('year') : null;
$platform = $this->option('platform') ? (int) $this->option('platform') : null;
$this->info("Fetching {$limit} games from IGDB (offset: {$offset})…");
if ($year && $platform) {
$this->error('Use --year or --platform, not both.');
return self::FAILURE;
}
$label = match (true) {
$year !== null => "year {$year}",
$platform !== null => "platform IGDB ID {$platform}",
$this->option('new') => 'new releases',
default => "popular (offset: {$offset})",
};
$this->info("Fetching {$limit} games from IGDB ({$label})…");
try {
if ($this->option('new')) {
$results = $igdb->getNewReleases($limit);
} else {
$results = $igdb->getPopularGames($limit, $offset);
}
$results = match (true) {
$year !== null => $igdb->getGamesByYear($year, $limit, $offset),
$platform !== null => $igdb->getGamesByPlatform($platform, $limit, $offset),
$this->option('new') => $igdb->getNewReleases($limit),
default => $igdb->getPopularGames($limit, $offset),
};
} catch (\Exception $e) {
$this->error('IGDB request failed: ' . $e->getMessage());
return self::FAILURE;
+1 -1
View File
@@ -52,7 +52,7 @@ class GameController extends Controller
if (auth()->check()) {
$userGame = $game->userGames()->where('user_id', auth()->id())->first();
$userReview = $game->reviews()->where('user_id', auth()->id())->first();
$userLists = auth()->user()->lists()->get(['id', 'title']);
$userLists = auth()->user()->lists()->get(['id', 'slug', 'title']);
}
$comments = $game->comments()->whereNull('parent_id')
+45
View File
@@ -139,6 +139,51 @@ class IgdbService
");
}
/**
* Get games released in a given year.
*/
public function getGamesByYear(int $year, int $limit = 20, int $offset = 0): array
{
$from = mktime(0, 0, 0, 1, 1, $year);
$to = mktime(23, 59, 59, 12, 31, $year);
return $this->query('games', "
fields id,name,slug,summary,cover.image_id,first_release_date,
genres.id,genres.name,genres.slug,
platforms.id,platforms.name,platforms.slug,platforms.abbreviation,
involved_companies.company.id,involved_companies.company.name,
involved_companies.company.slug,involved_companies.developer,
involved_companies.publisher,
screenshots.image_id,
rating,rating_count;
where first_release_date >= {$from} & first_release_date <= {$to} & cover != null;
sort rating_count desc;
limit {$limit};
offset {$offset};
");
}
/**
* Get games for a given platform IGDB ID.
*/
public function getGamesByPlatform(int $platformIgdbId, int $limit = 20, int $offset = 0): array
{
return $this->query('games', "
fields id,name,slug,summary,cover.image_id,first_release_date,
genres.id,genres.name,genres.slug,
platforms.id,platforms.name,platforms.slug,platforms.abbreviation,
involved_companies.company.id,involved_companies.company.name,
involved_companies.company.slug,involved_companies.developer,
involved_companies.publisher,
screenshots.image_id,
rating,rating_count;
where platforms = [{$platformIgdbId}] & cover != null & rating != null;
sort rating_count desc;
limit {$limit};
offset {$offset};
");
}
/**
* Get games by genre.
*/