diff --git a/src/Module/ProjectManagement/Domain/Entity/Task.php b/src/Module/ProjectManagement/Domain/Entity/Task.php index 3d9daf8..28b0b72 100644 --- a/src/Module/ProjectManagement/Domain/Entity/Task.php +++ b/src/Module/ProjectManagement/Domain/Entity/Task.php @@ -111,6 +111,7 @@ class Task implements TaskInterface, TimestampableInterface, BlamableInterface #[ORM\ManyToOne(targetEntity: Project::class, inversedBy: 'tasks')] #[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')] #[Groups(['task:read', 'task:write'])] + #[Assert\NotNull] private ?Project $project = null; /** @var Collection */ diff --git a/src/Module/ProjectManagement/Infrastructure/Service/CalDavService.php b/src/Module/ProjectManagement/Infrastructure/Service/CalDavService.php index 8be1017..a35ef38 100644 --- a/src/Module/ProjectManagement/Infrastructure/Service/CalDavService.php +++ b/src/Module/ProjectManagement/Infrastructure/Service/CalDavService.php @@ -134,6 +134,12 @@ final class CalDavService public function syncTask(Task $task): void { + // No CalDAV server configured/enabled: skip all remote interaction so a + // task save never triggers a doomed HTTP request nor stores a sync error. + if (!$this->isConfigured()) { + return; + } + if (!$task->isSyncToCalendar()) { $this->deleteEvent($task->getCalendarEventUid()); $this->deleteTodo($task->getCalendarTodoUid());