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>