DiploMaster/api/alumnos.php

165 lines
6.1 KiB
PHP

<?php
header('Content-Type: application/json');
require '../includes/config.php';
if (!is_logged_in()) {
http_response_code(401);
echo json_encode(['success' => false, 'error' => 'No autenticado']);
exit;
}
$method = $_SERVER['REQUEST_METHOD'];
try {
switch ($method) {
case 'GET':
// Obtener todos los alumnos
$query = "SELECT * FROM alumnos ORDER BY nombre ASC";
$stmt = $pdo->prepare($query);
$stmt->execute();
$alumnos = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo json_encode([
'success' => true,
'data' => $alumnos,
'count' => count($alumnos)
]);
break;
case 'POST':
$data = json_decode(file_get_contents('php://input'), true);
if (empty($data['nombre']) || empty($data['email'])) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'Nombre y email son requeridos']);
exit;
}
$pdo->beginTransaction();
try {
// Insertar alumno
$stmt = $pdo->prepare("
INSERT INTO alumnos (nombre, email, telefono)
VALUES (?, ?, ?)
");
$stmt->execute([
$data['nombre'],
$data['email'],
$data['telefono'] ?? null
]);
$alumnoId = $pdo->lastInsertId();
// Si viene curso_id, asignar también a curso
if (!empty($data['curso_id'])) {
$stmt = $pdo->prepare("
INSERT INTO alumnos_cursos (alumno_id, curso_id, estado)
VALUES (?, ?, 'cursando')
");
$stmt->execute([$alumnoId, $data['curso_id']]);
}
$pdo->commit();
echo json_encode([
'success' => true,
'id' => $alumnoId,
'message' => 'Alumno creado y asignado exitosamente'
]);
} catch (PDOException $e) {
$pdo->rollBack();
http_response_code(500);
echo json_encode(['success' => false, 'error' => 'Error al registrar: ' . $e->getMessage()]);
}
break;
case 'PUT':
$data = json_decode(file_get_contents('php://input'), true);
if (empty($data['id']) || empty($data['nombre']) || empty($data['email'])) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'Datos incompletos']);
exit;
}
$stmt = $pdo->prepare("
UPDATE alumnos SET
nombre = ?,
email = ?,
telefono = ?
WHERE id = ?
");
$stmt->execute([
$data['nombre'],
$data['email'],
$data['telefono'] ?? null,
$data['id']
]);
// Si curso_id viene en la actualización, actualizar también el curso
if (!empty($data['curso_id'])) {
// Verifica si ya tiene una relación previa
$check = $pdo->prepare("SELECT id FROM alumnos_cursos WHERE alumno_id = ?");
$check->execute([$data['id']]);
if ($check->fetch()) {
// Si ya tiene relación, actualizamos el curso asignado
$updateCurso = $pdo->prepare("
UPDATE alumnos_cursos SET curso_id = ?, estado = 'cursando'
WHERE alumno_id = ?
");
$updateCurso->execute([$data['curso_id'], $data['id']]);
} else {
// Si no tiene relación previa, la insertamos
$insertCurso = $pdo->prepare("
INSERT INTO alumnos_cursos (alumno_id, curso_id, estado)
VALUES (?, ?, 'cursando')
");
$insertCurso->execute([$data['id'], $data['curso_id']]);
}
}
echo json_encode([
'success' => true,
'message' => 'Alumno actualizado exitosamente'
]);
break;
case 'DELETE':
$id = $_GET['id'] ?? null;
if (!$id) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'ID de alumno no proporcionado']);
exit;
}
// Verificar si el alumno está asignado a algún curso primero
$stmt = $pdo->prepare("SELECT COUNT(*) FROM alumnos_cursos WHERE alumno_id = ?");
$stmt->execute([$id]);
$tieneCursos = $stmt->fetchColumn();
if ($tieneCursos > 0) {
http_response_code(400);
echo json_encode(['success' => false, 'error' => 'No se puede eliminar, el alumno está asignado a cursos']);
exit;
}
$stmt = $pdo->prepare("DELETE FROM alumnos WHERE id = ?");
$stmt->execute([$id]);
echo json_encode([
'success' => true,
'message' => 'Alumno eliminado exitosamente'
]);
break;
default:
http_response_code(405);
echo json_encode(['success' => false, 'error' => 'Método no permitido']);
}
} catch (PDOException $e) {
http_response_code(500);
echo json_encode(['success' => false, 'error' => 'Error en la base de datos: ' . $e->getMessage()]);
}
?>