route.ts 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. import { NextRequest, NextResponse } from "next/server"
  2. import { getServerSession } from "next-auth"
  3. import { authOptions } from "@/lib/auth"
  4. import { prisma } from "@/lib/prisma"
  5. interface ActivityEvent {
  6. id: string
  7. type: 'user_registered' | 'report_created' | 'appointment_created' | 'appointment_completed'
  8. title: string
  9. description: string
  10. timestamp: Date
  11. color: 'green' | 'blue' | 'purple' | 'orange'
  12. }
  13. export async function GET(request: NextRequest) {
  14. try {
  15. const session = await getServerSession(authOptions)
  16. if (!session?.user?.id) {
  17. return NextResponse.json(
  18. { error: "No autorizado" },
  19. { status: 401 }
  20. )
  21. }
  22. if (session.user.role !== "ADMIN") {
  23. return NextResponse.json(
  24. { error: "Acceso denegado. Solo administradores." },
  25. { status: 403 }
  26. )
  27. }
  28. const { searchParams } = new URL(request.url)
  29. const limit = parseInt(searchParams.get("limit") || "10")
  30. // Obtener últimos usuarios registrados
  31. const recentUsers = await prisma.user.findMany({
  32. where: {
  33. role: "PATIENT"
  34. },
  35. select: {
  36. id: true,
  37. name: true,
  38. lastname: true,
  39. createdAt: true
  40. },
  41. orderBy: {
  42. createdAt: "desc"
  43. },
  44. take: 5
  45. })
  46. // Obtener últimos reportes creados
  47. const recentReports = await prisma.record.findMany({
  48. select: {
  49. id: true,
  50. createdAt: true,
  51. chatType: true,
  52. user: {
  53. select: {
  54. name: true,
  55. lastname: true
  56. }
  57. }
  58. },
  59. orderBy: {
  60. createdAt: "desc"
  61. },
  62. take: 5
  63. })
  64. // Obtener últimas citas completadas
  65. const recentAppointments = await prisma.appointment.findMany({
  66. where: {
  67. estado: "COMPLETADA"
  68. },
  69. select: {
  70. id: true,
  71. createdAt: true,
  72. updatedAt: true,
  73. estado: true,
  74. paciente: {
  75. select: {
  76. name: true,
  77. lastname: true
  78. }
  79. }
  80. },
  81. orderBy: {
  82. updatedAt: "desc"
  83. },
  84. take: 5
  85. })
  86. // Convertir a eventos unificados
  87. const activities: ActivityEvent[] = []
  88. // Agregar usuarios registrados
  89. recentUsers.forEach(user => {
  90. activities.push({
  91. id: `user-${user.id}`,
  92. type: 'user_registered',
  93. title: 'Nuevo paciente registrado',
  94. description: `${user.name} ${user.lastname}`,
  95. timestamp: user.createdAt,
  96. color: 'green'
  97. })
  98. })
  99. // Agregar reportes
  100. recentReports.forEach(report => {
  101. activities.push({
  102. id: `report-${report.id}`,
  103. type: 'report_created',
  104. title: report.chatType === 'PSYCHOLOGICAL' ? 'Reporte psicológico generado' : 'Reporte médico generado',
  105. description: `${report.user.name} ${report.user.lastname}`,
  106. timestamp: report.createdAt,
  107. color: 'blue'
  108. })
  109. })
  110. // Agregar citas completadas
  111. recentAppointments.forEach(apt => {
  112. activities.push({
  113. id: `appointment-${apt.id}`,
  114. type: 'appointment_completed',
  115. title: 'Consulta completada',
  116. description: `${apt.paciente.name} ${apt.paciente.lastname}`,
  117. timestamp: apt.updatedAt,
  118. color: 'purple'
  119. })
  120. })
  121. // Ordenar todos los eventos por fecha (más reciente primero)
  122. activities.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime())
  123. // Limitar al número solicitado
  124. const limitedActivities = activities.slice(0, limit)
  125. return NextResponse.json({
  126. activities: limitedActivities,
  127. total: activities.length
  128. })
  129. } catch (error) {
  130. console.error("Error in recent activity API:", error)
  131. return NextResponse.json(
  132. { error: "Error al obtener actividad reciente" },
  133. { status: 500 }
  134. )
  135. }
  136. }