93 lines
2.3 KiB
PHP
93 lines
2.3 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Service;
|
|
|
|
use App\Entity\Sms;
|
|
use App\Entity\User;
|
|
use DateTime;
|
|
use Doctrine\Common\Collections\ArrayCollection;
|
|
use Doctrine\ORM\EntityManager;
|
|
use Doctrine\ORM\OptimisticLockException;
|
|
use Doctrine\ORM\ORMException;
|
|
use Exception;
|
|
use Zend\EventManager\EventManager;
|
|
|
|
class SmsStoreService
|
|
{
|
|
/** @var EntityManager */
|
|
private $em;
|
|
|
|
/** @var EventManager */
|
|
private $eventManager;
|
|
|
|
public function __construct(EntityManager $em, EventManager $eventManager)
|
|
{
|
|
$this->em = $em;
|
|
$this->eventManager = $eventManager;
|
|
}
|
|
|
|
/**
|
|
* @param string $hashKey
|
|
* @param int $direction
|
|
* @param array $requestData
|
|
* @return bool
|
|
* @throws ORMException
|
|
* @throws OptimisticLockException
|
|
* @throws Exception
|
|
*/
|
|
public function storeSms(string $hashKey, int $direction, array $requestData): bool
|
|
{
|
|
$normalizedDate = str_replace("at ", "", $requestData['when']);
|
|
$user = $this->ensureUserExists($hashKey);
|
|
$sms = new Sms();
|
|
$sms->setDirection($direction)
|
|
->setContactName($requestData['contactName'])
|
|
->setContactNumber($requestData['contactNumber'])
|
|
->setOccuredAt(new DateTime($normalizedDate))
|
|
->setOwner($user)
|
|
->setText($requestData['text']);
|
|
$this->em->persist($sms);
|
|
$this->em->flush();
|
|
|
|
$this->eventManager->trigger('store.sms.persisted', $this, [
|
|
'sms' => $sms,
|
|
]);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @param string $hashKey
|
|
* @return User
|
|
* @throws ORMException
|
|
* @throws OptimisticLockException
|
|
*/
|
|
private function ensureUserExists(string $hashKey): User
|
|
{
|
|
/** @var User $user */
|
|
$user = $this->em->getRepository(User::class)->findOneBy([
|
|
'hashKey' => $hashKey
|
|
]);
|
|
|
|
if ($user === null) {
|
|
$user = new User();
|
|
$user->setHashKey($hashKey)->setName("Unknown");
|
|
$this->em->persist($user);
|
|
$this->em->flush();
|
|
}
|
|
|
|
return $user;
|
|
}
|
|
|
|
public function getFailedImports(): array
|
|
{
|
|
return $this->em->getRepository(Sms::class)->findBy([
|
|
'parsedAndHandled' => false,
|
|
], [
|
|
'occuredAt' => 'ASC'
|
|
]);
|
|
}
|
|
}
|