diff --git a/app/Model/Facade/DatabazeFacade.php b/app/Model/Facade/DatabazeFacade.php new file mode 100644 index 0000000..6d5a47f --- /dev/null +++ b/app/Model/Facade/DatabazeFacade.php @@ -0,0 +1,27 @@ +masterDb->fetchAll( + 'SELECT ID, EMAIL, POSLEDNI_PRIHLASENI, AKTIVNI, [DATABASE], [SERVER], FIRMA_ID, IS_ADMIN + FROM dbo.LOGIN + ORDER BY [DATABASE], EMAIL' + ); + } +} diff --git a/app/Model/Security/Authentificator.php b/app/Model/Security/Authentificator.php index b5523e5..90243ea 100644 --- a/app/Model/Security/Authentificator.php +++ b/app/Model/Security/Authentificator.php @@ -28,7 +28,7 @@ class Authenticator implements IAuthenticator // 1. Načtení uživatele podle tvého přesného schématu UZIVATEL $row = $this->masterDb->fetch( - 'SELECT ID, EMAIL, HESLO_HASH, [DATABASE], [SERVER], FIRMA_ID + 'SELECT ID, EMAIL, HESLO_HASH, [DATABASE], [SERVER], FIRMA_ID, IS_ADMIN FROM dbo.LOGIN WHERE EMAIL = ? AND AKTIVNI = 1', $email @@ -57,14 +57,17 @@ class Authenticator implements IAuthenticator //$firmaId = $firmaRow ? $firmaRow->FIRMA_ID : $row->ID; // 4. Předání dat do Nette Identity + $isAdmin = (bool) $row->IS_ADMIN; + return new SimpleIdentity( $row->ID, - null, // role + $isAdmin ? 'admin' : 'user', [ 'email' => $row->EMAIL, 'database' => $row->DATABASE, // Nulllable -> KufrikConnectionFactory použije default_db 'server' => $row->SERVER, 'firma_id' => (int) $row->FIRMA_ID, // Zpřístupní $user->identity->firma_id + 'is_admin' => $isAdmin, ] ); } diff --git a/app/UI/@layout.latte b/app/UI/@layout.latte index b49d9b6..2bac57e 100644 --- a/app/UI/@layout.latte +++ b/app/UI/@layout.latte @@ -65,6 +65,16 @@ Kufřík + + + {if $user->isInRole('admin')} + + {/if} {/if} @@ -214,6 +224,22 @@ + + {if $user->isInRole('admin')} +
+
+ + + Databáze + + + + Statistika + +
+
+ {/if} + diff --git a/app/UI/Admin/AdminPresenter.php b/app/UI/Admin/AdminPresenter.php new file mode 100644 index 0000000..7ca7798 --- /dev/null +++ b/app/UI/Admin/AdminPresenter.php @@ -0,0 +1,49 @@ +getUser()->isInRole('admin')) { + $this->error('Sekce Admin je dostupná pouze administrátorovi systému.', 403); + } + } + + public function actionDefault(): void + { + $this->redirect('databaze'); + } + + public function renderDatabaze(): void + { + $loginy = $this->databazeFacade->getAll(); + $aktivniCount = 0; + + foreach ($loginy as $login) { + if ($login->AKTIVNI) { + $aktivniCount++; + } + } + + $this->template->loginy = $loginy; + $this->template->celkemCount = count($loginy); + $this->template->aktivniCount = $aktivniCount; + } + + public function renderStatistika(): void + { + } +} diff --git a/app/UI/Admin/databaze.latte b/app/UI/Admin/databaze.latte new file mode 100644 index 0000000..adbac4c --- /dev/null +++ b/app/UI/Admin/databaze.latte @@ -0,0 +1,95 @@ +{block content} + + + + +
+
+

Přehled databází

