Skip to content

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)
// Query
query getCourses {
fn: import { getCourses } from "@src/courses/operations",
entities: [Course, Lesson]
}
// Action
action enrollInCourse {
fn: import { enrollInCourse } from "@src/courses/operations",
entities: [Enrollment, User, Course]
}
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} />;
}
import { enrollInCourse } from 'wasp/client/operations';
// Las actions se llaman directamente con await
// NO usar useAction a menos que necesites optimistic updates
async function handleEnroll(courseId: number) {
try {
await enrollInCourse({ courseId });
// La cache de queries se invalida automaticamente
} catch (error) {
console.error('Error:', error);
}
}
operations.ts
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
};
PropiedadTipoDescripcion
context.userAuthUser | nullUsuario autenticado
context.entities.ModelNamePrismaDelegateAcceso a modelos
context.prismaPrismaClientCliente Prisma completo
import { HttpError } from 'wasp/server';
// 401 Unauthorized
if (!context.user) {
throw new HttpError(401, 'Debes iniciar sesion');
}
// 403 Forbidden
if (!context.user.isAdmin) {
throw new HttpError(403, 'No tienes permisos');
}
// 404 Not Found
if (!course) {
throw new HttpError(404, 'Curso no encontrado');
}
// 400 Bad Request
if (!args.courseId) {
throw new HttpError(400, 'courseId es requerido');
}
OperacionTipoDescripcion
getCoursesQueryObtener cursos publicados
getCourseBySlugQueryObtener curso por slug
getMyEnrollmentsQueryObtener inscripciones del usuario
getCourseAccessQueryVerificar acceso a un curso
enrollInCourseActionInscribir usuario en curso
updateLessonProgressActionActualizar progreso de leccion
completeCourseActionMarcar curso como completado
OperacionTipoDescripcion
createCourseActionCrear nuevo curso (admin)
updateCourseActionActualizar curso (admin)
deleteCourseActionEliminar curso (admin)
createLessonActionCrear leccion (admin)
updateLessonActionActualizar leccion (admin)
deleteLessonActionEliminar leccion (admin)
getAdminStatsQueryEstadisticas para dashboard
OperacionTipoDescripcion
createCourseCheckoutActionCrear sesion de checkout para curso
createSubscriptionCheckoutActionCrear sesion de checkout para suscripcion
getSignedVideoUrlQueryObtener URL firmada para video
  • Queries - Documentacion detallada de queries
  • Actions - Documentacion detallada de actions