ThreadCount Community edition

Uniform stock management for healthcare linen rooms. Licensed under the GNU AGPL v3.
This commit is contained in:
ThreadCount
2026-09-13 08:54:35 +10:00
commit 344b1701dd
505 changed files with 56231 additions and 0 deletions
@@ -0,0 +1,21 @@
-- The reveal path's own role: four columns of one table, and nothing else.
--
-- ops_ro provably cannot read a facility's coordinator contacts — the production probe refuses
-- them. Revealing one is a separate act (a typed reason, a thirty-minute grant, a trail row, an
-- email to the operator), and it reads through THIS role rather than through an exception in
-- code. So widening the reveal's SELECT in some future edit fails at the database, exactly as a
-- stray query in a projection would.
--
-- Created by hand as postgres before this migration reaches the box:
-- CREATE ROLE ops_reveal LOGIN PASSWORD '…';
-- Guarded like ops_ro_grants: a missing role skips the grants and the deploy succeeds; the
-- reveal cannot connect until it exists, which is the safe failure.
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_roles WHERE rolname = 'ops_reveal') THEN
RAISE NOTICE 'ops_reveal does not exist — grants skipped; create the role, then apply this block by hand';
RETURN;
END IF;
GRANT USAGE ON SCHEMA public TO ops_reveal;
GRANT SELECT ("id", "coordinator", "coordinatorEmail", "coordinatorPhone") ON "Facility" TO ops_reveal;
END $$;