107 lines
3.9 KiB
PHP
107 lines
3.9 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Mummert\SurveyBundle\Service;
|
|
|
|
use Mummert\SurveyBundle\Form\Model\SurveyConditionData;
|
|
use Mummert\SurveyBundle\Form\Model\SurveyEditorData;
|
|
use Mummert\SurveyBundle\Form\Model\SurveyQuestionData;
|
|
use Mummert\SurveyBundle\Model\SurveyModel;
|
|
use Mummert\SurveyBundle\Repository\SurveyConditionRepository;
|
|
use Mummert\SurveyBundle\Repository\SurveyEditorRepository;
|
|
use Mummert\SurveyBundle\Repository\SurveyQuestionRepository;
|
|
use Mummert\SurveyBundle\Repository\SurveyRepository;
|
|
|
|
final class SurveyEditorService
|
|
{
|
|
public function __construct(
|
|
private readonly SurveyRepository $surveyRepository,
|
|
private readonly SurveyQuestionRepository $surveyQuestionRepository,
|
|
private readonly SurveyConditionRepository $surveyConditionRepository,
|
|
private readonly SurveyEditorRepository $surveyEditorRepository,
|
|
private readonly SurveyCategoryAssignmentService $surveyCategoryAssignmentService,
|
|
) {
|
|
}
|
|
|
|
public function createSurvey(int $memberId, SurveyEditorData $data): SurveyModel
|
|
{
|
|
$payload = $data->toArray();
|
|
$payload['category'] = $this->surveyCategoryAssignmentService->getMemberCategoryIds($memberId);
|
|
|
|
$survey = $this->surveyRepository->create($memberId, $payload);
|
|
$this->surveyEditorRepository->assignEditor((int) $survey->id, $memberId);
|
|
$this->surveyRepository->refreshListMetadata((int) $survey->id);
|
|
|
|
return $survey;
|
|
}
|
|
|
|
public function updateSurvey(SurveyModel $survey, int $memberId, SurveyEditorData $data): void
|
|
{
|
|
$this->surveyRepository->update($survey, $memberId, $data->toArray());
|
|
}
|
|
|
|
public function saveQuestion(SurveyModel $survey, SurveyQuestionData $data, int $questionId = 0): void
|
|
{
|
|
$this->assertUnlocked($survey);
|
|
|
|
if ($questionId > 0) {
|
|
$question = $this->surveyQuestionRepository->findByIdForSurvey((int) $survey->id, $questionId);
|
|
|
|
if (null === $question) {
|
|
throw new \RuntimeException('Die Frage wurde nicht gefunden.');
|
|
}
|
|
|
|
$this->surveyQuestionRepository->update($question, $data->toArray());
|
|
$this->surveyRepository->touch((int) $survey->id);
|
|
|
|
return;
|
|
}
|
|
|
|
$this->surveyQuestionRepository->create((int) $survey->id, $data->toArray());
|
|
$this->surveyRepository->touch((int) $survey->id);
|
|
}
|
|
|
|
public function deleteQuestion(SurveyModel $survey, int $questionId): void
|
|
{
|
|
$this->assertUnlocked($survey);
|
|
|
|
$this->surveyQuestionRepository->delete((int) $survey->id, $questionId);
|
|
$this->surveyRepository->touch((int) $survey->id);
|
|
}
|
|
|
|
public function saveCondition(SurveyModel $survey, SurveyConditionData $data, int $conditionId = 0): void
|
|
{
|
|
$this->assertUnlocked($survey);
|
|
|
|
if ($conditionId > 0) {
|
|
$condition = $this->surveyConditionRepository->findById($conditionId);
|
|
|
|
if (null === $condition || (int) $condition->pid !== (int) $survey->id) {
|
|
throw new \RuntimeException('Die Bedingung wurde nicht gefunden.');
|
|
}
|
|
|
|
$this->surveyConditionRepository->update($condition, $data->toArray());
|
|
$this->surveyRepository->touch((int) $survey->id);
|
|
|
|
return;
|
|
}
|
|
|
|
$this->surveyConditionRepository->create((int) $survey->id, $data->toArray());
|
|
$this->surveyRepository->touch((int) $survey->id);
|
|
}
|
|
|
|
public function deleteCondition(SurveyModel $survey, int $conditionId): void
|
|
{
|
|
$this->assertUnlocked($survey);
|
|
$this->surveyConditionRepository->delete((int) $survey->id, $conditionId);
|
|
$this->surveyRepository->touch((int) $survey->id);
|
|
}
|
|
|
|
private function assertUnlocked(SurveyModel $survey): void
|
|
{
|
|
if ('1' === (string) $survey->isLocked) {
|
|
throw new \RuntimeException('Die Umfrage ist gesperrt, weil bereits Antworten existieren.');
|
|
}
|
|
}
|
|
} |