From 74c67555ed9fc2325d4e108ee9529bdad55aa8be Mon Sep 17 00:00:00 2001 From: LeonardoBizzoni Date: Thu, 26 May 2022 15:48:45 +0200 Subject: [PATCH] Docs and list page --- README.org | 6 +- dockerfiles/README.org | 9 +++ media/dbER.jpg | Bin 0 -> 18728 bytes .../m_1653570702_notificationColFavVtuber.php | 21 ++++++ www/README.org | 71 ++++++++++++------ www/controllers/SiteController.php | 20 ++++- www/pub/css/list.css | 8 ++ www/pub/css/main.css | 0 www/views/layouts/list.php | 5 +- www/views/layouts/main.php | 1 - www/views/list.php | 49 ++++++++++-- 11 files changed, 150 insertions(+), 40 deletions(-) create mode 100644 media/dbER.jpg create mode 100644 www/Migrations/m_1653570702_notificationColFavVtuber.php create mode 100644 www/pub/css/list.css delete mode 100644 www/pub/css/main.css diff --git a/README.org b/README.org index 7ad1dd6..5684faf 100644 --- a/README.org +++ b/README.org @@ -45,7 +45,6 @@ Il suo compito principale è quello di mostrare e ricevere informazioni dal clie Ho deciso di utilizzare Nginx come web server per le migliori performance e leggerezza in confronto ad altri web server. Inoltre la configura di Nginx è molto più semplice di web server come Apache. -[[./media/nginxApacheGraph.png]] *** Application Layer - PHP L'application layer rappresenta il cuore dell'applicazione. @@ -67,10 +66,11 @@ Il data layer si occupa della gestione ed immagazinamento dei dati generati dall L'installazione del database server mariadb viene anch'essa eseguita tramite un docker container e la container image disponibile su [[https://hub.docker.com/_/mariadb][hub.docker]] per cui non ha bisogno di alcuna configurazione. -**** Schema E/R +**** Schema E/R ed analisi delle molteplicità [[./media/dbER.jpg]] -#TODO: descrizione schema ER +Un utente può avere più vtuber preferite. +Una vtuber può essere la preferita di più utenti. **** Schema logico [[./media/dbLogico.jpg]] diff --git a/dockerfiles/README.org b/dockerfiles/README.org index 5ae4ac6..2cd7483 100644 --- a/dockerfiles/README.org +++ b/dockerfiles/README.org @@ -1,9 +1,18 @@ #+TITLE: Containers * Contenuti :TOC: +- [[#perchè-i-container][Perchè i container]] - [[#gestione-containers][Gestione containers]] - [[#creazione-ed-esecuzione-containers][Creazione ed esecuzione containers]] +* Perchè i container +Ho deciso di realizzare questo progetto utilizzando i container per poter separare i processi server in esecuzione dall'ambiente di sviluppo. +In questo modo ho a disposizione 3 container isolati, con il proprio file system, che sono facilmente spostabili ad altre macchine. + +Un'alternativa ai container poteva essere l'utilizzo delle virtual machine che però possono causare svariati problemi: +- utilizzo maggiore delle risorse hardware, dato che una virtual machine ha il proprio hardware virtuale, il proprio sistema operativo, i propri driver e servizi in esecuzione +- maggiore difficoltà nell'installazione e configurazione dei server, tramite Dockerfile e docker-compose configurare ed installare i server nel container è molto semplice a differenza delle VM dove è necessario eseguire tutto manualmente + * Gestione containers La creazione e gestione dei container viene effettuata tramite *docker-compose* ed il file di configurazione [[./docker-compose.yml][docker-compose.yml]]. Il file di configurazione utilizza il linguaggio markup YAML ed è composto da 2 parti principali: diff --git a/media/dbER.jpg b/media/dbER.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a4fb8c98974f0f1c0f5a53af379fbf941e1cdcff GIT binary patch literal 18728 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 literal 0 HcmV?d00001 diff --git a/www/Migrations/m_1653570702_notificationColFavVtuber.php b/www/Migrations/m_1653570702_notificationColFavVtuber.php new file mode 100644 index 0000000..c638cb0 --- /dev/null +++ b/www/Migrations/m_1653570702_notificationColFavVtuber.php @@ -0,0 +1,21 @@ +db; + $sql = "ALTER TABLE favoriteVtuber ADD COLUMN notify BOOL DEFAULT 1;"; + $db->pdo->exec($sql); + } + + public function down() + { + $db = Application::$app->db; + $sql = "ALTER TABLE favoriteVtuber DROP COLUMN notify;"; + $db->pdo->exec($sql); + } +} +?> diff --git a/www/README.org b/www/README.org index 47ca122..d049e9d 100644 --- a/www/README.org +++ b/www/README.org @@ -10,28 +10,44 @@ * Realizzazione La web app è strutturata seguendo il *Model View Controller* framework. +Quando un utente visita la pagina, viene inizializzato il core dell'applicazione. +Il core è dotato di diversi classi fondamentali per il corretto funzionamento della web app, tra cui: +- Application +- Router +- Session +- Le base class per model e controller + Per gestire le dipendenze e namespaces di PHP viene utilizzato *composer*. ** Entry point - index.php -La home page, si occupa di inizializzare l'applicazione ed impostare le route con annesso array [Controller, metodo]. +La home page, si occupa di inizializzare l'applicazione ed impostare le route. +Una route è formata da: +- *metodo*: rappresentato dal metodo della classe router utilizzato (/come in esempio/) +- *path*: il primo parametro da passare al metodo get/post del router (nell'esempio "/") +- *callback*: il secondo parametro da passare al metodo e può essere: + + una funzione che verrà eseguita quando l'utente visita il path specificato + + il nome di una *view*, deve coincidere con un file nella directory view + + un array formato da [ *ControllerClass*, "*metodo*" ] #+begin_src php $app = new Application(dirname(__DIR__)); -$app->router->get("/", [SiteController::class, "home"]); -#+end_src -** Core -*** Main application class -La classe principale, si occupa di istanziare: -- la Router class -- la Request helper class -- la Response helper class +# Esempio con funzione +$app->router->get("/esempio0", function () { + echo "hello world!"; +}); -Rappresenta il fulcro della web app. -Rende possibile l'accesso a tutte le classi da essa istaziate tramite la viariabile statica "$app". +# Esempio con sola view +$app->router->get("/esempio1", "home"); + +# Esempio con controller +$app->router->get("/esempio2", [SiteController::class, "home"]); +#+end_src -Gestisce tutti i controller tramite "BaseController". +Una volta impostate tutte le route disponibili viene chiamato il metodo "run()". +Questo metodo a sua volta chiama il router per risolvere la richiesta effettuata utente. +** Core *** Router class Una delle classi principali è il Router, gestisce l'array associativo "$routes" e la risoluzione delle varie request effettuate. @@ -136,8 +152,8 @@ if ($ruleName == self::RULE_MATCH && $value != $this->{$rule["match"]}) { #+end_src *** Database class -Il compito della Database class è quello di effettuare una connessione al server mariadb in esecuzione sul docker container ed applicare delle [[./www/Migrations][migration]]. -Sia le credenziali di accesso al database che il domain service name (DSN) sono salvate nel file "www/.env" (vedi [[./www/.env.example][.env.example]]) e per leggerle si utilizza il package [[https://github.com/vlucas/phpdotenv][phpdotenv]]. +Il compito della Database class è quello di effettuare una connessione al server mariadb in esecuzione sul docker container ed applicare delle [[./Migrations][migration]]. +Sia le credenziali di accesso al database che il domain service name (DSN) sono salvate nel file "www/.env" (vedi [[./.env.example][.env.example]]) e per leggerle si utilizza il package [[https://github.com/vlucas/phpdotenv][phpdotenv]]. Installazione phpdotenv: #+begin_src bash @@ -150,13 +166,9 @@ Attraverso il metodo "applyMigrations()" la Database class è in grado di: - selezionare le migration presenti nella migration table - per ogni migration non presente nel DB, creare un'istanza ed esegue il metodo "up()" -*** Database model class -La classe DbModel si basa sulla base Database class ma viene trattata come l'effettiva SQL table. - ** Migrations - È importante che le migration class siano ordinate e che seguano tutte lo stesso stile di nomeclatura. -La creazione di una migration class può essere effettuata tramite lo script [[./scripts/createMigration.sh][createMigration]]. +La creazione di una migration class può essere effettuata tramite lo script [[../scripts/createMigration.sh][createMigration]]. #+begin_src bash ./scripts/createMigration pathToMigrationsDir migrationName #+end_src @@ -168,7 +180,7 @@ Ogni migration class è formata da _almeno_ 2 metodi: - "down()": esegue del codice SQL per annullare la modifica ** Models -Le classi "Model" gestiscono i dati presenti nel database e controlla che i dati seguano delle determinate regole. +Le classi "Model" gestiscono i dati presenti nel database o inseriti dall'utente e controllano che i dati seguano delle determinate regole. Tutte le classi Model derivano dalla classe "BaseModel" o "DbModel". *** Registration model - User model @@ -192,13 +204,22 @@ Model utilizzato per interagire con il database di vtuber. Simile al model di registrazione ma con 2 importanti metodi: - *getVtuberInfo()*: controlla che il link inserito sia l'URL ad un canale twitch o youtube ed utilizzando i rispettivi API(Twitch o Google) recupara le informazioni della vtuber in questione -- *isLive()*: controlla se la vtuber in questione è live o no, utilizzando l'API Twitch o tramite curl request per canali YT +- *isLive()*: controlla se la vtuber in questione è live o no ** Controllers -Le classi "Controller" svolgono il ruolo di ponte. +Le classi "Controller" svolgono il ruolo di ponte tra: +- view <-> utente +- view <-> model + Esse permettono ai dati di apparire nella View richiesta dall'utente una volta prelevati dal database o di venirvi inseriti tramite una form. *** Authentication controller -L'authentication controller ha 2 compiti fondamentali: -- registrare nuovi utenti con l'aiuto della classe "RegisterModel" -- permettere l'accesso ad utenti già registrati +L'authentication controller ha 3 compiti fondamentali: +- registrare nuovi utenti (register) +- permettere l'accesso ad utenti già registrati (login) +- permettere ad utente registrati di uscire dal proprio account (logout) + +*** SiteController +Questo controller è il controller principale della pagina, implementa infatti i 2 metodi: +- *list()*: effettua il check dei dati in trasito verso la pagina contente la lista di vtuber preferite dell'utente +- *live()*: effettua il check dei dati in trasito verso la pagina principale diff --git a/www/controllers/SiteController.php b/www/controllers/SiteController.php index d08b973..8f2992a 100644 --- a/www/controllers/SiteController.php +++ b/www/controllers/SiteController.php @@ -9,10 +9,24 @@ use app\models\Vtubers; class SiteController extends BaseController { - public function list() + public function list(Request $req) { Application::$app->router->title = "WeebSite - Your top vtubers"; $this->setLayout("list"); + + if ($req->getMethod() == "post") { + if (isset($req->getBody()["rem"])) { + $stmt = Application::$app->db->pdo->prepare("DELETE FROM favoriteVtuber WHERE _userID=" . Application::$app->user->id . " AND _vtuberID=" . $req->getBody()["rem"]); + $stmt->execute(); + } else if (isset($req->getBody()["notNotify"])) { + $stmt = Application::$app->db->pdo->prepare("UPDATE favoriteVtuber SET notify=0 WHERE _vtuberID=" . $req->getBody()["notNotify"]); + $stmt->execute(); + } else if (isset($req->getBody()["notify"])) { + $stmt = Application::$app->db->pdo->prepare("UPDATE favoriteVtuber SET notify=1 WHERE _vtuberID=" . $req->getBody()["notify"]); + $stmt->execute(); + } + } + return $this->render("list"); } @@ -41,9 +55,9 @@ class SiteController extends BaseController $statement->execute(); foreach ($statement->fetchAll() as $vtuber) { - $params[] = [ $vtuber, $vtuberModel->isLive($vtuber["login"], $vtuber["link"]) ]; + $params[] = [$vtuber, $vtuberModel->isLive($vtuber["login"], $vtuber["link"])]; if ($singleVtuber) { - Application::$app->router->title = "WeebSite - ".$vtuber["username"]; + Application::$app->router->title = "WeebSite - " . $vtuber["username"]; } } } diff --git a/www/pub/css/list.css b/www/pub/css/list.css new file mode 100644 index 0000000..e2862cb --- /dev/null +++ b/www/pub/css/list.css @@ -0,0 +1,8 @@ +.vtuber-img { + width: 88px; + height: 88px; +} + +td { + vertical-align: middle; +} diff --git a/www/pub/css/main.css b/www/pub/css/main.css deleted file mode 100644 index e69de29..0000000 diff --git a/www/views/layouts/list.php b/www/views/layouts/list.php index 26b9e6b..c989aca 100644 --- a/www/views/layouts/list.php +++ b/www/views/layouts/list.php @@ -9,9 +9,9 @@ use app\core\Application; - + - Document + <?= $this->title ?> @@ -48,6 +48,7 @@ use app\core\Application; Username + diff --git a/www/views/layouts/main.php b/www/views/layouts/main.php index a4a71f8..e5e2f63 100644 --- a/www/views/layouts/main.php +++ b/www/views/layouts/main.php @@ -9,7 +9,6 @@ use app\core\Application; - <?= $this->title ?> diff --git a/www/views/list.php b/www/views/list.php index 30b09ce..b9050f2 100644 --- a/www/views/list.php +++ b/www/views/list.php @@ -2,12 +2,49 @@ use app\core\Application; -if (!Application::isGuest()) : -?> +if (!Application::isGuest()) { + $stmt = Application::$app->db->pdo->prepare(" +SELECT vtubers.id, img, vtubers.username, notify +FROM users, vtubers, favoriteVtuber +WHERE users.id = _userID +AND vtubers.id = _vtuberID +AND users.id = ". Application::$app->user->id); + $stmt->execute(); + while ($row = $stmt->fetch()) { + if ($row["notify"] == 1) { + $disable = ""; + $enable = "disabled"; + } else { + $disable = "disabled"; + $enable = ""; + } -res->redirect("/"); + echo " + + +{$row["username"]} + +
+ +
+ + +
+ +
+ + +
+ +
+ + +"; + } -endif; ?> +} +else { + Application::$app->res->redirect("/"); +} +?> -- 2.52.0