Skip to content

Commit bcec12a

Browse files
romanetarsmarcet
andcommitted
Questions by ticket types and badge feature types (#128)
* Fix on Filter Parse Allow to select filter primary element JOIN Boolean condition (AND or OR) default AND modifier prefix with || ( OR ) Signed-off-by: smarcet@gmail.com <smarcet@gmail.com> Change-Id: Ic51562872036ea3592a2032109227ccb0fe9822b * Model relations and migrations Signed-off-by: romanetar <roman_ag@hotmail.com> * ORM mappings and serializer Signed-off-by: romanetar <roman_ag@hotmail.com> * Model - ORM Mappings & Serializers Signed-off-by: romanetar <roman_ag@hotmail.com> * CRUD endpoint updates Signed-off-by: romanetar <roman_ag@hotmail.com> * allowed extra questions filtering Signed-off-by: romanetar <roman_ag@hotmail.com> * allowed extra questions filtering (WIP) Signed-off-by: romanetar <roman_ag@hotmail.com> * allowed extra questions filtering Signed-off-by: romanetar <roman_ag@hotmail.com> * Fixes and Tweaks Signed-off-by: smarcet@gmail.com <smarcet@gmail.com> Change-Id: If5c9c427c3231a9984bbba8a8178f74b0fa599d8 * allowed extra questions filtering in population Signed-off-by: romanetar <roman_ag@hotmail.com> --------- Signed-off-by: smarcet@gmail.com <smarcet@gmail.com> Signed-off-by: romanetar <roman_ag@hotmail.com> Co-authored-by: smarcet@gmail.com <smarcet@gmail.com> Change-Id: I8705ffa989b6d58e756b77e9fab3ea183623aefe
1 parent aa2fd07 commit bcec12a

27 files changed

Lines changed: 1081 additions & 14502 deletions

Libs/ModelSerializers/AbstractSerializer.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -396,8 +396,9 @@ protected function _expand(array $values, ?string $expand, array $fields = [], a
396396
if(empty($getter)) continue;
397397
$has = $serializerSpec['has'] ?? null;
398398
$test_rule = $serializerSpec['test_rule'] ?? null;
399+
$should_skip_rule = $serializerSpec['should_skip_rule'] ?? null;
399400
$serializer_type = $serializerSpec['serializer_type'] ?? SerializerRegistry::SerializerType_Public;
400-
$serializer = new $serializerClass($original_attribute, $attribute, $getter, $has, $serializer_type, $test_rule);
401+
$serializer = new $serializerClass($original_attribute, $attribute, $getter, $has, $serializer_type, $test_rule, $should_skip_rule);
401402
$values = $serializer->serialize($this->object, $values, $expand, $fields, $relations, $params);
402403
}
403404
}

Libs/ModelSerializers/Many2OneExpandSerializer.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
* limitations under the License.
1313
**/
1414

15-
use Illuminate\Support\Facades\Log;
1615
use ModelSerializers\SerializerRegistry;
1716
/**
1817
* Class Many2OneExpandSerializer
@@ -36,6 +35,8 @@ public function serialize($entity, array $values, string $expand, array $fields
3635
$values = $this->unsetOriginalAttribute($values);
3736
$res = [];
3837
foreach ($entity->{$this->getter}() as $item){
38+
$shouldSkip = is_null($this->should_skip_rule) ? false : call_user_func($this->should_skip_rule, $item, $params);
39+
if ($shouldSkip == true) continue;
3940
$res[] = SerializerRegistry::getInstance()->getSerializer($item, $this->serializer_type)
4041
->serialize
4142
(

Libs/ModelSerializers/One2ManyExpandSerializer.php

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,20 @@ class One2ManyExpandSerializer implements IExpandSerializer
4949
* @var string
5050
*/
5151
protected $test_rule;
52+
53+
/**
54+
* @var string
55+
*/
56+
protected $should_skip_rule;
57+
5258
/**
5359
* @param string $original_attribute
5460
* @param string $attribute
5561
* @param string $getter
5662
* @param string|null $has
5763
* @param string|null $serializer_type
5864
* @param string|null $test_rule
65+
* @param string|null $should_skip_rule
5966
*/
6067
public function __construct
6168
(
@@ -64,7 +71,8 @@ public function __construct
6471
string $getter,
6572
?string $has = null,
6673
?string $serializer_type = SerializerRegistry::SerializerType_Public,
67-
?string $test_rule = null
74+
?string $test_rule = null,
75+
?string $should_skip_rule = null
6876
)
6977
{
7078
$this->original_attribute = $original_attribute;
@@ -73,6 +81,7 @@ public function __construct
7381
$this->has = $has;
7482
$this->serializer_type = $serializer_type;
7583
$this->test_rule = $test_rule;
84+
$this->should_skip_rule = $should_skip_rule;
7685
Log::debug
7786
(
7887
sprintf

app/Http/Controllers/Apis/Protected/Summit/Factories/Registration/SummitOrderExtraQuestionTypeValidationRulesFactory.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,16 @@ public static function build(array $data, $update = false){
3232
return array_merge([
3333
'usage' => 'sometimes|string|in:'.implode(",", SummitOrderExtraQuestionTypeConstants::ValidQuestionUsages),
3434
'printable' => 'sometimes|boolean',
35+
'has_badge_feature_types' => 'sometimes|string|in:true,false',
36+
'has_ticket_types' => 'sometimes|string|in:true,false',
3537
], $rules);
3638
}
3739

3840
return array_merge([
3941
'usage' => 'required|string|in:'.implode(",", SummitOrderExtraQuestionTypeConstants::ValidQuestionUsages),
4042
'printable' => 'sometimes|boolean',
41-
43+
'has_badge_feature_types' => 'sometimes|string|in:true,false',
44+
'has_ticket_types' => 'sometimes|string|in:true,false',
4245
], $rules);
4346
}
4447
}

