Saltar al contenido principal

Funciones remotas

  • Las funciones remotas no tienen acceso a locals, donde generalmente se definen los datos de sesión del usuario, pero se puede acceder a través de la request

Función

  • Para tener validaciones en los formularios del lado del servidor
bun add valibot #zod arktype
src/routes/admin/posts.remote.ts
import { form, getRequestEvent, query } from "$app/server";
import { auth } from "$lib/auth";
import { db } from "$lib/server/db";
import { posts } from "$lib/server/db/schema";
import { error, redirect } from "@sveltejs/kit";
import * as v from "valibot"

// Fetch all posts =====================================================
export const get_all_posts = query(async () => db.query.posts.findMany())

// Create a new post ==================================================
export const create_post = form(
v.object({
title: v.pipe(v.string(), v.nonEmpty("Title is required")),
body: v.pipe(v.string(), v.nonEmpty("Body is required")),
}),
async ({ title, body }) => {

// Get session data
const event = getRequestEvent();
const session = await auth.api.getSession({ headers: event.request.headers });

if (!session?.user?.id) {
error(401, "Unauthorized");
}

const slug = title.toLocaleLowerCase().replace(/\s+/g, '-').replace(/[^\w-]+/g, '');

// Create new post
await db.insert(posts).values({
title,
slug,
body,
authorId: session.user.id
});

redirect(303, '/admin');
})

Mostrar datos

src/routes/admin/+page.svelte
<script>
import { get_all_posts } from './posts.remote';

// "Query" all posts
//const posts = await get_all_posts();
</script>

<!-- List all posts -->
<ol>
{#each await get_all_posts() as post (post.id)}
<li>{post.title}</li>
{/each}
</ol>

Formularios