Files
kupshop/bundles/KupShop/UserAddressesBundle/Util/UserAddressesUtil.php
2025-08-02 16:30:27 +02:00

168 lines
4.8 KiB
PHP

<?php
declare(strict_types=1);
namespace KupShop\UserAddressesBundle\Util;
use Doctrine\DBAL\Exception;
use KupShop\KupShopBundle\Config;
use KupShop\KupShopBundle\Context\UserContext;
use KupShop\KupShopBundle\Util\Entity\EntityUtil;
use KupShop\UserAddressesBundle\Entity\DeliveryAddressEntity;
use Query\Operator;
class UserAddressesUtil
{
public function __construct(
protected UserContext $userContext,
protected EntityUtil $entityUtil,
protected DeliveryAddressConverter $deliveryAddressConverter,
) {
}
/**
* @return DeliveryAddressEntity[]
*/
public function getDeliveryAddresses(): array
{
if (($userId = $this->userContext->getActiveId()) === null) {
return [];
}
$addressesQb = sqlQueryBuilder()->select('*')
->from('users_addresses')
->andWhere(Operator::equals(['id_user' => $userId]))
->orderBy('delivery_firm, delivery_surname, delivery_name');
$entities = [];
foreach ($addressesQb->execute() as $address) {
$entities[] = $this->entityUtil->createEntity($address, DeliveryAddressEntity::class, $this->deliveryAddressConverter);
}
return $entities;
}
public function getDeliveryAddressesForUsers(array $userIds): array
{
if (empty($userIds)) {
return [];
}
$qb = sqlQueryBuilder()->select('*')
->from('users_addresses')
->where(Operator::inIntArray($userIds, 'id_user'))
->orderBy('delivery_firm, delivery_surname, delivery_name');
$userAddresses = [];
foreach ($qb->execute() as $address) {
$userAddresses[$address['id_user']][] = $this->entityUtil->createEntity($address,
DeliveryAddressEntity::class, $this->deliveryAddressConverter);
}
return $userAddresses;
}
public function getDeliveryAddressesIds(): array
{
if (($userId = $this->userContext->getActiveId()) === null) {
return [];
}
return sqlQueryBuilder()->select('id')
->from('users_addresses')
->andWhere(Operator::equals(['id_user' => $userId]))
->execute()->fetchFirstColumn();
}
public function getDeliveryAddress(int $addressId): ?DeliveryAddressEntity
{
$address = sqlQueryBuilder()->select('*')
->from('users_addresses')
->andWhere(Operator::equals(['id' => $addressId]))
->execute()->fetchAssociative();
if ($address === false) {
return null;
}
return $this->entityUtil->createEntity($address, DeliveryAddressEntity::class, $this->deliveryAddressConverter);
}
/**
* @return bool true if new address was created
*
* @throws Exception
*/
public function saveDeliveryAddress(DeliveryAddressEntity $address): bool
{
$fields = [
'id_user' => $address->getIdUser(),
'delivery_name' => $address->getName(),
'delivery_surname' => $address->getSurname(),
'delivery_firm' => $address->getFirm(),
'delivery_street' => $address->getStreet(),
'delivery_city' => $address->getCity(),
'delivery_zip' => $address->getZip(),
'delivery_country' => $address->getCountry(),
'delivery_phone' => $address->getPhone(),
'delivery_state' => $address->getState(),
'delivery_email' => $address->getEmail(),
'delivery_custom_address' => $address->getCustomAddress(),
];
$qb = sqlQueryBuilder();
if ($address->getId() !== null) {
$qb->update('users_addresses')
->where(Operator::equals(['id' => $address->getId()]));
} else {
$qb->insert('users_addresses');
}
$qb->directValues($fields)->execute();
if ($address->getId() === null) {
$address->setId(sqlInsertId());
return true;
}
return false;
}
public function isAllowed(): bool
{
$cfg = Config::get();
if (empty($cfg['Modules']['user_addresses']['user_types'])) {
return false;
}
foreach ($cfg['Modules']['user_addresses']['user_types'] as $type) {
if ($this->userContext->isType($type)) {
return true;
}
}
return false;
}
public function deleteAddress(int $addressId, bool $checkUser = true): void
{
$qb = sqlQueryBuilder()
->delete('users_addresses')
->where(Operator::equals(['id' => $addressId]));
if ($checkUser) {
if (($userId = $this->userContext->getActiveId()) === null) {
return;
}
$qb->andWhere(Operator::equals(['id_user' => $userId]));
}
$qb->execute();
}
}