<?php
namespace App\EventSubscriber;
use Pimcore\Mail;
use Pimcore\Model\DataObject;
use App\Model\DataObject\Customer;
use App\Service\WSO2Service;
use PDO;
use Pimcore\Event\Model\DataObjectEvent;
use Pimcore\Model\DataObject\Customer as DataObjectCustomer;
use Pimcore\Model\DataObject\Package;
use Pimcore\Model\DataObject\Subscription;
use Pimcore\Model\DataObject\WSO2Policies;
use Pimcore\Model\Element\ValidationException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class SubscriptionEventListener
{
protected $wso2Service;
public function preUpdated(DataObjectEvent $event)
{
try {
$this->wso2Service = new WSO2Service();
$object = $event->getObject();
if ($object instanceof Subscription && !$object->getApplicationId()) {
$package = $object->getSubscribedPackage();
$user = $object->getSubscribedUser();
if ($package instanceof Package && $user instanceof DataObjectCustomer) {
if ($package->getPackagetype() == "public" && $package->getIsApi()) {
$this->createApplication($user, $object, $package);
}
}
}
} catch (\Exception $ex) {
throw new ValidationException($ex->getMessage());
}
}
private function createApplication(DataObjectCustomer $user, Subscription $object, Package $package)
{
$publicApi = \Pimcore\Model\DataObject\WSO2APIS::getByName('public', true);
if (!$publicApi) {
throw new ValidationException("Public api is not configured");
}
if (!$package->getThrottlingPolicy()) {
throw new ValidationException("Policy is not attached with associated package. Please attach it and continue");
}
$policy = \Pimcore\Model\DataObject::getById($package->getThrottlingPolicy());
if (!$policy instanceof WSO2Policies) {
throw new ValidationException("No policy object found. Which is associated with package");
}
$applicationInfo = $this->wso2Service->createApplication(
$package->getPackageCode() . "_" . $package->getTenure() . "YEARS" . date('Ymdhis'),
$policy->getPolicyName(),
$user->getEmail(),
"JWT"
);
// Handle the application creation response or error as needed
if ($applicationInfo) {
$object->setApplicationId($applicationInfo['applicationId']);
$object->setApplicationDetail(json_encode($applicationInfo));
$subscriptionKeys = $this->wso2Service->createSubscriptionForApplication($applicationInfo['applicationId'], $publicApi);
if ($subscriptionKeys) {
$object->setSubscriptionId($subscriptionKeys['subscriptionId']);
$object->setSubscriptionDetail(json_encode($subscriptionKeys));
$apiKeys = $this->wso2Service->generateApplicationKeys($applicationInfo['applicationId']);
if ($apiKeys) {
$object->setConsumerKey($apiKeys['consumerKey']);
$object->setConsumerSecret($apiKeys['consumerSecret']);
$object->setApplicationKeys(json_encode($apiKeys));
}
}
}
}
}