Full project rename per m's call. Single atomic commit because the codebase rename is a coupled change — go module path, env vars, DB default, Docker artefact names, and on-disk mDock paths all flip together. - go.mod: module mgit.msbls.de/m/mcables → mgit.msbls.de/m/cablegui - cmd/mcables → cmd/cablegui (git mv) - All Go imports rewritten to the new module path - Env vars: MCABLES_ADDR/MCABLES_DB → CABLEGUI_ADDR/CABLEGUI_DB - DB default path: data/mcables.db → data/cablegui.db - Dockerfile + docker-compose.yml: image, container_name, env vars, bind-mount /home/m/stacks/mcables → /home/m/stacks/cablegui, secrets /home/m/secrets/mcables → /home/m/secrets/cablegui - Makefile: bin target + run/build commands point at cmd/cablegui - .gitignore + .dockerignore: /mcables → /cablegui - README, docs/design.md, CLAUDE.md: prose + paths + image name - web/static/index.html: <title> + brand - web/static/main.js + web/web.go: header comment - internal/exporter: Scene.Source "mcables" → "cablegui" - internal/server/export.go: error-detail secrets path - internal/db/migrations/*.sql: header comments (mCables vN → CableGUI vN) Memory group_id kept as "mcables" to preserve existing memory continuity. Documented as historical in CLAUDE.md. go build ./... clean; go test -race ./... green
168 lines
11 KiB
SQL
168 lines
11 KiB
SQL
-- CableGUI v4 device-type catalog. See docs/design.md §2.1 + §2.2.
|
||
|
||
-- v4 — device-type catalog. Built-in types live globally (project_id NULL).
|
||
-- Per-project custom types use project_id = X.
|
||
CREATE TABLE device_types (
|
||
id INTEGER PRIMARY KEY,
|
||
project_id INTEGER REFERENCES projects(id) ON DELETE CASCADE,
|
||
name TEXT NOT NULL,
|
||
kind TEXT NOT NULL DEFAULT 'generic',
|
||
icon TEXT,
|
||
description TEXT NOT NULL DEFAULT '',
|
||
built_in INTEGER NOT NULL DEFAULT 0,
|
||
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
||
UNIQUE (project_id, name)
|
||
);
|
||
CREATE INDEX device_types_project_idx ON device_types(project_id);
|
||
|
||
-- v4 — port profile per device type. Used to seed ports when a device
|
||
-- of that type is created.
|
||
CREATE TABLE device_type_ports (
|
||
id INTEGER PRIMARY KEY,
|
||
device_type_id INTEGER NOT NULL REFERENCES device_types(id) ON DELETE CASCADE,
|
||
cable_type_id INTEGER NOT NULL REFERENCES cable_types(id) ON DELETE RESTRICT,
|
||
label_prefix TEXT NOT NULL DEFAULT '',
|
||
count INTEGER NOT NULL DEFAULT 1 CHECK (count >= 1),
|
||
edge TEXT NOT NULL DEFAULT 'bottom' CHECK (edge IN ('top','bottom','left','right')),
|
||
sort_order INTEGER NOT NULL DEFAULT 0
|
||
);
|
||
CREATE INDEX device_type_ports_type_idx ON device_type_ports(device_type_id);
|
||
|
||
-- v4 — devices gain a nullable type_id. SET NULL on type-delete so we
|
||
-- never cascade-delete a device the user still wants.
|
||
ALTER TABLE devices ADD COLUMN type_id INTEGER
|
||
REFERENCES device_types(id) ON DELETE SET NULL;
|
||
CREATE INDEX devices_type_idx ON devices(type_id);
|
||
|
||
-- Seed the 14 built-in device types.
|
||
-- project_id stays NULL → built-in. The trio Screen / Keyboard / Mouse
|
||
-- was added in v4.1 to support the Home Office setup template (slice 6).
|
||
INSERT INTO device_types (name, kind, built_in, description) VALUES
|
||
('NAS', 'storage', 1, 'Network-attached storage'),
|
||
('PC', 'compute', 1, 'Desktop PC / workstation'),
|
||
('Mac', 'compute', 1, 'Mac (mini / studio / desktop)'),
|
||
('Notebook', 'compute', 1, 'Laptop / notebook'),
|
||
('TV', 'display', 1, 'Television'),
|
||
('Soundbar', 'audio', 1, 'Soundbar / AV receiver'),
|
||
('Switch', 'network', 1, 'Ethernet switch'),
|
||
('fritz', 'network', 1, 'AVM Fritz!Box router'),
|
||
('ChromeCast', 'display', 1, 'ChromeCast / streaming stick'),
|
||
('SteamLink', 'compute', 1, 'Steam Link / dedicated streaming box'),
|
||
('IOx-3', 'hub', 1, 'USB hub with 3 downstream ports'),
|
||
('IOx-6', 'hub', 1, 'USB hub with 6 downstream ports'),
|
||
('IOx-8', 'hub', 1, 'USB hub with 8 downstream ports'),
|
||
('Screen', 'display', 1, 'External monitor / display'),
|
||
('Keyboard', 'accessory', 1, 'Keyboard'),
|
||
('Mouse', 'accessory', 1, 'Mouse / pointing device');
|
||
|
||
-- Now seed device_type_ports. Each row references its device_type by
|
||
-- (SELECT id FROM device_types WHERE name = ? AND project_id IS NULL).
|
||
--
|
||
-- cable_types ids come from the 001 seed in fixed order:
|
||
-- 1=Power, 2=USB, 3=HDMI, 4=DP, 5=RJ45
|
||
--
|
||
-- label_prefix is what the seeder appends a 1..N suffix to when count>1.
|
||
-- Default edge is 'bottom'; sort_order positions the port-types from
|
||
-- left to right along that edge.
|
||
|
||
-- NAS: Power × 1, RJ45 × 1
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='NAS' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 5, 'RJ45', 1, 'bottom', 1 FROM device_types WHERE name='NAS' AND project_id IS NULL;
|
||
|
||
-- PC: Power × 1, RJ45 × 1, HDMI × 1, USB × 2
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='PC' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 5, 'RJ45', 1, 'bottom', 1 FROM device_types WHERE name='PC' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 3, 'HDMI', 1, 'bottom', 2 FROM device_types WHERE name='PC' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 2, 'USB', 2, 'bottom', 3 FROM device_types WHERE name='PC' AND project_id IS NULL;
|
||
|
||
-- Mac: Power × 1, HDMI × 1, USB × 2
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='Mac' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 3, 'HDMI', 1, 'bottom', 1 FROM device_types WHERE name='Mac' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 2, 'USB', 2, 'bottom', 2 FROM device_types WHERE name='Mac' AND project_id IS NULL;
|
||
|
||
-- Notebook: Power × 1, USB × 2
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='Notebook' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 2, 'USB', 2, 'bottom', 1 FROM device_types WHERE name='Notebook' AND project_id IS NULL;
|
||
|
||
-- TV: Power × 1, HDMI × 2
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='TV' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 3, 'HDMI', 2, 'bottom', 1 FROM device_types WHERE name='TV' AND project_id IS NULL;
|
||
|
||
-- Soundbar: Power × 1, HDMI × 1
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='Soundbar' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 3, 'HDMI', 1, 'bottom', 1 FROM device_types WHERE name='Soundbar' AND project_id IS NULL;
|
||
|
||
-- Switch: Power × 1, RJ45 × 5
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='Switch' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 5, 'RJ45', 5, 'bottom', 1 FROM device_types WHERE name='Switch' AND project_id IS NULL;
|
||
|
||
-- fritz: Power × 1, RJ45 × 4
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='fritz' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 5, 'RJ45', 4, 'bottom', 1 FROM device_types WHERE name='fritz' AND project_id IS NULL;
|
||
|
||
-- ChromeCast: Power × 1, HDMI × 1
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='ChromeCast' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 3, 'HDMI', 1, 'bottom', 1 FROM device_types WHERE name='ChromeCast' AND project_id IS NULL;
|
||
|
||
-- SteamLink: Power × 1, HDMI × 1, USB × 2
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='SteamLink' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 3, 'HDMI', 1, 'bottom', 1 FROM device_types WHERE name='SteamLink' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 2, 'USB', 2, 'bottom', 2 FROM device_types WHERE name='SteamLink' AND project_id IS NULL;
|
||
|
||
-- IOx-3: Power × 1, USB × 3
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='IOx-3' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 2, 'USB', 3, 'bottom', 1 FROM device_types WHERE name='IOx-3' AND project_id IS NULL;
|
||
|
||
-- IOx-6: Power × 1, USB × 6
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='IOx-6' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 2, 'USB', 6, 'bottom', 1 FROM device_types WHERE name='IOx-6' AND project_id IS NULL;
|
||
|
||
-- IOx-8: Power × 1, USB × 8
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='IOx-8' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 2, 'USB', 8, 'bottom', 1 FROM device_types WHERE name='IOx-8' AND project_id IS NULL;
|
||
|
||
-- Screen: Power × 1, HDMI × 1 (v4.1)
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 1, 'Power', 1, 'bottom', 0 FROM device_types WHERE name='Screen' AND project_id IS NULL;
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 3, 'HDMI', 1, 'bottom', 1 FROM device_types WHERE name='Screen' AND project_id IS NULL;
|
||
|
||
-- Keyboard: USB × 1 (v4.1)
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 2, 'USB', 1, 'bottom', 0 FROM device_types WHERE name='Keyboard' AND project_id IS NULL;
|
||
|
||
-- Mouse: USB × 1 (v4.1)
|
||
INSERT INTO device_type_ports (device_type_id, cable_type_id, label_prefix, count, edge, sort_order)
|
||
SELECT id, 2, 'USB', 1, 'bottom', 0 FROM device_types WHERE name='Mouse' AND project_id IS NULL;
|