Login sequence and inventory/protocol storage groundwork

This commit is contained in:
2026-03-19 05:42:11 +00:00
parent 5b2c7e4506
commit 55bbd6909d
21 changed files with 3882 additions and 157 deletions

15
server/src/db/migrate.ts Normal file
View File

@@ -0,0 +1,15 @@
import { pool } from './pool';
import fs from 'fs';
import path from 'path';
async function migrate() {
const sql = fs.readFileSync(path.join(__dirname, 'schema.sql'), 'utf-8');
await pool.query(sql);
console.log('Migration complete');
await pool.end();
}
migrate().catch(err => {
console.error('Migration failed:', err);
process.exit(1);
});

9
server/src/db/pool.ts Normal file
View File

@@ -0,0 +1,9 @@
import { Pool } from 'pg';
export const pool = new Pool({
connectionString: process.env.DATABASE_URL ||
'postgresql://labwise:labwise_dev_pw@localhost:5432/labwise_db',
max: 10,
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
});

63
server/src/db/schema.sql Normal file
View File

@@ -0,0 +1,63 @@
-- Chemical inventory, scoped per user
CREATE TABLE IF NOT EXISTS chemicals (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id TEXT NOT NULL,
-- Required fields
pi_first_name TEXT NOT NULL,
physical_state TEXT NOT NULL,
chemical_name TEXT NOT NULL,
bldg_code TEXT NOT NULL,
lab TEXT NOT NULL,
storage_location TEXT NOT NULL,
storage_device TEXT NOT NULL,
number_of_containers TEXT NOT NULL,
amount_per_container TEXT NOT NULL,
unit_of_measure TEXT NOT NULL,
cas_number TEXT NOT NULL,
-- Optional fields
chemical_formula TEXT,
molecular_weight TEXT,
vendor TEXT,
catalog_number TEXT,
found_in_catalog TEXT,
po_number TEXT,
receipt_date TEXT,
open_date TEXT,
max_on_hand TEXT,
expiration_date DATE,
contact TEXT,
comments TEXT,
permit_number TEXT,
barcode TEXT,
concentration TEXT,
chemical_number TEXT,
lot_number TEXT,
multiple_cas TEXT,
msds TEXT,
percentage_full NUMERIC(5,2),
needs_manual_entry TEXT[],
scanned_image TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS chemicals_user_id_idx ON chemicals(user_id);
CREATE INDEX IF NOT EXISTS chemicals_cas_number_idx ON chemicals(cas_number);
-- Protocols with JSONB analysis results
CREATE TABLE IF NOT EXISTS protocols (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
user_id TEXT NOT NULL,
title TEXT NOT NULL,
content TEXT NOT NULL DEFAULT '',
file_url TEXT,
analysis_results JSONB,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE INDEX IF NOT EXISTS protocols_user_id_idx ON protocols(user_id);