/** * Floor Plans Service * * Handles all data operations for floor plans including fetching * floor plan data with associated rooms and real-time subscriptions. * * Returns data directly from PocketBase with expand relations. * File URLs are resolved at display time using getFileUrl() helper. */ import { pb, Collections } from "@/lib/pocketbase"; import type { FloorPlan, FloorPlanWithRooms, Room } from "@/types/floor-plan"; import { safely } from "@/lib/result"; /** * Fetches all floor plans with their associated rooms * Expands room -> company relations for complete data * Returns floor plans sorted by sort_order * * @returns Array of floor plans with nested rooms and company data */ export async function getFloorPlans(): Promise { /* Fetch all floor plans */ const floorPlans = await pb.collection(Collections.FloorPlans).getFullList({ sort: "sort_order", }); /* Fetch all rooms with company relations expanded */ const rooms = await pb.collection(Collections.Rooms).getFullList({ expand: "company", }); /* Combine floor plans with their rooms */ return floorPlans.map((floorPlan) => ({ ...floorPlan, rooms: rooms.filter((room) => room.floor_plan === floorPlan.id), })); } /** * Subscribes to real-time floor plan and room updates * Callback is invoked whenever floor plans or rooms change * Monitors both collections to ensure complete updates * * @param callback Function to call when floor plans change * @returns Unsubscribe function to clean up all subscriptions */ export function subscribeToFloorPlans(callback: (floorPlans: FloorPlanWithRooms[]) => void): () => void { pb.collection(Collections.FloorPlans).subscribe("*", async () => { const floorPlans = await getFloorPlans(); callback(floorPlans); }); pb.collection(Collections.Rooms).subscribe("*", async () => { const floorPlans = await getFloorPlans(); callback(floorPlans); }); return () => { safely(() => { pb.collection(Collections.FloorPlans).unsubscribe("*"); pb.collection(Collections.Rooms).unsubscribe("*"); }); }; }