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')}
+
+ {/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
+
+
+
+
+
+
+
+
+
+ | Databáze |
+ Server |
+ Login |
+ Firma ID |
+ Poslední přihlášení |
+ Stav |
+ Role |
+
+
+
+ {foreach $loginy as $login}
+
+ |
+ {$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}
+ |
+
+ {/foreach}
+
+
+
+
+
+
+
+
+
+{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