Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
43.48% |
10 / 23 |
CRAP | |
48.21% |
27 / 56 |
User | |
0.00% |
0 / 1 |
|
43.48% |
10 / 23 |
145.80 | |
48.21% |
27 / 56 |
__construct | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
setCreatedAt | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getCreatedAt | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setEndingSchoolYear | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
getEndingSchoolYear | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
setFullname | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getFullname | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
addJob | |
100.00% |
1 / 1 |
3 | |
100.00% |
7 / 7 |
|||
removeJob | |
100.00% |
1 / 1 |
2 | |
100.00% |
5 / 5 |
|||
getJobs | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setOrganizationEmail | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
getOrganizationEmail | |
100.00% |
1 / 1 |
1 | |
100.00% |
1 / 1 |
|||
setOrganizationEmailCanonical | |
100.00% |
1 / 1 |
1 | |
100.00% |
2 / 2 |
|||
getOrganizationEmailCanonical | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
setStudentConvention | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
getStudentConvention | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
addType | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 4 |
|||
setTypes | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
getTypes | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
setUpdatedAt | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
getUpdatedAt | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 1 |
|||
getAllowedTypes | |
100.00% |
1 / 1 |
1 | |
100.00% |
3 / 3 |
|||
validate | |
0.00% |
0 / 1 |
12 | |
0.00% |
0 / 9 |
<?php | |
/* | |
* This file is part of the Incipio package. | |
* | |
* (c) Théo FIDRY <theo.fidry@gmail.com> | |
* | |
* For the full copyright and license information, please view the LICENSE | |
* file that was distributed with this source code. | |
*/ | |
namespace ApiBundle\Entity; | |
use Doctrine\Common\Collections\ArrayCollection; | |
use Doctrine\ORM\Mapping as ORM; | |
use Dunglas\ApiBundle\Annotation\Iri; | |
use FOS\UserBundle\Model\User as BaseUser; | |
use Gedmo\Mapping\Annotation as Gedmo; | |
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; | |
use Symfony\Component\Serializer\Annotation\Groups; | |
use Symfony\Component\Validator\Constraints as Assert; | |
use Symfony\Component\Validator\Context\ExecutionContextInterface; | |
/** | |
* Class User: user that have an account in the application. | |
* | |
* In this class, the term "organization" refers either to a Junior-Entreprise, Creation and such or a company. | |
* | |
* @ORM\Entity | |
* @UniqueEntity("username") | |
* @UniqueEntity("email") | |
* | |
* @author Théo FIDRY <theo.fidry@gmail.com> | |
*/ | |
class User extends BaseUser | |
{ | |
const TYPE_CONTRACTOR = 'TYPE_CONTRACTOR'; | |
const TYPE_MEMBER = 'TYPE_MEMBER'; | |
/** | |
* {@inheritdoc} | |
* | |
* @ORM\Id | |
* @ORM\Column(type="integer") | |
* @ORM\GeneratedValue(strategy="AUTO") | |
*/ | |
protected $id; | |
private $address; | |
/** | |
* @var \DateTime | |
* | |
* @Gedmo\Timestampable(on="create") | |
* @ORM\Column(type="datetime") | |
* @Groups({"user-read"}) | |
*/ | |
protected $createdAt; | |
/** | |
* {@inheritdoc} | |
* | |
* @Iri("https://schema.org/email") | |
* @Assert\Email | |
* @Assert\NotBlank | |
* @Groups({"user"}) | |
*/ | |
protected $email; | |
/** | |
* {@inheritdoc} | |
* | |
* @Assert\NotNull | |
* @Groups({"user"}) | |
* | |
* @TODO: validation for boolean | |
*/ | |
protected $enabled = false; | |
/** | |
* @var int | |
* | |
* @Iri("https://schema.org/name") | |
* @ORM\Column(type="smallint", nullable=true) | |
* @Assert\Range( | |
* min=1900, | |
* max=2100, | |
* minMessage="The ending school year must be a valid year.", | |
* maxMessage="The ending school year must be a valid year.", | |
* invalidMessage="The ending school year must be a valid year." | |
* ) | |
* @Groups({"user"}) | |
*/ | |
private $endingSchoolYear; | |
/** | |
* @var string | |
* | |
* @Iri("https://schema.org/name") | |
* @ORM\Column(type="string", length=255, nullable=true) | |
* @Assert\NotBlank | |
* @Assert\Type("string") | |
* @Groups({"user"}) | |
* | |
* @TODO: validation for username! | |
*/ | |
protected $fullname; | |
/** | |
* @var string Professional email. | |
* | |
* @Iri("https://schema.org/email") | |
* @ORM\Column(type="string", length=255, nullable=true) | |
* @Assert\Email | |
* @Groups({"user"}) | |
*/ | |
private $organizationEmail; | |
/** | |
* @var string Professional email in lowercase for search and string comparison; cf emailCanonical & passwordCanonical | |
* | |
* @Iri("https://schema.org/email") | |
* @ORM\Column(type="string", length=255, nullable=true) | |
* @Assert\Email | |
* @Groups({"user-write"}) | |
*/ | |
private $organizationEmailCanonical; | |
private $phones; | |
/** | |
* {@inheritdoc} | |
* | |
* @var string | |
* | |
* @Groups({"user-write"}) | |
* @TODO: validation for the password! | |
*/ | |
protected $plainPassword; | |
/** | |
* {@inheritdoc} | |
* | |
* @Groups({"user"}) | |
*/ | |
protected $roles; | |
/** | |
* Validated via {@see ::validate()}. | |
* | |
* @var array | |
* | |
* @ORM\Column(type="array") | |
* @Groups({"user"}) | |
*/ | |
private $types = []; | |
/** | |
* @var StudentConvention | |
* | |
* @ORM\OneToOne(targetEntity="StudentConvention") | |
* @ORM\JoinColumn(referencedColumnName="reference") | |
* @Groups({"user"}) | |
*/ | |
private $studentConvention; | |
/** | |
* {@inheritdoc} | |
* | |
* @Assert\Type("string") | |
* @Groups({"user"}) | |
* | |
* @TODO: validation for username! | |
*/ | |
protected $username; | |
/** | |
* @var ArrayCollection|Job[] List of job for this user. | |
* | |
* @ORM\ManyToMany(targetEntity="Job", mappedBy="users") | |
* @Groups({"user"}) | |
* | |
* @TODO: validation: may have no user | |
**/ | |
protected $jobs; | |
/** | |
* @var \DateTime | |
* | |
* @Gedmo\Timestampable(on="update") | |
* @ORM\Column(type="datetime") | |
* @Groups({"user-read"}) | |
*/ | |
protected $updatedAt; | |
public function __construct() | |
{ | |
parent::__construct(); | |
$this->jobs = new ArrayCollection(); | |
} | |
/** | |
* @param \DateTime $createdAt | |
* | |
* @return $this | |
*/ | |
public function setCreatedAt(\DateTime $createdAt) | |
{ | |
$this->createdAt = $createdAt; | |
return $this; | |
} | |
/** | |
* @return \DateTime | |
*/ | |
public function getCreatedAt() | |
{ | |
return $this->createdAt; | |
} | |
/** | |
* @param int $endingSchoolYear | |
* | |
* @return $this | |
*/ | |
public function setEndingSchoolYear($endingSchoolYear) | |
{ | |
$this->endingSchoolYear = $endingSchoolYear; | |
return $this; | |
} | |
/** | |
* @return int|null | |
*/ | |
public function getEndingSchoolYear() | |
{ | |
return $this->endingSchoolYear; | |
} | |
/** | |
* @param string|null $fullname | |
* | |
* @return $this | |
*/ | |
public function setFullname($fullname) | |
{ | |
$this->fullname = $fullname; | |
return $this; | |
} | |
/** | |
* @return string|null | |
*/ | |
public function getFullname() | |
{ | |
return $this->fullname; | |
} | |
/** | |
* Adds Job. Will automatically update job's user too. | |
* | |
* @param Job $job | |
* | |
* @return $this | |
*/ | |
public function addJob(Job $job) | |
{ | |
// Check for duplicate | |
if (false === $this->jobs->contains($job)) { | |
$this->jobs->add($job); | |
} | |
// Ensure the relation is set for both entities | |
if (false === $job->getUsers()->contains($this)) { | |
$job->addUser($this); | |
} | |
return $this; | |
} | |
/** | |
* Removes job. Will automatically update job's user too. | |
* | |
* @param Job $job | |
* | |
* @return $this | |
*/ | |
public function removeJob(Job $job) | |
{ | |
$this->jobs->removeElement($job); | |
// Ensure the relation is unset for both entities | |
// The check must be done to avoid circular references | |
if (true === $job->getUsers()->contains($this)) { | |
$job->removeUser($this); | |
} | |
return $this; | |
} | |
/** | |
* @return ArrayCollection|Job[] | |
*/ | |
public function getJobs() | |
{ | |
return $this->jobs; | |
} | |
/** | |
* @param string $organizationEmail | |
* | |
* @return $this | |
*/ | |
public function setOrganizationEmail($organizationEmail) | |
{ | |
$this->organizationEmail = $organizationEmail; | |
return $this; | |
} | |
/** | |
* @return string|null | |
*/ | |
public function getOrganizationEmail() | |
{ | |
return $this->organizationEmail; | |
} | |
/** | |
* @param string $organizationEmailCanonical | |
* | |
* @return $this | |
*/ | |
public function setOrganizationEmailCanonical($organizationEmailCanonical) | |
{ | |
$this->organizationEmailCanonical = $organizationEmailCanonical; | |
return $this; | |
} | |
/** | |
* @return string|null | |
*/ | |
public function getOrganizationEmailCanonical() | |
{ | |
return $this->organizationEmailCanonical; | |
} | |
/** | |
* @param StudentConvention|null $studentConvention | |
* | |
* @return $this | |
*/ | |
public function setStudentConvention(StudentConvention $studentConvention = null) | |
{ | |
$this->studentConvention = $studentConvention; | |
return $this; | |
} | |
/** | |
* @return StudentConvention|null | |
*/ | |
public function getStudentConvention() | |
{ | |
return $this->studentConvention; | |
} | |
/** | |
* Add the given type if is not already present. | |
* | |
* @param string $type See ::getAllowedTypes() for valid values | |
* | |
* @return $this | |
*/ | |
public function addType($type) | |
{ | |
if (!in_array($type, $this->types)) { | |
$this->types[] = $type; | |
} | |
return $this; | |
} | |
/** | |
* See ::getAllowedTypes() for valid values. | |
* | |
* @param array $types | |
* | |
* @return $this | |
*/ | |
public function setTypes(array $types) | |
{ | |
$this->types = $types; | |
return $this; | |
} | |
/** | |
* @return array | |
*/ | |
public function getTypes() | |
{ | |
return $this->types; | |
} | |
/** | |
* @param \DateTime $updatedAt | |
* | |
* @return $this | |
*/ | |
public function setUpdatedAt(\DateTime $updatedAt) | |
{ | |
$this->updatedAt = $updatedAt; | |
return $this; | |
} | |
/** | |
* @return \DateTime | |
*/ | |
public function getUpdatedAt() | |
{ | |
return $this->updatedAt; | |
} | |
/** | |
* @return array Array of all valid values for the ::type property. | |
*/ | |
public static function getAllowedTypes() | |
{ | |
return [ | |
'contractor' => self::TYPE_CONTRACTOR, | |
'member' => self::TYPE_MEMBER, | |
]; | |
} | |
/** | |
* @param ExecutionContextInterface $context | |
* | |
* @Assert\Callback | |
*/ | |
public function validate(ExecutionContextInterface $context) | |
{ | |
$allowedTypes = array_flip($this->getAllowedTypes()); | |
foreach ($this->getTypes() as $type) { | |
if (!isset($allowedTypes[$type])) { | |
$context | |
->buildViolation('This type is not a valid type') | |
->atPath('types') | |
->addViolation(); | |
} | |
} | |
} | |
} |