OpenXE/classes/Modules/Country/Service/CountryService.php
2021-05-21 08:49:41 +02:00

157 lines
4.8 KiB
PHP

<?php
namespace Xentral\Modules\Country\Service;
use Xentral\Components\Database\Database;
use Xentral\Modules\Country\Data\CountryData;
use Xentral\Modules\Country\Exception\CountryNotFoundException;
use Xentral\Modules\Country\Gateway\CountryGateway;
final class CountryService
{
/** @var CountryGateway $gateway */
private $gateway;
/** @var Database $db */
private $db;
/**
* @param CountryGateway $gateway
* @param Database $database
*/
public function __construct(CountryGateway $gateway, Database $database)
{
$this->gateway = $gateway;
$this->db = $database;
}
/**
* @param string $iso3Code
*
* @return CountryData
*/
public function getByIso3Code($iso3Code)
{
$state = $this->gateway->findByIso3Code($iso3Code);
if (empty($state)) {
throw new CountryNotFoundException("ISO3-Code '{$iso3Code}' nicht gefunden");
}
return CountryData::fromState($state);
// @todo Exception werfen wenn Gateway kein Ergebnis liefert
// @todo Exception werfen wenn Daten unvollständig => An entsprechender Stelle Exception abfangen und
// in Oberflächen-Fehlermeldung umwandeln
}
/**
* @param string $iso2Code
*
* @return CountryData
*/
public function getByIso2Code($iso2Code)
{
$state = $this->gateway->findByIso2Code($iso2Code);
if (empty($state)) {
throw new CountryNotFoundException("ISO2-Code '{$iso2Code}' nicht gefunden");
}
return CountryData::fromState($state);
// @todo Exception werfen wenn Gateway kein Ergebnis liefert
// @todo Exception werfen wenn Daten unvollständig => An entsprechender Stelle Exception abfangen und
// in Oberflächen-Fehlermeldung umwandeln
}
/**
* @param string $name
*
* @return CountryData
*/
public function getByName($name)
{
$state = $this->gateway->findByName($name);
if (empty($state)) {
throw new CountryNotFoundException("Name '{$name}' nicht gefunden");
}
return CountryData::fromState($state);
// @todo Exception werfen wenn Gateway kein Ergebnis liefert
// @todo Exception werfen wenn Daten unvollständig => An entsprechender Stelle Exception abfangen und
// in Oberflächen-Fehlermeldung umwandeln
}
/**
* @param string $numericCode
*
* @return CountryData
*/
public function getByNumericCode($numericCode)
{
$state = $this->gateway->findByNumericCode($numericCode);
if (empty($state)) {
throw new CountryNotFoundException("Code '{$numericCode}' nicht gefunden");
}
return CountryData::fromState($state);
// @todo Exception werfen wenn Gateway kein Ergebnis liefert
// @todo Exception werfen wenn Daten unvollständig => An entsprechender Stelle Exception abfangen und
// in Oberflächen-Fehlermeldung umwandeln
}
/**
* @param CountryData $country
*
* @return void
*/
public function save(CountryData $country, $tableName = 'laender')
{
$sql = "SELECT COUNT(*) FROM {$tableName} WHERE iso = :iso2_code";
$matches = $this->db->fetchValue($sql, ['iso2_code' => $country->getIsoAlpha2()]);
if ($matches > 0) {
$sql =
"UPDATE {$tableName} SET
iso3 = :iso3_code,
bezeichnung_de = :name_de,
bezeichnung_en = :name_en,
eu = :is_eu,
num_code = :num_code
WHERE
iso=:iso2_code;";
$this->db->perform(
$sql,
[
'iso2_code' => $country->getIsoAlpha2(),
'iso3_code' => $country->getIsoAlpha3(),
'num_code' => $country->getIsoNumeric(),
'name_de' => $country->getNameGerman(),
'name_en' => $country->getNameEnglish(),
'is_eu' => $country->isEu(),
]
);
return;
}
$sql =
"INSERT INTO {$tableName}
(iso, iso3, num_code, bezeichnung_de, bezeichnung_en, eu)
VALUES
(:iso2_code, :iso3_code, :num_code, :name_de, :name_en, :is_eu);";
$this->db->perform(
$sql,
[
'iso2_code' => $country->getIsoAlpha2(),
'iso3_code' => $country->getIsoAlpha3(),
'num_code' => $country->getIsoNumeric(),
'name_de' => $country->getNameGerman(),
'name_en' => $country->getNameEnglish(),
'is_eu' => $country->isEu(),
]
);
}
}