Fetch all participants of survey (instead of first 10 only - default behaviour)

This commit is contained in:
Meritoo
2017-10-25 20:26:03 +02:00
parent ac72c6bd76
commit 83ff76776c
14 changed files with 1343 additions and 315 deletions

View File

@@ -8,14 +8,12 @@
namespace Meritoo\LimeSurvey\ApiClient\Service;
use Meritoo\Common\Collection\Collection;
use Meritoo\LimeSurvey\ApiClient\Client\Client;
use Meritoo\LimeSurvey\ApiClient\Exception\CannotProcessDataException;
use Meritoo\LimeSurvey\ApiClient\Exception\MissingParticipantOfSurveyException;
use Meritoo\LimeSurvey\ApiClient\Result\Collection\Participants;
use Meritoo\LimeSurvey\ApiClient\Result\Collection\ParticipantsDetails;
use Meritoo\LimeSurvey\ApiClient\Result\Item\Participant;
use Meritoo\LimeSurvey\ApiClient\Result\Item\ParticipantShort;
use Meritoo\LimeSurvey\ApiClient\Type\MethodType;
use Meritoo\LimeSurvey\ApiClient\Type\ReasonType;
@@ -34,14 +32,6 @@ class ParticipantService
*/
private $client;
/**
* Collection of participants' short data.
* All participants grouped per survey.
*
* @var Participants
*/
private $allParticipants;
/**
* Collection of participants' full data.
* All participants grouped per survey.
@@ -54,26 +44,18 @@ class ParticipantService
* Class constructor
*
* @param Client $client Client of the LimeSurvey's API
* @param Participants $allParticipants (optional) Collection of participants' short data. All participants
* grouped per survey.
* @param ParticipantsDetails $participantsDetails (optional) Collection of participants' full data. All
* participants grouped per survey.
*/
public function __construct(
Client $client,
Participants $allParticipants = null,
ParticipantsDetails $participantsDetails = null
) {
if (null === $allParticipants) {
$allParticipants = new Participants();
}
if (null === $participantsDetails) {
$participantsDetails = new ParticipantsDetails();
}
$this->client = $client;
$this->allParticipants = $allParticipants;
$this->participantsDetails = $participantsDetails;
}
@@ -87,51 +69,6 @@ class ParticipantService
return $this->client;
}
/**
* Returns participants of given survey
*
* @param int $surveyId ID of survey
* @return Collection
*
* @throws CannotProcessDataException
*/
public function getSurveyParticipants($surveyId)
{
$hasSurvey = $this
->allParticipants
->hasParticipantsOfSurvey($surveyId);
if (!$hasSurvey) {
$arguments = [
$surveyId,
];
try {
$participants = $this
->client
->run(MethodType::LIST_PARTICIPANTS, $arguments)
->getData();
} catch (CannotProcessDataException $exception) {
/*
* Oops, something is broken, because the reason is different than "there are no participants"
*/
if (ReasonType::NO_PARTICIPANTS_FOUND !== $exception->getReason()) {
throw $exception;
}
$participants = new Collection();
}
$this
->allParticipants
->addParticipants($participants, $surveyId);
}
return $this
->allParticipants
->getBySurvey($surveyId);
}
/**
* Returns information if given survey has participant with given e-mail
*
@@ -144,71 +81,6 @@ class ParticipantService
return null !== $this->getParticipantDetails($surveyId, $email);
}
/**
* Adds participant with given data to survey with given ID
*
* @param int $surveyId ID of survey
* @param string $firstName First name of the participant to add
* @param string $lastName Last ame of the participant to add
* @param string $email E-mail address of the participant to add
* @return Participant
*/
public function addParticipant($surveyId, $firstName, $lastName, $email)
{
$participantsData = [
[
'firstname' => $firstName,
'lastname' => $lastName,
'email' => $email,
],
];
$arguments = [
$surveyId,
$participantsData,
];
$participantCollection = $this
->client
->run(MethodType::ADD_PARTICIPANTS, $arguments)
->getData();
/* @var Participant $addedParticipant */
$addedParticipant = $participantCollection->getFirst();
$participants = new Collection([
ParticipantShort::fromParticipant($addedParticipant),
]);
$this
->allParticipants
->addParticipants($participants, $surveyId);
return $participantCollection->getFirst();
}
/**
* Returns short data of one participant with given e-mail (participant of given survey)
*
* @param int $surveyId ID of survey
* @param string $email E-mail address of the participant
* @return ParticipantShort|null
*/
public function getParticipant($surveyId, $email)
{
/*
* I have to get all participants of survey to avoid problem when participants exist but are not loaded
*/
$this->getSurveyParticipants($surveyId);
$participant = $this
->allParticipants
->getParticipantOfSurvey($surveyId, $email);
/* @var ParticipantShort $participant */
return $participant;
}
/**
* Returns full data of participant with given e-mail (participant of given survey)
*