From f7a7c3457bdaed4aadfe29ce4ff8e0b61529d6ae Mon Sep 17 00:00:00 2001 From: Chris Date: Sun, 22 Oct 2023 23:05:24 +0200 Subject: [PATCH] man kann hunde anlegen yay --- README.md | 3 +- web/inc/classes/Model.class.php | 46 ++++++--- web/inc/core.php | 2 +- web/index.php | 4 +- web/models/Dog.model.php | 17 ++++ web/models/User.model.php | 1 + web/pages/admin/controller.php | 8 +- web/pages/admin/edituser.html | 2 +- web/pages/dog/controller.php | 16 --- web/pages/dog/dog.html | 32 ------ web/pages/dogs/controller.php | 147 ++++++++++++++++++++++++++++ web/pages/dogs/edit.html | 38 +++++++ web/pages/dogs/list.html | 48 +++++++++ web/pages/home/home.html | 2 +- web/pages/register/controller.php | 15 ++- web/pages/register/register.html | 4 +- web/templates/partials/error.html | 4 +- web/templates/partials/info.html | 4 +- web/templates/partials/success.html | 4 +- 19 files changed, 314 insertions(+), 83 deletions(-) create mode 100644 web/models/Dog.model.php delete mode 100644 web/pages/dog/controller.php delete mode 100644 web/pages/dog/dog.html create mode 100644 web/pages/dogs/controller.php create mode 100644 web/pages/dogs/edit.html create mode 100644 web/pages/dogs/list.html diff --git a/README.md b/README.md index e802fcf..1036262 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ https://gitea.haschek.at/Crispi/dogstats ## Techstack - [HTMX](https://htmx.org/docs/) -- [Tailwind](https://flowbite.com/docs/components/) +- [Tailwind](https://flowbite.com/docs/components/accordion/) +- [Font Awesome 5 Pro](https://fontawesome.com/v5/search) ## Start Dev diff --git a/web/inc/classes/Model.class.php b/web/inc/classes/Model.class.php index 0d049e5..31f70f1 100644 --- a/web/inc/classes/Model.class.php +++ b/web/inc/classes/Model.class.php @@ -57,34 +57,54 @@ class Model { public function save() { + if (!$this->id) + $this->id = gen_ulid(); if (!$this->validate()) return false; foreach($this->dbFields as $field=>$options) { if(isset($this->data[$field])) - $this->redis->hset($this->dbTable.':'.$this->id,$field,$this->data[$field]); + { + error_log($field.' -> '.$options['type']); + if($options['type']=='array') + $GLOBALS['redis']->hset($this->dbTable.':'.$this->id,$field,json_encode($this->data[$field])); + else + { + + error_log("hset $this->dbTable:$this->id $field {$this->data[$field]}"); + $GLOBALS['redis']->hset($this->dbTable.':'.$this->id,$field,$this->data[$field]); + } + } + } + + return $this->id; } public function load($id) { $this->id = $id; - if(!$this->redis->exists($this->dbTable.':'.$this->id)) + if(!$GLOBALS['redis']->exists($this->dbTable.':'.$this->id)) return false; $keys = array_keys($this->dbFields); foreach($keys as $key) { - $value = $this->redis->hget($this->dbTable.':'.$this->id,$key); + $value = $GLOBALS['redis']->hget($this->dbTable.':'.$this->id,$key); if($value!==NULL) //we'll leave null values - switch($this->dbFields[$key]['type']) - { - case 'int': $value = intval($value);break; - case 'bool': $value = boolval($value);break; - case 'float': $value = floatval($value);break; - case 'double': $value = doubleval($value);break; - } + switch($this->dbFields[$key]['type']) + { + case 'int': $value = intval($value);break; + case 'bool': $value = boolval($value);break; + case 'float': $value = floatval($value);break; + case 'double': $value = doubleval($value);break; + case 'array': + $value = json_decode($value,true); + if($value===null) + $value = []; + break; + } $this->data[$key] = $value; } @@ -148,6 +168,10 @@ class Model { throw new Exception("$type validation failed"); } break; + case 'array': + if(!is_array($value)) + throw new Exception('Dogs validation failed'); + break; case 'csv': case "text": $regexp = null; @@ -180,7 +204,7 @@ class Model { function delete() { - return $this->redis->del($this->dbTable.':'.$this->id); + return $GLOBALS['redis']->del($this->dbTable.':'.$this->id); } function gen_shorthash(){ diff --git a/web/inc/core.php b/web/inc/core.php index 5de442f..1eddbe5 100644 --- a/web/inc/core.php +++ b/web/inc/core.php @@ -30,7 +30,7 @@ function includeManagement() { $redis = new Redis(); try{ - $redis->pconnect(REDIS_SERVER, REDIS_PORT); + $redis->connect(REDIS_SERVER, REDIS_PORT); if (defined('REDIS_PASS') && REDIS_PASS) $redis->auth(REDIS_PASS); if (defined('REDIS_PREFIX') && REDIS_PREFIX) diff --git a/web/index.php b/web/index.php index 896037b..83a59da 100644 --- a/web/index.php +++ b/web/index.php @@ -1,5 +1,5 @@ ['type'=>'text','required','unique','autoValMethod'=>'gen_ulid'], + 'registered' => ['type'=>'datetime','required','unique','autoValMethod'=>'getDateTime'], + 'name' => ['type'=>'text'], + 'kennel_name' => ['type'=>'text'], + 'breed' => ['type'=>'text'], + 'size' => ['type'=>'text'], //in cm + 'birthday' => ['type'=>'int'], //unix timestamp + 'agility_size' => ['type'=>'int'], //S,M,I,L + 'active' => ['type'=>'int','default'=>1] + ); + +} \ No newline at end of file diff --git a/web/models/User.model.php b/web/models/User.model.php index 8437a74..8804efa 100644 --- a/web/models/User.model.php +++ b/web/models/User.model.php @@ -12,6 +12,7 @@ class User extends Model { 'last_login' => ['type'=>'datetime','required','unique','autoValMethod'=>'getDateTime'], 'token' => ['type'=>'text','required','unique','autoValMethod'=>'uuid4'], 'timezone' => ['type'=>'int'], + 'dogs' => ['type'=> 'array','default'=>[]], 'active' => ['type'=>'int','default'=>0] ); protected $hidden = ['password','token']; diff --git a/web/pages/admin/controller.php b/web/pages/admin/controller.php index 17acbf6..a5c262c 100644 --- a/web/pages/admin/controller.php +++ b/web/pages/admin/controller.php @@ -53,6 +53,10 @@ class Admin extends Page { foreach($_REQUEST as $key => $value) { if($key == 'email') continue; + if($key=='dogs') + { + $value = json_decode(html_entity_decode($value),true); + } $u->$key = $value; } @@ -61,12 +65,12 @@ class Admin extends Page { } catch(Exception $e) { - $this->set('message', $e->getMessage()); + $this->set('errorMessage', $e->getMessage()); $this->set('template', '/templates/partials/error.html'); return; } - $this->set('message', 'Speichern erfolgreich'); + $this->set('successMessage', 'Speichern erfolgreich'); $this->set('template', '/templates/partials/success.html'); } diff --git a/web/pages/admin/edituser.html b/web/pages/admin/edituser.html index 7d6492c..0404e31 100644 --- a/web/pages/admin/edituser.html +++ b/web/pages/admin/edituser.html @@ -22,7 +22,7 @@ - + diff --git a/web/pages/dog/controller.php b/web/pages/dog/controller.php deleted file mode 100644 index 64ad35d..0000000 --- a/web/pages/dog/controller.php +++ /dev/null @@ -1,16 +0,0 @@ -menu_text = 'Dog'; - $this->menu_image = 'far fa-dog'; - $this->menu_priority = 0; - } - - function index() { - $this->set('template', 'dog.html'); - } - -} \ No newline at end of file diff --git a/web/pages/dog/dog.html b/web/pages/dog/dog.html deleted file mode 100644 index ae0a9cc..0000000 --- a/web/pages/dog/dog.html +++ /dev/null @@ -1,32 +0,0 @@ -
-