app/Http/Controllers/Apis/Protected/Summit/OAuth2SummitOrderExtraQuestionTypeApiController.php

Lines changed: 100 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,21 @@
1616
use App\Models\Foundation\Summit\Repositories\ISummitOrderExtraQuestionTypeRepository;
1717
use App\ModelSerializers\SerializerUtils;
1818
use App\Services\Model\ISummitOrderExtraQuestionTypeService;
19+
use Illuminate\Support\Facades\Log;
1920
use libs\utils\HTMLCleaner;
2021
use models\exceptions\EntityNotFoundException;
2122
use models\exceptions\ValidationException;
2223
use models\oauth2\IResourceServerContext;
2324
use models\summit\ISummitRepository;
2425
use models\summit\Summit;
26+
use models\summit\SummitAttendee;
27+
use models\summit\SummitOrderExtraQuestionTypeConstants;
2528
use models\utils\IEntity;
2629
use ModelSerializers\SerializerRegistry;
30+
use utils\Filter;
31+
use utils\FilterElement;
32+
use utils\Order;
33+
use utils\PagingInfo;
2734
use utils\PagingResponse;
2835
use App\Http\Controllers\RequestProcessor;
2936

@@ -80,6 +87,8 @@ public function __construct
8087

8188
use RequestProcessor;
8289

