feat(30-01): create onboarding route with Zod validation and register

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-12 20:43:29 +02:00
parent 9da4c8435c
commit 5b35e60477
3 changed files with 31 additions and 0 deletions

View File

@@ -19,6 +19,7 @@ import { globalItemRoutes } from "./routes/global-items.ts";
import { imageRoutes } from "./routes/images.ts";
import { itemRoutes } from "./routes/items.ts";
import { oauthRoutes, wellKnownRoute } from "./routes/oauth.ts";
import { onboardingRoutes } from "./routes/onboarding.ts";
import { profileRoutes } from "./routes/profiles.ts";
import { settingsRoutes } from "./routes/settings.ts";
import { setupRoutes } from "./routes/setups.ts";
@@ -191,6 +192,7 @@ app.route("/api/users", profileRoutes);
app.route("/api/setups", setupRoutes);
app.route("/api/discovery", discoveryRoutes);
app.route("/api/global-items", globalItemRoutes);
app.route("/api/onboarding", onboardingRoutes);
app.route("/api/tags", tagRoutes);
// MCP server (conditionally mounted)

View File

@@ -0,0 +1,24 @@
import { Hono } from "hono";
import { zValidator } from "@hono/zod-validator";
import { completeOnboardingSchema } from "../../shared/schemas.ts";
import { completeOnboarding } from "../services/onboarding.service.ts";
type Env = { Variables: { db?: any; userId?: number } };
const app = new Hono<Env>();
// POST /api/onboarding/complete
app.post(
"/complete",
zValidator("json", completeOnboardingSchema),
async (c) => {
const database = c.get("db");
const userId = c.get("userId")!;
const { globalItemIds } = c.req.valid("json");
const result = await completeOnboarding(database, userId, globalItemIds);
return c.json(result);
},
);
export { app as onboardingRoutes };

View File

@@ -153,3 +153,8 @@ export const changeEmailSchema = z.object({
export const deleteAccountSchema = z.object({
confirmation: z.literal("DELETE"),
});
// Onboarding schemas
export const completeOnboardingSchema = z.object({
globalItemIds: z.array(z.number().int().positive()).max(50),
});