From 67f9b10b312befeab639f3c259eb30a0ee1696ed Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Wed, 31 Aug 2022 14:40:36 +0200 Subject: [PATCH 1/3] Fixed preorder api results; added CORS headers for docs --- application/Api/v1/AddressdbApicontroller.php | 22 +- public/.htaccess | 2 +- public/docs/preorder-api.yaml | 240 ++++++++++++++++++ 3 files changed, 252 insertions(+), 12 deletions(-) create mode 100644 public/docs/preorder-api.yaml diff --git a/application/Api/v1/AddressdbApicontroller.php b/application/Api/v1/AddressdbApicontroller.php index 4041f9378..0e04e8251 100644 --- a/application/Api/v1/AddressdbApicontroller.php +++ b/application/Api/v1/AddressdbApicontroller.php @@ -12,7 +12,7 @@ class AddressdbApicontroller extends mfBaseApicontroller { } protected function findCity() { - $search = $this->db()->escape($this->post['search']); + $search = $this->db()->escape(trim($this->post['search'])); if(!$search) { return mfResponse::BadRequest(['message' => "Searchstring cannot be empty!"]); } @@ -25,12 +25,12 @@ class AddressdbApicontroller extends mfBaseApicontroller { $cities[] = $result->name; } - $citiesv= array_unique($cities); - return mfResponse::Ok(['cities' => $cities]); + $cities = array_unique($cities); + return mfResponse::Ok(['cities' => array_values($cities)]); } protected function findZip() { - $search = $this->db()->escape($this->post['search']); + $search = $this->db()->escape(trim($this->post['search'])); if(!$search) { return mfResponse::BadRequest(['message' => "Searchstring cannot be empty!"]); } @@ -44,11 +44,11 @@ class AddressdbApicontroller extends mfBaseApicontroller { } $zips = array_unique($zips); - return mfResponse::Ok(['zips' => $zips]); + return mfResponse::Ok(['zips' => array_values($zips)]); } protected function findStreet() { - $search = $this->db()->escape($this->post['search']); + $search = $this->db()->escape(trim($this->post['search'])); if(!$search) { return mfResponse::BadRequest(['message' => "Searchstring cannot be empty!"]); } @@ -62,14 +62,14 @@ class AddressdbApicontroller extends mfBaseApicontroller { } $streets = array_unique($streets); - return mfResponse::Ok(['streets' => $streets]); + return mfResponse::Ok(['streets' => array_values($streets)]); } protected function find() { - $search_street = $this->db()->escape($this->post['street']); - $search_zip = $this->db()->escape($this->post['zip']); - $search_city = $this->db()->escape($this->post['city']); - $search_housenumber = $this->db()->escape($this->post['housenumber']); + $search_street = $this->db()->escape(trim($this->post['street'])); + $search_zip = $this->db()->escape(trim($this->post['zip'])); + $search_city = $this->db()->escape(trim($this->post['city'])); + $search_housenumber = $this->db()->escape(trim($this->post['housenumber'])); if(!$search_street) { diff --git a/public/.htaccess b/public/.htaccess index 82a20271a..1f7f89849 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -1,4 +1,4 @@ -SetEnvIf Origin "(https://docs.breitband-steiermark.at|https://editor.swagger.io)$" AccessControlAllowOrigin=$0 +SetEnvIf Origin "(https://docs.thetool.xinon.at|https://editor.swagger.io)$" AccessControlAllowOrigin=$0 Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS" Header add Access-Control-Allow-Headers: "X-Api-Key" diff --git a/public/docs/preorder-api.yaml b/public/docs/preorder-api.yaml new file mode 100644 index 000000000..e645f5540 --- /dev/null +++ b/public/docs/preorder-api.yaml @@ -0,0 +1,240 @@ +openapi: 3.0.1 +info: + title: thetool Preorder API + description: API Dokumentation für thetool Vorbestellung + contact: + name: thetool Development Team + email: thetool-api-support@xinon.at + license: + name: Apache 2.0 License + url: http://www.apache.org/licenses/LICENSE-2.0.html + version: 1.0.0 +servers: + - url: https://thetool.xinon.at/api/v1 +tags: + - name: addressdb + description: Abfrage von GWR Daten +paths: + /addressdb/findAddress: + post: + tags: + - addressdb + summary: Adressen suchen + description: Sucht nach Adressen + operationId: findAddresses + requestBody: + description: addressSearchRequest object. Parameter müssen mindestens 3 Zeichen lang sein, `zip` muss mindestens 2 Zeichen lang sein. + required: true + content: + 'application/json': + schema: + $ref: '#/components/schemas/Address' + 'application/x-www-form-urlencoded': + schema: + $ref: '#/components/schemas/Address' + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: object + properties: + status: + type: string + description: Status string + example: OK + result: + type: object + properties: + addresses: + $ref: '#/components/schemas/Addresses' + '400': + description: | + Bad Request + + Parameter missing or malformed + '401': + description: Unauthorized + /addressdb/findStreet: + post: + tags: + - addressdb + summary: Straßen suchen + description: Sucht nach Straßen + operationId: findStreets + requestBody: + description: addressComponentSearchRequest object. Parameter `search` muss mindestens 3 Zeichen lang sein. + required: true + content: + 'application/json': + schema: + $ref: '#/components/schemas/addressComponentSearchRequest' + 'application/x-www-form-urlencoded': + schema: + $ref: '#/components/schemas/addressComponentSearchRequest' + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: object + properties: + status: + type: string + description: Status string + example: OK + result: + type: object + properties: + streets: + $ref: '#/components/schemas/Streets' + '400': + description: | + Bad Request + + Parameter missing or malformed + '401': + description: Unauthorized + /addressdb/findZip: + post: + tags: + - addressdb + summary: Postleitzahlen suchen + description: Sucht nach Postleitzahlen + operationId: findZips + requestBody: + description: zipSearchRequest object. Parameter `search` muss mindestens 2 Zeichen lang sein. + required: true + content: + 'application/json': + schema: + $ref: '#/components/schemas/zipComponentSearchRequest' + 'application/x-www-form-urlencoded': + schema: + $ref: '#/components/schemas/zipComponentSearchRequest' + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: object + properties: + status: + type: string + description: Status string + example: OK + result: + type: object + properties: + streets: + $ref: '#/components/schemas/Zips' + '400': + description: | + Bad Request + + Parameter missing or malformed + '401': + description: Unauthorized + /addressdb/findCity: + post: + tags: + - addressdb + summary: Ortschaften suchen + description: Sucht nach Ortschaften + operationId: findCity + requestBody: + description: addressComponentSearchRequest object. Parameter `search` muss mindestens 3 Zeichen lang sein. + required: true + content: + 'application/json': + schema: + $ref: '#/components/schemas/addressComponentSearchRequest' + 'application/x-www-form-urlencoded': + schema: + $ref: '#/components/schemas/addressComponentSearchRequest' + responses: + '200': + description: Successful operation + content: + application/json: + schema: + type: object + properties: + status: + type: string + description: Status string + example: OK + result: + type: object + properties: + streets: + $ref: '#/components/schemas/Cities' + '400': + description: | + Bad Request + + Parameter missing or malformed + '401': + description: Unauthorized +components: + schemas: + addressComponentSearchRequest: + type: object + properties: + search: + type: string + description: Suchbegriff von mindestens 3 Zeichen Länge + minLength: 3 + zipComponentSearchRequest: + type: object + properties: + search: + type: string + description: Suchbegriff von mindestens 2 Zeichen Länge + minLength: 2 + Zips: + type: array + items: + type: string + Cities: + type: array + items: + type: string + Streets: + type: array + items: + type: string + Addresses: + type: array + items: + $ref: '#/components/schemas/Address' + Address: + type: object + properties: + street: + type: string + description: Straße + housenumber: + type: string + description: Hausnummer + zip: + type: string + description: PLZ + city: + type: string + description: Ortschaft + securitySchemes: + api_key_header: + type: apiKey + name: X-Api-Key + in: header + api_key_query: + type: apiKey + name: apikey + in: query +security: + - api_key_header: [] + - api_key_query: [] From 976ab357a521dc82319405446fec010de24f2499 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Thu, 1 Sep 2022 13:25:14 +0200 Subject: [PATCH 2/3] Added dev domain to CORS headers --- public/.htaccess | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/.htaccess b/public/.htaccess index 1f7f89849..f717870af 100644 --- a/public/.htaccess +++ b/public/.htaccess @@ -1,4 +1,4 @@ -SetEnvIf Origin "(https://docs.thetool.xinon.at|https://editor.swagger.io)$" AccessControlAllowOrigin=$0 +SetEnvIf Origin "^(https://docs.thetool.xinon.at|https://editor.swagger.io|.*abstellgleis.at)$" AccessControlAllowOrigin=$0 Header add Access-Control-Allow-Origin %{AccessControlAllowOrigin}e env=AccessControlAllowOrigin Header add Access-Control-Allow-Methods: "GET,POST,OPTIONS" Header add Access-Control-Allow-Headers: "X-Api-Key" From e900b305a8a192977feb0a85ca95649fa8152554 Mon Sep 17 00:00:00 2001 From: Frank Schubert Date: Thu, 1 Sep 2022 14:39:37 +0200 Subject: [PATCH 3/3] some changes to AddressDB --- application/ADBGemeinde/ADBGemeinde.php | 12 +++---- application/ADBHausnummer/ADBHausnummer.php | 31 ++----------------- .../ADBHausnummer/ADBHausnummerModel.php | 13 ++++++-- application/ADBOrtschaft/ADBOrtschaft.php | 1 + application/ADBPlz/ADBPlzModel.php | 20 ++++++------ application/AddressDB/AddressDB.php | 10 +++--- application/Api/v1/AddressdbApicontroller.php | 8 ++--- 7 files changed, 40 insertions(+), 55 deletions(-) diff --git a/application/ADBGemeinde/ADBGemeinde.php b/application/ADBGemeinde/ADBGemeinde.php index 4dee56996..a32bec397 100644 --- a/application/ADBGemeinde/ADBGemeinde.php +++ b/application/ADBGemeinde/ADBGemeinde.php @@ -1,7 +1,7 @@ loadPlz(); + //$this->loadPlz(); } - public function loadPlz() { + /*public function loadPlz() { if(!$this->id) { return false; } @@ -57,12 +57,12 @@ class ADBGemeinde extends mfBaseModel { } return true; - } + }*/ public function getPlzList() { $list = []; - foreach($this->plz as $plz) { - $list[$plz->id] = $plz->plz; + foreach($this->plzs as $plz) { + $list[$plz->id] = $plz->plzs; } return $list; } diff --git a/application/ADBHausnummer/ADBHausnummer.php b/application/ADBHausnummer/ADBHausnummer.php index c1f36a2bd..c4ab11cc9 100644 --- a/application/ADBHausnummer/ADBHausnummer.php +++ b/application/ADBHausnummer/ADBHausnummer.php @@ -2,6 +2,7 @@ class ADBHausnummer extends mfBaseModel { public $strasse; + public $plz; public $status; public $providers = []; public $providerlist = []; @@ -13,33 +14,7 @@ class ADBHausnummer extends mfBaseModel { public function afterLoad() { $this->strasse = new ADBStrasse($this->strasse_id); - //$this->loadStatus(); - //$this->loadProvider(); + $this->plz = new ADBPlz($this->plz_id); } - /* - 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; - }*/ - + } diff --git a/application/ADBHausnummer/ADBHausnummerModel.php b/application/ADBHausnummer/ADBHausnummerModel.php index 19df84c25..1c120a732 100644 --- a/application/ADBHausnummer/ADBHausnummerModel.php +++ b/application/ADBHausnummer/ADBHausnummerModel.php @@ -1,10 +1,11 @@ select("Plz", "*", "$where ORDER BY gemeinde_id,plz LIMIT 1"); + $res = $db->select("Plz", "*", "$where ORDER BY plz LIMIT 1"); if($db->num_rows($res)) { $data = $db->fetch_object($res); $item = new ADBPlz($data); @@ -58,7 +57,7 @@ class ADBPlzModel { $db = FronkDB::singleton(ADDRESSDB_DBHOST, ADDRESSDB_DBUSER, ADDRESSDB_DBPASS, ADDRESSDB_DBNAME); - $res = $db->select("Plz", "*", "1=1 ORDER BY gemeinde_id,plz"); + $res = $db->select("Plz", "*", "1=1 ORDER BY plz"); if($db->num_rows($res)) { while($data = $db->fetch_object($res)) { $items[] = new ADBPlz($data); @@ -92,7 +91,7 @@ class ADBPlzModel { $where = self::getSqlFilter($filter); $sql = "SELECT Plz.* FROM Plz WHERE $where - ORDER BY gemeinde_id,plz"; + ORDER BY plz"; //mfLoghandler::singleton()->debug($sql); if(is_array($limit) && count($limit)) { @@ -116,13 +115,12 @@ class ADBPlzModel { $where = "1=1 "; - - if(array_key_exists("gemeinde_id", $filter)) { - $gemeinde_id = $filter['gemeinde_id']; - if(is_numeric($gemeinde_id)) { - $where .= " AND Plz.gemeinde_id=$gemeinde_id"; - } elseif(is_array($gemeinde_id) && count($gemeinde_id)) { - $where .= " AND Plz.gemeinde_id IN (". implode(",", $gemeinde_id).")"; + if(array_key_exists("hausnummer_id", $filter)) { + $hausnummer_id = $filter['hausnummer_id']; + if(is_numeric($hausnummer_id)) { + $where .= " AND Plz.hausnummer_id=$hausnummer_id"; + } elseif(is_array($hausnummer_id) && count($hausnummer_id)) { + $where .= " AND Plz.hausnummer_id IN (". implode(",", $hausnummer_id).")"; } } diff --git a/application/AddressDB/AddressDB.php b/application/AddressDB/AddressDB.php index b871261da..97f2660a9 100644 --- a/application/AddressDB/AddressDB.php +++ b/application/AddressDB/AddressDB.php @@ -121,11 +121,11 @@ class AddressDB { die("Error creating Ortschaft $ort_kz $ort_name!\n"); } } + - $plz = ADBPlzModel::getFirst(['gemeinde_id' => $gemeinde->id, 'plz' => $plz_name]); + $plz = ADBPlzModel::getFirst(['plz' => $plz_name]); if(!$plz) { $plz = new ADBPlz(); - $plz->gemeinde_id = $gemeinde->id; $plz->plz = $plz_name; $plz->plzstring = $plz_name; $plz_id = $plz->save(); @@ -133,8 +133,8 @@ class AddressDB { die("Error creating Plz $plz_name!\n"); } } - //var_dump($plz);exit; + $strasse = ADBStrasseModel::getFirst(['gemeinde_id' => $gemeinde->id, 'ortschaft_id' => $ort->id, 'name' => $strasse_name]); if(!$strasse) { @@ -147,12 +147,13 @@ class AddressDB { die("error creating Strasse $strasse_name (gemeinde ".$gemeinde->id.", ort ".$ort->id.")"); } } - //var_dump($strasse);exit; + $hausnummer = ADBHausnummerModel::getFirst(['strasse_id' => $strasse->id, 'hausnummer' => $hausnummer_name]); if(!$hausnummer) { $hausnummer = new ADBHausnummer(); + $hausnummer->plz_id = $plz->id; $hausnummer->strasse_id = $strasse->id; $hausnummer->hausnummer = $hausnummer_name; $hausnummer_id = $hausnummer->save(); @@ -161,6 +162,7 @@ class AddressDB { } } //var_dump($hausnummer);exit; + $we_search = [ 'hausnummer_id' => $hausnummer->id, diff --git a/application/Api/v1/AddressdbApicontroller.php b/application/Api/v1/AddressdbApicontroller.php index 0e04e8251..8a9d782ce 100644 --- a/application/Api/v1/AddressdbApicontroller.php +++ b/application/Api/v1/AddressdbApicontroller.php @@ -17,7 +17,7 @@ class AddressdbApicontroller extends mfBaseApicontroller { return mfResponse::BadRequest(['message' => "Searchstring cannot be empty!"]); } - $results = ADBOrtschaftModel::search(['name%' => $search], ['count' => 20]); + $results = ADBOrtschaftModel::search(['name%' => $search]); $cities = []; @@ -35,7 +35,7 @@ class AddressdbApicontroller extends mfBaseApicontroller { return mfResponse::BadRequest(['message' => "Searchstring cannot be empty!"]); } - $results = ADBPlzModel::search(['plzstring%' => $search], ['count' => 20]); + $results = ADBPlzModel::search(['plzstring%' => $search]); $zips = []; @@ -53,7 +53,7 @@ class AddressdbApicontroller extends mfBaseApicontroller { return mfResponse::BadRequest(['message' => "Searchstring cannot be empty!"]); } - $results = ADBStrasseModel::search(['name%' => $search], ['count' => 20]); + $results = ADBStrasseModel::search(['name%' => $search]); $streets = []; @@ -94,7 +94,7 @@ class AddressdbApicontroller extends mfBaseApicontroller { } //$res = $this->db()->select("view_wohneinheit_plz", "*", $where); - $sql = "SELECT * FROM view_wohneinheit WHERE $where ORDER BY plz, ortschaft, strasse, LENGTH(hausnummer), hausnummer, block, stiege, stock, LENGTH(tuer), tuer LIMIT 20"; + $sql = "SELECT * FROM view_wohneinheit WHERE $where ORDER BY plz, ortschaft, strasse, LENGTH(hausnummer), hausnummer, block, stiege, stock, LENGTH(tuer), tuer"; //echo $sql;exit; $res = $this->db()->query($sql);