Files
cobble/src/functions/backend/db/check-allowed-joins.ts
T
tbenandClaude Opus 5.5 3286b80029 Build Cobble project structure from the handoff
- Remove the preset document suite (letters, emails, invoices, quotes,
  PDF generation, line items) with its routes, API handlers and tables
- Rebrand to Cobble: site data, Lato, handoff design tokens (light and
  dark) in main.css, brand assets in public/brand, ember stone logo and
  regenerated favicons
- Add bots, bot_messages, bot_tasks and bot_task_steps tables, regenerate
  DB types (BUN_SQLITE_COBBLE_*) and add a sample crew seed (seed:bots)
- Add the chat shell at /admin/bots: rail with pinned coordinator and
  user popover, bottom-anchored conversation with composer, working-on
  panel, and a send-message API scoped to the session user
- Add BotStone and Wordmark components, crew status and relative time
  utils with tests, and update AGENTS.md

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-18 17:10:36 +01:00

70 lines
2.0 KiB
TypeScript

import type { BUN_SQLITE_COBBLE_ALL_TYPEDEFS } from "@/db/types/db";
import type { TableType } from "@/src/types";
import uniqueStringArr from "@/src/utils/unique-string-arr";
import type { ServerQueryParam } from "@moduletrace/bun-sqlite";
import BunSQLite from "@moduletrace/bun-sqlite";
import type { APIResponseObject } from "@moduletrace/bunext/types";
import _ from "lodash";
type Params = {
/**
* Allowed joins
*/
joins: TableType[];
query: ServerQueryParam<any>;
/**
* Allowed fields from joins
*/
include_fields?: (keyof BUN_SQLITE_COBBLE_ALL_TYPEDEFS)[];
/**
* Fields to exclude from joins
*/
exclude_fields?: (keyof BUN_SQLITE_COBBLE_ALL_TYPEDEFS)[];
};
export default function checkAllowedJoins({
joins,
query,
include_fields,
exclude_fields,
}: Params): APIResponseObject {
const all_joins = BunSQLite.utils.grab_join_fields_from_query_object({
query,
});
const all_joins_str_arr = uniqueStringArr(
all_joins
.filter((j) => Boolean(j.table))
.map((j) => j.table) as string[],
);
const are_joins_allowed =
_.intersection(joins, all_joins_str_arr).length >=
all_joins_str_arr.length;
if (!are_joins_allowed) {
return {
success: false,
msg: `Can't Join all tables: \`${all_joins_str_arr.join(", ")}\`. Tables allowed are \`${joins.join(", ")}\``,
};
}
if (include_fields?.[0]) {
for (let i = 0; i < all_joins.length; i++) {
const join = all_joins[i];
if (!join) continue;
const join_field = join.field as keyof BUN_SQLITE_COBBLE_ALL_TYPEDEFS;
if (!include_fields.includes(join_field)) {
return {
success: false,
msg: `Can't Join field: \`${join_field}\` in \`${join.table}\` table`,
};
}
}
}
return {
success: true,
};
}