Hund hinzufügen/bearbeiten

- -
-
- - -
-
- - -
-
- - -
-
- - -
-
- - -
- -
-
\ No newline at end of file diff --git a/web/pages/dogs/controller.php b/web/pages/dogs/controller.php new file mode 100644 index 0000000..e3eedf5 --- /dev/null +++ b/web/pages/dogs/controller.php @@ -0,0 +1,147 @@ +menu_text = 'Meine Hunde'; + $this->menu_image = 'far fa-dog'; + $this->menu_priority = 0; + } + + function setSubmenu() + { + $this->addSubmenuItem('Hunde anzeigen','/dogs','far fa-list-alt'); + $this->addSubmenuItem('Hund hinzufügen','/dogs/add','fas fa-plus-circle'); + } + + function index() { + $dogs = $_SESSION['user']->data['dogs']; + $doggos = []; + + foreach($dogs as $dogid) + { + $dog = new Dog(); + try{ + $dog->load($dogid); + } + catch(Exception $e) + { + continue; + } + if($dog->data) + $doggos[] = array_merge($dog->data,['id'=>$dogid]); + } + + //var_dump($doggos); + + if(count($doggos) > 0) + { + $this->set('doggos',$doggos); + $this->set('template', 'list.html'); + } + else + { + $this->set('template','/templates/partials/info.html'); + $this->set('infoTitle', 'Keine Hunde gefunden'); + $this->set('infoMessage', 'Du hast aktuell noch keine Hunde angelegt. Klicke im Menü auf "Hund hinzufügen" um einen Hund anzulegen.'); + } + } + + function add() { + $this->set('template', 'edit.html'); + } + + function edit() { + if($_REQUEST['submit']) + { + $id = $_REQUEST['dog_id']; + $name = $_REQUEST['name']; + $kennel_name = $_REQUEST['kennel_name']; + $dog_breed = $_REQUEST['dog_breed']; + $dog_size = $_REQUEST['dog_size']; + $dog_birthday = $_REQUEST['dog_birthday']; + $agi_height_category = $_REQUEST['agi_height_category']; + + $error = false; + if(!$name || !$dog_birthday ) + $error = 'Bitte zumindest Name und Geburtsdatum angeben'; + else if(!strtotime($dog_birthday)) + $error = 'Das Geburstdatum ist ungültig. Bitte die Eingabe prüfen'; + + if($error){ + $this->set('errorMessage', $error); + $this->set('template', '/templates/partials/error.html'); + return; + } + else + { + $dog = new Dog(); + if($id) + $dog->load($id); + + $dog->name = $name; + $dog->kennel_name = $kennel_name; + $dog->breed = $dog_breed; + $dog->size = $dog_size; + $dog->birthday = $dog_birthday; + $dog->agility_size = $agi_height_category; + + try + { + $dogid = $dog->save(); + } + catch(Exception $e) + { + $this->set('template', '/templates/partials/error.html'); + $this->set('errorTitle', 'Error'); + $this->set('errorMessage', $e->getMessage()); + return; + } + + //var_dump($_SESSION['user']->data['dogs']); + + if(!is_array($_SESSION['user']->data['dogs']) || !in_array($dogid, $_SESSION['user']->data['dogs'])) // new dog! + { + $_SESSION['user']->data['dogs'][] = $dogid; + try + { + $_SESSION['user']->save(); + } + catch(Exception $e) + { + $this->set('template', '/templates/partials/error.html'); + $this->set('errorTitle', 'Error'); + $this->set('errorMessage', $e->getMessage()); + return; + } + $this->redirect('/dogs'); + } + else + { + $this->set('template', '/templates/partials/success.html'); + $this->set('successMessage', "Daten erfolgreich gespeichert"); + return; + } + + } + } + else + { + //checken ob der den hund eh bearbeiten darf + $id = $this->params[0]; + $dog = new Dog(); + $dog->load($id); + $this->set('dogdata',$dog->data); + $this->set('dogid',$dog->id); + $this->set('template', 'edit.html'); + } + } + + function maySeeThisPage() { + if($_SESSION['user']) //wenn eingeloggt, kein problem + return true; + else return false; + } + +} \ No newline at end of file diff --git a/web/pages/dogs/edit.html b/web/pages/dogs/edit.html new file mode 100644 index 0000000..1f65722 --- /dev/null +++ b/web/pages/dogs/edit.html @@ -0,0 +1,38 @@ +
+

Hund hinzufügen/bearbeiten

+ +
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
\ No newline at end of file diff --git a/web/pages/dogs/list.html b/web/pages/dogs/list.html new file mode 100644 index 0000000..96bfe65 --- /dev/null +++ b/web/pages/dogs/list.html @@ -0,0 +1,48 @@ +

Meine Hunde

+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + Bearbeiten + + Löschen +
+ + + + + +
+
+
+
+
\ No newline at end of file diff --git a/web/pages/home/home.html b/web/pages/home/home.html index fa173ee..83de1e4 100644 --- a/web/pages/home/home.html +++ b/web/pages/home/home.html @@ -43,7 +43,7 @@ - + diff --git a/web/pages/register/controller.php b/web/pages/register/controller.php index 8168262..f7d71a9 100644 --- a/web/pages/register/controller.php +++ b/web/pages/register/controller.php @@ -15,7 +15,6 @@ class Register extends Page { $hash = password_hash($password, PASSWORD_DEFAULT); - $u = new User(); $err = false; @@ -35,8 +34,8 @@ class Register extends Page { if($err) { $this->set('template', '/templates/partials/error.html'); - $this->set('title', 'Error'); - $this->set('message', $err); + $this->set('errorTitle', 'Error'); + $this->set('errorMessage', $err); return; } else @@ -52,22 +51,22 @@ class Register extends Page { catch(Exception $e) { $this->set('template', '/templates/partials/error.html'); - $this->set('title', 'Error'); - $this->set('message', $e->getMessage()); + $this->set('errorTitle', 'Error'); + $this->set('errorMessage', $e->getMessage()); return; } //$this->redirect('/register/success'); return; } - return print_r(['email'=>$email,'password'=>$password,'password2'=>$password2], true); + //return print_r(['email'=>$email,'password'=>$password,'password2'=>$password2], true); } function success() { $this->set('template', '/templates/partials/success.html'); - $this->set('title', 'Success'); - $this->set('message', 'You have successfully registered. Activate your account from the Link in your email'); + $this->set('successTitle', 'Success'); + $this->set('successMessage', 'You have successfully registered. Activate your account from the Link in your email'); } function test() diff --git a/web/pages/register/register.html b/web/pages/register/register.html index 1030448..200a2c4 100644 --- a/web/pages/register/register.html +++ b/web/pages/register/register.html @@ -4,9 +4,7 @@

Register

-
- -
+
diff --git a/web/templates/partials/error.html b/web/templates/partials/error.html index 1737366..17a8363 100644 --- a/web/templates/partials/error.html +++ b/web/templates/partials/error.html @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/web/templates/partials/info.html b/web/templates/partials/info.html index c1386e0..5d576a9 100644 --- a/web/templates/partials/info.html +++ b/web/templates/partials/info.html @@ -1,4 +1,4 @@ \ No newline at end of file diff --git a/web/templates/partials/success.html b/web/templates/partials/success.html index 3f2a672..b0e265c 100644 --- a/web/templates/partials/success.html +++ b/web/templates/partials/success.html @@ -1,4 +1,4 @@ \ No newline at end of file