<?php
namespace App\Controller\Cronjob\Usage\Open;
use App\Entity\VPN\OpenVPN\Server;
use App\Entity\VPN\Service\Service;
use App\Entity\VPN\Service\ServiceUsage;
use App\Repository\VPN\Service\ServiceUsageRepository;
use App\Service\Util\Mikrotik;
use App\Service\Util\NotificationService;
use App\Service\Util\Telegram;
use Doctrine\ORM\EntityManagerInterface;
use Exception;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\Routing\Annotation\Route;
class UsageController extends AbstractController
{
#[Route('/cronjob/open', name: 'app_cronjob_usage_open')]
public function index(NotificationService $notificationService ,EntityManagerInterface $entityManager, Telegram $telegram , ServiceUsageRepository $serviceUsageRepository): JsonResponse
{
$calculationVolume = 1.5;
try {
foreach ($entityManager->getRepository(Server::class)->findBy(['active' => 1, 'deletedAt' => null]) as $server) {
/**
* @var Server $server
*/
$serverContent = null;
try {
$apiObject = new Mikrotik($server->getUMEndpoint(), $server->getUMUsername(), $server->getUMPassword(), $server->getUMProfileName(), $server->getUMSSHPort());
$serverContent = $apiObject->getUsersUsage();
} catch (Exception $exception) {
$notificationService->exception($exception);
$telegram->exception($exception);
}
if ($serverContent) {
foreach ($serverContent['data'] as $item) {
$service = $entityManager->getRepository(Service::class)->findOneBy(['clientId' => (int)$item['name']]);
if ($service && !$service->getExpireAt() && (((int)$item['total-download']) + ((int)$item['total-upload']))!== 0)
{
$now = new \DateTimeImmutable();
$expiredAt = $now->add(new \DateInterval("P{$service->getPlan()->getDays()}D"));
$service->setExpireAt($expiredAt);
$entityManager->flush();
}
if ($service) {
$service->setOpenVpnUsage(
$calculationVolume * (
(((int)$item['total-download']) + ((int)$item['total-upload']))
)
);
$now = new \DateTime();
$todayUsageObject = $serviceUsageRepository->findOneBy(['service' => $service , 'date' => $now]);
if (!$todayUsageObject) {
$todayUsageObject = new ServiceUsage();
$todayUsageObject->setService($service);
$todayUsageObject->setDate(new \DateTime());
$entityManager->persist($todayUsageObject);
}
$yesterday = $now->modify('-1 day');
$yesterdayUsageObject = $serviceUsageRepository->findOneBy(['service' => $service , 'date' => $yesterday]);
if (!$yesterdayUsageObject) {
$yesterdayUsageObject = new ServiceUsage();
$yesterdayUsageObject->setService($service);
$yesterdayUsageObject->setDate($yesterday);
$entityManager->persist($todayUsageObject);
$entityManager->flush();
$yesterdayUsageWithCalculationVolume = 0;
}else{
$yesterdayUsageWithCalculationVolume = $yesterdayUsageObject->getOpenUsage();
}
$add = $calculationVolume * (
(((int)$item['total-download']) + ((int)$item['total-upload']))
) - $yesterdayUsageWithCalculationVolume;
$todayUsageObject->setOpenUsage($add);
$entityManager->flush();
}
}
}
}
$entityManager->clear();
} catch (Exception $exception) {
$notificationService->exception($exception);
// var_dump($exception->getMessage());die;
$telegram->exception($exception);
}
return $this->json(['res' => true]);
}
}