Z1: proizvod ASP-Terminia (migracija + registracija u startup listi)

Migracija po sablonu 002_seed_products.sql (INSERT IGNORE, idempotentna).

limits/features su PLACEHOLDER - vlasnik jos nije odlucio pakete
(basic/pro). Bezbedno jer:
- server cuva oba polja kao json.RawMessage, cist passthrough, ne tumaci ih
- firmware (ASP-TERMINIA repo, licenca.cpp) JOS NE CITA features/limits -
  parsira samo edition/customer/expires_at/grace_days/machine_fingerprint;
  enforcement dolazi tek u zadatku Z4
- svaka izdata licenca nosi SVOJE limits/features (ne nasledjuje default
  posle izdavanja), pa promena default-a kasnije ne trazi novu migraciju

cmd/server/main.go: registrovan migrations/004_... u runMigrations() listi
(migracije se pokrecu automatski pri svakom startu servisa, ali SAMO iz te
liste - nov fajl sam po sebi ne bi se pokrenuo bez ove linije).

Resava P3 iz docs/asp-terminia/02-api-ugovor-firmware.md (format
limits/features za ASP proizvod) - opisano u poruci commit-a kao odgovor.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
Nenad Djukic 2026-07-25 08:40:43 +02:00
parent 79877e9ee5
commit 56f2dfe17f
2 changed files with 13 additions and 0 deletions

View File

@ -84,6 +84,7 @@ func runMigrations(db *sql.DB) {
"migrations/001_create_tables.sql", "migrations/001_create_tables.sql",
"migrations/002_seed_products.sql", "migrations/002_seed_products.sql",
"migrations/003_create_admin_users.sql", "migrations/003_create_admin_users.sql",
"migrations/004_seed_asp_terminia.sql",
} }
for _, f := range files { for _, f := range files {
data, err := os.ReadFile(f) data, err := os.ReadFile(f)

View File

@ -0,0 +1,12 @@
-- Z1: proizvod ASP-Terminia (ASP repo docs/asp-terminia/03-zadaci.md)
--
-- limits/features su PLACEHOLDER dok vlasnik ne odluci pakete (basic/pro).
-- Server ih ne tumaci (json.RawMessage, cist passthrough) i firmware ih
-- JOS NE CITA (enforcement dolazi kasnije, zadatak Z4) - menjanje ovih
-- vrednosti kasnije NE trazi novu migraciju, samo UPDATE reda, i ne utice
-- na vec izdate licence (svaka licenca nosi SVOJE limits/features, ne
-- nasledjuje default proizvoda posle izdavanja).
INSERT IGNORE INTO products (code, name, key_prefix, default_limits, available_features) VALUES
('ASP-TERMINIA', 'ASP-Terminia', 'ASP-',
'{"max_readers": 4, "max_cards": 5000}',
'["FEAT_CARDCHECK", "FEAT_ISSUE", "FEAT_PRINT", "FEAT_CATALOG", "FEAT_ANTIPASS", "FEAT_SYNC", "FEAT_OTA"]');