90+
use ParametrizedGetAll;
91+
8392
/**
8493
* @param $summit_id
8594
* @return mixed
@@ -105,7 +114,9 @@ protected function getFilterRules(): array
105114
'type' => ['==', '=@'],
106115
'usage' => ['==', '=@'],
107116
'label' => ['==', '=@'],
108-
'class' => ['==']
117+
'class' => ['=='],
118+
'has_ticket_types' => ['=='],
119+
'has_badge_feature_types' => ['==']
109120
];
110121
}
111122

@@ -120,6 +131,8 @@ protected function getFilterValidatorRules(): array
120131
'usage' => 'sometimes|required|string',
121132
'label' => 'sometimes|required|string',
122133
'class' => 'sometimes|required|string|in:' . implode(',', ExtraQuestionTypeConstants::AllowedQuestionClass),
134+
'has_ticket_types' => 'sometimes|string|in:true,false',
135+
'has_badge_feature_types' => 'sometimes|string|in:true,false'
123136
];
124137
}
125138

@@ -444,4 +457,90 @@ public function deleteSubQuestionRule($summit_id, $question_id, $rule_id)
444457
return $this->deleted();
445458
});
446459
}
460+
461+
/**
462+
* @param $summit_id
463+
* @return mixed
464+
*/
465+
public function getOwnAttendeeAllowedExtraQuestions($summit_id)
466+
{
467+
return $this->processRequest(function () use ($summit_id) {
468+
$summit = SummitFinderStrategyFactory::build($this->summit_repository, $this->getResourceServerContext())->find($summit_id);
469+
if (is_null($summit)) return $this->error404();
470+
471+
$type = CheckAttendeeStrategyFactory::Me;
472+
$attendee = CheckAttendeeStrategyFactory::build($type, $this->resource_server_context)->check('me', $summit);
473+
if (is_null($attendee)) return $this->error404();
474+
475+
return $this->getAttendeeExtraQuestions($summit_id, $attendee->getId());
476+
});
477+
}
478+
479+
/**
480+
* @param $summit_id
481+
* @param $attendee_id
482+
* @return mixed
483+
*/
484+
public function getAttendeeExtraQuestions($summit_id, $attendee_id)
485+
{
486+
$summit = SummitFinderStrategyFactory::build($this->getSummitRepository(), $this->getResourceServerContext())->find($summit_id);
487+
if (is_null($summit)) return $this->error404();
488+
489+
$attendee = $summit->getAttendeeById(intval($attendee_id));
490+
if (is_null($attendee)) return $this->error404();
491+
492+
return $this->_getAll(
493+
function () {
494+
return [
495+
'name' => ['=@', '=='],
496+
'type' => ['=@', '=='],
497+
'label' => ['=@', '=='],
498+
'printable' => ['=='],
499+
'usage' => ['=@', '=='],
500+
'summit_id' => ['==']
501+
];
502+
},
503+
function () {
504+
return [
505+
'name' => 'sometimes|string',
506+
'type' => 'sometimes|string',
507+
'label' => 'sometimes|string',
508+
'printable' => 'sometimes|string|in:true,false',
509+
'usage' => 'sometimes|string',
510+
'summit_id' => 'sometimes|integer'
511+
];
512+
},
513+
function () {
514+
return [
515+
'id',
516+
'name',
517+
'label',
518+
'order',
519+
];
520+
},
521+
function ($filter) use ($summit) {
522+
if ($filter instanceof Filter) {
523+
$filter->addFilterCondition(FilterElement::makeEqual('summit_id', $summit->getId()));
524+
$filter->addFilterCondition(FilterElement::makeEqual('class', ExtraQuestionTypeConstants::QuestionClassMain));
525+
$filter->addFilterCondition(FilterElement::makeEqual('usage', SummitOrderExtraQuestionTypeConstants::TicketQuestionUsage));
526+
}
527+
return $filter;
528+
},
529+
function () {
530+
return SerializerRegistry::SerializerType_Public;
531+
},
532+
null,
533+
null,
534+
function ($page, $per_page, $filter, $order, $applyExtraFilters) use ($attendee) {
535+
return $this->repository->getAllAllowedByPage
536+
(
537+
$attendee,
538+
new PagingInfo($page, $per_page),
539+
call_user_func($applyExtraFilters, $filter),
540+
$order
541+
);
542+
},
543+
['attendee' => $attendee]
544+
);
545+
}
447546
}

