Operations
Section titled “Operations”Las operaciones de Wasp son funciones server-side que se pueden llamar desde el cliente. Hay dos tipos:
- Queries: Operaciones de lectura (GET)
- Actions: Operaciones de escritura (POST/PUT/DELETE)
Declaracion en main.wasp
Section titled “Declaracion en main.wasp”// Queryquery getCourses { fn: import { getCourses } from "@src/courses/operations", entities: [Course, Lesson]}
// Actionaction enrollInCourse { fn: import { enrollInCourse } from "@src/courses/operations", entities: [Enrollment, User, Course]}Uso en el Cliente
Section titled “Uso en el Cliente”Queries
Section titled “Queries”import { useQuery, getCourses } from 'wasp/client/operations';
function CoursesPage() { // useQuery para datos que necesitan actualizarse const { data, isLoading, error } = useQuery(getCourses);
if (isLoading) return <Loading />; if (error) return <Error message={error.message} />;
return <CourseGrid courses={data} />;}Actions
Section titled “Actions”import { enrollInCourse } from 'wasp/client/operations';
// Las actions se llaman directamente con await// NO usar useAction a menos que necesites optimistic updatesasync function handleEnroll(courseId: number) { try { await enrollInCourse({ courseId }); // La cache de queries se invalida automaticamente } catch (error) { console.error('Error:', error); }}Implementacion Server-Side
Section titled “Implementacion Server-Side”import type { GetCourses, EnrollInCourse } from 'wasp/server/operations';import type { Course, Enrollment } from 'wasp/entities';import { HttpError } from 'wasp/server';
// GetCourses<InputType, OutputType>export const getCourses: GetCourses<void, Course[]> = async (args, context) => { // context contiene: // - context.user: Usuario autenticado (si existe) // - context.entities: Acceso a modelos de Prisma // - context.prisma: Cliente Prisma directo};Context
Section titled “Context”| Propiedad | Tipo | Descripcion |
|---|---|---|
context.user | AuthUser | null | Usuario autenticado |
context.entities.ModelName | PrismaDelegate | Acceso a modelos |
context.prisma | PrismaClient | Cliente Prisma completo |
Errores HTTP
Section titled “Errores HTTP”import { HttpError } from 'wasp/server';
// 401 Unauthorizedif (!context.user) { throw new HttpError(401, 'Debes iniciar sesion');}
// 403 Forbiddenif (!context.user.isAdmin) { throw new HttpError(403, 'No tienes permisos');}
// 404 Not Foundif (!course) { throw new HttpError(404, 'Curso no encontrado');}
// 400 Bad Requestif (!args.courseId) { throw new HttpError(400, 'courseId es requerido');}Lista de Operaciones
Section titled “Lista de Operaciones”Cursos
Section titled “Cursos”| Operacion | Tipo | Descripcion |
|---|---|---|
getCourses | Query | Obtener cursos publicados |
getCourseBySlug | Query | Obtener curso por slug |
getMyEnrollments | Query | Obtener inscripciones del usuario |
getCourseAccess | Query | Verificar acceso a un curso |
enrollInCourse | Action | Inscribir usuario en curso |
updateLessonProgress | Action | Actualizar progreso de leccion |
completeCourse | Action | Marcar curso como completado |
| Operacion | Tipo | Descripcion |
|---|---|---|
createCourse | Action | Crear nuevo curso (admin) |
updateCourse | Action | Actualizar curso (admin) |
deleteCourse | Action | Eliminar curso (admin) |
createLesson | Action | Crear leccion (admin) |
updateLesson | Action | Actualizar leccion (admin) |
deleteLesson | Action | Eliminar leccion (admin) |
getAdminStats | Query | Estadisticas para dashboard |
| Operacion | Tipo | Descripcion |
|---|---|---|
createCourseCheckout | Action | Crear sesion de checkout para curso |
createSubscriptionCheckout | Action | Crear sesion de checkout para suscripcion |
getSignedVideoUrl | Query | Obtener URL firmada para video |