All files / plainweb/src/admin/database/routes/[table] row.tsx

0% Statements 0/29
0% Branches 0/1
0% Functions 0/1
0% Lines 0/29

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43                                                                                     
import type { Column } from "admin/column";
import { config } from "admin/config";
import { sql } from "drizzle-orm";
import type { BetterSQLite3Database } from "drizzle-orm/better-sqlite3";
import type { Handler } from "handler";
import { TableRow } from "./components/table-row";
 
export const GET: Handler = async ({ req, res }) => {
  const tableName = req.params.table as string;
  const db = res.locals.database as BetterSQLite3Database<
    Record<string, unknown>
  >;
  const row = JSON.parse(decodeURIComponent(req.query.row as string));
 
  const columns = db.all<Column>(
    sql`SELECT * from pragma_table_info(${tableName}) LIMIT 100`,
  );
 
  config.verbose > 1 && console.log("[admin] [database]", "fetching row", row);
 
  const whereClause = Object.entries(row)
    .map(([column, value]) => sql`${column} = ${value}`)
    .join(" AND ");
 
  const query = sql`SELECT * FROM ${sql.identifier(tableName)} WHERE`;
 
  let i = 0;
  for (const [column, value] of Object.entries(row)) {
    query.append(sql`${sql.identifier(column)} = ${value}`);
    if (i === Object.keys(row).length - 1) continue;
    query.append(sql` AND `);
    i++;
  }
 
  const found = db.all<Record<string, unknown>>(query);
 
  if (found.length === 0) {
    throw new Error(`Row not found for ${whereClause}`);
  }
 
  return <TableRow tableName={tableName} columns={columns} row={row} />;
};