GG.deals clone: CodeIgniter 4 + MongoDB game price tracker

- Full gg.deals-style UI: deal feed with filters, game pages with price
  history charts, rankings, vouchers, news, prepaids, subscriptions,
  bundles, franchises, wishlist, API docs
- Real data crawlers:
  * gg:crawl (Steam Store API + GOG Catalog + Epic free games)
  * gg:catalog (252K game slugs from gg.deals sitemaps)
  * gg:ggdeals (per-game prices via FlareSolverr session, JSON-LD parsing)
  * gg:seed / gg:crawl-covers (demo seed + Steam CDN cover art)
- 24/7 self-updating scheduler (scripts/scheduler_loop.php, lockfile-protected)
- Tailwind v4 dark/light theme, Alpine.js, Chart.js
This commit is contained in:
deepseek
2026-08-23 07:06:02 +00:00
commit fff7a4b9b9
146 changed files with 15691 additions and 0 deletions
+40
View File
@@ -0,0 +1,40 @@
<?php
declare(strict_types=1);
namespace App\Controllers;
use App\Models\GameModel;
use CodeIgniter\Controller;
class Wishlist extends Controller
{
public function index(): string
{
// wishlist slugs come from localStorage client-side; the page shows
// the JS-powered collection with an optional server fetch fallback.
$data = [
'pageTitle' => 'Wishlist — GG.deals',
];
return view('wishlist', $data);
}
/**
* JSON: fetch full game data for a list of slugs (used by the wishlist page).
*/
public function data(): \CodeIgniter\HTTP\ResponseInterface
{
$slugs = (array) service('request')->getGet('slugs');
$games = [];
foreach (array_unique(array_filter($slugs)) as $slug) {
$g = (new GameModel())->findBySlug($slug);
if ($g !== null) {
$games[] = $g;
}
}
return service('response')->setJSON($games);
}
}