Files
cmsPRO/docs/plans/2026-02-28-update-channels-design.md

114 lines
3.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 (12 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.