<?php
namespace App\Entity;
use ApiPlatform\Core\Annotation\ApiResource;
use ApiPlatform\Core\Annotation\ApiFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\DateFilter;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Filter\OrderFilter;
use App\Repository\KinestexLogRepository;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Mapping\Annotation as Gedmo;
use Symfony\Component\Serializer\Annotation\Groups;
/**
* @ApiResource(
* normalizationContext={"groups"={"kinestex_log:read"}},
* denormalizationContext={"groups"={"kinestex_log:write"}},
* itemOperations={
* "get"={"security"="is_granted('ROLE_USER')"},
* "put"={"security"="is_granted('ROLE_USER')"},
* "delete"={"security"="is_granted('ROLE_USER')"}
* },
* collectionOperations={
* "get"={"security"="is_granted('ROLE_USER')"},
* "post"={"security"="is_granted('ROLE_USER')"}
* }
* )
* @ORM\Entity(repositoryClass=KinestexLogRepository::class)
* @ApiFilter(SearchFilter::class, properties={
* "user.id": "exact",
* "company.id": "exact",
* "exerciseType": "exact",
* "kinestexExercise.id": "exact",
* "kinestexExercise.kinestexId": "exact"
* })
* @ApiFilter(DateFilter::class, properties={"logDate", "createdAt"})
* @ApiFilter(OrderFilter::class)
*/
class KinestexLog
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
* @Groups({"kinestex_log:read"})
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=User::class)
* @ORM\JoinColumn(nullable=false)
* @Groups({"kinestex_log:read", "kinestex_log:write"})
*/
private $user;
/**
* @ORM\ManyToOne(targetEntity=Company::class)
* @Groups({"kinestex_log:read", "kinestex_log:write"})
*/
private $company;
/**
* @ORM\ManyToOne(targetEntity=KinestexExercise::class)
* @ORM\JoinColumn(nullable=true)
* @Groups({"kinestex_log:read", "kinestex_log:write"})
*/
private $kinestexExercise;
/**
* Type d'exercice (ex: "repetition", "duration")
* @ORM\Column(type="string", length=100)
* @Groups({"kinestex_log:read", "kinestex_log:write"})
*/
private $exerciseType;
/**
* ID de l'exercice KinesteX (legacy, maintenant on utilise la relation)
* @ORM\Column(type="string", length=100, nullable=true)
* @Groups({"kinestex_log:read", "kinestex_log:write"})
*/
private $exerciseId;
/**
* Nombre de répétitions effectuées (nullable pour le gainage)
* @ORM\Column(type="integer", nullable=true)
* @Groups({"kinestex_log:read", "kinestex_log:write"})
*/
private $repsCompleted;
/**
* Durée en secondes (nullable pour les exercices de répétitions)
* @ORM\Column(type="integer", nullable=true)
* @Groups({"kinestex_log:read", "kinestex_log:write"})
*/
private $durationSeconds;
/**
* Calories brûlées
* @ORM\Column(type="decimal", precision=6, scale=2, nullable=true)
* @Groups({"kinestex_log:read", "kinestex_log:write"})
*/
private $caloriesBurned;
/**
* Score de précision (0-100)
* @ORM\Column(type="decimal", precision=5, scale=2, nullable=true)
* @Groups({"kinestex_log:read", "kinestex_log:write"})
*/
private $accuracyScore;
/**
* Pourcentage de complétion
* @ORM\Column(type="decimal", precision=5, scale=2, nullable=true)
* @Groups({"kinestex_log:read", "kinestex_log:write"})
*/
private $completionPercentage;
/**
* Date du log (jour normalisé à minuit)
* @ORM\Column(type="date")
* @Groups({"kinestex_log:read", "kinestex_log:write"})
*/
private $logDate;
/**
* Source de données (ex: "kinestex_sdk")
* @ORM\Column(type="string", length=50, nullable=true)
* @Groups({"kinestex_log:read", "kinestex_log:write"})
*/
private $source;
/**
* Données brutes JSON de KinesteX
* @ORM\Column(type="json", nullable=true)
* @Groups({"kinestex_log:read", "kinestex_log:write"})
*/
private $rawData = [];
/**
* @ORM\Column(type="datetime", options={"default": "CURRENT_TIMESTAMP"})
* @Gedmo\Timestampable(on="create")
* @Groups({"kinestex_log:read"})
*/
private $createdAt;
/**
* @ORM\Column(type="datetime", nullable=true)
* @Gedmo\Timestampable(on="update")
* @Groups({"kinestex_log:read"})
*/
private $updatedAt;
// Getters & Setters existants...
public function getId(): ?int
{
return $this->id;
}
public function getUser(): ?User
{
return $this->user;
}
public function setUser(?User $user): self
{
$this->user = $user;
return $this;
}
public function getCompany(): ?Company
{
return $this->company;
}
public function setCompany(?Company $company): self
{
$this->company = $company;
return $this;
}
public function getKinestexExercise(): ?KinestexExercise
{
return $this->kinestexExercise;
}
public function setKinestexExercise(?KinestexExercise $kinestexExercise): self
{
$this->kinestexExercise = $kinestexExercise;
// Auto-populate exerciseId et exerciseType depuis la relation
if ($kinestexExercise) {
$this->exerciseId = $kinestexExercise->getKinestexId();
$this->exerciseType = $kinestexExercise->getType();
}
return $this;
}
public function getExerciseType(): ?string
{
return $this->exerciseType;
}
public function setExerciseType(string $exerciseType): self
{
$this->exerciseType = $exerciseType;
return $this;
}
public function getExerciseId(): ?string
{
return $this->exerciseId;
}
public function setExerciseId(?string $exerciseId): self
{
$this->exerciseId = $exerciseId;
return $this;
}
// ... reste des getters/setters inchangés ...
public function getRepsCompleted(): ?int
{
return $this->repsCompleted;
}
public function setRepsCompleted(?int $repsCompleted): self
{
$this->repsCompleted = $repsCompleted;
return $this;
}
public function getDurationSeconds(): ?int
{
return $this->durationSeconds;
}
public function setDurationSeconds(?int $durationSeconds): self
{
$this->durationSeconds = $durationSeconds;
return $this;
}
public function getCaloriesBurned(): ?float
{
return $this->caloriesBurned ? (float) $this->caloriesBurned : null;
}
public function setCaloriesBurned(?float $caloriesBurned): self
{
$this->caloriesBurned = $caloriesBurned;
return $this;
}
public function getAccuracyScore(): ?float
{
return $this->accuracyScore ? (float) $this->accuracyScore : null;
}
public function setAccuracyScore(?float $accuracyScore): self
{
$this->accuracyScore = $accuracyScore;
return $this;
}
public function getCompletionPercentage(): ?float
{
return $this->completionPercentage ? (float) $this->completionPercentage : null;
}
public function setCompletionPercentage(?float $completionPercentage): self
{
$this->completionPercentage = $completionPercentage;
return $this;
}
public function getLogDate(): ?\DateTimeInterface
{
return $this->logDate;
}
public function setLogDate(\DateTimeInterface $logDate): self
{
$this->logDate = $logDate;
return $this;
}
public function getSource(): ?string
{
return $this->source;
}
public function setSource(?string $source): self
{
$this->source = $source;
return $this;
}
public function getRawData(): ?array
{
return $this->rawData;
}
public function setRawData(?array $rawData): self
{
$this->rawData = $rawData;
return $this;
}
public function getCreatedAt(): ?\DateTimeInterface
{
return $this->createdAt;
}
public function setCreatedAt(\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt;
return $this;
}
public function getUpdatedAt(): ?\DateTimeInterface
{
return $this->updatedAt;
}
public function setUpdatedAt(?\DateTimeInterface $updatedAt): self
{
$this->updatedAt = $updatedAt;
return $this;
}
}