/home/techb158/workloadmatch.com/api/routes
Edit: /home/techb158/workloadmatch.com/api/routes/preferences.php (6487B)
prepare($sql);
if ($params) $stmt->bind_param($types, ...$params);
$stmt->execute();
$stmt->bind_result($total);
$stmt->fetch();
$stmt->close();
$sql = "SELECT tp.*, tr.First_Name, tr.Last_Name, c.Course_Name, c.Course_Code, p.Program_Name
FROM teacher_preferences tp
LEFT JOIN teacher_profile tr ON tr.Teacher_ID = tp.Teacher_ID
LEFT JOIN Courses c ON c.Course_ID = tp.Course_ID
LEFT JOIN Programs p ON p.Program_ID = tp.Program_ID
$whereClause
ORDER BY tp.Teacher_ID, tp.Preference_Order LIMIT ? OFFSET ?";
$stmt = $mysqli->prepare($sql);
$bindParams = array_merge($params, [$perPage, $offset]);
$bindTypes = $types . 'ii';
if ($bindParams) $stmt->bind_param($bindTypes, ...$bindParams);
$stmt->execute();
$result = $stmt->get_result();
$items = $result->fetch_all(MYSQLI_ASSOC);
$stmt->close();
Response::paginated($items, $total, $page, $perPage);
}
function getTeacherPreferences(string $teacherId, mysqli $mysqli): void
{
Auth::requireLogin();
// Teachers can only view their own preferences
$currentUserId = Auth::getUserId();
if (Auth::getUserType() === 'teacher_profile' && $currentUserId !== $teacherId) {
Response::forbidden('You can only view your own preferences');
}
$stmt = $mysqli->prepare("
SELECT tp.*, c.Course_Name, c.Course_Code, c.Course_Time, p.Program_Name
FROM teacher_preferences tp
LEFT JOIN Courses c ON c.Course_ID = tp.Course_ID
LEFT JOIN Programs p ON p.Program_ID = tp.Program_ID
WHERE tp.Teacher_ID = ?
ORDER BY tp.Program_ID, tp.Preference_Order
");
$stmt->bind_param('i', $teacherId);
$stmt->execute();
$result = $stmt->get_result();
$items = $result->fetch_all(MYSQLI_ASSOC);
$stmt->close();
// Group by program
$grouped = [];
foreach ($items as $item) {
$programId = $item['Program_ID'];
if (!isset($grouped[$programId])) {
$grouped[$programId] = [
'Program_ID' => $programId,
'Program_Name' => $item['Program_Name'],
'courses' => [],
];
}
$grouped[$programId]['courses'][] = $item;
}
Response::success([
'teacher_id' => $teacherId,
'preferences' => array_values($grouped),
]);
}
function savePreferences(?string $teacherId, ?array $body, mysqli $mysqli): void
{
$user = Auth::requireLogin();
// Teachers can only save their own preferences
if (Auth::getUserType() === 'teacher_profile') {
$teacherId = Auth::getUserId();
}
if (!$teacherId) Response::error('Teacher ID required');
if (!$body || !isset($body['courses']) || !is_array($body['courses'])) {
Response::validationError(['courses' => 'Array of course preferences required']);
}
$programId = $body['Program_ID'] ?? null;
$courses = $body['courses'];
// Delete existing preferences
$stmt = $mysqli->prepare("DELETE FROM teacher_preferences WHERE Teacher_ID = ?" . ($programId ? " AND Program_ID = ?" : ""));
if ($programId) {
$stmt->bind_param('ii', $teacherId, $programId);
} else {
$stmt->bind_param('i', $teacherId);
}
$stmt->execute();
$stmt->close();
// Insert new preferences
$inserted = 0;
foreach ($courses as $order => $pref) {
$courseId = $pref['Course_ID'] ?? $pref;
$prefProgramId = $pref['Program_ID'] ?? $programId;
$prefLevel = $pref['Preference_Level'] ?? $pref['level'] ?? null;
$prefOrder = $pref['Preference_Order'] ?? $pref['order'] ?? ($order + 1);
$stmt = $mysqli->prepare("INSERT INTO teacher_preferences (Teacher_ID, Course_ID, Program_ID, Preference_Level, Preference_Order) VALUES (?, ?, ?, ?, ?)");
$stmt->bind_param('iiisi', $teacherId, $courseId, $prefProgramId, $prefLevel, $prefOrder);
$stmt->execute();
$stmt->close();
$inserted++;
}
log_activity($mysqli, 'save', 'preferences', $teacherId, "Teacher $teacherId saved $inserted preferences", 'Preferences saved via API');
Response::success([
'teacher_id' => $teacherId,
'courses_saved' => $inserted,
], 'Preferences saved successfully');
}
function deletePreferences(?string $teacherId, mysqli $mysqli): void
{
Auth::requireAnyRole(['admin_profile', 'master_profile', 'manager_profile']);
if (!$teacherId) Response::error('Teacher ID required');
$programId = $_GET['program_id'] ?? null;
$stmt = $mysqli->prepare("DELETE FROM teacher_preferences WHERE Teacher_ID = ?" . ($programId ? " AND Program_ID = ?" : ""));
if ($programId) {
$stmt->bind_param('ii', $teacherId, $programId);
} else {
$stmt->bind_param('i', $teacherId);
}
$stmt->execute();
$deleted = $mysqli->affected_rows;
$stmt->close();
log_activity($mysqli, 'delete', 'preferences', $teacherId, "Deleted $deleted preferences", 'Preferences deleted via API');
Response::success(null, "Deleted $deleted preference(s)");
}