mirror of
https://github.com/Monadical-SAS/reflector.git
synced 2026-02-06 10:46:46 +00:00
- Add max_length=100 on BulkStatusRequest.room_names to prevent abuse - Filter bulk endpoint results to rooms user can see (owned or shared) - Throw on bulk-status fetch error instead of silently returning empty data - Fix room_by_id type annotation: dict[str, DbRoom] instead of Any - Remove stale "200ms" comment in test - Enable strict: true in jest tsconfig - Remove working docs from tracked files - Simplify redundant ternary in test helper
38 lines
1.2 KiB
TypeScript
38 lines
1.2 KiB
TypeScript
import { create, keyResolver, windowScheduler } from "@yornaath/batshit";
|
|
import { client } from "./apiClient";
|
|
import type { components } from "../reflector-api";
|
|
|
|
type MeetingStatusResult = {
|
|
roomName: string;
|
|
active_meetings: components["schemas"]["Meeting"][];
|
|
upcoming_events: components["schemas"]["CalendarEventResponse"][];
|
|
};
|
|
|
|
const BATCH_WINDOW_MS = 10;
|
|
|
|
export function createMeetingStatusBatcher(windowMs: number = BATCH_WINDOW_MS) {
|
|
return create({
|
|
fetcher: async (roomNames: string[]): Promise<MeetingStatusResult[]> => {
|
|
const unique = [...new Set(roomNames)];
|
|
const { data, error } = await client.POST(
|
|
"/v1/rooms/meetings/bulk-status",
|
|
{ body: { room_names: unique } },
|
|
);
|
|
if (error || !data) {
|
|
throw new Error(
|
|
`bulk-status fetch failed: ${JSON.stringify(error ?? "no data")}`,
|
|
);
|
|
}
|
|
return roomNames.map((name) => ({
|
|
roomName: name,
|
|
active_meetings: data[name]?.active_meetings ?? [],
|
|
upcoming_events: data[name]?.upcoming_events ?? [],
|
|
}));
|
|
},
|
|
resolver: keyResolver("roomName"),
|
|
scheduler: windowScheduler(windowMs),
|
|
});
|
|
}
|
|
|
|
export const meetingStatusBatcher = createMeetingStatusBatcher();
|