+
+ +
+
+
+
Celkem databází
+
{$celkemCount} ks
+
+
+
+
+
Aktivní
+
{$aktivniCount} ks
+
+
+
+ +
+
+ + + + + + + + + + + + + + {foreach $loginy as $login} + + + + + + + + + + {/foreach} + +
DatabázeServerLoginFirma IDPoslední přihlášeníStavRole
+ {$login->DATABASE} + {$login->SERVER} + {$login->EMAIL} + {$login->FIRMA_ID} + {if $login->POSLEDNI_PRIHLASENI} + {$login->POSLEDNI_PRIHLASENI|date:'d.m.Y H:i'} + {else} + — + {/if} + + {if $login->AKTIVNI} + Aktivní + {else} + Neaktivní + {/if} + + {if $login->IS_ADMIN} + Admin + {else} + Uživatel + {/if} +
+
+
+
+ + + + +{syntax off} + +{/syntax} diff --git a/app/UI/Admin/statistika.latte b/app/UI/Admin/statistika.latte new file mode 100644 index 0000000..df43c83 --- /dev/null +++ b/app/UI/Admin/statistika.latte @@ -0,0 +1,11 @@ +{block content} + +
+
+

+ Statistika +

+
+

Systémové statistiky budou doplněny.

+
+
diff --git a/config/services.neon b/config/services.neon index db5fc72..ba45d08 100644 --- a/config/services.neon +++ b/config/services.neon @@ -6,6 +6,9 @@ services: # Authenticator si vyžádá připojení k Master DB - App\Model\Security\Authenticator(@database.default.connection) + # Seznam databází (LOGIN) z Master DB + - App\Model\Facade\DatabazeFacade(@database.default.connection) + # 1. Factory pro klientskou databázi kufrikConnectionFactory: factory: App\Model\Database\KufrikConnectionFactory(%clientDb.user%, %clientDb.password%) diff --git a/sql/KufrikDB.sql b/sql/KufrikDB.sql index 7c049b7..ac70333 100644 --- a/sql/KufrikDB.sql +++ b/sql/KufrikDB.sql @@ -44,6 +44,7 @@ BEGIN [DATABASE] [nvarchar](128) NOT NULL, [SERVER] [nvarchar](100) NOT NULL, [FIRMA_ID] [int] NOT NULL, -- vazna na tabulku FIRMA v datové DB + [IS_ADMIN] [bit] NOT NULL CONSTRAINT [DF_LOGIN_IS_ADMIN] DEFAULT 0, CONSTRAINT [PK_LOGIN] PRIMARY KEY CLUSTERED ([ID] ASC), CONSTRAINT [UQ_LOGIN_EMAIL] UNIQUE NONCLUSTERED ([EMAIL] ASC) @@ -58,7 +59,8 @@ INSERT INTO dbo.[LOGIN] ( [HESLO_HASH], [DATABASE], [SERVER], - [FIRMA_ID] + [FIRMA_ID], + [IS_ADMIN] ) VALUES ( 1, @@ -67,11 +69,20 @@ VALUES ( N'$2y$12$9SAWctZKp/JpYl7K.awSRehXOXVyRpu0ofReqvbm1jVjvdz41zH7a', N'kufrik', N'localhost', - 1 -- Odkaz na FIRMA.ID = 1 v klientské databázi 'kufrik' + 1, -- Odkaz na FIRMA.ID = 1 v klientské databázi 'kufrik' + 1 -- systémový administrátor ); SET IDENTITY_INSERT dbo.[LOGIN] OFF; GO +-- Existující instalace: sloupec IS_ADMIN +IF COL_LENGTH('dbo.LOGIN', 'IS_ADMIN') IS NULL +BEGIN + ALTER TABLE dbo.LOGIN ADD [IS_ADMIN] [bit] NOT NULL CONSTRAINT [DF_LOGIN_IS_ADMIN] DEFAULT 0; + UPDATE dbo.LOGIN SET [IS_ADMIN] = 1 WHERE [EMAIL] = N'admin@kmetix.cz'; +END +GO + -- ========================================== -- DATOVÁ databáze -- ========================================== diff --git a/sql/add_login_is_admin.sql b/sql/add_login_is_admin.sql new file mode 100644 index 0000000..483472c --- /dev/null +++ b/sql/add_login_is_admin.sql @@ -0,0 +1,9 @@ +USE [kufrik_master] +GO + +IF COL_LENGTH('dbo.LOGIN', 'IS_ADMIN') IS NULL +BEGIN + ALTER TABLE dbo.LOGIN ADD [IS_ADMIN] [bit] NOT NULL CONSTRAINT [DF_LOGIN_IS_ADMIN] DEFAULT 0; + UPDATE dbo.LOGIN SET [IS_ADMIN] = 1 WHERE [EMAIL] = N'admin@kmetix.cz'; +END +GO