// routes/landlord/onboarding/property-setup.tsx import { define } from "../../../utils.ts"; import { page } from "fresh"; import type { SessionCookie } from "../../auth/callback.ts"; import { properties } from "../../../db/schema.ts"; import { db } from "../../../db/db.ts"; import { markRoleOnboarded } from "../../../services/onboardingService.ts"; import { addE2EProperty, isE2EEnabled } from "../../../services/e2eFixtures.ts"; export const handler = define.handlers({ async GET(ctx) { const stateData = ctx.state.data as SessionCookie; const { user_id } = stateData; if (!user_id) { return new Response("", { status: 302, headers: { Location: "/auth/login" }, }); } return page({ stateData }); }, async POST(ctx) { const stateData = ctx.state.data as SessionCookie; const { user_id } = stateData; if (!user_id) { return new Response("", { status: 302, headers: { Location: "/auth/login" }, }); } const formData = await ctx.req.formData(); const now = Date.now(); const id = crypto.randomUUID(); const propertyPayload = { id, owner_id: user_id, address_1: (formData.get("address_1") || "").toString(), address_2: (formData.get("address_2") || "").toString(), city: (formData.get("city") || "").toString(), state: (formData.get("state") || "").toString(), zip: (formData.get("zip") || "").toString(), country: (formData.get("country") || "").toString(), property_type: (formData.get("property_type") || "").toString(), bedrooms: parseInt((formData.get("bedrooms") || "0").toString(), 10) || 0, bathrooms: parseInt((formData.get("bathrooms") || "0").toString(), 10) || 0, monthly_rent: parseFloat((formData.get("monthly_rent") || "0").toString()) || 0, security_deposit: parseFloat((formData.get("security_deposit") || "0").toString()) || 0, lease_duration_months: parseInt( (formData.get("lease_duration_months") || "12").toString(), 10, ) || 12, amenities: (formData.get("amenities") || "").toString(), description: (formData.get("description") || "").toString(), rental_status: "draft", created_on: now, updated_on: now, }; if (isE2EEnabled()) { addE2EProperty(user_id, propertyPayload); } else { await db.insert(properties).values(propertyPayload); } // Mark onboarding complete (step 0 or null effectively means finished) await markRoleOnboarded(user_id, "landlord"); return new Response("", { status: 302, headers: { Location: "/landlord/dashboard" }, }); }, }); export default define.page(function PropertySetup({ data }) { const { stateData, error } = data as { stateData: SessionCookie; error?: string; }; return (
Enter details for at least one property to complete onboarding.