Skip to content

[Phase 2] SQLite device inventory (SQLAlchemy models) - #23

Merged
reloadfast merged 2 commits into
mainfrom
feature/phase-2-inventory
Feb 27, 2026
Merged

reloadfast merged 2 commits into
mainfrom
feature/phase-2-inventory

Conversation

@reloadfast

Copy link
Copy Markdown
Owner

Closes #5

Changes

backend/app/models/device.py

  • Device: added vendor column (populated from arp-scan OUI lookup), UniqueConstraint("ip_address") — one row per IP, upserts update in place
  • Port: added UniqueConstraint("device_id", "port_number", "protocol") — prevents duplicate port rows per device per scan

backend/app/db.py

  • upsert_device(session, *, ip_address, mac_address, vendor, hostname, os_guess) — inserts a new Device or updates non-None fields on an existing one; never overwrites stored data with None
  • upsert_port(session, *, device_id, port_number, protocol, service_name, version_banner) — same pattern for Port rows

backend/tests/test_db.py

  • 20 tests: schema inspection, CRUD round-trips, constraint enforcement (IntegrityError on duplicate IP / duplicate port), upsert create / update / none-does-not-overwrite / idempotency
  • Full suite: 57 tests, 99% line coverage

…ints, upsert helpers

- Device: add vendor column (arp-scan OUI lookup), UniqueConstraint on ip_address
- Port: add UniqueConstraint on (device_id, port_number, protocol)
- db.py: add upsert_device() and upsert_port() helpers — insert-or-update
  keyed on ip_address and (device_id, port, proto) respectively; None fields
  never overwrite existing data
- Tests: 20 tests covering schema, CRUD, constraint enforcement, upsert
  create/update/idempotency/none-does-not-overwrite; total suite 57 tests at 99%

Closes #5
@reloadfast
reloadfast merged commit c428254 into main Feb 27, 2026
4 checks passed
@reloadfast
reloadfast deleted the feature/phase-2-inventory branch February 27, 2026 20:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Phase 2] SQLite device inventory (SQLAlchemy models)

1 participant