diff --git a/docs/plans/2026-02-28-update-channels-design.md b/docs/plans/2026-02-28-update-channels-design.md new file mode 100644 index 0000000..6c056ca --- /dev/null +++ b/docs/plans/2026-02-28-update-channels-design.md @@ -0,0 +1,113 @@ +# Design: Dwukanałowy system aktualizacji + zarządzanie licencjami + +**Data:** 2026-02-28 +**Status:** Zatwierdzony + +## Kontekst + +cmsPRO jest używany przez wielu klientów. Celem jest wprowadzenie dwustopniowej dystrybucji aktualizacji: +- Kanał **beta** — tylko wybrane testowe instalacje (1–2 strony dewelopera) +- Kanał **stable** — wszyscy pozostali klienci + +Zarządzanie odbywa się z panelu admina na `cmspro.project-dc.pl` (ten sam serwer i DB co serwer aktualizacji). + +**Kluczowe ograniczenie:** nowy moduł admina oraz nowe tabele DB nigdy nie trafiają do paczek aktualizacyjnych wysyłanych klientom. + +--- + +## Sekcja 1: Baza danych + +Dwie nowe tabele tworzone **ręcznie tylko na serwerze dewelopera**. Nie mogą pojawić się w żadnym SQL migracyjnym dla klientów. + +```sql +CREATE TABLE pp_update_licenses ( + id INT AUTO_INCREMENT PRIMARY KEY, + `key` VARCHAR(64) NOT NULL UNIQUE, + domain VARCHAR(255) NOT NULL, + valid_to_date DATE NULL, + valid_to_version VARCHAR(10) NULL, + beta TINYINT(1) NOT NULL DEFAULT 0, + note TEXT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +); + +CREATE TABLE pp_update_versions ( + id INT AUTO_INCREMENT PRIMARY KEY, + version VARCHAR(10) NOT NULL UNIQUE, + channel ENUM('beta','stable') NOT NULL DEFAULT 'beta', + created_at DATETIME DEFAULT CURRENT_TIMESTAMP, + promoted_at DATETIME NULL +); +``` + +Dane z `updates/versions.php` (tablica `$license`) migrujemy jednorazowo do `pp_update_licenses`. + +--- + +## Sekcja 2: Plik `updates/versions.php` + +Plik zostaje w tym samym miejscu, zmienia się tylko logika (hardkodowane tablice zastępowane odczytem z DB). + +### Nowy przepływ: + +1. `require_once '../config.php'` → dostęp do `$mdb` (Medoo) +2. Skan filesystem — lista istniejących ZIPów (jak dotychczas) +3. **Auto-discovery:** każdy ZIP nieobecny w `pp_update_versions` → `INSERT IGNORE` z `channel='beta'`. Wrzucenie nowego ZIPa na serwer automatycznie rejestruje go jako beta — bez zmian w `build-update.ps1`. +4. Walidacja klucza z `pp_update_licenses` (zamiast `$license[...]`) +5. Filtrowanie wersji według kanału: + - klient z `beta=1` → wersje gdzie `channel IN ('beta','stable')` + - klient z `beta=0` → tylko `channel='stable'` +6. Dalsze filtrowanie po `valid_to_date` i `valid_to_version` (bez zmian) +7. Wypisanie listy wersji (jak dotychczas) + +--- + +## Sekcja 3: Nowy moduł admina `Releases` + +Nowa nazwa `Releases` (odróżnienie od istniejącego modułu `Update` używanego przez klientów do aktualizacji własnej instalacji). + +### Zakładka "Wersje" + +- Tabela z `pp_update_versions` + status istnienia ZIPa na dysku +- Kolumny: wersja, kanał, data dodania, data promocji +- Akcje: **Promuj do stable** / **Cofnij do beta** + +### Zakładka "Licencje" + +- Tabela z `pp_update_licenses` +- Kolumny: domena, klucz (skrócony hash), ważna do daty, ważna do wersji, beta (toggle), notatka +- Pełny CRUD: dodaj / edytuj / usuń +- Szybki toggle flagi `beta` bezpośrednio z listy + +### Pliki modułu + +Wszystkie wykluczone z paczek ZIP dla klientów: + +``` +autoload/admin/controls/class.Releases.php +autoload/admin/factory/class.Releases.php +autoload/admin/view/class.Releases.php +admin/templates/releases/main-view.php +admin/templates/releases/licenses-view.php +``` + +--- + +## Sekcja 4: Wykluczenie z aktualizacji klientów + +### Pliki PHP +W `build-update.ps1` — dodanie powyższych ścieżek do listy wykluczeń. + +### Tabele DB +`pp_update_licenses` i `pp_update_versions` **nigdy** nie pojawiają się w: +- plikach `_sql.txt` dołączanych do paczek +- sekcji `sql` w plikach `_manifest.json` + +Tabele tworzone jednorazowo ręcznie na serwerze dewelopera. + +--- + +## Migracja danych + +Jednorazowy skrypt PHP (uruchamiany ręcznie na serwerze) przenosi dane z `$license[...]` z `versions.php` do `pp_update_licenses`. Po migracji tablica `$license` w `versions.php` jest usuwana.