WIP AddressDB + api

This commit is contained in:
Frank Schubert
2022-08-25 16:59:54 +02:00
parent 4b39d5a158
commit 36b41b4e5a
23 changed files with 1373 additions and 34 deletions
+68
View File
@@ -0,0 +1,68 @@
<?php
class ADBGemeinde extends mfBaseModel {
public $plz = [];
protected function init() {
$this->db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
}
public function loadByGemeindeCode($code) {
$res = $this->db->select("Gemeinde","*","code=$code");
if($this->db->num_rows($res)) {
$data = $this->db->fetch_object($res);
$this->load($data);
return true;
}
return false;
}
public function find($search) {
$seach = $this->db->escape($search);
if(!$search) {
return false;
}
$results = [];
$res = $this->db->select("Gemeinde", "*", "name like '%$search%'");
if($this->db->num_rows($res)) {
while($data = $this->db->fetch_object($res)) {
$results[] = new ADBGemeinde($data);
}
}
return $results;
}
public function afterLoad() {
$this->loadPlz();
}
public function loadPlz() {
if(!$this->id) {
return false;
}
$plz = [];
$res = $this->db->select("Plz","*","gemeinde_id=".$this->id);
if($this->db->num_rows($res)) {
while($data = $this->db->fetch_object($res)) {
$this->plz[] = new ADBPlz($data);
}
}
return true;
}
public function getPlzList() {
$list = [];
foreach($this->plz as $plz) {
$list[$plz->id] = $plz->plz;
}
return $list;
}
}
@@ -0,0 +1,22 @@
<?php
class ADBGemeindeController extends mfBaseController {
protected function init() {
$db = $this->db(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
}
public function getGemeinden() {
$gemeinden = array();
$res = $this->db()->select("Gemeinde","*","1=1 ORDER BY name");
if($this->db()->num_rows($res)) {
while($data = $this->db()->fetch_object($res)) {
$gemeinden[] = new ADBOrtschaft($data);
}
}
return $gemeinden;
}
}
@@ -0,0 +1,44 @@
<?php
class ADBHausnummer extends mfBaseModel {
public $strasse;
public $status;
public $providers = [];
public $providerlist = [];
protected function init() {
$this->db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
}
public function afterLoad() {
$this->strasse = new ADBStrasse($this->strasse_id);
//$this->loadStatus();
//$this->loadProvider();
}
/*
public function loadStatus() {
if(!$this->id) {
return false;
}
$status = HausnummerStatus::singleton();
$this->status = $status->getObject($this->status_id);
}
public function loadProvider() {
if(!$this->id) {
return false;
}
$res = $this->db->select("HausnummerProvider", "*", "hausnummer_id=".$this->id);
if($this->db->num_rows($res)) {
while($data = $this->db->fetch_object($res)) {
$provider = new Provider($data->provider_id);
$this->providerlist[$provider->id] = $provider->name;
$this->providers[] = $provider;
}
}
return true;
}*/
}
+27
View File
@@ -0,0 +1,27 @@
<?php
class ADBOrtschaft extends mfBaseModel {
protected function init() {
$this->db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
}
public function find($search) {
$seach = $this->db->escape($search);
if(!$search) {
return false;
}
$results = [];
$res = $this->db->select("Ortschaft", "*", "name like '%$search%'");
if($this->db->num_rows($res)) {
while($data = $this->db->fetch_object($res)) {
$results[] = new ADBOrtschaft($data);
}
}
return $results;
}
}
@@ -0,0 +1,21 @@
<?php
class ADBOrtschaftController extends mfBaseController {
protected function init() {
$db = $this->db(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
}
public function getOrte() {
$orte = array();
$res = $this->db()->query("SELECT ortschaft_id AS id FROM view_ort ORDER BY gemeinde_kennziffer,gemeinde,ort");
if($this->db()->num_rows($res)) {
while($data = $this->db()->fetch_object($res)) {
$orte[] = new ADBOrtschaft($data->id);
}
}
return $orte;
}
}
+9
View File
@@ -0,0 +1,9 @@
<?php
class ADBPlz extends mfBaseModel {
protected function init() {
$this->db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
}
}
+14
View File
@@ -0,0 +1,14 @@
<?php
class Strasse extends mfBaseModel {
public $gemeinde = [];
protected function init() {
$this->db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
}
public function afterLoad() {
$this->gemeinde = new ADBGemeinde($this->gemeinde_id);
}
}
@@ -0,0 +1,21 @@
<?php
class StrasseController extends mfBaseController {
protected function init() {
$db = $this->db(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME);
}
public function getStrassen() {
$strassen = array();
$res = $this->db()->query("SELECT strasse_id AS id FROM view_strasse ORDER BY gemeinde_kennziffer,gemeinde,ort,strasse");
if($this->db()->num_rows($res)) {
while($data = $this->db()->fetch_object($res)) {
$strassen[] = new ADBStrasse($data->id);
}
}
return $strassen;
}
}
+111
View File
@@ -0,0 +1,111 @@
<?php
class AddressDB {
private $log;
private $db;
public $data;
public function __contruct() {
}
public function findAddress($search) {
if(!is_array($search)) {
return false;
}
$gemeinde_name = $search['gemeinde_name'];
$ort_name = $search['ort_name'];
$plz = $search['plz'];
$strasse_name = $search['strasse_name'];
$hausnummer = $search['hausnummer'];
$block = $search['block'];
$stiege = $search['stiege'];
$stock = $search['stock'];
$tuer = $search['tuee'];
/*
if($gemeinde_id < 1 || $strasse_id < 1 || !$hausnummer
|| $gemeinde_id > pow(2, 30) || $strasse_id > pow(2, 30) || strlen($hausnummer) > 32) {
$this->redirect('Check','',['status' => 'error']);
}*/
$hausnummerMatch = true;
$gemeinde = new Gemeinde($gemeinde_id);
$strasse = new Strasse($strasse_id);
// try exact hausnummer
$res = $this->db()->select("view_adresseProvider", "*", "gemeinde = '".$gemeinde->name."' AND strasse = '".$strasse->name."' AND hausnummer = '$hausnummer'");
if(!$this->db()->num_rows($res)) {
$hausnummerMatch = false;
// check for anschlüsse in the same street
$res = $this->db()->select("view_adresseProvider", "*", "gemeinde = '".$gemeinde->name."' AND strasse = '".$strasse->name."'");
if(!$this->db()->num_rows($res)) {
// XXX: if breitband stmk
$this->layout()->setTemplate("Check/Result/Fail");
// xdsl anzeigen
return $this->checkVull($request);
}
}
// if multiple hausnummern, anschluss in street available, or multiple providers
if($this->db()->num_rows($res)) {
$addresses = [];
$providers = [];
$homeProvider = false;
$multipleAddress = false;
while($data = $this->db()->fetch_object($res)) {
$addresses[] = new Hausnummer($data->id);
if($data->provider_id == HOME_PROVIDER_ID) {
$homeProvider = true;
}
if(!in_array($data->provider, $providers)) {
$providers[$data->provider_id] = $data->provider;
}
if($data->hausnummer != $hausnummer) {
$multipleAddress = true;
}
}
$pc = new ProductController();
if($homeProvider && $multipleAddress) {
$this->layout()->set("debug", "multi hausnummern, homeprovider");
$this->layout()->setTemplate("Check/Result/Street");
return true;
}
if($homeProvider) {
$this->layout()->set("debug", "single hausnummer, homeprovider");
$this->layout()->setTemplate("Check/Result/Success");
$this->layout()->set("productsPrivate", $pc->getProducts(1, "fiber", "privat"));
$this->layout()->set("productsBusiness", $pc->getProducts(1, "fiber", "business"));
if($data->status == 1) {
$this->layout()->set("debug", "single hausnummer, homeprovider, rohr am grundstück");
$this->layout()->setTemplate("Check/Result/Street");
}
return true;
}
if(!$homeProvider) {
$this->layout()->set("providers", $providers);
$this->layout()->set("debug", "single hausnummer, partner provider");
$this->layout()->setTemplate("Check/Result/SuccessPartner");
return true;
}
return true;
} /*elseif($this->db()->num_rows($res) == 1 && $hausnummerMatch) {
// exactly 1 match
$data = $this->db()->fetch_object($res);
$address = new Hausnummer($data->id);
$this->layout()->set("adresse", $address);
$this->layout()->set("debug", "single address, only homeprovider");
$this->layout()->setTemplate("Check/Result/Success");
return true;
}*/
}
}
@@ -0,0 +1,5 @@
<?php
class AddressDBController extends mfBaseController {
}
+71
View File
@@ -0,0 +1,71 @@
<?php
class OrtApicontroller extends mfBaseApicontroller {
protected function init() {
//$this->addRoute("/home/getAll", "getHomes", "GET");
$this->addRoute("/ort/find", "findOrt", "POST");
//$this->addRoute("/home/:oanid/products", "getHomeProducts", "GET");
}
protected function findOrt() {
$search = $this->post['search'];
if(!$search) {
return mfResponse::BadRequest(['message' => "Suchbegriff darf nicht leer sein!"]);
}
$orte = [];
$ag = new ADBGemeinde();
$results = $ag->find($search);
//var_dump($results);exit;
foreach($results as $result) {
if(is_array($result->plz) && count($result->plz)) {
foreach($result->plz as $plz) {
$orte[] = ['plz' => $plz->plzstring, 'ort' => $result->name];
}
}
}
return mfResponse::Ok(['orte' => $orte]);
}
/*
protected function getHomes() {
$homes = [];
foreach(HomeModel::search(['operationalstate_id' => [5,3]]) as $home) {
$homes[] = $home->getApiArray();
}
return mfResponse::Ok(['homes' => $homes]);
}*/
/*
protected function validateOan($oan_id) {
$home = new Home();
$home->loadByOan($oan_id);
if(!$home->id) {
return mfResponse::NotFound(['oan_d' => $oan_id, 'isValid' => false]);
}
return mfResponse::Ok(['oan_d' => $oan_id, 'isValid' => true]);
}*/
/*
protected function getHomeProducts($oanid) {
$home = new Home();
$home->loadByOan($oanid);
if(!$home->id) {
return mfResponse::NotFound(['message' => "Home not found"]);
}
$products = [];
foreach(ProductModel::search(['provider_id' => $this->me->provider_id]) as $product) {
$products[] = $product->getApiArray();
}
return mfResponse::Ok(["products" => $products]);
}*/
}
+59
View File
@@ -43,6 +43,65 @@ class User extends mfBaseModel {
return false;
}
public function loadByUsername($username) {
$username = $this->db->escape($username);
if(!$username) {
return false;
}
$res = $this->db->select($this->table, "*", "username='$username' LIMIT 1");
if($this->db->num_rows($res)) {
$data = $this->db->fetch_object($res);
$this->load($data);
return true;
}
return false;
}
public function loadByApikey($key) {
$key = $this->db->escape($key);
if(!$key) {
return false;
}
$res = $this->db->select($this->table, "*", "apikey='$key'");
if($this->db->num_rows($res) === 1) {
$data = $this->db->fetch_object($res);
$this->load($data);
return true;
}
return false;
}
public function createApiKey() {
$tries = 3;
$key = false;
while(!$key) {
$source = random_bytes(128);
$key = base64_encode($source);
$key = str_replace(["/","=","+"], "", $key);
$key = substr($key, 0, 32);
$res = $this->db->select($this->table, "id", "apikey='$key'");
if($this->db->num_rows($res) || strlen($key) < 32) {
$key = false;
$tries--;
$this->log->error("new api key not unique ($tries)");
if($tries < 1) {
break;
}
}
}
if(!$key) {
$this->log->error("unable to create unique api key");
return null;
}
return $key;
}
public function getAbbrName() {
if(strpos($this->name, " ") === false) {
return $this->name;
+35
View File
@@ -73,6 +73,30 @@ class UserController extends mfBaseController {
$this->layout()->set("addresses", $addresses);
}
protected function generateApikey($request) {
if(!$this->isAdmin()) {
$this->redirect("Dashboard");
}
$id = $request['id'];
if(!is_numeric($id) || $id < 1) {
$this->layout()->setFlash("User nicht gefunden.", "error");
$this->redirect("User");
}
$user = new User($id);
if(!$user->id) {
$this->layout()->setFlash("User nicht gefunden.", "error");
$this->redirect("User");
}
$user->apikey = $user->createApiKey();
$user->save();
$this->layout()->setFlash("API Key erfolgreich generiert.", "success");
$this->redirect("User", "edit", ['id' => $id]);
}
protected function profileAction($request) {
}
@@ -92,6 +116,17 @@ class UserController extends mfBaseController {
}
$user = new User($id);
// check if new user already exits
if($this->isAdmin() && !$r->id) {
$tu = new User();
$tu->loadByUsername($r->username);
if($tu->id) {
$this->layout()->setFlash("Benutzer mit diesem Benutzername bereits vorhanden!", "error");
$this->redirect("User");
}
}
if(!$user->permissions) {
$user->permissions = new WorkerPermission();
}
+1
View File
@@ -6,6 +6,7 @@ class UserModel {
public $password = null;
public $name = null;
public $email = null;
public $apikey = null;
public $ip = null;
public $sessionid = null;