*/ class PointApiController extends CommonApiController { use LeadAccessTrait; protected LeadModel $leadModel; /** * @var PointModel|null */ protected $model; public function __construct(CorePermissions $security, Translator $translator, EntityResultHelper $entityResultHelper, RouterInterface $router, FormFactoryInterface $formFactory, AppVersion $appVersion, RequestStack $requestStack, ManagerRegistry $doctrine, ModelFactory $modelFactory, EventDispatcherInterface $dispatcher, CoreParametersHelper $coreParametersHelper, MauticFactory $factory) { $leadModel = $modelFactory->getModel('lead'); \assert($leadModel instanceof LeadModel); $pointModel = $modelFactory->getModel('point'); \assert($pointModel instanceof PointModel); $this->model = $pointModel; $this->leadModel = $leadModel; $this->entityClass = Point::class; $this->entityNameOne = 'point'; $this->entityNameMulti = 'points'; $this->serializerGroups = ['pointDetails', 'categoryList', 'publishDetails']; parent::__construct($security, $translator, $entityResultHelper, $router, $formFactory, $appVersion, $requestStack, $doctrine, $modelFactory, $dispatcher, $coreParametersHelper, $factory); } /** * Return array of available point action types. */ public function getPointActionTypesAction() { if (!$this->security->isGranted([$this->permissionBase.':view', $this->permissionBase.':viewown'])) { return $this->accessDenied(); } $actionTypes = $this->model->getPointActions(); $view = $this->view(['pointActionTypes' => $actionTypes['list']]); return $this->handleView($view); } /** * Subtract points from a lead. * * @param int $leadId * @param string $operator * @param int $delta * * @return Response */ public function adjustPointsAction(Request $request, IpLookupHelper $ipLookupHelper, $leadId, $operator, $delta) { $lead = $this->checkLeadAccess($leadId, 'edit'); if ($lead instanceof Response) { return $lead; } try { $this->logApiPointChange($request, $ipLookupHelper, $lead, $delta, $operator); } catch (\Exception $e) { return $this->returnError($e->getMessage(), Response::HTTP_BAD_REQUEST); } return $this->handleView($this->view(['success' => 1], Response::HTTP_OK)); } /** * Log the lead points change. * * @param int $delta */ protected function logApiPointChange(Request $request, IpLookupHelper $ipLookupHelper, $lead, $delta, $operator) { $trans = $this->translator; $ip = $ipLookupHelper->getIpAddress(); $eventName = InputHelper::clean($request->request->get('eventName', $trans->trans('mautic.lead.lead.submitaction.operator_'.$operator))); $actionName = InputHelper::clean($request->request->get('actionName', $trans->trans('mautic.lead.event.api'))); $lead->adjustPoints($delta, $operator); $lead->addPointsChangeLogEntry('API', $eventName, $actionName, $delta, $ip); $this->leadModel->saveEntity($lead, false); } }