Files
alrahma_sunday_school_api/app/Services/PublicWinners/PublicWinnersPortalService.php
T
2026-06-11 11:46:12 -04:00

117 lines
3.6 KiB
PHP

<?php
namespace App\Services\PublicWinners;
use App\Controllers\WinnersController;
use App\Models\ClassSection;
use App\Models\Competition;
use Carbon\CarbonInterface;
use Illuminate\Support\Facades\DB;
/**
* legacy {@see WinnersController} — public published winners pages.
*/
class PublicWinnersPortalService
{
/**
* @return list<array<string, mixed>>
*/
public function publishedCompetitions(): array
{
return Competition::query()
->where('is_published', 1)
->orderByDesc('published_at')
->get()
->map(fn (Competition $c) => $this->normalizeCompetition($c))
->values()
->all();
}
/**
* @return array{
* competition: array<string, mixed>,
* winners_by_class: array<int|string, list<array<string, mixed>>>,
* section_map: array<int, string>,
* question_counts: array<int, int>
* }|null
*/
public function competitionPayload(int $id): ?array
{
$competition = Competition::query()
->where('is_published', 1)
->find($id);
if (! $competition) {
return null;
}
$winnerRows = DB::table('competition_winners as cw')
->select('cw.*', 's.firstname', 's.lastname', 'cs.class_section_name')
->leftJoin('students as s', 's.id', '=', 'cw.student_id')
->leftJoin('classSection as cs', 'cs.class_section_id', '=', 'cw.class_section_id')
->where('cw.competition_id', $id)
->orderBy('cw.class_section_id', 'ASC')
->orderBy('cw.rank', 'ASC')
->get();
$sectionMap = [];
foreach (
ClassSection::query()
->select(['class_section_id', 'class_section_name'])
->get() as $section
) {
$sid = (int) ($section->class_section_id ?? 0);
if ($sid > 0) {
$sectionMap[$sid] = (string) ($section->class_section_name ?? (string) $sid);
}
}
$winnersByClass = [];
foreach ($winnerRows as $row) {
$arr = (array) $row;
$classId = (int) ($arr['class_section_id'] ?? 0);
$fname = (string) ($arr['firstname'] ?? '');
$lname = (string) ($arr['lastname'] ?? '');
$name = trim($fname.' '.$lname);
$arr['name'] = $name !== '' ? $name : ('Student #'.($arr['student_id'] ?? ''));
$winnersByClass[$classId][] = $arr;
}
$questionCounts = [];
$qRows = DB::table('competition_class_winners')
->select(['class_section_id', 'question_count'])
->where('competition_id', $id)
->get();
foreach ($qRows as $row) {
$arr = (array) $row;
$classId = (int) ($arr['class_section_id'] ?? 0);
if ($classId > 0 && isset($arr['question_count']) && $arr['question_count'] !== null) {
$questionCounts[$classId] = (int) $arr['question_count'];
}
}
return [
'competition' => $this->normalizeCompetition($competition),
'winners_by_class' => $winnersByClass,
'section_map' => $sectionMap,
'question_counts' => $questionCounts,
];
}
/**
* @return array<string, mixed>
*/
private function normalizeCompetition(Competition $c): array
{
$arr = $c->toArray();
foreach ($arr as $key => $value) {
if ($value instanceof CarbonInterface) {
$arr[$key] = $value->format('Y-m-d H:i:s');
}
}
return $arr;
}
}