Squashed commit message
Some checks failed
Telegram Mini App Shop Builder / Compute version metadata (push) Has been cancelled
Telegram Mini App Shop Builder / Run Frontend tests (push) Has been cancelled
Telegram Mini App Shop Builder / Run Backend tests (push) Has been cancelled
Telegram Mini App Shop Builder / Run PHP_CodeSniffer (push) Has been cancelled
Telegram Mini App Shop Builder / Build module. (push) Has been cancelled
Telegram Mini App Shop Builder / release (push) Has been cancelled
Some checks failed
Telegram Mini App Shop Builder / Compute version metadata (push) Has been cancelled
Telegram Mini App Shop Builder / Run Frontend tests (push) Has been cancelled
Telegram Mini App Shop Builder / Run Backend tests (push) Has been cancelled
Telegram Mini App Shop Builder / Run PHP_CodeSniffer (push) Has been cancelled
Telegram Mini App Shop Builder / Build module. (push) Has been cancelled
Telegram Mini App Shop Builder / release (push) Has been cancelled
This commit is contained in:
129
backend/src/app/Services/MegapayCustomerService.php
Executable file
129
backend/src/app/Services/MegapayCustomerService.php
Executable file
@@ -0,0 +1,129 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Models\TelegramCustomer;
|
||||
use Carbon\Carbon;
|
||||
use Acme\ECommerceFramework\Config\Settings;
|
||||
use Acme\ECommerceFramework\Support\Arr;
|
||||
use Acme\ECommerceFramework\Support\Utils;
|
||||
use RuntimeException;
|
||||
|
||||
class MegapayCustomerService
|
||||
{
|
||||
private TelegramCustomer $telegramCustomer;
|
||||
private Settings $settings;
|
||||
|
||||
public function __construct(TelegramCustomer $telegramCustomer, Settings $settings)
|
||||
{
|
||||
$this->telegramCustomer = $telegramCustomer;
|
||||
$this->settings = $settings;
|
||||
}
|
||||
|
||||
/**
|
||||
* Сохранить или обновить Telegram-пользователя
|
||||
*
|
||||
* @param array $telegramUserData Данные пользователя из Telegram.WebApp.initDataUnsafe
|
||||
* @return array
|
||||
* @throws RuntimeException Если данные невалидны или не удалось сохранить
|
||||
*/
|
||||
public function saveOrUpdate(array $telegramUserData): array
|
||||
{
|
||||
$telegramUserId = $this->extractTelegramUserId($telegramUserData);
|
||||
$telegramCustomerData = $this->prepareCustomerData($telegramUserData, $telegramUserId);
|
||||
|
||||
$existingRecord = $this->telegramCustomer->findByTelegramUserId($telegramUserId);
|
||||
|
||||
if ($existingRecord) {
|
||||
$this->telegramCustomer->updateByTelegramUserId($telegramUserId, $telegramCustomerData);
|
||||
} else {
|
||||
$this->telegramCustomer->create($telegramCustomerData);
|
||||
}
|
||||
|
||||
return $this->telegramCustomer->findByTelegramUserId($telegramUserId);
|
||||
}
|
||||
|
||||
/**
|
||||
* Извлечь Telegram user ID из данных
|
||||
*
|
||||
* @param array $telegramUserData Данные пользователя
|
||||
* @return int Telegram user ID
|
||||
* @throws RuntimeException Если ID отсутствует или невалиден
|
||||
*/
|
||||
private function extractTelegramUserId(array $telegramUserData): int
|
||||
{
|
||||
$telegramUserId = (int)Arr::get($telegramUserData, 'id');
|
||||
|
||||
if ($telegramUserId <= 0) {
|
||||
throw new RuntimeException('Telegram user ID is required and must be positive');
|
||||
}
|
||||
|
||||
return $telegramUserId;
|
||||
}
|
||||
|
||||
/**
|
||||
* Подготовить данные для сохранения в БД
|
||||
*
|
||||
* @param array $telegramUserData Исходные данные пользователя
|
||||
* @param int $telegramUserId Telegram user ID
|
||||
* @return array Подготовленные данные
|
||||
*/
|
||||
private function prepareCustomerData(array $telegramUserData, int $telegramUserId): array
|
||||
{
|
||||
return [
|
||||
'telegram_user_id' => $telegramUserId,
|
||||
'username' => Arr::get($telegramUserData, 'username', $telegramUserId),
|
||||
'first_name' => Arr::get($telegramUserData, 'first_name'),
|
||||
'last_name' => Arr::get($telegramUserData, 'last_name'),
|
||||
'language_code' => Arr::get($telegramUserData, 'language_code'),
|
||||
'is_premium' => Utils::boolToInt(Arr::get($telegramUserData, 'is_premium', false)),
|
||||
'allows_write_to_pm' => Utils::boolToInt(Arr::get($telegramUserData, 'allows_write_to_pm', false)),
|
||||
'photo_url' => Arr::get($telegramUserData, 'photo_url'),
|
||||
'last_seen_at' => date('Y-m-d H:i:s'),
|
||||
'store_id' => $this->settings->get('store.oc_store_id', 0),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Assign ECommerce Customer to Telegram User ID and return Megapay Customer ID if it exists.
|
||||
*
|
||||
* @param $telegramUserId
|
||||
* @param int $ocCustomerId
|
||||
* @return int|null
|
||||
*/
|
||||
public function assignOcCustomer($telegramUserId, int $ocCustomerId): ?int
|
||||
{
|
||||
$customer = $this->telegramCustomer->findByTelegramUserId($telegramUserId);
|
||||
|
||||
if (! $customer) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if ($customer['oc_customer_id'] === null) {
|
||||
$this->telegramCustomer->updateByTelegramUserId($telegramUserId, [
|
||||
'oc_customer_id' => $ocCustomerId,
|
||||
'updated_at' => Carbon::now()->toDateTimeString(),
|
||||
]);
|
||||
}
|
||||
|
||||
return (int)$customer['id'];
|
||||
}
|
||||
|
||||
public function increaseOrdersCount(int $acmeshopCustomerId): void
|
||||
{
|
||||
$this->telegramCustomer->increase($acmeshopCustomerId, 'orders_count');
|
||||
}
|
||||
|
||||
/**
|
||||
* Получить данные пользователя по Telegram user ID
|
||||
*
|
||||
* @param int $telegramUserId Telegram user ID
|
||||
* @return array|null Данные пользователя или null если не найдено
|
||||
*/
|
||||
public function getByTelegramUserId(int $telegramUserId): ?array
|
||||
{
|
||||
return $this->telegramCustomer->findByTelegramUserId($telegramUserId);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user