Skip to content

Commit 6fbe5b4

Browse files
authored
Merge branch 'develop' into composer-superuser-20240914
2 parents 6a07ba7 + 06bab6a commit 6fbe5b4

File tree

12 files changed

+424
-286
lines changed

12 files changed

+424
-286
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
3+
namespace Ushahidi\Modules\V5\Actions\Survey;
4+
5+
use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchTasksBySurveyIdQuery;
6+
use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchRolesCanCreateSurveyPostsQuery;
7+
8+
trait HandleSurveyOnlyParameters
9+
{
10+
private function addHydrateRelationships(&$survey, $only, $hydrate)
11+
{
12+
$relations = [
13+
'tasks' => false,
14+
'translations' => false,
15+
'enabled_languages' => false,
16+
];
17+
18+
foreach ($hydrate as $relation) {
19+
switch ($relation) {
20+
case 'can_create':
21+
$this->addCanCreate($survey);
22+
break;
23+
case 'tasks':
24+
$survey->tasks = $this->queryBus->handle(
25+
new FetchTasksBySurveyIdQuery(
26+
$survey->id,
27+
FetchTasksBySurveyIdQuery::DEFAULT_SORT_BY,
28+
FetchTasksBySurveyIdQuery::DEFAULT_ORDER
29+
)
30+
);
31+
$relations['tasks'] = true;
32+
break;
33+
case 'translations':
34+
$relations['translations'] = true;
35+
break;
36+
case 'enabled_languages':
37+
$survey->enabled_languages = [
38+
'default' => $survey->base_language,
39+
'available' => $survey->translations->groupBy('language')->keys()
40+
];
41+
$relations['enabled_languages'] = true;
42+
break;
43+
}
44+
}
45+
46+
if (!$relations['tasks']) {
47+
$survey->tasks = null;
48+
}
49+
if (!$relations['translations']) {
50+
$survey->translations = null;
51+
}
52+
}
53+
private function addCanCreate(&$survey)
54+
{
55+
$survey_roles = $this->queryBus->handle(
56+
new FetchRolesCanCreateSurveyPostsQuery(
57+
$survey->id,
58+
FetchRolesCanCreateSurveyPostsQuery::DEFAULT_SORT_BY,
59+
FetchRolesCanCreateSurveyPostsQuery::DEFAULT_ORDER
60+
)
61+
);
62+
$roles = [];
63+
foreach ($survey_roles as $survey_role) {
64+
$roles[] = $survey_role->role()->value('name');
65+
}
66+
$survey->can_create = $roles;
67+
}
68+
}

src/Ushahidi/Modules/V5/Actions/Survey/Handlers/FetchSurveyByIdQueryHandler.php

Lines changed: 14 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,16 @@
55
use Ushahidi\Modules\V5\Actions\V5QueryHandler;
66
use App\Bus\Query\Query;
77
use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchSurveyByIdQuery;
8-
use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchTasksBySurveyIdQuery;
9-
use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchRolesCanCreateSurveyPostsQuery;
108
use Ushahidi\Modules\V5\Repository\Survey\SurveyRepository;
119
use Ushahidi\Modules\V5\Models\Survey;
1210
use App\Bus\Query\QueryBus;
11+
use Ushahidi\Modules\V5\Actions\Survey\HandleSurveyOnlyParameters;
1312

1413
class FetchSurveyByIdQueryHandler extends V5QueryHandler
1514
{
1615

16+
use HandleSurveyOnlyParameters;
17+
1718
private $survey_repository;
1819
private $queryBus;
1920

@@ -31,87 +32,28 @@ protected function isSupported(Query $query)
3132
);
3233
}
3334

