-
Notifications
You must be signed in to change notification settings - Fork 994
/
ParticipantBlacklistHandler.php
143 lines (127 loc) · 5.31 KB
/
ParticipantBlacklistHandler.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
<?php
namespace LimeSurvey\Models\Services;
use InvalidArgumentException;
use LimeSurvey\Datavalueobjects\BlacklistResult;
class ParticipantBlacklistHandler
{
/**
* @param \Token $token
* @return \LimeSurvey\Datavalueobjects\BlacklistResult
*/
public function addToBlacklist($token)
{
$participant = $this->getCentralParticipantFromToken($token);
if (empty($participant)) {
return new BlacklistResult(false, gT("No CPDB participant found."));
}
// Add participant to the blocklist if it's not already blocklisted
if ($participant->blacklisted != "Y") {
$participant->blacklisted = 'Y';
$participant->save();
$result = new BlacklistResult(true, gT("You have been removed from the central participants list for this site."));
// Remove or blocklist participant in current surveys if needed
if (\Yii::app()->getConfig('deleteblacklisted') == "Y") {
$surveyIds = $this->removeParticipantFromAllSurveys($participant);
} elseif (\Yii::app()->getConfig('blacklistallsurveys') == "Y") {
$surveyIds = $this->optoutParticipantFromAllSurveys($participant);
}
if (!empty($surveyIds)) {
$result->appendMessage(sprintf(gT("You were also removed from %d surveys on this site."), count($surveyIds)));
}
return $result;
} else {
// Already blocklisted
return new BlacklistResult(true, gT("You have already been removed from the central participants list for this site."));
}
}
/**
* @param \Token $token
* @return \LimeSurvey\Datavalueobjects\BlacklistResult
*/
public function removeFromBlacklist($token)
{
$participant = $this->getCentralParticipantFromToken($token);
if (empty($participant) || $participant->blacklisted != "Y") {
return new BlacklistResult(false, gT("You are not globally blocklisted on this site."));
}
// Remove participant from the blocklist
$participant->blacklisted == 'N';
$participant->save();
$result = new BlacklistResult(false, gT("You have been added back to the central participants list for this site."));
// TODO: Remove 'OptOut' status from all surveys if 'blacklistallsurveys' setting is true?
return $result;
}
/**
* Returns the CPDB participant corresponding to the given Token.
* @param \Token $token
* @return \Participant|null
*/
public function getCentralParticipantFromToken($token)
{
$participant = null;
// Try to match by participant ID
if (!empty($token->participant_id)) {
$participant = \Participant::model()->findByPk($token->participant_id);
}
// TODO: Should we also try to match by email?
return $participant;
}
/**
* Removes the participant from all surveys currently present in the system that use tokens
* @param \Participant $participant
* @return int[] the list of survey IDs from which the participant was removed
*/
private function removeParticipantFromAllSurveys($participant)
{
if (empty($participant->participant_id)) {
throw new InvalidArgumentException(gT("Participant ID cannot be empty"));
}
$surveys = \Survey::model()->findAll();
/** @var int[] the list of survey IDs from which the participant was removed */
$removedSurveyIds = [];
foreach ($surveys as $survey) {
if ($survey->hasTokensTable) {
$count = \Token::model($survey->sid)->deleteAllByAttributes(['participant_id' => $participant->participant_id]);
if ($count > 0) {
$removedSurveyIds[] = $survey->sid;
}
}
}
return $removedSurveyIds;
}
/**
* Marks the participant as "opted out" on all surveys currently present in the system that use tokens
* @param \Participant $participant
* @return int[] the list of survey IDs from which the participant was opted out
*/
private function optoutParticipantFromAllSurveys($participant)
{
if (empty($participant->participant_id)) {
throw new InvalidArgumentException(gT("Participant ID cannot be empty"));
}
$surveys = \Survey::model()->findAll();
/** @var int[] the list of survey IDs from which the participant was opted out */
$optedoutSurveyIds = [];
foreach ($surveys as $survey) {
if ($survey->hasTokensTable) {
$token = \Token::model($survey->sid)->findByAttributes(['participant_id' => $participant->participant_id], "emailstatus <> 'OptOut'");
if (!empty($token)) {
$token->emailstatus = 'OptOut';
$token->save();
$optedoutSurveyIds[] = $survey->sid;
}
}
}
return $optedoutSurveyIds;
}
/**
* Returns true if the token is globally blocklisted
* @param \Token $token
* @return bool
*/
public function isTokenBlacklisted($token)
{
$participant = $this->getCentralParticipantFromToken($token);
return !empty($participant) && $participant->blacklisted == "Y";
}
}