MIF_E31230356/app/Http/Controllers/Siswa/LeaderboardController.php

75 lines
2.4 KiB
PHP

<?php
namespace App\Http\Controllers\Siswa;
use App\Http\Controllers\Controller;
use App\Models\Leaderboard;
use App\Services\BadgeService;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Carbon\Carbon;
class LeaderboardController extends Controller
{
private function getData()
{
$siswa = Auth::guard('siswa')->user();
$now = Carbon::now();
$semester = $now->month >= 7 ? '1' : '2';
$tahunAjaran = $now->month >= 7
? $now->year . '/' . ($now->year + 1)
: ($now->year - 1) . '/' . $now->year;
$leaderboard = Leaderboard::with('siswa')
->where('id_kelas', $siswa->id_kelas)
->where('semester', $semester)
->where('tahun_ajaran', $tahunAjaran)
->orderBy('total_exp', 'desc')
->get()
->map(function ($item, $i) {
$fotoProfil = optional($item->siswa)->foto_profil;
return [
'ranking' => $i + 1,
'nama' => optional($item->siswa)->nama ?? '-',
'nisn' => optional($item->siswa)->nisn ?? '-',
'exp' => $item->total_exp,
'id_siswa' => $item->id_siswa,
'foto_profil' => $fotoProfil,
'foto_url' => $fotoProfil ? Storage::url($fotoProfil) : null,
];
});
$myRank = $leaderboard->firstWhere('id_siswa', $siswa->id_siswa);
return compact('leaderboard', 'myRank', 'semester', 'tahunAjaran', 'siswa');
}
public function index()
{
$data = $this->getData();
// Keluarkan 'siswa' dari data yang dikirim ke view (tidak dibutuhkan di view)
unset($data['siswa']);
return view('siswa.leaderboard.index', $data);
}
/**
* Endpoint JSON untuk polling real-time.
* Setiap kali dipanggil, badge leaderboard siswa yang sedang login
* dievaluasi ulang (diberikan atau dicabut sesuai ranking saat ini).
*/
public function json()
{
$data = $this->getData();
$siswa = $data['siswa'];
// Evaluasi badge leaderboard secara real-time untuk siswa yang sedang login
app(BadgeService::class)->checkLeaderboardBadges(
$siswa->id_siswa,
$siswa->id_kelas
);
unset($data['siswa']);
return response()->json($data);
}
}