34-
3535
/**
3636
* @param FetchSurveyByIdQuery $query
3737
* @return Survey
3838
*/
39-
public function __invoke($query) //: array
39+
public function __invoke($action) //: array
4040
{
41-
$only = $this->getSelectFields(
42-
$query->getFormat(),
43-
$query->getOnlyFields(),
44-
Survey::$approved_fields_for_select,
45-
Survey::$required_fields_for_select
41+
$this->isSupported($action);
42+
$survey = $this->survey_repository->findById(
43+
$action->getId(),
44+
array_unique(array_merge(
45+
$action->getFields(),
46+
$action->getFieldsForRelationship()
47+
)),
48+
$action->getWithRelationship()
4649
);
47-
$this->isSupported($query);
48-
$survey = $this->survey_repository->findById($query->getId(), $only);
4950
$this->addHydrateRelationships(
5051
$survey,
51-
$only,
52-
$this->getHydrateRelationshpis(Survey::$relationships, $query->getHydrate())
52+
$action->getFields(),
53+
$action->getHydrates()
5354
);
5455
$survey->offsetUnset('base_language');
5556

5657
return $survey;
5758
}
58-
private function addHydrateRelationships(&$survey, $only, $hydrate)
59-
{
60-
$relations = [
61-
'tasks' => false,
62-
'translations' => false,
63-
'enabled_languages' => false,
64-
];
65-
66-
foreach ($hydrate as $relation) {
67-
switch ($relation) {
68-
case 'tasks':
69-
$survey->tasks = $this->queryBus->handle(
70-
new FetchTasksBySurveyIdQuery(
71-
$survey->id,
72-
FetchTasksBySurveyIdQuery::DEFAULT_SORT_BY,
73-
FetchTasksBySurveyIdQuery::DEFAULT_ORDER
74-
)
75-
);
76-
$relations['tasks'] = true;
77-
break;
78-
case 'translations':
79-
$relations['translations'] = true;
80-
break;
81-
case 'enabled_languages':
82-
$survey->enabled_languages = [
83-
'default' => $survey->base_language,
84-
'available' => $survey->translations->groupBy('language')->keys()
85-
];
86-
$relations['enabled_languages'] = true;
87-
break;
88-
}
89-
}
90-
91-
if (!$relations['tasks']) {
92-
$survey->tasks = null;
93-
}
94-
if (!$relations['translations']) {
95-
$survey->translations = null;
96-
}
97-
98-
99-
$this->addCanCreate($survey);
100-
}
101-
private function addCanCreate(&$survey)
102-
{
103-
104-
$survey_roles = $this->queryBus->handle(
105-
new FetchRolesCanCreateSurveyPostsQuery(
106-
$survey->id,
107-
FetchRolesCanCreateSurveyPostsQuery::DEFAULT_SORT_BY,
108-
FetchRolesCanCreateSurveyPostsQuery::DEFAULT_ORDER
109-
)
110-
);
111-
$roles = [];
112-
foreach ($survey_roles as $survey_role) {
113-
$roles[] = $survey_role->role()->value('name');
114-
}
115-
$survey->can_create = $roles;
116-
}
11759
}

src/Ushahidi/Modules/V5/Actions/Survey/Handlers/FetchSurveyQueryHandler.php

Lines changed: 14 additions & 85 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@
66
use App\Bus\Query\Query;
77
use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchSurveyQuery;
88
use Ushahidi\Modules\V5\Repository\Survey\SurveyRepository;
9-
use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchTasksBySurveyIdQuery;
10-
use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchRolesCanCreateSurveyPostsQuery;
119
use Ushahidi\Modules\V5\Models\Survey;
1210
use App\Bus\Query\QueryBus;
1311
use Illuminate\Pagination\LengthAwarePaginator;
12+
use Ushahidi\Modules\V5\Actions\Survey\HandleSurveyOnlyParameters;
1413

