This commit is contained in:
Marek Lenczewski
2026-03-30 23:08:24 +02:00
parent 2f96caaa23
commit 7b58e68ecb
31 changed files with 637 additions and 431 deletions

View File

@@ -3,53 +3,27 @@
namespace App\Service;
use App\DTO\Request\CreateSchemaRequest;
use App\DTO\Request\ToggleRequest;
use App\DTO\Request\UpdateSchemaRequest;
use App\DTO\Response\ToggleResponse;
use App\Entity\TaskSchema;
use App\Enum\TaskSchemaStatus;
use App\Enum\TaskSchemaType;
use App\Enum\TaskStatus;
use Symfony\Component\HttpKernel\Exception\HttpException;
use App\Repository\CategoryRepository;
use App\Repository\TaskRepository;
use Doctrine\ORM\EntityManagerInterface;
class TaskSchemaManager
{
public function __construct(
private EntityManagerInterface $em,
private CategoryRepository $categoryRepository,
private TaskRepository $taskRepository,
private TaskSynchronizer $taskSynchronizer,
) {}
public function createSchema(CreateSchemaRequest $request): TaskSchema
{
$schema = new TaskSchema();
$schema->setName($request->name ?? '');
if ($request->status !== null) {
$status = TaskSchemaStatus::tryFrom($request->status);
if ($status !== null) {
$schema->setStatus($status);
}
}
if ($request->taskType !== null) {
$taskType = TaskSchemaType::tryFrom($request->taskType);
if ($taskType !== null) {
$schema->setTaskType($taskType);
}
}
$schema->setDeadline($request->deadline !== null ? new \DateTime($request->deadline) : null);
$schema->setStartDate($request->startDate !== null ? new \DateTime($request->startDate) : null);
$schema->setEndDate($request->endDate !== null ? new \DateTime($request->endDate) : null);
$schema->setWeekdays($request->weekdays);
$schema->setMonthDays($request->monthDays);
$schema->setYearDays($request->yearDays);
$this->applyFields($schema, $request);
$this->resolveCategory($schema, $request);
$this->applyDefaults($schema);
@@ -65,6 +39,19 @@ class TaskSchemaManager
$schema->setName($request->name);
}
$this->applyFields($schema, $request);
$this->resolveCategory($schema, $request);
$this->applyDefaults($schema);
$this->em->flush();
$this->taskSynchronizer->syncForSchema($schema);
return $schema;
}
private function applyFields(TaskSchema $schema, CreateSchemaRequest|UpdateSchemaRequest $request): void
{
if ($request->status !== null) {
$status = TaskSchemaStatus::tryFrom($request->status);
if ($status !== null) {
@@ -85,40 +72,6 @@ class TaskSchemaManager
$schema->setWeekdays($request->weekdays);
$schema->setMonthDays($request->monthDays);
$schema->setYearDays($request->yearDays);
$this->resolveCategory($schema, $request);
$this->applyDefaults($schema);
$this->em->flush();
// Sync: delete what no longer fits, create what's missing
$this->taskSynchronizer->syncForSchema($schema);
return $schema;
}
public function toggleTaskStatus(TaskSchema $schema, ToggleRequest $request): ToggleResponse
{
if ($schema->getStatus() === TaskSchemaStatus::Inactive) {
throw new HttpException(422, 'Inaktive Aufgaben können nicht umgeschaltet werden.');
}
// Find the task
$task = $request->date !== null
? $this->taskRepository->findByTaskAndDate($schema, new \DateTime($request->date))
: $this->taskRepository->findOneBy(['schema' => $schema, 'date' => null]);
if (!$task) {
throw new HttpException(404, 'Task nicht gefunden.');
}
$newStatus = $task->getStatus() === TaskStatus::Active
? TaskStatus::Completed
: TaskStatus::Active;
$task->setStatus($newStatus);
$this->em->flush();
return new ToggleResponse(completed: $newStatus === TaskStatus::Completed);
}
private function resolveCategory(TaskSchema $schema, UpdateSchemaRequest|CreateSchemaRequest $request): void