One Hat Cyber Team
Your IP :
104.23.197.102
Server IP :
172.67.218.182
Server :
Linux 128-201-239-36.cprapid.com 3.10.0-1160.41.1.el7.x86_64 #1 SMP Tue Aug 31 14:52:47 UTC 2021 x86_64
Server Software :
Apache
PHP Version :
7.4.33
Buat File
|
Buat Folder
Eksekusi
Dir :
~
/
home
/
juscatamarca
/
public_html
/
campusjxj
/
helpers
/
View File Name :
admin_classes.php
<?php declare(strict_types=1); require_once ROOT_PATH . '/config/database.php'; /** * Return course options for class creation/editing. * Excludes archived courses. * * @return array<int, array<string, mixed>> */ function get_course_options(): array { $sql = " SELECT c.id, c.title, c.status, gd.name AS geographic_department_name FROM courses c LEFT JOIN geographic_departments gd ON gd.id = c.geographic_department_id WHERE c.status <> 'archived' ORDER BY c.title ASC "; return db_fetch_all($sql); } /** * List classes with course and department context. * * @return array<int, array<string, mixed>> */ function get_admin_classes(?string $search = null, ?string $status = null): array { $conditions = ['1=1']; $params = []; if ($search !== null && trim($search) !== '') { $conditions[] = '(cl.title LIKE :search OR co.title LIKE :search OR gd.name LIKE :search)'; $params[':search'] = '%' . trim($search) . '%'; } if ($status !== null && in_array($status, ['draft', 'published', 'hidden'], true)) { $conditions[] = 'cl.status = :status'; $params[':status'] = $status; } $sql = " SELECT cl.id, cl.course_id, cl.title, cl.description, cl.class_order, cl.scheduled_at, cl.class_view_url, cl.status, cl.created_at, co.title AS course_title, gd.name AS geographic_department_name FROM classes cl INNER JOIN courses co ON co.id = cl.course_id LEFT JOIN geographic_departments gd ON gd.id = co.geographic_department_id WHERE " . implode(' AND ', $conditions) . " ORDER BY CASE cl.status WHEN 'published' THEN 0 WHEN 'draft' THEN 1 ELSE 2 END ASC, co.title ASC, cl.class_order ASC "; return db_fetch_all($sql, $params); } /** * Fetch one class by id with contextual names. * * @return array<string, mixed>|null */ function get_admin_class_by_id(int $id): ?array { $sql = " SELECT cl.id, cl.course_id, cl.title, cl.description, cl.class_order, cl.scheduled_at, cl.class_view_url, cl.status, co.title AS course_title, gd.name AS geographic_department_name FROM classes cl INNER JOIN courses co ON co.id = cl.course_id LEFT JOIN geographic_departments gd ON gd.id = co.geographic_department_id WHERE cl.id = :id LIMIT 1 "; return db_fetch_one($sql, [':id' => $id]); } function admin_course_exists(int $courseId): bool { $sql = 'SELECT id FROM courses WHERE id = :id AND status <> :archived LIMIT 1'; $row = db_fetch_one($sql, [ ':id' => $courseId, ':archived' => 'archived', ]); return $row !== null; } function create_admin_class(array $data): bool { $sql = " INSERT INTO classes ( course_id, title, description, class_order, scheduled_at, class_view_url, status ) VALUES ( :course_id, :title, :description, :class_order, :scheduled_at, :class_view_url, :status ) "; return db_execute($sql, [ ':course_id' => (int) $data['course_id'], ':title' => (string) $data['title'], ':description' => $data['description'] !== '' ? (string) $data['description'] : null, ':class_order' => (int) $data['class_order'], ':scheduled_at' => $data['scheduled_at'] !== '' ? (string) $data['scheduled_at'] : null, ':class_view_url' => $data['class_view_url'] !== '' ? (string) $data['class_view_url'] : null, ':status' => (string) $data['status'], ]); } function update_admin_class(int $id, array $data): bool { $sql = " UPDATE classes SET course_id = :course_id, title = :title, description = :description, class_order = :class_order, scheduled_at = :scheduled_at, class_view_url = :class_view_url, status = :status, updated_at = NOW() WHERE id = :id "; return db_execute($sql, [ ':id' => $id, ':course_id' => (int) $data['course_id'], ':title' => (string) $data['title'], ':description' => $data['description'] !== '' ? (string) $data['description'] : null, ':class_order' => (int) $data['class_order'], ':scheduled_at' => $data['scheduled_at'] !== '' ? (string) $data['scheduled_at'] : null, ':class_view_url' => $data['class_view_url'] !== '' ? (string) $data['class_view_url'] : null, ':status' => (string) $data['status'], ]); } /** * @return array{class: string, label: string} */ function admin_class_status_badge(string $status): array { switch ($status) { case 'published': return ['class' => 'text-bg-success', 'label' => 'Publicado']; case 'draft': return ['class' => 'text-bg-secondary', 'label' => 'Borrador']; case 'hidden': return ['class' => 'text-bg-dark', 'label' => 'Oculto']; default: return ['class' => 'text-bg-light', 'label' => ucfirst($status)]; } } function format_datetime_local(?string $value): string { if ($value === null || trim($value) === '') { return ''; } $ts = strtotime($value); if ($ts === false) { return ''; } return date('Y-m-d\TH:i', $ts); } function parse_datetime_local(?string $value): string { $value = trim((string) $value); if ($value === '') { return ''; } $dt = DateTime::createFromFormat('Y-m-d\TH:i', $value); if ($dt === false) { return ''; } return $dt->format('Y-m-d H:i:s'); } function delete_admin_class(int $id): bool { $sql = 'DELETE FROM classes WHERE id = :id'; return db_execute($sql, [':id' => $id]); }