1514
class FetchSurveyQueryHandler extends V5QueryHandler
1615
{
16+
use HandleSurveyOnlyParameters;
17+
1718
private $survey_repository;
1819
private $queryBus;
1920

@@ -35,99 +36,27 @@ protected function isSupported(Query $query)
3536
* @param FetchSurveyQuery $query
3637
* @return LengthAwarePaginator
3738
*/
38-
public function __invoke($query) //: LengthAwarePaginator
39+
public function __invoke($action) //: LengthAwarePaginator
3940
{
40-
$this->isSupported($query);
41-
$skip = $query->getLimit() * ($query->getPage() - 1);
42-
$only = $this->getSelectFields(
43-
$query->getFormat(),
44-
$query->getOnlyFields(),
45-
Survey::$approved_fields_for_select,
46-
Survey::$required_fields_for_select
47-
);
41+
$this->isSupported($action);
42+
43+
$only_fields = array_unique(array_merge($action->getFields(), $action->getFieldsForRelationship()));
4844

49-
$surveys = $this->survey_repository->fetch(
50-
$query->getLimit(),
51-
$skip,
52-
$query->getSortBy(),
53-
$query->getOrder(),
54-
$query->getSearchFields(),
55-
$only
45+
$surveys = $this->survey_repository->paginate(
46+
$action->getPaging(),
47+
$action->getSearchFields(),
48+
$only_fields,
49+
$action->getWithRelationship()
5650
);
5751

58-
// TODO: This should happen at the repository level
59-
$hydrates = $this->getHydrateRelationshpis(Survey::$relationships, $query->getHydrate());
6052
foreach ($surveys as $survey) {
6153
$this->addHydrateRelationships(
6254
$survey,
63-
$only,
64-
$hydrates
55+
$action->getFields(),
56+
$action->getHydrates()
6557
);
6658
$survey->offsetUnset('base_language');
6759
}
6860
return $surveys;
6961
}
70-
71-
72-
private function addHydrateRelationships(&$survey, $only, $hydrate)
73-
{
74-
$relations = [
75-
'tasks' => false,
76-
'translations' => false,
77-
'enabled_languages' => false,
78-
];
79-
80-
foreach ($hydrate as $relation) {
81-
switch ($relation) {
82-
case 'tasks':
83-
// TODO: This is wrong and should be done at the repository level instead to create an aggregate
84-
$survey->tasks = $this->queryBus->handle(
85-
new FetchTasksBySurveyIdQuery(
86-
$survey->id,
87-
FetchTasksBySurveyIdQuery::DEFAULT_SORT_BY,
88-
FetchTasksBySurveyIdQuery::DEFAULT_ORDER
89-
)
90-
);
91-
$relations['tasks'] = true;
92-
break;
93-
case 'translations':
94-
$relations['translations'] = true;
95-
break;
96-
case 'enabled_languages':
97-
$survey->enabled_languages = [
98-
'default' => $survey->base_language,
99-
'available' => $survey->translations->groupBy('language')->keys()
100-
];
101-
$relations['enabled_languages'] = true;
102-
break;
103-
}
104-
}
105-
106-
if (!$relations['tasks']) {
107-
$survey->tasks = null;
108-
}
109-
if (!$relations['translations']) {
110-
$survey->translations = null;
111-
}
112-
113-
114-
$this->addCanCreate($survey);
115-
}
116-
117-
private function addCanCreate(&$survey)
118-
{
119-
120-
$survey_roles = $this->queryBus->handle(
121-
new FetchRolesCanCreateSurveyPostsQuery(
122-
$survey->id,
123-
FetchRolesCanCreateSurveyPostsQuery::DEFAULT_SORT_BY,
124-
FetchRolesCanCreateSurveyPostsQuery::DEFAULT_ORDER
125-
)
126-
);
127-
$roles = [];
128-
foreach ($survey_roles as $survey_role) {
129-
$roles[] = $survey_role->role()->value('name');
130-
}
131-
$survey->can_create = $roles;
132-
}
13362
}

src/Ushahidi/Modules/V5/Actions/Survey/Queries/FetchSurveyByIdQuery.php

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,48 +4,37 @@
44

55
use App\Bus\Query\Query;
66
use Ushahidi\Modules\V5\Models\Survey;
7+
use Ushahidi\Modules\V5\Traits\OnlyParameter\QueryWithOnlyParameter;
8+
use Illuminate\Http\Request;
79

810
class FetchSurveyByIdQuery implements Query
911
{
1012

11-
13+
use QueryWithOnlyParameter;
1214
/**
1315
* int
1416
*/
1517
private $id;
16-
private $format;
17-
private $only_fields;
18-
private $hydrate;
1918

2019
public function __construct(
21-
int $id = 0,
22-
?string $format = null,
23-
?string $only_fields = null,
24-
?string $hydrate = null
20+
int $id = 0
2521
) {
2622

2723
$this->id = $id;
28-
$this->format = $format;
29-
$this->only_fields = $only_fields;
30-
$this->hydrate = $hydrate;
3124
}
32-
33-
public function getId(): int
25+
26+
public static function fromRequest(int $id, Request $request): self
3427
{
35-
return $this->id;
28+
if ($id <= 0) {
29+
throw new \InvalidArgumentException('Id must be a positive number');
30+
}
31+
$query = new self($id);
32+
$query->addOnlyParameteresFromRequest($request, Survey::ALLOWED_FIELDS, Survey::ALLOWED_RELATIONSHIPS, Survey::REQUIRED_FIELDS);
33+
return $query;
3634
}
3735

38-
public function getFormat()
39-
{
40-
return $this->format;
41-
}
42-
public function getOnlyFields()
43-
{
44-
return $this->only_fields;
45-
}
46-
47-
public function getHydrate()
36+
public function getId(): int
4837
{
49-
return $this->hydrate;
38+
return $this->id;
5039
}
5140
}

0 commit comments

Comments
 (0)