<?php
namespace Roothirsch\CoreBundle\Translation\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use ApiPlatform\Core\Annotation\ApiResource as ApiResource;
use ApiPlatform\Core\Annotation\ApiSubresource;
use Gedmo\Mapping\Annotation as Gedmo;
/**
* @ORM\Entity(repositoryClass="Roothirsch\CoreBundle\Translation\Repository\TranslationScopeRepository")
* @ORM\Table(name="translation_scope")
* @ApiResource(
* shortName="Translation/Scope",
* itemOperations={
* "get"={"requirements"={"id"=".+"}},
* "put",
* "delete",
* "push_translations"={
* "route_name": "api_translation_scopes_push_translations_item",
* "method"="put",
* "requirements"={"id"=".+"}
* }
* }
* )
*/
class TranslationScope
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(name="namespace",type="string", length=255)
* @Assert\NotBlank()
* @var string
*/
private $namespace;
/**
* @ORM\Column(type="string", length=255)
* @Assert\NotBlank()
* @var string
*/
private $pushToken;
/**
* The DateTime of the creation date
* @ORM\Column(type="datetime")
* @var \DateTime $created
* @Gedmo\Timestampable(on="create")
*/
private $created;
/**
* The DateTime of the creation date
* @ORM\Column(type="datetime", nullable=true)
* @var \DateTime $created
* @Gedmo\Timestampable(on="update")
*/
private $updated;
/**
* The actual translations
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="Roothirsch\CoreBundle\Translation\Entity\TranslationUnit", mappedBy="scope", cascade={"persist", "remove"}, orphanRemoval=true)
* @ApiSubresource
*/
private $units;
/**
* @var ArrayCollection
* @ORM\OneToMany(targetEntity="Roothirsch\CoreBundle\Translation\Entity\TranslationUnit", mappedBy="scope", orphanRemoval=true)
*/
private $translations;
public function __construct()
{
$this->generatePushToken();
}
public function __toString()
{
return $this->namespace;
}
/**
* @return int
*/
public function getId()
{
return $this->id;
}
/**
* @return string
*/
public function getNamespace()
{
return $this->namespace;
}
/**
* @param string $namespace
*/
public function setNamespace($namespace)
{
$this->namespace = $namespace;
}
/**
* @return \DateTime
*/
public function getCreated()
{
return $this->created;
}
/**
* @param \DateTime $created
*/
public function setCreated($created)
{
$this->created = $created;
}
/**
* @return \DateTime
*/
public function getUpdated()
{
return $this->updated;
}
/**
* @param \DateTime $updated
*/
public function setUpdated($updated)
{
$this->updated = $updated;
}
/**
* @return mixed
*/
public function getUnits()
{
return $this->units;
}
/**
* @param mixed $units
*/
public function setUnits($units)
{
$this->units = $units;
}
/**
* @return mixed
*/
public function getPushToken()
{
return $this->pushToken;
}
/**
* @param mixed $pushToken
*/
public function setPushToken($pushToken)
{
$this->pushToken = $pushToken;
}
public function generatePushToken($length = 32)
{
$this->pushToken = substr(bin2hex(random_bytes($length)), 0, $length);
}
/**
* @return ArrayCollection
*/
public function getTranslations()
{
return $this->translations;
}
/**
* @param ArrayCollection $translations
*/
public function setTranslations(ArrayCollection $translations): void
{
$this->translations = $translations;
}
public function getCompleteness()
{
$status = [
'complete' => 0,
'total' => 0,
];
foreach ($this->getTranslations() as $translation) {
if ($translation->getSource() != null) {
continue;
}
if ($translation->isComplete() == true) {
$status['complete']++;
}
$status['total']++;
}
return $status;
}
}