route.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. import { NextRequest, NextResponse } from 'next/server';
  2. import { getServerSession } from 'next-auth';
  3. import { authOptions } from '@/lib/auth';
  4. import { db } from '@/lib/db';
  5. import { classes, periods, eq } from '@/lib/db/schema';
  6. export async function GET() {
  7. try {
  8. const session = await getServerSession(authOptions);
  9. if (!session?.user || session.user.role !== 'admin') {
  10. return NextResponse.json(
  11. { error: 'No autorizado' },
  12. { status: 401 }
  13. );
  14. }
  15. const allClasses = await db
  16. .select({
  17. id: classes.id,
  18. name: classes.name,
  19. code: classes.code,
  20. credits: classes.credits,
  21. description: classes.description,
  22. periodId: classes.periodId,
  23. isActive: classes.isActive,
  24. createdAt: classes.createdAt,
  25. period: {
  26. id: periods.id,
  27. name: periods.name,
  28. startDate: periods.startDate,
  29. endDate: periods.endDate,
  30. isActive: periods.isActive,
  31. },
  32. })
  33. .from(classes)
  34. .leftJoin(periods, eq(classes.periodId, periods.id))
  35. .orderBy(classes.name);
  36. return NextResponse.json(allClasses);
  37. } catch (error) {
  38. console.error('Error fetching classes:', error);
  39. return NextResponse.json(
  40. { error: 'Error interno del servidor' },
  41. { status: 500 }
  42. );
  43. }
  44. }
  45. export async function POST(request: NextRequest) {
  46. try {
  47. const session = await getServerSession(authOptions);
  48. if (!session?.user || session.user.role !== 'admin') {
  49. return NextResponse.json(
  50. { error: 'No autorizado' },
  51. { status: 401 }
  52. );
  53. }
  54. const { name, code, credits, description, periodId } = await request.json();
  55. // Validaciones
  56. if (!name || !code || !credits || !periodId) {
  57. return NextResponse.json(
  58. { error: 'Nombre, código, créditos y período académico son requeridos' },
  59. { status: 400 }
  60. );
  61. }
  62. if (typeof credits !== 'number' || credits < 1) {
  63. return NextResponse.json(
  64. { error: 'Los créditos deben ser un número mayor a 0' },
  65. { status: 400 }
  66. );
  67. }
  68. // Verificar si ya existe una clase con el mismo código
  69. const existingClass = await db
  70. .select()
  71. .from(classes)
  72. .where(eq(classes.code, code))
  73. .limit(1);
  74. if (existingClass.length > 0) {
  75. return NextResponse.json(
  76. { error: 'Ya existe una clase con este código' },
  77. { status: 400 }
  78. );
  79. }
  80. // Crear clase
  81. const [newClass] = await db
  82. .insert(classes)
  83. .values({
  84. name,
  85. code,
  86. credits,
  87. description: description || null,
  88. periodId,
  89. isActive: true,
  90. })
  91. .returning({
  92. id: classes.id,
  93. name: classes.name,
  94. code: classes.code,
  95. credits: classes.credits,
  96. description: classes.description,
  97. periodId: classes.periodId,
  98. isActive: classes.isActive,
  99. createdAt: classes.createdAt,
  100. });
  101. return NextResponse.json(newClass, { status: 201 });
  102. } catch (error) {
  103. console.error('Error creating class:', error);
  104. return NextResponse.json(
  105. { error: 'Error interno del servidor' },
  106. { status: 500 }
  107. );
  108. }
  109. }