<?php
namespace App\Controller;
use App\Entity\AuctionAccount;
use App\Entity\AuctionBid;
use App\Entity\PluginEventLog;
use App\Entity\PluginLotData;
use App\Entity\PluginPing;
use App\Entity\PluginToken;
use App\Entity\PluginUser;
use App\Entity\PluginUserAuctionAccountAssigment;
use App\Entity\ProdAuctionBid;
use App\Entity\ProdPluginEventLog;
use App\Entity\ProxyAccount;
use App\Exception\Plugin\BadRequestException;
use App\Exception\Plugin\InvalidTokenException;
use App\Repository\AccountCodeRepository;
use App\Form\PluginUserType;
use App\Repository\PluginTokenRepository;
use App\Repository\PluginUserRepository;
use App\Service\Utils\CommonUtils;
use App\Service\Utils\FileUploader;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\File\UploadedFile;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Contracts\Translation\TranslatorInterface;
/**
* @Route("/api_plugin", name="api_plugin_")
*/
class ApiPluginController extends AbstractController
{
const STATIC_VPN_CONFIG = 'CmNsaWVudApub2JpbmQKZGV2IHR1bgpyZW1vdGUtY2VydC10bHMgc2VydmVyCgpyZW1vdGUgNTEuODMuMjQ5LjU4IDExOTQgdWRwCgo8a2V5PgotLS0tLUJFR0lOIFBSSVZBVEUgS0VZLS0tLS0KTUlJRXZ3SUJBREFOQmdrcWhraUc5dzBCQVFFRkFBU0NCS2t3Z2dTbEFnRUFBb0lCQVFERFo1TmpLTWhrSkNsRgo0QThudmYwNHJNWHNVNkN3VEJiQnF4dnZmSVVqekF5VkQzWWE5UE8zWllMTkFOR3F5anI1OWFaZDR6N2phbDFsCjM0dURtOE5WMGZmWVUrS0l0RCtJc1RMVkJyTkJMbW52NkpwTThzZ0dtbUF2dlpxbEhEUVF6OXlmeDQ4c1FPQ08KNDRDK3FNQTYzRE0yVU9hSmlrSHV3SzAwOUR3S0FTYkRNNmNUOEcxNWx2ZHQrMGxpTmVIUzQyREJnQ3hzY1NjTApnMnoxSnl6RDNjc0cwcVlqTkNBS3c5dXk1d1U2K3k0NXdNQzVUOFhKRTNaQ2JUZnM2M2JkZTNsbDdnSWwxUmFMCjF4c282bzlzL3lDaG9FWnI0c09IMS9UWVEzc1hRNzVnYU83a3l0MmVGN2JIZi9UREI0NiticHJTV01UUVhwNjEKQlFOTGEyYjNBZ01CQUFFQ2dnRUJBSzAzTUpqeSt3aUNZYS9XV2JqaUd3bFZacklDdyt2ajF6eGdvUWZmZXVwcgpwQyt5b0FCdmFXZ0diVGVxNVRHZnlUM3crMFE1QUhONXcwZGVMWDlCNFpzKzRKUjhiOUM4NzZFTmEwRVppbWRhCmJJQkYwaG9xRVJTQlhvaVRhL1czRlpSZG5uWm80VXJhUy9WK1NJODZhZ1VEVThadldwMUwyUHg3QWs5eHZaTWoKT2prN25mYm9Vd2tMOVBYYUFMMjVCM3FWYTFFc2ttU1RkcGVPK0cyM0dqeGhWa0RKZHY5SEQvYVIzMHJyOFJidApDdzAxN0pJclhJSTI1b2Vnc1BSZkZBc2dnUFhkZTVKTlZodWNYdngxbEJJT2tSUWMzUE1sc1p4OFhlTjdXNGg0CnRXU1VLZ29wRUdnbzEzY2RsWTkxTzVBak4zczY2eVVaYSs2aitRMThxc0VDZ1lFQTgwbDNwbGxBT0JxWnJCMloKZDFOMUNSOE5oSVpQYmNZSGpNMGlrMG9VamVQbFFqSHF4Y1NLdDJxaXJyNjEwTFdRNCt4bVBlTTVub1J6djdmRApXaVY0L0paOHRjSEMwNk1Td0VoaEhDdTgwV2diSSs0ZDFoQUt2NXNIbFFMRHdVaHdlaHlFU0VpUW05MVU5MTNYCkFlQnZZUTF0bjh6WDJwTTNFSTAxWUFVSHVlRUNnWUVBeloyUndaSm9Fcll5RWx3ZkUzQnZWQS9XR1VKNWwzdlgKV2hqWVZJaWxiMGdnWk1KR3FJNm1Lelp5aWdvT2ZYZmJCelgvc21ubGh6dGZaNVVTSmxlR1FLV3dxRVFaVm1pcgpEMFBYbVZ4aWVUSEV5L21HbnRiYTNQQjFVdlJJUFBkS0x0L2FSbWVMNTE1a1EzazhxdHdHY0pHQnNJSTlIa0VICm9TZ0pSdk5scTljQ2dZRUFpc1VQTUoyY0dlUmlYMkNLMXh1Tm1HUlVDNUdvNE02aUk5Z21ycWtFekdKL3RLQlEKYi9wSnZaRmZ0aGttRUNSZ3Z3RnEyRVl4Nlk5WGpyVzlBa0I1b0dvZVBIYUhNTHpGeDFRQndGWGFYLy9uNnppNQpZQTdLY3J4MU9MUFpBUGpXMzNCQXJCSm9HZC9IeFVtTGlKQ0NOM08zWWYwdjZvY3FVNUNZTDJydkcwRUNnWUVBCnFwRlIvb0JUY1dKTyswZ01SM1g0QklYMmw1RzdpRnlsY3dvMU96cjM4ZTZsWUxDQktRYmM5ZS8rNkdBYlVSNEMKUm1NWE1Jd0Vha0Jvam1idFhYMHgwNk1mZnhhdTVpMkI2ZkhmZ2t0UExUYUtDS09BZDNmSXE0dVY2RERaVkNuWQpFamFFdmU3YjhoMHRrNE9aUGl1ejgrSGc4ZW00aGNad2E5SG9rRUVOVUpVQ2dZQm9Ed3ZodlQ5NEJtYUVGZ3ZsCit2ZWJNeGo2WjVGcUFYSklrZnEySXZxUVZIb2RXcWF1RDVMSUNqdFQ3eUsyQkdGWktKNHBwZ1dOV2NjVnpnekwKZXFkVWZ3QWlJeG5jSElZV2RScWsyenZNOFpTWHNqcjN0NXFDUldVTVZ5eEZyQ296NUFFUTEycGxLSGV0QlhPUApzbTE2SmJrSkNyRC9PaDNSNlNSeEhLbXQvUT09Ci0tLS0tRU5EIFBSSVZBVEUgS0VZLS0tLS0KPC9rZXk+CjxjZXJ0PgotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KTUlJRFJEQ0NBaXlnQXdJQkFnSVFjWkluSEI2QW9WUFQyaFZ2L1JwaDhqQU5CZ2txaGtpRzl3MEJBUXNGQURBUApNUTB3Q3dZRFZRUUREQVJ2YkdWbk1CNFhEVEkwTURneU1UQTRNamcxTWxvWERUSTJNVEV5TkRBNE1qZzFNbG93CkR6RU5NQXNHQTFVRUF3d0ViMnhsWnpDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUIKQU1ObmsyTW95R1FrS1VYZ0R5ZTkvVGlzeGV4VG9MQk1Gc0dyRys5OGhTUE1ESlVQZGhyMDg3ZGxnczBBMGFySwpPdm4xcGwzalB1TnFYV1hmaTRPYncxWFI5OWhUNG9pMFA0aXhNdFVHczBFdWFlL29ta3p5eUFhYVlDKzltcVVjCk5CRFAzSi9Ianl4QTRJN2pnTDZvd0RyY016WlE1b21LUWU3QXJUVDBQQW9CSnNNenB4UHdiWG1XOTIzN1NXSTEKNGRMallNR0FMR3h4Snd1RGJQVW5MTVBkeXdiU3BpTTBJQXJEMjdMbkJUcjdMam5Bd0xsUHhja1Rka0p0Tit6cgpkdDE3ZVdYdUFpWFZGb3ZYR3lqcWoyei9JS0dnUm12aXc0Zlg5TmhEZXhkRHZtQm83dVRLM1o0WHRzZC85TU1ICmpyNXVtdEpZeE5CZW5yVUZBMHRyWnZjQ0F3RUFBYU9CbXpDQm1EQUpCZ05WSFJNRUFqQUFNQjBHQTFVZERnUVcKQkJSVmtLVEtWQUI5ZUp1Zi9uNFpSWThlVFRFc0xUQktCZ05WSFNNRVF6QkJnQlJFNCtLMTFvODBrM2hGcnJOcgpIT21uZ2I2SGJxRVRwQkV3RHpFTk1Bc0dBMVVFQXd3RWIyeGxaNElVZTBYWHc0RFJMc3lNTFJMeGt6MExZWk51CnN2d3dFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUhBd0l3Q3dZRFZSMFBCQVFEQWdlQU1BMEdDU3FHU0liM0RRRUIKQ3dVQUE0SUJBUUFKWjhWTTVieldoa1hnbTZIOUIra0s1SGozQURkODB5ZUFkQXJkQVF2Z2MydDVOdGRBTWxvbwp2blovbzZ3eHA2THdqcGExeGcyUE81bnVZeUhkcnlSeldZUTJ5RVk2am9OcHNDK2NiVnRnc3BPRG5EUTYwZTRjClJYOTR0M0RKQUh5Vk90UEJObXJWelpwdXVHTCtYM0RqcFRYQTlWdTRiK3lpTXduc0QvL3daU252N0t3TE1BUWkKZUkwS0luTVFrOVd2SGllK1crZTRZSThqWERWSWw1c3BwSEdDMmYwMU84dEZoY1l4Z0p4aHI3dzUrOUpkQlorcQoxVHV0YzlMWnJVSCsxK0ZTaG5vSzRRdnM1V0tORlh3SllnWXV0N29zVkRSS3VSeklVSDhYWUJEZ0NWUDFDcFhmCkdCR3Rad3pWVkhBSXplcmxROXIxWFlXRENuTlZyWW5RCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KPC9jZXJ0Pgo8Y2E+Ci0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlETmpDQ0FoNmdBd0lCQWdJVWUwWFh3NERSTHN5TUxSTHhrejBMWVpOdXN2d3dEUVlKS29aSWh2Y05BUUVMCkJRQXdEekVOTUFzR0ExVUVBd3dFYjJ4bFp6QWVGdzB5TkRBNE1qRXdOekl4TVRaYUZ3MHpOREE0TVRrd056SXgKTVRaYU1BOHhEVEFMQmdOVkJBTU1CRzlzWldjd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFSwpBb0lCQVFEZmQzWXdsMG51Z0llOE5TSGNkZmpmTk5aRFMxOCsvL2s2WnMraTA5eE54ZGMySHNFdkVPWEJsV2c5CkEwZ2JKTkdBaEc1SlJMZlM3ZVc0ZzgrSk1rU05XWU5vK2kyL1lWR1ZDK3d3bEYxZDFoemxMVHM5amJQdDRmekwKU0I0cVpNakNhTDVxay9BRGFOaExEcmMycVpPcm5kQ1paRzNDYjVtMmc2TnhqNytBdmNXY2d1bU11ZTF5NnRWbAo3R3N5dW4wQ0d2WnNyclY2ZkFMcDZ2dG5MNWR6UGFuVG12ZDh4ZXN4ZDNNZllWQmU2SXpzR2c3K29TenVqejY3CnRWcHZLM1ZzNm9MNUNQYlI4cldueThzeTk3M2VmNmpUZ0lhVkJsTGE5Y3hNdnMrTDNnejB6R3Fleml0MDZiTUMKZEtCVU5RZytnLzA4bVZwSEYvYjdJSUNESzVURkFnTUJBQUdqZ1lrd2dZWXdIUVlEVlIwT0JCWUVGRVRqNHJYVwpqelNUZUVXdXMyc2M2YWVCdm9kdU1Fb0dBMVVkSXdSRE1FR0FGRVRqNHJYV2p6U1RlRVd1czJzYzZhZUJ2b2R1Cm9ST2tFVEFQTVEwd0N3WURWUVFEREFSdmJHVm5naFI3UmRmRGdORXV6SXd0RXZHVFBRdGhrMjZ5L0RBTUJnTlYKSFJNRUJUQURBUUgvTUFzR0ExVWREd1FFQXdJQkJqQU5CZ2txaGtpRzl3MEJBUXNGQUFPQ0FRRUF5aHlSZ25vVQpZOEJ0MllSN2R1Mm1pM3RIYVVBbHlnaHBCVDZWUEVyOU5uTXRKNWsveEU4VERSbmNtSnB0Uk96NjJMVFdmYTFuCnJla3doWDF5VXZSbUxBVVpIREVGOE9qbjJFZFF1QWJ0bVI5angzV0NDbDdNZWZkanUrbDNGYkdBVm1mTVY2Q0IKWVFWMGE2UHNTMjlMRW5DVXBlNjMvU2lELzVROFBtTndhc3NjYWE0c2JlaWNjQy9pZzg2djZISldHMnFoMlNjawprRExremN3U25GRFhNVllRc3VHOC9LbnlPbDBPOFVpMUYrZUhhb0t0L2dZd3paa1ZvWGg1QXdySndMUlZ4TEdXCk04V00yNlovb21hSDcra3JXQW1XMm1kZ2x2TEVxaC9aMEJxWkVOQmprUnI0NVJHY0xIbEdqc1JzMWpoNUg5ZlgKVkVFb0J2Nk55eE0zU1E9PQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCjwvY2E+CmtleS1kaXJlY3Rpb24gMQo8dGxzLWF1dGg+CiMKIyAyMDQ4IGJpdCBPcGVuVlBOIHN0YXRpYyBrZXkKIwotLS0tLUJFR0lOIE9wZW5WUE4gU3RhdGljIGtleSBWMS0tLS0tCjRhMDYyOWQ4OWRmZjBhMWUwZTYyZDJlYmZmZTE5ZGQ3Cjg2NjllNzQ4YWQxZWU2MTRlN2ZhNGI3Y2QwM2Y4N2FiCjBkZjNhOTU2N2Q5NTFmM2Y0ODdmZWRkZDQ4YzdmOWQ4CmE3N2U0MGYxNWFiZWVlOGVkOGRkYzQ5MjFmNzExMDBiCmIxMzVjNmU2MzgwOTQ4Zjc1ZDAwMzk3MTQzYmViZDNkCjI1MjlmY2M3Y2UyM2YzNTYyMGQ5OWYyZmZjN2MzMDg5CjQyYTdjNTM4NTBmNDVmM2QyMzk1YjE3MWI3ODRhNjdjCmUyMzBmNjdhZWVkYTI3MzJjOGNjYTdiMzZiMDVjZGEwCmVlZWFkNjI4OGNiMDQwNGU5N2M5ZDE5YmYyNGFiZmVjCmU5NmVjNDUxYjA2N2Q2MWVhY2FiOTQyNDM3OTQwOWUwCjk4ODI2ODJjMmYyOTFkMzI0Y2NjM2M0ZTkyNmE2NGQ4CjNlMzFlMDc2MTc0YzkzMzc3ZDczOTNmNWY0NTFkZDNmCmI1ZDUzNDU3M2UzNTQ4MThlNDcyY2ZmODVjNjBiNmU3Cjg5NGFjZDAyZWYzNDhiYjA5ZDZhMDZlNTU5NzU5OWFlCmJmMTk3NGVjNTdhNjU1YTk1ZmNlODUwZGViNTYxMTc2CjM0NGY1Yzc5ZmM2N2UzYzAyM2YzZGVjYzg1NjliMGNlCi0tLS0tRU5EIE9wZW5WUE4gU3RhdGljIGtleSBWMS0tLS0tCjwvdGxzLWF1dGg+CgpyZWRpcmVjdC1nYXRld2F5IGRlZjEK';
const HEADERS = 'Access-Control-Allow-Origin: *';
const ALLOWED_DOMAINS = [
'https://copart.com',
'https://www.copart.com',
];
/**
* @var FileUploader
*/
private $fileUploader;
/**
* @var TranslatorInterface
*/
private $translator;
public function __construct(TranslatorInterface $translator, FileUploader $fileUploader)
{
$this->translator = $translator;
$this->fileUploader = $fileUploader;
}
/**
* @Route("/headers_sh", name="headers_show", methods={"GET, POST"})
* @return Response
*/
public function headers_show(Request $request): Response
{
//$headers = $request->headers->all();
//dd($headers);
return new JsonResponse([], 200);
}
/**
* @Route("/user_auth", name="user_auth", methods={"POST"})
* @return Response
*/
public function pluginUserAuth(PluginTokenRepository $pluginTokenRepository, PluginUserRepository $pluginUserRepository, Request $request): Response
{
$proxy = [];
$parameters = json_decode($request->getContent(), true);
if (empty($parameters) || empty($parameters['login']) || empty($parameters['password'])) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
}
$pluginUser = $pluginUserRepository->findOneBy(['login' => $parameters['login'],'deleted' => 0]);
$entityManager = $this->getDoctrine()->getManager();
if (!$pluginUser) {
header(self::HEADERS);
return new JsonResponse('Invalid login', 401);
} elseif ($parameters['password'] != $pluginUser->getPassword()) {
header(self::HEADERS);
return new JsonResponse('Invalid password', 401);
}
if (!$pluginUser->getOwner()->getEnablePlugin()){
header(self::HEADERS);
return new JsonResponse('Plugin disabled', 401);
}
// $onPluginTokens = $pluginTokenRepository->findBy(['plugin_user' => $pluginUser, 'status' => 'on']);
// if ($onPluginTokens) {
// foreach ($onPluginTokens as $onPluginToken) {
// $onPluginToken
// ->setStatus('off')
// ->setDisabledAt(new \DateTime('now'));
// $entityManager->persist($onPluginToken);
// $entityManager->flush();
// }
// }
$is_token = true;
while ($is_token) {
$token = substr(hash('sha256', mt_rand()), 0, 40);
$is_token = $pluginTokenRepository->findOneBy(['token' => $token]);
}
$pluginToken = new PluginToken();
$pluginToken
->setToken($token)
->setPluginUser($pluginUser);
$entityManager->persist($pluginToken);
$entityManager->flush();
$customer = $pluginUser->getCustomer();
$owner = $pluginUser->getOwner();
if ($customer) {
$id = $customer->getId();
$name = $customer->getUsername();
} else {
$id = $owner->getId();
$name = $owner->getUsername();
}
if(isset($parameters['auction']) && $parameters['auction'] == 'manheim') {
$AuctionAccounts = $pluginToken->getPluginUser()->getOnlyManheimAccounts();
$count = count($AuctionAccounts);
if ($count < 1) {
header(self::HEADERS);
return new JsonResponse('Invalid Manheim accounts', 401);
}
$em = $this->getDoctrine()->getManager();
$proxyAccount = $em->getRepository(ProxyAccount::class)->findLastUsedManheimProxy();
// $key = random_int(0, $count - 1);
// $auctionAccount = $AuctionAccounts[$key];
// $login = $auctionAccount->getLogin();
// $password = $auctionAccount->getPassword();
// $proxyAccount = $auctionAccount->getProxyAccount();
if ($proxyAccount) {
$proxy = [
'proxy' => [
'host' => $proxyAccount->getProxyHost() ?? '',
'port' => $proxyAccount->getProxyPort() ?? '',
'username' => $proxyAccount->getProxyUsername() ?? '',
'password' => $proxyAccount->getProxyPassword() ?? '',
]
];
$proxyAccount->setLastUsedAt(new \DateTime('now'));
$em->persist($proxyAccount);
$em->flush();
}
}
$data = [
'id' => $pluginUser->getId(),
'name' => $name,
'token' => $token,
'allowLogging' => true,
];
if(!empty($proxy)) {
$data = array_merge($data, $proxy);
}
header(self::HEADERS);
return new JsonResponse($data, 200);
}
/**
* @param EntityManagerInterface $em
* @param Request $request
* @return PluginToken
* @throws BadRequestException
* @throws InvalidTokenException
*/
private function _authUserByToken(EntityManagerInterface $em, Request $request): PluginToken
{
$pluginTokenRepository = $em->getRepository(PluginToken::class);
$parameters = json_decode($request->getContent(), true);
if(!empty($parameters['user'])) { // if request is from universal APP
$parameters = $parameters['user'];
}
if (empty($parameters) || empty($parameters['id']) || empty($parameters['name']) || empty($parameters['token'])) {
throw new BadRequestException();
}
$pluginToken = $pluginTokenRepository->findOneBy(['token' => $parameters['token'], 'status' => 'on']);
if (!$pluginToken instanceof PluginToken) {
throw new InvalidTokenException();
}
if(!$pluginToken->getPluginUser()->getOwner()->getEnablePlugin()){
throw new InvalidTokenException();
}
return $pluginToken;
}
/**
* @Route("/get_copart_account", name="get_copart_account", methods={"POST"})
* @return Response
*/
public function getCopartAccount(Request $request, EntityManagerInterface $em): Response
{
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
return new JsonResponse('Invalid token', 401);
}
$parameters = json_decode($request->getContent(), true);
$plugin_version = $parameters['pv'] ?? '';
if (empty($plugin_version)) {
header(self::HEADERS);
return new JsonResponse('Invalid pv', 400);
}
$ip = CommonUtils::getClientIP($request);
$pluginUser = $pluginToken->getPluginUser();
$AuctionAccounts = $pluginUser->getOnlyCopartAccounts();
if (count($AuctionAccounts) < 1) {
header(self::HEADERS);
return new JsonResponse('Invalid Copart accounts', 401);
}
$accountFinancesAccesses = $pluginUser->getAccountsFinancesAccessMap();
$assigmentRepository = $em->getRepository(PluginUserAuctionAccountAssigment::class);
$auctionAccount = $assigmentRepository->selectAuctionAccountForAssigment($AuctionAccounts, $accountFinancesAccesses);
$pluginAuctionAssignment = $assigmentRepository->createAuctionAssignment($auctionAccount, $pluginToken, $plugin_version, $ip);
$canManagePayments = $accountFinancesAccesses[$auctionAccount->getId()] ?? false;
// $login = $auctionAccount->getLogin();
// $password = $auctionAccount->getPassword();
$proxyAccount = $auctionAccount->getProxyAccount();
$proxy = [];
if ($proxyAccount) {
$proxy = [
'proxy' => [
'host' => $proxyAccount->getProxyHost() ?? '',
'port' => $proxyAccount->getProxyPort() ?? '',
'username' => $proxyAccount->getProxyUsername() ?? '',
'password' => $proxyAccount->getProxyPassword() ?? '',
]
];
}
$data = [
'copart' => [
'login' => $pluginAuctionAssignment->getAuctionAccount()->getLogin() ?? '',
'password' => $pluginAuctionAssignment->getAuctionAccount()->getPassword() ?? '',
],
'assigment_id' => $pluginAuctionAssignment->getId(),
'can_manage_payments' => $canManagePayments,
];
header(self::HEADERS);
return new JsonResponse(array_merge($data, $proxy), 200);
}
/**
* @Route("/bid_clicked", name="bid_clicked", methods={"POST"})
* @param PluginTokenRepository $pluginTokenRepository
* @param Request $request
* @param EntityManagerInterface $em
* @return Response
*/
public function bidClicked(Request $request, EntityManagerInterface $em): Response
{
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
return new JsonResponse('Invalid token', 401);
}
$parameters = json_decode($request->getContent(), true);
$lot = $parameters['lot'] ?? '';
$bid = $parameters['bid'] ?? false;
$bid_type = strtolower($parameters['bid_type']) ?? '';
$session_url = $parameters['session_url'] ?? '';
$window_host = $parameters['window_host'] ?? '';
$loggedCopart =
$parameters['loggedCopart'] ??
$parameters['loggedIaai'] ??
$parameters['loggedManheim'] ??
$parameters['loggedBringatrailer'] ??
$parameters['loggedCars_and_bids'] ??
$parameters['loggedCars'] ??
$parameters['loggedCargurus'] ?? false;
if (empty($lot)) {
header(self::HEADERS);
return new JsonResponse('Invalid lot', 400);
}
if ($bid === false) {
header(self::HEADERS);
return new JsonResponse('Invalid bid', 400);
}
if(empty($bid_type) || !in_array($bid_type, AuctionBid::TYPES)){
header(self::HEADERS);
return new JsonResponse('Invalid bid_type', 400);
}
if (empty($parameters['assigment_id'])) {
header(self::HEADERS);
return new JsonResponse('Invalid assigment', 406);
}
$assignedAuctionAccount = $em->getRepository(PluginUserAuctionAccountAssigment::class)->find((int)$parameters['assigment_id']);
if (!$assignedAuctionAccount instanceof PluginUserAuctionAccountAssigment) {
header(self::HEADERS);
return new JsonResponse('Invalid assigment', 406);
}
/******* check iaai country *********/
/*$auctionAccount = $assignedAuctionAccount->getAuctionAccount();
if (strtolower($auctionAccount->getAuctionName()) === 'iaai') {
if (!empty($window_host)) {
if (($window_host === 'www.iaai.com') && ($auctionAccount->getCountry() === 'usa')) {
true;
} elseif (($window_host === 'ca.iaai.com') && ($auctionAccount->getCountry() === 'canada')) {
true;
} else {
header(self::HEADERS);
return new JsonResponse('Invalid country in window_host', 406);
}
} else {
header(self::HEADERS);
return new JsonResponse('Invalid window_host', 406);
}
}*/
/******* end *********/
$auctionBid = (new AuctionBid())
->setCreatedAt(new \DateTime('now'))
->setAssignation($assignedAuctionAccount)
->setBid((float)$bid)
->setLot($lot)
->setLoggedCopart((bool)$loggedCopart)
->setType($bid_type)
->setSessionUrl($session_url);
$em->persist($auctionBid);
$em->flush();
header(self::HEADERS);
return new JsonResponse(['history_id' => $auctionBid->getId()], 200);
}
/**
* @Route("/get_assigment_finances_access", name="assigment_finances_access", methods={"POST"})
* @param Request $request
* @param EntityManagerInterface $em
* @return Response
*/
public function getAssigmentFinancesAccess(Request $request, EntityManagerInterface $em): Response
{
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
return new JsonResponse('Invalid token', 401);
}
$parameters = json_decode($request->getContent(), true);
$assigmentId = $parameters['assigment_id'] ?? null;
if (empty($assigmentId)) {
header(self::HEADERS);
return new JsonResponse('Invalid assigment', 406);
}
$pluginUser = $pluginToken->getPluginUser();
$assignedAuctionAccount = $em->getRepository(PluginUserAuctionAccountAssigment::class)->find((int)$parameters['assigment_id']);
if (!$assignedAuctionAccount instanceof PluginUserAuctionAccountAssigment
|| $assignedAuctionAccount->getPluginUser()->getId() !== $pluginUser->getId()
) {
header(self::HEADERS);
return new JsonResponse('Invalid assigment', 406);
}
$accountFinancesAccesses = $pluginUser->getAccountsFinancesAccessMap();
$canManageFinances = $accountFinancesAccesses[$assignedAuctionAccount->getAuctionAccount()->getId()] ?? false;
header(self::HEADERS);
return new JsonResponse(['can_manage_finances' => $canManageFinances], 200);
}
/**
* @Route("/ping", name="ping", methods={"POST"})
* @param Request $request
* @param EntityManagerInterface $em
* @return Response
*/
public function ping(Request $request, EntityManagerInterface $em): Response
{
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
return new JsonResponse('Invalid token', 401);
}
$parameters = json_decode($request->getContent(), true);
$assigment_id = $parameters['assigment_id'] ?? '';
$token = $parameters['token'] ?? '';
$loggedCopart =
$parameters['loggedCopart'] ??
$parameters['loggedIaai'] ??
$parameters['loggedManheim'] ??
$parameters['loggedBringatrailer'] ??
$parameters['loggedCars_and_bids'] ??
$parameters['loggedCars'] ??
$parameters['loggedCargurus'] ?? false;
$loggedPlugin = $parameters['loggedPlugin'] ?? '';
// $date = $parameters['date'] ?? '';
if (empty($assigment_id)) {
header(self::HEADERS);
return new JsonResponse('Empty assigment_id', 400);
}
if (empty($token)) {
header(self::HEADERS);
return new JsonResponse('Empty token', 406);
}
// if (empty($loggedCopart)) {
// return new JsonResponse('Empty loggedCopart', 406);
// }
// if (empty($loggedPlugin)) {
// return new JsonResponse('Empty loggedPlugin', 406);
// }
// if (empty($date)) {
// return new JsonResponse('Empty date', 406);
// }
$assignedAuctionAccount = $em->getRepository(PluginUserAuctionAccountAssigment::class)->find((int)$assigment_id);
if (!$assignedAuctionAccount instanceof PluginUserAuctionAccountAssigment) {
header(self::HEADERS);
return new JsonResponse('Invalid assigment', 406);
}
if($pluginToken->getToken() != $token){
header(self::HEADERS);
return new JsonResponse('Invalid token', 406);
}
$pluginPing = (new PluginPing())
->setAssigment($assignedAuctionAccount)
->setToken($pluginToken)
->setLoggedCopart((bool)$loggedCopart)
->setLoggedPlugin((bool)$loggedPlugin)
->setDate( new \DateTime('now'));
$em->persist($pluginPing);
$em->flush();
header(self::HEADERS);
return new JsonResponse(['status' => 'Ok'], 200);
}
/**
* @Route("/add_event_log", name="add_event_log", methods={"POST"})
* @param Request $request
* @param EntityManagerInterface $em
* @return Response
*/
public function addEventLog(Request $request, EntityManagerInterface $em): Response
{
$parameters = json_decode($request->getContent(), true);
if (empty($parameters['event'])) {
header(self::HEADERS);
return new JsonResponse('Empty event', 400);
}
if (empty($parameters['eventData']) || !is_array($parameters['eventData'])) {
header(self::HEADERS);
return new JsonResponse('Bad data', 400);
}
$ip = CommonUtils::getClientIP($request);
$pluginEventLog = (new PluginEventLog())
->setIp($ip)
->setCreatedAt(new \DateTime('now'))
->setName($parameters['event'])
->setData($parameters['eventData']);
if( !empty($parameters['eventData']['origin']) && in_array($parameters['eventData']['origin'], PluginEventLog::ORIGINS) ){
$pluginEventLog->setOrigin($parameters['eventData']['origin']);
}
$em->persist($pluginEventLog);
$em->flush();
header(self::HEADERS);
return new JsonResponse(['status' => 'Ok'], 200);
}
/**
* @Route("/add_lot_data", name="add_lot_data", methods={"POST"})
* @param Request $request
* @param EntityManagerInterface $em
* @return Response
*/
public function addLotData(Request $request, EntityManagerInterface $em): Response
{
$parameters = json_decode($request->getContent(), true);
if (empty($parameters['auction'])) {
header(self::HEADERS);
return new JsonResponse('Empty auction', 400);
}
if (empty($parameters['lot'])) {
header(self::HEADERS);
return new JsonResponse('Empty lot', 400);
}
if (empty($parameters['vin']) || str_contains('stars_', $parameters['vin'])) {
header(self::HEADERS);
return new JsonResponse('Wrong vin', 400);
}
if (!isset($parameters['data']) || empty($parameters['data']) || !is_array($parameters['data']) || !isset($parameters['data']['lotDetails'])) {
header(self::HEADERS);
return new JsonResponse('Bad data', 400);
}
$ip = CommonUtils::getClientIP($request);
$pluginEventLog = (new PluginLotData())
->setIp($ip)
->setCreatedAt(new \DateTimeImmutable('now'))
->setLot($parameters['lot'])
->setVin($parameters['vin'])
->setPv($parameters['pv'])
->setUserData($parameters['user_data'])
->setData($parameters['data']);
if( !empty($parameters['auction']) && in_array($parameters['auction'], PluginLotData::AUCTIONS) ){
$pluginEventLog->setAuction($parameters['auction']);
}
$em->persist($pluginEventLog);
$em->flush();
header(self::HEADERS);
return new JsonResponse(['status' => 'Ok'], 200);
}
/**
* @Route("/get_auction", name="get_auction", methods={"POST"})
* @param Request $request
* @param EntityManagerInterface $em
* @return Response
*/
public function get_auction(Request $request, EntityManagerInterface $em): Response
{
$request_body = $request->toArray();
$plugin_version = $request_body['pv'] ?? '';
$auction_name = strtolower(trim($request_body['auction_name'])) ?? '';
$ip = CommonUtils::getClientIP($request);
if(empty($auction_name)){
header(self::HEADERS);
return new JsonResponse('Invalid Request', 400);
}
if (empty($plugin_version)) {
header(self::HEADERS);
return new JsonResponse('Invalid pv', 400);
}
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
}
$available_accounts = $pluginToken->getPluginUser()->getCopartAccounts();
$AuctionAccounts = [];
foreach($available_accounts as $account) {
if (strtolower($account->getAuctionNameWithFullCountry()) === $auction_name) {
$AuctionAccounts[] = $account;
}
}
$count = count($AuctionAccounts);
if ($count < 1) {
header(self::HEADERS);
return new JsonResponse('Invalid Auction accounts', 401);
}
$key = random_int(0, $count - 1);
$auctionAccount = $AuctionAccounts[$key];
$proxyAccount = $auctionAccount->getProxyAccount();
$proxy = [];
if ($proxyAccount) {
$proxy = [
'host' => $proxyAccount->getProxyHost() ?? '',
'port' => $proxyAccount->getProxyPort() ?? '',
'username' => $proxyAccount->getProxyUsername() ?? '',
'password' => $proxyAccount->getProxyPassword() ?? '',
];
}
$vpn = [];
$vpn_required = false;
if($auction_name == 'cars-usa') { //TODO check if auction has vpn config.
$vpn = [
'vpn_type' => 'openvpn',
'vpn_config' => self::STATIC_VPN_CONFIG,
];
$vpn_required = true;
}
$assigmentRepository = $em->getRepository(PluginUserAuctionAccountAssigment::class);
$pluginAuctionAssignment = $assigmentRepository->createAuctionAssignment($auctionAccount, $pluginToken, $plugin_version, $ip);
$data = [
'auction_credentials' => [
'auction_name' => $auction_name,
'login' => $pluginAuctionAssignment->getAuctionAccount()->getLogin() ?? '',
'password' => $pluginAuctionAssignment->getAuctionAccount()->getPassword() ?? '',
],
'assigment_id' => $pluginAuctionAssignment->getId(),
'proxy' => $proxy,
'vpn_options' => $vpn,
'vpn_required' => $vpn_required,
];
header(self::HEADERS);
return new JsonResponse($data, 200);
}
/**
* @Route("/get_available_auctions", name="get_available_auctions", methods={"POST"})
* @return Response
*/
public function getAvailableAuctionAccounts(Request $request, EntityManagerInterface $em): Response
{
$data = [];
$_avail_auction_names = [];
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
return new JsonResponse('Invalid token', 401);
}
$available_accounts = $pluginToken->getPluginUser()->getCopartAccounts();
foreach($available_accounts as $account) {
if(in_array($account->getAuctionName().'-'.$account->getCountry(), $_avail_auction_names)) continue;
$_avail_auction_names[] = $account->getAuctionName().'-'.$account->getCountry();
$id = $account->getId();
if (strtolower($account->getAuctionName()) === 'copart'){
$id = 2;
} elseif (strtolower($account->getAuctionName()) === 'manheim'){
$id = 11;
} elseif (strtolower($account->getAuctionName()) === 'iaai' && !is_null($account->getCountry())) {
if (strtolower($account->getCountry()) === 'usa') {
$id = 1;
} elseif (strtolower($account->getCountry()) === 'canada') {
$id = 12;
}
} elseif (strtolower($account->getAuctionName()) === 'bringatrailer'){
$id = 17;
}elseif (strtolower($account->getAuctionName()) === 'cars_and_bids'){
$id = 20;
}elseif (strtolower($account->getAuctionName()) === 'cars'){
$id = 23;
}elseif (strtolower($account->getAuctionName()) === 'cargurus'){
$id = 26;
}
$data[] = [
'id' => $id,
'auction_name' => $account->getAuctionName(),
'auction_country' => $account->getCountry(),
'display_name' => ( is_null($account->getCountry()) || empty($account->getCountry()) ) ? strtoupper($account->getAuctionName()) : strtoupper($account->getAuctionName().'-'.$account->getCountry()),
];
}
if (count($data) < 1) {
header(self::HEADERS);
return new JsonResponse('Invalid Auction accounts', 401);
}
header(self::HEADERS);
return new JsonResponse($data, 200);
}
/**
* @Route("/get_iaai_account", name="get_iaai_account", methods={"POST"})
* @return Response
*/
public function getIaaiAccount(Request $request, EntityManagerInterface $em): Response
{
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
return new JsonResponse('Invalid token', 401);
}
$parameters = json_decode($request->getContent(), true);
$plugin_version = $parameters['pv'] ?? '';
if (empty($plugin_version)) {
header(self::HEADERS);
return new JsonResponse('Invalid pv', 400);
}
$ip = CommonUtils::getClientIP($request);
/******* parse iaai redirect country *********/
$redirect_uri = $parameters['url'] ?? 'usa';
$country = 'usa';
if (!empty($redirect_uri)) {
parse_str(parse_url(urldecode($redirect_uri), PHP_URL_QUERY), $parsed_redirect_url);
if (!empty($parsed_redirect_url['redirect_uri'])) {
if (strpos($parsed_redirect_url['redirect_uri'], 'ca.iaai.com') !== false) {
$country = 'canada';
} elseif (strpos($parsed_redirect_url['redirect_uri'], 'www.iaai.com') !== false) {
$country = 'usa';
}
}
}
/******* end *********/
$pluginUser = $pluginToken->getPluginUser();
$AuctionAccounts = [];
foreach ($pluginUser->getOnlyIaaiAccounts() as $aa) {
if ($aa->getCountry() === $country) {
$AuctionAccounts[] = $aa;
}
}
if (count($AuctionAccounts) < 1) {
header(self::HEADERS);
return new JsonResponse('Invalid Iaai accounts', 401);
}
$accountFinancesAccesses = $pluginUser->getAccountsFinancesAccessMap();
$assigmentRepository = $em->getRepository(PluginUserAuctionAccountAssigment::class);
$auctionAccount = $assigmentRepository->selectAuctionAccountForAssigment($AuctionAccounts, $accountFinancesAccesses);
$pluginAuctionAssignment = $assigmentRepository->createAuctionAssignment($auctionAccount, $pluginToken, $plugin_version, $ip);
$canManagePayments = $accountFinancesAccesses[$auctionAccount->getId()] ?? false;
$proxyAccount = $auctionAccount->getProxyAccount();
$proxy = [];
if ($proxyAccount) {
$proxy = [
'proxy' => [
'host' => $proxyAccount->getProxyHost() ?? '',
'port' => $proxyAccount->getProxyPort() ?? '',
'username' => $proxyAccount->getProxyUsername() ?? '',
'password' => $proxyAccount->getProxyPassword() ?? '',
]
];
}
$data = [
'iaai' => [
'login' => $pluginAuctionAssignment->getAuctionAccount()->getLogin() ?? '',
'password' => $pluginAuctionAssignment->getAuctionAccount()->getPassword() ?? '',
],
'assigment_id' => $pluginAuctionAssignment->getId(),
'can_manage_payments' => $canManagePayments,
];
header(self::HEADERS);
return new JsonResponse(array_merge($data, $proxy), 200);
}
/**
* @Route("/get_manheim_account", name="get_manheim_account", methods={"POST"})
* @return Response
*/
public function getManheimAccount(Request $request, EntityManagerInterface $em): Response
{
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
return new JsonResponse('Invalid token', 401);
}
$parameters = json_decode($request->getContent(), true);
$plugin_version = $parameters['pv'] ?? '';
if (empty($plugin_version)) {
header(self::HEADERS);
return new JsonResponse('Invalid pv', 400);
}
$ip = CommonUtils::getClientIP($request);
$pluginUser = $pluginToken->getPluginUser();
$AuctionAccounts = $pluginUser->getOnlyManheimAccounts();
if (count($AuctionAccounts) < 1) {
header(self::HEADERS);
return new JsonResponse('Invalid Manheim accounts', 401);
}
$accountFinancesAccesses = $pluginUser->getAccountsFinancesAccessMap();
$assigmentRepository = $em->getRepository(PluginUserAuctionAccountAssigment::class);
$auctionAccount = $assigmentRepository->selectAuctionAccountForAssigment($AuctionAccounts, $accountFinancesAccesses);
$pluginAuctionAssignment = $assigmentRepository->createAuctionAssignment($auctionAccount, $pluginToken, $plugin_version, $ip);
$canManagePayments = $accountFinancesAccesses[$auctionAccount->getId()] ?? false;
// $login = $auctionAccount->getLogin();
// $password = $auctionAccount->getPassword();
// $proxyAccount = $auctionAccount->getProxyAccount();
$em = $this->getDoctrine()->getManager();
$proxyAccount = $em->getRepository(ProxyAccount::class)->findLastUsedManheimProxy();
$proxy = [];
if ($proxyAccount) {
$proxy = [
'proxy' => [
'host' => $proxyAccount->getProxyHost() ?? '',
'port' => $proxyAccount->getProxyPort() ?? '',
'username' => $proxyAccount->getProxyUsername() ?? '',
'password' => $proxyAccount->getProxyPassword() ?? '',
]
];
$proxyAccount->setLastUsedAt(new \DateTime('now'));
$em->persist($proxyAccount);
}
$data = [
'manheim' => [
'login' => $pluginAuctionAssignment->getAuctionAccount()->getLogin() ?? '',
'password' => $pluginAuctionAssignment->getAuctionAccount()->getPassword() ?? '',
],
'assigment_id' => $pluginAuctionAssignment->getId(),
'can_manage_payments' => $canManagePayments,
];
header(self::HEADERS);
return new JsonResponse(array_merge($data, $proxy), 200);
}
/**
* @Route("/manheim_2fa_codes", name="manheim_2fa_code", methods={"POST"})
* @return Response
*/
public function getManheim2FACodes(AccountCodeRepository $accountCodeRepository, EntityManagerInterface $em, Request $request): Response
{
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
return new JsonResponse('Invalid token', 401);
}
$auctionAccounts = $pluginToken->getPluginUser()->getOnlyManheimAccounts();
$count = count($auctionAccounts);
if ($count < 1) {
header(self::HEADERS);
return new JsonResponse('Invalid Manheim accounts', 401);
}
$manheimCodes = $accountCodeRepository->getLatestCodesByAccountType('manheim');
$resultCodes = [];
foreach ($manheimCodes as $code) {
$resultCodes[] = [
'2fa_code' => $code->getCode(),
'received_at' => $code->getReceivedAt()->format('c'), // ISO 8601 format,
];
}
$data = [
'manheim_codes' => $resultCodes
];
header(self::HEADERS);
return new JsonResponse($data, 200);
}
/**
* @Route("/get_bringatrailer_account", name="get_bringatrailer_account", methods={"POST"})
* @return Response
*/
public function getBringatrailerAccount(Request $request, EntityManagerInterface $em): Response
{
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
return new JsonResponse('Invalid token', 401);
}
$parameters = json_decode($request->getContent(), true);
$plugin_version = $parameters['pv'] ?? '';
if (empty($plugin_version)) {
header(self::HEADERS);
return new JsonResponse('Invalid pv', 400);
}
$ip = CommonUtils::getClientIP($request);
$pluginUser = $pluginToken->getPluginUser();
$AuctionAccounts = $pluginUser->getOnlyBringatrailerAccounts();
if (count($AuctionAccounts) < 1) {
header(self::HEADERS);
return new JsonResponse('Invalid Bringatrailer accounts', 401);
}
$accountFinancesAccesses = $pluginUser->getAccountsFinancesAccessMap();
$assigmentRepository = $em->getRepository(PluginUserAuctionAccountAssigment::class);
$auctionAccount = $assigmentRepository->selectAuctionAccountForAssigment($AuctionAccounts, $accountFinancesAccesses);
$pluginAuctionAssignment = $assigmentRepository->createAuctionAssignment($auctionAccount, $pluginToken, $plugin_version, $ip);
$canManagePayments = $accountFinancesAccesses[$auctionAccount->getId()] ?? false;
// $login = $auctionAccount->getLogin();
// $password = $auctionAccount->getPassword();
$proxyAccount = $auctionAccount->getProxyAccount();
$proxy = [];
if ($proxyAccount) {
$proxy = [
'proxy' => [
'host' => $proxyAccount->getProxyHost() ?? '',
'port' => $proxyAccount->getProxyPort() ?? '',
'username' => $proxyAccount->getProxyUsername() ?? '',
'password' => $proxyAccount->getProxyPassword() ?? '',
]
];
}
$data = [
'bringatrailer' => [
'login' => $pluginAuctionAssignment->getAuctionAccount()->getLogin() ?? '',
'password' => $pluginAuctionAssignment->getAuctionAccount()->getPassword() ?? '',
],
'assigment_id' => $pluginAuctionAssignment->getId(),
'can_manage_payments' => $canManagePayments,
];
header(self::HEADERS);
return new JsonResponse(array_merge($data, $proxy), 200);
}
/**
* @Route("/get_cars_and_bids_account", name="get_cars_and_bids_account", methods={"POST"})
* @return Response
*/
public function getCarsAndBidsAccount(Request $request, EntityManagerInterface $em): Response
{
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
return new JsonResponse('Invalid token', 401);
}
$parameters = json_decode($request->getContent(), true);
$plugin_version = $parameters['pv'] ?? '';
if (empty($plugin_version)) {
header(self::HEADERS);
return new JsonResponse('Invalid pv', 400);
}
$ip = CommonUtils::getClientIP($request);
$pluginUser = $pluginToken->getPluginUser();
$AuctionAccounts = $pluginUser->getOnlyCarsAndBidsAccounts();
if (count($AuctionAccounts) < 1) {
header(self::HEADERS);
return new JsonResponse('Invalid Cars_and_bids accounts', 401);
}
$accountFinancesAccesses = $pluginUser->getAccountsFinancesAccessMap();
$assigmentRepository = $em->getRepository(PluginUserAuctionAccountAssigment::class);
$auctionAccount = $assigmentRepository->selectAuctionAccountForAssigment($AuctionAccounts, $accountFinancesAccesses);
$pluginAuctionAssignment = $assigmentRepository->createAuctionAssignment($auctionAccount, $pluginToken, $plugin_version, $ip);
$canManagePayments = $accountFinancesAccesses[$auctionAccount->getId()] ?? false;
// $login = $auctionAccount->getLogin();
// $password = $auctionAccount->getPassword();
$proxyAccount = $auctionAccount->getProxyAccount();
$proxy = [];
if ($proxyAccount) {
$proxy = [
'proxy' => [
'host' => $proxyAccount->getProxyHost() ?? '',
'port' => $proxyAccount->getProxyPort() ?? '',
'username' => $proxyAccount->getProxyUsername() ?? '',
'password' => $proxyAccount->getProxyPassword() ?? '',
]
];
}
$data = [
'cars_and_bids' => [
'login' => $pluginAuctionAssignment->getAuctionAccount()->getLogin() ?? '',
'password' => $pluginAuctionAssignment->getAuctionAccount()->getPassword() ?? '',
],
'assigment_id' => $pluginAuctionAssignment->getId(),
'can_manage_payments' => $canManagePayments,
];
header(self::HEADERS);
return new JsonResponse(array_merge($data, $proxy), 200);
}
/**
* @Route("/get_cars_account", name="get_cars_account", methods={"POST"})
* @return Response
*/
public function getCarsAccount(Request $request, EntityManagerInterface $em): Response
{
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
return new JsonResponse('Invalid token', 401);
}
$parameters = json_decode($request->getContent(), true);
$plugin_version = $parameters['pv'] ?? '';
if (empty($plugin_version)) {
header(self::HEADERS);
return new JsonResponse('Invalid pv', 400);
}
$ip = CommonUtils::getClientIP($request);
$pluginUser = $pluginToken->getPluginUser();
$AuctionAccounts = $pluginUser->getOnlyCarsAccounts();
if (count($AuctionAccounts) < 1) {
header(self::HEADERS);
return new JsonResponse('Invalid Cars accounts', 401);
}
$accountFinancesAccesses = $pluginUser->getAccountsFinancesAccessMap();
$assigmentRepository = $em->getRepository(PluginUserAuctionAccountAssigment::class);
$auctionAccount = $assigmentRepository->selectAuctionAccountForAssigment($AuctionAccounts, $accountFinancesAccesses);
$pluginAuctionAssignment = $assigmentRepository->createAuctionAssignment($auctionAccount, $pluginToken, $plugin_version, $ip);
$canManagePayments = $accountFinancesAccesses[$auctionAccount->getId()] ?? false;
$proxyAccount = $auctionAccount->getProxyAccount();
$proxy = [];
if ($proxyAccount) {
$proxy = [
'proxy' => [
'host' => $proxyAccount->getProxyHost() ?? '',
'port' => $proxyAccount->getProxyPort() ?? '',
'username' => $proxyAccount->getProxyUsername() ?? '',
'password' => $proxyAccount->getProxyPassword() ?? '',
]
];
}
$data = [
'cars' => [
'login' => $pluginAuctionAssignment->getAuctionAccount()->getLogin() ?? '',
'password' => $pluginAuctionAssignment->getAuctionAccount()->getPassword() ?? '',
],
'assigment_id' => $pluginAuctionAssignment->getId(),
'can_manage_payments' => $canManagePayments,
];
header(self::HEADERS);
return new JsonResponse(array_merge($data, $proxy), 200);
}
/**
* @Route("/get_cargurus_account", name="get_cargurus_account", methods={"POST"})
* @return Response
*/
public function getCargurusAccount(Request $request, EntityManagerInterface $em): Response
{
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
return new JsonResponse('Invalid token', 401);
}
$parameters = json_decode($request->getContent(), true);
$plugin_version = $parameters['pv'] ?? '';
if (empty($plugin_version)) {
header(self::HEADERS);
return new JsonResponse('Invalid pv', 400);
}
$ip = CommonUtils::getClientIP($request);
$pluginUser = $pluginToken->getPluginUser();
$AuctionAccounts = $pluginUser->getOnlyCargurusAccounts();
if (count($AuctionAccounts) < 1) {
header(self::HEADERS);
return new JsonResponse('Invalid Cargurus accounts', 401);
}
$accountFinancesAccesses = $pluginUser->getAccountsFinancesAccessMap();
$assigmentRepository = $em->getRepository(PluginUserAuctionAccountAssigment::class);
$auctionAccount = $assigmentRepository->selectAuctionAccountForAssigment($AuctionAccounts, $accountFinancesAccesses);
$pluginAuctionAssignment = $assigmentRepository->createAuctionAssignment($auctionAccount, $pluginToken, $plugin_version, $ip);
$canManagePayments = $accountFinancesAccesses[$auctionAccount->getId()] ?? false;
$proxyAccount = $auctionAccount->getProxyAccount();
$proxy = [];
if ($proxyAccount) {
$proxy = [
'proxy' => [
'host' => $proxyAccount->getProxyHost() ?? '',
'port' => $proxyAccount->getProxyPort() ?? '',
'username' => $proxyAccount->getProxyUsername() ?? '',
'password' => $proxyAccount->getProxyPassword() ?? '',
]
];
}
$data = [
'cargurus' => [
'login' => $pluginAuctionAssignment->getAuctionAccount()->getLogin() ?? '',
'password' => $pluginAuctionAssignment->getAuctionAccount()->getPassword() ?? '',
],
'assigment_id' => $pluginAuctionAssignment->getId(),
'can_manage_payments' => $canManagePayments,
];
header(self::HEADERS);
return new JsonResponse(array_merge($data, $proxy), 200);
}
/**
* @Route("/send_app_debug", name="send_app_debug", methods={"POST"})
* @return Response
*/
public function sendAppDebug(Request $request, EntityManagerInterface $em): Response
{
$plugin_login = $request->get('plugin_login', '');
$plugin_user = $em->getRepository(PluginUser::class)->findOneBy(['login' => $plugin_login]);
//TODO: add checking if is set debug flag for plugin user
if (!$plugin_user instanceof PluginUser) {
return new JsonResponse('Invalid user', 401);
}
$date = (new \DateTime('now'))->format('Y-m-d');
$files = $request->files->all();
if(!array_key_exists('files', $files)) {
return new JsonResponse('File error', Response::HTTP_BAD_REQUEST, []);
}
$files = $files['files'];
$files_uploaded = $this->_uploadedFiles( $files,"fk_o1z_app_logs/{$plugin_login}/{$date}" );
$result = [
'status'=>'Success',
'message' => 'Logs are successfully saved',
'files_url' => $files_uploaded, //TODO: Remove after debug!
];
return new JsonResponse($result, 200, []);
}
private function _uploadedFiles($added_files_set, $store_path){
$_files = [];
if (!empty($added_files_set)) {
foreach ($added_files_set as $_newFile) {
if($_newFile instanceof UploadedFile) {
$new_file_path = $this->fileUploader->upload($store_path, $_newFile, '');
if ($new_file_path) {
$_files[] = $this->fileUploader->getAbsoluteURLToFile($new_file_path);
}
}
}
}
return $_files;
}
/**
* @Route("/check_app_updates", name="check_app_updates", methods={"POST"})
* @return Response
*/
public function checkAppUpdates(Request $request, EntityManagerInterface $em): Response
{
try {
$pluginToken = $this->_authUserByToken($em, $request);
} catch (BadRequestException $e) {
header(self::HEADERS);
return new JsonResponse('Bad Request', 400);
} catch (InvalidTokenException $e) {
header(self::HEADERS);
return new JsonResponse('Invalid token', 401);
}
$parameters = json_decode($request->getContent(), true);
//TODO: This is only for test. Make Production checks !!!
$data = [
'update_available' => false,
'update_required' => false,
];
$platform = $parameters['platform'] ?? '';
$version = $parameters['version'] ?? '';
if($platform == 'windows' && $version == '0.3.33') {
$data['update_available'] = true;
$data['update_required'] = false;
$data['update_link'] = 'http://my.zvigerauto.com/Setup_ZvigerautoAuction_v0334.exe';
$data['update_message'] = 'New Version is available';
}
if($platform == 'windows' && $version == '0.3.32') {
$data['update_available'] = true;
$data['update_required'] = true;
$data['update_link'] = 'http://my.zvigerauto.com/Setup_ZvigerautoAuction_v0334.exe';
$data['update_message'] = 'New Version is available';
}
return new JsonResponse(['data'=>$data], Response::HTTP_OK, []);
}
/**
* @Route("/add_event_log_dev", name="add_event_log_dev", methods={"POST"})
* @param Request $request
* @param EntityManagerInterface $em
* @return Response
*/
public function addEventLogProd(Request $request, EntityManagerInterface $em): Response
{
$parameters = json_decode($request->getContent(), true);
if (empty($parameters['event'])) {
header(self::HEADERS);
return new JsonResponse('Empty event', 400);
}
if (empty($parameters['eventData']) || !is_array($parameters['eventData'])) {
header(self::HEADERS);
return new JsonResponse('Bad data', 400);
}
$ip = CommonUtils::getClientIP($request);
$prodPluginEventLog = (new ProdPluginEventLog())
->setIp($ip)
->setCreatedAt(new \DateTime('now'))
->setName($parameters['event'])
->setData($parameters['eventData']);
if( !empty($parameters['eventData']['origin']) && in_array($parameters['eventData']['origin'], PluginEventLog::ORIGINS) ){
$prodPluginEventLog->setOrigin($parameters['eventData']['origin']);
}
$em->persist($prodPluginEventLog);
$em->flush();
header(self::HEADERS);
return new JsonResponse(['status' => 'Ok'], 200);
}
/**
* @Route("/bid_clicked_dev", name="bid_clicked_dev", methods={"POST"})
* @param PluginTokenRepository $pluginTokenRepository
* @param Request $request
* @param EntityManagerInterface $em
* @return Response
*/
public function bidClickedDev(Request $request, EntityManagerInterface $em): Response
{
$parameters = json_decode($request->getContent(), true);
$lot = $parameters['lot'] ?? '';
$bid = $parameters['bid'] ?? false;
$bid_type = strtolower($parameters['bid_type']) ?? '';
$window_host = $parameters['window_host'] ?? '';
$loggedCopart =
$parameters['loggedCopart'] ??
$parameters['loggedIaai'] ??
$parameters['loggedManheim'] ??
$parameters['loggedBringatrailer'] ??
$parameters['loggedCars_and_bids'] ??
$parameters['loggedCars'] ??
$parameters['loggedCargurus'] ?? false;
if (empty($lot)) {
header(self::HEADERS);
return new JsonResponse('Invalid lot', 400);
}
if ($bid === false) {
header(self::HEADERS);
return new JsonResponse('Invalid bid', 400);
}
if(empty($bid_type) || !in_array($bid_type, AuctionBid::TYPES)){
header(self::HEADERS);
return new JsonResponse('Invalid bid_type', 400);
}
if (empty($parameters['assigment_id'])) {
header(self::HEADERS);
return new JsonResponse('Invalid assigment', 406);
}
/******* end *********/
$auctionBid = (new ProdAuctionBid())
->setCreatedAt(new \DateTime('now'))
->setAssignation(['assigment_id' => $parameters['assigment_id']])
->setBid((float)$bid)
->setLot($lot)
->setLoggedCopart((bool)$loggedCopart)
->setType($bid_type);
$em->persist($auctionBid);
$em->flush();
header(self::HEADERS);
return new JsonResponse(['history_id' => $auctionBid->getId()], 200);
}
}