app/ModelSerializers/ExtraQuestionTypeSerializer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public function serialize($expand = null, array $fields = array(), array $relati
8989
'values' => [
9090
'type' => Many2OneExpandSerializer::class,
9191
'getter' => 'getValues',
92-
'test_rule' => 'ModelSerializers\\ExtraQuestionTypeSerializer::testRule'
92+
'test_rule' => 'ModelSerializers\\ExtraQuestionTypeSerializer::testRule',
9393
],
9494
'sub_question_rules' => [
9595
'type' => Many2OneExpandSerializer::class,

app/ModelSerializers/Summit/Registration/SummitOrderExtraQuestionTypeSerializer.php

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@
1111
* See the License for the specific language governing permissions and
1212
* limitations under the License.
1313
**/
14+
15+
use App\Models\Foundation\Main\ExtraQuestions\SubQuestionRule;
16+
use Libs\ModelSerializers\Many2OneExpandSerializer;
17+
use models\summit\SummitAttendee;
1418
use models\summit\SummitOrderExtraQuestionType;
19+
1520
/**
1621
* Class SummitOrderExtraQuestionTypeSerializer
1722
* @package ModelSerializers
@@ -24,6 +29,22 @@ final class SummitOrderExtraQuestionTypeSerializer extends ExtraQuestionTypeSeri
2429
'SummitId' => 'summit_id:json_int',
2530
];
2631

32+
public static function shouldSkip($e, $params): bool
33+
{
34+
if (array_key_exists('attendee', $params)) {
35+
$attendee = $params['attendee'];
36+
if(!$attendee instanceof SummitAttendee) return false;
37+
if (!$e instanceof SubQuestionRule) return false;
38+
return !$attendee->isAllowedQuestion($e->getSubQuestion());
39+
}
40+
return false;
41+
}
42+
43+
protected static $allowed_relations = [
44+
'allowed_ticket_types',
45+
'allowed_badge_features_types',
46+
];
47+
2748
/**
2849
* @param null $expand
2950
* @param array $fields
@@ -35,8 +56,62 @@ public function serialize($expand = null, array $fields = array(), array $relati
3556
{
3657
$question = $this->object;
3758
if (!$question instanceof SummitOrderExtraQuestionType) return [];
59+
3860
if(!count($relations)) $relations = $this->getAllowedRelations();
61+
62+
// we do here before calling parent to overload and applyt the should skip rule
63+
if(in_array('sub_question_rules', $relations) && !isset($values['sub_question_rules']) && $question->allowsValues()) {
64+
$sub_question_rules = [];
65+
foreach ($question->getOrderedSubQuestionRules() as $rule) {
66+
if (self::shouldSkip($rule, $params)) continue;
67+
$sub_question_rules[] = $rule->getId();
68+
}
69+
$values['sub_question_rules'] = $sub_question_rules;
70+
}
71+
72+
if(in_array('parent_rules', $relations) && !isset($values['parent_rules'])) {
73+
$parent_rules = [];
74+
foreach ($question->getParentRules() as $rule) {
75+
if (self::shouldSkip($rule, $params)) continue;
76+
$parent_rules[] = $rule->getId();
77+
}
78+
$values['parent_rules'] = $parent_rules;
79+
}
80+
3981
$values = parent::serialize($expand, $fields, $relations, $params);
82+
83+
if(in_array('allowed_ticket_types', $relations) && !isset($values['allowed_ticket_types']))
84+
$values['allowed_ticket_types'] = $question->getAllowedTicketTypeIds();
85+
86+
if(in_array('allowed_badge_features_types', $relations) && !isset($values['allowed_badge_features_types']))
87+
$values['allowed_badge_feature_types'] = $question->getAllowedBadgeFeatureTypeIds();
88+
4089
return $values;
4190
}
91+
92+
93+
protected static $expand_mappings = [
94+
'allowed_ticket_types' => [
95+
'type' => Many2OneExpandSerializer::class,
96+
'getter' => 'getAllowedTicketTypes',
97+
],
98+
'allowed_badge_features_types' => [
99+
'type' => Many2OneExpandSerializer::class,
100+
'getter' => 'getAllowedBadgeFeatureTypes',
101+
],
102+
// overload to apply the should skip rule
103+
'sub_question_rules' => [
104+
'type' => Many2OneExpandSerializer::class,
105+
'getter' => 'getOrderedSubQuestionRules',
106+
'test_rule' => 'ModelSerializers\\ExtraQuestionTypeSerializer::testRule',
107+
'should_skip_rule' => 'ModelSerializers\\SummitOrderExtraQuestionTypeSerializer::shouldSkip',
108+
109+
],
110+
// overload to apply the should skip rule
111+
'parent_rules' => [
112+
'type' => Many2OneExpandSerializer::class,
113+
'getter' => 'getParentRules',
114+
'should_skip_rule' => 'ModelSerializers\\SummitOrderExtraQuestionTypeSerializer::shouldSkip',
115+
]
116+
];
42117
}

app/Models/Foundation/Main/ExtraQuestions/ExtraQuestionAnswerHolder.php

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
use Doctrine\Common\Collections\ArrayCollection;
1818
use Illuminate\Support\Facades\Log;
1919
use models\exceptions\ValidationException;
20+
use models\summit\SummitOrderExtraQuestionType;
21+
2022
/***
2123
* Trait ExtraQuestionAnswerHolder
2224
* @package App\Models\Foundation\Main\ExtraQuestions
@@ -31,7 +33,7 @@ public abstract function getExtraQuestionAnswers();
3133
/**
3234
* @return ExtraQuestionType[] | ArrayCollection
3335
*/
34-
public abstract function getExtraQuestions();
36+
public abstract function getExtraQuestions(): array;
3537

3638
/**
3739
* @param int $questionId
@@ -54,6 +56,12 @@ public abstract function buildExtraQuestionAnswer():ExtraQuestionAnswer;
5456
*/
5557
public abstract function addExtraQuestionAnswer(ExtraQuestionAnswer $answer):void;
5658

59+
/**
60+
* @param ExtraQuestionType $q
61+
* @return bool
62+
*/
63+
public abstract function isAllowedQuestion(ExtraQuestionType $q): bool;
64+
5765
/**
5866
* @return ExtraQuestionAnswerSet
5967
*/
@@ -99,9 +107,13 @@ private function checkQuestion(ExtraQuestionType $q, ExtraQuestionAnswerSet $for
99107
);
100108
}
101109
$res = $q->isAnswered($answers);
110+
102111
// check sub-questions ...
103112
foreach ($q->getSubQuestionRules() as $rule){
104-
$res &= $this->checkQuestion($rule->getSubQuestion(), $formerAnswers, $answers);
113+
$sq = $rule->getSubQuestion();
114+
if ($this->isAllowedQuestion($sq)) {
115+
$res &= $this->checkQuestion($sq, $formerAnswers, $answers);
116+
}
105117
}
106118
return $res;
107119
}

0 commit comments

Comments
 (0)