diff --git a/src/Ushahidi/Modules/V5/Actions/Survey/HandleSurveyOnlyParameters.php b/src/Ushahidi/Modules/V5/Actions/Survey/HandleSurveyOnlyParameters.php new file mode 100644 index 0000000000..1234b74e4e --- /dev/null +++ b/src/Ushahidi/Modules/V5/Actions/Survey/HandleSurveyOnlyParameters.php @@ -0,0 +1,68 @@ + false, + 'translations' => false, + 'enabled_languages' => false, + ]; + + foreach ($hydrate as $relation) { + switch ($relation) { + case 'can_create': + $this->addCanCreate($survey); + break; + case 'tasks': + $survey->tasks = $this->queryBus->handle( + new FetchTasksBySurveyIdQuery( + $survey->id, + FetchTasksBySurveyIdQuery::DEFAULT_SORT_BY, + FetchTasksBySurveyIdQuery::DEFAULT_ORDER + ) + ); + $relations['tasks'] = true; + break; + case 'translations': + $relations['translations'] = true; + break; + case 'enabled_languages': + $survey->enabled_languages = [ + 'default' => $survey->base_language, + 'available' => $survey->translations->groupBy('language')->keys() + ]; + $relations['enabled_languages'] = true; + break; + } + } + + if (!$relations['tasks']) { + $survey->tasks = null; + } + if (!$relations['translations']) { + $survey->translations = null; + } + } + private function addCanCreate(&$survey) + { + $survey_roles = $this->queryBus->handle( + new FetchRolesCanCreateSurveyPostsQuery( + $survey->id, + FetchRolesCanCreateSurveyPostsQuery::DEFAULT_SORT_BY, + FetchRolesCanCreateSurveyPostsQuery::DEFAULT_ORDER + ) + ); + $roles = []; + foreach ($survey_roles as $survey_role) { + $roles[] = $survey_role->role()->value('name'); + } + $survey->can_create = $roles; + } +} diff --git a/src/Ushahidi/Modules/V5/Actions/Survey/Handlers/FetchSurveyByIdQueryHandler.php b/src/Ushahidi/Modules/V5/Actions/Survey/Handlers/FetchSurveyByIdQueryHandler.php index 3fa26c2fea..b9ec5f2266 100644 --- a/src/Ushahidi/Modules/V5/Actions/Survey/Handlers/FetchSurveyByIdQueryHandler.php +++ b/src/Ushahidi/Modules/V5/Actions/Survey/Handlers/FetchSurveyByIdQueryHandler.php @@ -5,15 +5,16 @@ use Ushahidi\Modules\V5\Actions\V5QueryHandler; use App\Bus\Query\Query; use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchSurveyByIdQuery; -use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchTasksBySurveyIdQuery; -use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchRolesCanCreateSurveyPostsQuery; use Ushahidi\Modules\V5\Repository\Survey\SurveyRepository; use Ushahidi\Modules\V5\Models\Survey; use App\Bus\Query\QueryBus; +use Ushahidi\Modules\V5\Actions\Survey\HandleSurveyOnlyParameters; class FetchSurveyByIdQueryHandler extends V5QueryHandler { + use HandleSurveyOnlyParameters; + private $survey_repository; private $queryBus; @@ -31,87 +32,28 @@ protected function isSupported(Query $query) ); } - /** * @param FetchSurveyByIdQuery $query * @return Survey */ - public function __invoke($query) //: array + public function __invoke($action) //: array { - $only = $this->getSelectFields( - $query->getFormat(), - $query->getOnlyFields(), - Survey::$approved_fields_for_select, - Survey::$required_fields_for_select + $this->isSupported($action); + $survey = $this->survey_repository->findById( + $action->getId(), + array_unique(array_merge( + $action->getFields(), + $action->getFieldsForRelationship() + )), + $action->getWithRelationship() ); - $this->isSupported($query); - $survey = $this->survey_repository->findById($query->getId(), $only); $this->addHydrateRelationships( $survey, - $only, - $this->getHydrateRelationshpis(Survey::$relationships, $query->getHydrate()) + $action->getFields(), + $action->getHydrates() ); $survey->offsetUnset('base_language'); return $survey; } - private function addHydrateRelationships(&$survey, $only, $hydrate) - { - $relations = [ - 'tasks' => false, - 'translations' => false, - 'enabled_languages' => false, - ]; - - foreach ($hydrate as $relation) { - switch ($relation) { - case 'tasks': - $survey->tasks = $this->queryBus->handle( - new FetchTasksBySurveyIdQuery( - $survey->id, - FetchTasksBySurveyIdQuery::DEFAULT_SORT_BY, - FetchTasksBySurveyIdQuery::DEFAULT_ORDER - ) - ); - $relations['tasks'] = true; - break; - case 'translations': - $relations['translations'] = true; - break; - case 'enabled_languages': - $survey->enabled_languages = [ - 'default' => $survey->base_language, - 'available' => $survey->translations->groupBy('language')->keys() - ]; - $relations['enabled_languages'] = true; - break; - } - } - - if (!$relations['tasks']) { - $survey->tasks = null; - } - if (!$relations['translations']) { - $survey->translations = null; - } - - - $this->addCanCreate($survey); - } - private function addCanCreate(&$survey) - { - - $survey_roles = $this->queryBus->handle( - new FetchRolesCanCreateSurveyPostsQuery( - $survey->id, - FetchRolesCanCreateSurveyPostsQuery::DEFAULT_SORT_BY, - FetchRolesCanCreateSurveyPostsQuery::DEFAULT_ORDER - ) - ); - $roles = []; - foreach ($survey_roles as $survey_role) { - $roles[] = $survey_role->role()->value('name'); - } - $survey->can_create = $roles; - } } diff --git a/src/Ushahidi/Modules/V5/Actions/Survey/Handlers/FetchSurveyQueryHandler.php b/src/Ushahidi/Modules/V5/Actions/Survey/Handlers/FetchSurveyQueryHandler.php index 548746862a..6874fa8628 100644 --- a/src/Ushahidi/Modules/V5/Actions/Survey/Handlers/FetchSurveyQueryHandler.php +++ b/src/Ushahidi/Modules/V5/Actions/Survey/Handlers/FetchSurveyQueryHandler.php @@ -6,14 +6,15 @@ use App\Bus\Query\Query; use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchSurveyQuery; use Ushahidi\Modules\V5\Repository\Survey\SurveyRepository; -use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchTasksBySurveyIdQuery; -use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchRolesCanCreateSurveyPostsQuery; use Ushahidi\Modules\V5\Models\Survey; use App\Bus\Query\QueryBus; use Illuminate\Pagination\LengthAwarePaginator; +use Ushahidi\Modules\V5\Actions\Survey\HandleSurveyOnlyParameters; class FetchSurveyQueryHandler extends V5QueryHandler { + use HandleSurveyOnlyParameters; + private $survey_repository; private $queryBus; @@ -35,99 +36,27 @@ protected function isSupported(Query $query) * @param FetchSurveyQuery $query * @return LengthAwarePaginator */ - public function __invoke($query) //: LengthAwarePaginator + public function __invoke($action) //: LengthAwarePaginator { - $this->isSupported($query); - $skip = $query->getLimit() * ($query->getPage() - 1); - $only = $this->getSelectFields( - $query->getFormat(), - $query->getOnlyFields(), - Survey::$approved_fields_for_select, - Survey::$required_fields_for_select - ); + $this->isSupported($action); + + $only_fields = array_unique(array_merge($action->getFields(), $action->getFieldsForRelationship())); - $surveys = $this->survey_repository->fetch( - $query->getLimit(), - $skip, - $query->getSortBy(), - $query->getOrder(), - $query->getSearchFields(), - $only + $surveys = $this->survey_repository->paginate( + $action->getPaging(), + $action->getSearchFields(), + $only_fields, + $action->getWithRelationship() ); - // TODO: This should happen at the repository level - $hydrates = $this->getHydrateRelationshpis(Survey::$relationships, $query->getHydrate()); foreach ($surveys as $survey) { $this->addHydrateRelationships( $survey, - $only, - $hydrates + $action->getFields(), + $action->getHydrates() ); $survey->offsetUnset('base_language'); } return $surveys; } - - - private function addHydrateRelationships(&$survey, $only, $hydrate) - { - $relations = [ - 'tasks' => false, - 'translations' => false, - 'enabled_languages' => false, - ]; - - foreach ($hydrate as $relation) { - switch ($relation) { - case 'tasks': - // TODO: This is wrong and should be done at the repository level instead to create an aggregate - $survey->tasks = $this->queryBus->handle( - new FetchTasksBySurveyIdQuery( - $survey->id, - FetchTasksBySurveyIdQuery::DEFAULT_SORT_BY, - FetchTasksBySurveyIdQuery::DEFAULT_ORDER - ) - ); - $relations['tasks'] = true; - break; - case 'translations': - $relations['translations'] = true; - break; - case 'enabled_languages': - $survey->enabled_languages = [ - 'default' => $survey->base_language, - 'available' => $survey->translations->groupBy('language')->keys() - ]; - $relations['enabled_languages'] = true; - break; - } - } - - if (!$relations['tasks']) { - $survey->tasks = null; - } - if (!$relations['translations']) { - $survey->translations = null; - } - - - $this->addCanCreate($survey); - } - - private function addCanCreate(&$survey) - { - - $survey_roles = $this->queryBus->handle( - new FetchRolesCanCreateSurveyPostsQuery( - $survey->id, - FetchRolesCanCreateSurveyPostsQuery::DEFAULT_SORT_BY, - FetchRolesCanCreateSurveyPostsQuery::DEFAULT_ORDER - ) - ); - $roles = []; - foreach ($survey_roles as $survey_role) { - $roles[] = $survey_role->role()->value('name'); - } - $survey->can_create = $roles; - } } diff --git a/src/Ushahidi/Modules/V5/Actions/Survey/Queries/FetchSurveyByIdQuery.php b/src/Ushahidi/Modules/V5/Actions/Survey/Queries/FetchSurveyByIdQuery.php index b1f1ddf3e2..3dacf23d6b 100644 --- a/src/Ushahidi/Modules/V5/Actions/Survey/Queries/FetchSurveyByIdQuery.php +++ b/src/Ushahidi/Modules/V5/Actions/Survey/Queries/FetchSurveyByIdQuery.php @@ -4,48 +4,37 @@ use App\Bus\Query\Query; use Ushahidi\Modules\V5\Models\Survey; +use Ushahidi\Modules\V5\Traits\OnlyParameter\QueryWithOnlyParameter; +use Illuminate\Http\Request; class FetchSurveyByIdQuery implements Query { - + use QueryWithOnlyParameter; /** * int */ private $id; - private $format; - private $only_fields; - private $hydrate; public function __construct( - int $id = 0, - ?string $format = null, - ?string $only_fields = null, - ?string $hydrate = null + int $id = 0 ) { $this->id = $id; - $this->format = $format; - $this->only_fields = $only_fields; - $this->hydrate = $hydrate; } - - public function getId(): int + + public static function fromRequest(int $id, Request $request): self { - return $this->id; + if ($id <= 0) { + throw new \InvalidArgumentException('Id must be a positive number'); + } + $query = new self($id); + $query->addOnlyParameteresFromRequest($request, Survey::ALLOWED_FIELDS, Survey::ALLOWED_RELATIONSHIPS, Survey::REQUIRED_FIELDS); + return $query; } - public function getFormat() - { - return $this->format; - } - public function getOnlyFields() - { - return $this->only_fields; - } - - public function getHydrate() + public function getId(): int { - return $this->hydrate; + return $this->id; } } diff --git a/src/Ushahidi/Modules/V5/Actions/Survey/Queries/FetchSurveyQuery.php b/src/Ushahidi/Modules/V5/Actions/Survey/Queries/FetchSurveyQuery.php index b073fd2b84..44c0df666b 100644 --- a/src/Ushahidi/Modules/V5/Actions/Survey/Queries/FetchSurveyQuery.php +++ b/src/Ushahidi/Modules/V5/Actions/Survey/Queries/FetchSurveyQuery.php @@ -4,81 +4,28 @@ use App\Bus\Query\Query; use Ushahidi\Modules\V5\DTO\SurveySearchFields; +use Illuminate\Http\Request; +use Ushahidi\Modules\V5\Models\Survey; +use Ushahidi\Modules\V5\Traits\OnlyParameter\QueryWithOnlyParameter; +use Ushahidi\Modules\V5\Traits\HasPaginate; +use Ushahidi\Modules\V5\Traits\HasSearchFields; class FetchSurveyQuery implements Query { - const DEFAULT_LIMIT = 100000; + use QueryWithOnlyParameter; + use HasPaginate; + use HasSearchFields; + + const DEFAULT_LIMIT = 10000; const DEFAULT_ORDER = "ASC"; const DEFAULT_SORT_BY = "id"; - private $limit; - private $page; - private $sortBy; - private $order; - private $search_fields; - private $format; - private $only_fields; - private $hydrate; - - - - - public function __construct( - int $limit, - int $page, - string $sortBy, - string $order, - SurveySearchFields $search_fields, - ?string $format, - ?string $only_fields, - ?string $hydrate - ) { - $this->limit = $limit; - $this->page = $page; - $this->sortBy = $sortBy; - $this->order = $order; - $this->search_fields = $search_fields; - $this->format = $format; - $this->only_fields = $only_fields; - $this->hydrate = $hydrate; - } - - public function getLimit(): int - { - return $this->limit; - } - - public function getPage(): int - { - return $this->page; - } - - public function getSortBy(): string - { - return $this->sortBy; - } - - public function getOrder(): string - { - return $this->order; - } - - public function getSearchFields() - { - return $this->search_fields; - } - - public function getFormat() - { - return $this->format; - } - public function getOnlyFields() - { - return $this->only_fields; - } - - public function getHydrate() + public static function fromRequest(Request $request): self { - return $this->hydrate; + $query = new self(); + $query->setPaging($request, self::DEFAULT_SORT_BY, self::DEFAULT_ORDER, self::DEFAULT_LIMIT); + $query->setSearchFields(new SurveySearchFields($request)); + $query->addOnlyParameteresFromRequest($request, Survey::ALLOWED_FIELDS, Survey::ALLOWED_RELATIONSHIPS, Survey::REQUIRED_FIELDS); + return $query; } } diff --git a/src/Ushahidi/Modules/V5/Http/Controllers/SurveyController.php b/src/Ushahidi/Modules/V5/Http/Controllers/SurveyController.php index e1b004e421..70cdd58070 100644 --- a/src/Ushahidi/Modules/V5/Http/Controllers/SurveyController.php +++ b/src/Ushahidi/Modules/V5/Http/Controllers/SurveyController.php @@ -11,10 +11,7 @@ use Ushahidi\Modules\V5\Actions\Survey\Commands\DeleteSurveyCommand; use Ushahidi\Modules\V5\Http\Resources\Survey\SurveyCollection; use Ushahidi\Modules\V5\Http\Resources\Survey\SurveyResource; -use Ushahidi\Modules\V5\DTO\SurveySearchFields; use Ushahidi\Core\Entity\Form as SurveyEntity; -use Ushahidi\Core\Exception\NotFoundException; -use Ushahidi\Modules\V5\Http\Resources\TranslationCollection; use Ushahidi\Modules\V5\Requests\SurveyRequest; use Ushahidi\Modules\V5\Actions\Survey\Queries\FetchSurveyStatsQuery; use Ushahidi\Modules\V5\DTO\SurveyStatesSearchFields; @@ -32,12 +29,7 @@ class SurveyController extends V5Controller public function show(Request $request, int $id) { $survey = $this->queryBus->handle( - new FetchSurveyByIdQuery( - $id, - $request->input('formater') ?? null, - $request->input('only') ?? null, - $request->input('hydrate') ?? null - ) + FetchSurveyByIdQuery::fromRequest($id, $request) ); $this->authorizeAnyone('show', $survey); @@ -56,20 +48,30 @@ public function index(Request $request) $this->authorizeAnyone('index', Survey::class); $surveys = $this->queryBus->handle( - new FetchSurveyQuery( - $request->query('limit', FetchSurveyQuery::DEFAULT_LIMIT), - $request->query('page', 1), - $request->query('sortBy', "id"), - $request->query('order', FetchSurveyQuery::DEFAULT_ORDER), - new SurveySearchFields($request), - $request->input('formater') ?? null, - $request->input('only') ?? null, - $request->input('hydrate') ?? null - ) + FetchSurveyQuery::fromRequest($request) ); return new SurveyCollection($surveys); } //end index() + private function getSurvey(int $id, ?array $fields = null, ?array $haydrates = null) + { + if (!$fields) { + $fields = Survey::ALLOWED_FIELDS; + } + if (!$haydrates) { + $haydrates = array_keys(Survey::ALLOWED_RELATIONSHIPS); + } + $find_survey_query = new FetchSurveyByIdQuery($id); + $find_survey_query->addOnlyValues( + $fields, + $haydrates, + Survey::ALLOWED_RELATIONSHIPS, + Survey::REQUIRED_FIELDS + ); + return $this->queryBus->handle($find_survey_query); + } + + /** * Display the specified resource. * @@ -99,7 +101,6 @@ public function store(SurveyRequest $request) $request->input('translations') ?? [] ) ); - return $this->show($request, $survey_id); } //end store() @@ -114,8 +115,7 @@ public function store(SurveyRequest $request) */ public function update(int $id, SurveyRequest $request) { - $survey = $this->queryBus->handle(new FetchSurveyByIdQuery($id)); - + $survey = $this->getSurvey($id); $this->authorize('update', $survey); if (!$survey) { return self::make404(); @@ -138,7 +138,7 @@ public function update(int $id, SurveyRequest $request) */ public function delete(int $id, Request $request) { - $survey = $this->queryBus->handle(new FetchSurveyByIdQuery($id, null, 'id', 'tasks')); + $survey = $this->getSurvey($id, ['id'], ['tasks']); $this->authorize('delete', $survey); $task_ids = $survey->tasks->modelKeys(); $field_ids = $survey->tasks->map(function ($task, $key) use (&$field_ids) { diff --git a/src/Ushahidi/Modules/V5/Http/Controllers/SurveyRoleController.php b/src/Ushahidi/Modules/V5/Http/Controllers/SurveyRoleController.php index 660ced8df4..fdba1ff2ab 100644 --- a/src/Ushahidi/Modules/V5/Http/Controllers/SurveyRoleController.php +++ b/src/Ushahidi/Modules/V5/Http/Controllers/SurveyRoleController.php @@ -13,6 +13,26 @@ class SurveyRoleController extends V5Controller { + + + private function getSurvey(int $id, ?array $fields = null, ?array $haydrates = null) + { + if (!$fields) { + $fields = Survey::ALLOWED_FIELDS; + } + if (!$haydrates) { + $haydrates = array_keys(Survey::ALLOWED_RELATIONSHIPS); + } + $find_survey_query = new FetchSurveyByIdQuery($id); + $find_survey_query->addOnlyValues( + $fields, + $haydrates, + Survey::ALLOWED_RELATIONSHIPS, + Survey::REQUIRED_FIELDS + ); + return $this->queryBus->handle($find_survey_query); + } + /** * Display the specified resource. * @@ -21,7 +41,7 @@ class SurveyRoleController extends V5Controller */ public function index(int $survey_id, Request $request) { - $survey = $this->queryBus->handle(new FetchSurveyByIdQuery($survey_id, null, null, null)); + $survey = $this->getSurvey($survey_id); // All access is based on the survey itself, not the role. // $this->authorize('show', $survey); @@ -46,7 +66,7 @@ public function index(int $survey_id, Request $request) */ public function replace(int $survey_id, SurveyRoleRequest $request) { - $survey = $this->queryBus->handle(new FetchSurveyByIdQuery($survey_id, null, null, null)); + $survey = $this->getSurvey($survey_id); $this->authorize('update', $survey); diff --git a/src/Ushahidi/Modules/V5/Models/Survey.php b/src/Ushahidi/Modules/V5/Models/Survey.php index 71f26dcac3..5f65709dae 100644 --- a/src/Ushahidi/Modules/V5/Models/Survey.php +++ b/src/Ushahidi/Modules/V5/Models/Survey.php @@ -38,6 +38,37 @@ class Survey extends BaseModel 'base_language', ]; + /** Data used for only parameters + * + * + */ + public const REQUIRED_FIELDS = [ + 'id' + ]; + public const ALLOWED_FIELDS = [ + 'id', + 'name', + 'description', + 'type', + 'disabled', + 'require_approval', + 'everyone_can_create', + 'color', + 'hide_author', + 'hide_time', + 'hide_location', + 'base_language', + 'targeted_survey', + 'created', + 'updated' + ]; + public const ALLOWED_RELATIONSHIPS = [ + 'tasks' => ['fields' => [], 'relationships' => ['tasks']], + 'can_create' => ['fields' => [], 'relationships' => []], //"SurveyRole" + 'translations' => ['fields' => [], 'relationships' => ["translations"]], + 'enabled_languages' => ['fields' => ['base_language'], 'relationships' => ['translations']], + ]; + /** * Add eloquent style timestamps * diff --git a/src/Ushahidi/Modules/V5/Repository/Survey/EloquentSurveyRepository.php b/src/Ushahidi/Modules/V5/Repository/Survey/EloquentSurveyRepository.php index b3ca693f3b..264fb1961d 100644 --- a/src/Ushahidi/Modules/V5/Repository/Survey/EloquentSurveyRepository.php +++ b/src/Ushahidi/Modules/V5/Repository/Survey/EloquentSurveyRepository.php @@ -8,6 +8,7 @@ use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\DB; use Ushahidi\Core\Entity\Form as SurveyEntity; +use Ushahidi\Modules\V5\DTO\Paging; use Ushahidi\Modules\V5\DTO\SurveySearchFields; use Ushahidi\Modules\V5\Models\SurveyRole; use Illuminate\Database\Eloquent\Collection; @@ -56,21 +57,60 @@ public function fetch( return $results; } + + public function paginate( + Paging $paging, + SurveySearchFields $search_fields, + array $fields = [], + array $with = [] + ): LengthAwarePaginator { + $fields = $this->addSurveyTableNamePrefix($fields); + $query = Survey::take($paging->getLimit()) + ->orderBy($paging->getOrderBy(), $paging->getOrder()); + + $query = $this->setSearchCondition($search_fields, $query); + + if (count($fields)) { + $query->select($fields); + } + if (count($with)) { + $query->with($with); + } + $query->distinct(); + + return $query->paginate($paging->getLimit()); + } + + private function addSurveyTableNamePrefix($fields) + { + $after_update = []; + foreach ($fields as $field) { + $after_update[] = 'forms.' . $field; + } + return $after_update; + } /** * This method will fetch a single Survey from the database utilising * Laravel Eloquent ORM. Will throw an exception if provided identifier does * not exist in the database. * @param int $id - * @param array required_fields + * @param array fields + * @param array with * @return Survey * @throws NotFoundException */ - public function findById(int $id, ?array $required_fields): Survey + public function findById(int $id, array $fields = [], array $with = []): Survey { - $survey = $required_fields ? - Survey::select($required_fields)->where('id', '=', $id)->first() - : Survey::all()->where('id', '=', $id)->first(); + $fields = $this->addSurveyTableNamePrefix($fields); + $query = Survey::where('id', '=', $id); + if (count($fields)) { + $query->select($fields); + } + if (count($with)) { + $query->with($with); + } + $survey = $query->first(); if (!$survey instanceof Survey) { throw new NotFoundException('Survey not found'); diff --git a/src/Ushahidi/Modules/V5/Repository/Survey/SurveyRepository.php b/src/Ushahidi/Modules/V5/Repository/Survey/SurveyRepository.php index 89058ab238..ea7557f0dc 100644 --- a/src/Ushahidi/Modules/V5/Repository/Survey/SurveyRepository.php +++ b/src/Ushahidi/Modules/V5/Repository/Survey/SurveyRepository.php @@ -5,8 +5,8 @@ use Ushahidi\Modules\V5\Models\Survey; use Illuminate\Pagination\LengthAwarePaginator; use Ushahidi\Core\Entity\Form as SurveyEntity; +use Ushahidi\Modules\V5\DTO\Paging; use Ushahidi\Modules\V5\DTO\SurveySearchFields; -use Ushahidi\Modules\V5\Models\SurveyRole; use Illuminate\Database\Eloquent\Collection; interface SurveyRepository @@ -31,16 +31,25 @@ public function fetch( array $required_fields ): LengthAwarePaginator; + + public function paginate( + Paging $paging, + SurveySearchFields $search_fields, + array $fields = [], + array $with = [] + ): LengthAwarePaginator; + /** * This method will fetch a single Survey from the database utilising * Laravel Eloquent ORM. Will throw an exception if provided identifier does * not exist in the database. * @param int $id - * @param array required_fields + * @param array fields + * @param array with * @return Survey * @throws NotFoundException */ - public function findById(int $id, ?array $required_fields): Survey; + public function findById(int $id, array $fields = [], array $with = []): Survey; /** * This method will create a Survey diff --git a/src/Ushahidi/Modules/V5/Traits/HasPaginate.php b/src/Ushahidi/Modules/V5/Traits/HasPaginate.php index aaa3f1ace2..70d16d0cb7 100644 --- a/src/Ushahidi/Modules/V5/Traits/HasPaginate.php +++ b/src/Ushahidi/Modules/V5/Traits/HasPaginate.php @@ -11,14 +11,33 @@ trait HasPaginate * @var Paging */ private $paging; + private $default_order; + private $default_sort_by = 'id'; + private $default_limit = '20'; public function getPaging(): Paging { return $this->paging; } - public function setPaging(Request $request) + public function setPaging( + Request $request, + $default_sort_by = null, + $default_order = null, + $default_limit = null, + $default_page = 1 + ) { + $this->paging = Paging::fromRequest( + $request, + $default_sort_by, + $default_order, + $default_limit, + $default_page + ); + } + + public function setDefaultOrder(): void { - $this->paging = Paging::fromRequest($request); + $this->paging; } } diff --git a/src/Ushahidi/Modules/V5/Traits/OnlyParameter/HandlePostOnlyParameters.php b/src/Ushahidi/Modules/V5/Traits/OnlyParameter/HandlePostOnlyParameters.php new file mode 100644 index 0000000000..5f395a5b3f --- /dev/null +++ b/src/Ushahidi/Modules/V5/Traits/OnlyParameter/HandlePostOnlyParameters.php @@ -0,0 +1,144 @@ +color = $post->survey ? $post->survey->color : null; + break; + case 'categories': + // $result['categories'] = $post->categories; + break; + case 'completed_stages': + $post->completed_stages = $post->postStages; + + break; + case 'post_content': + $post->post_content = $this->getResourcePostContent($post); + break; + case 'translations': + break; + case 'contact': + $post->contact = null; + if ($post->source === Sources::WHATSAPP) { + if ($this->userHasManagePostPermissions()) { + if (isset($post->metadata['contact'])) { + $post->contact = (new Contact)->fill($post->metadata['contact']); + } + } else { + if (isset($post->metadata['contact']['id'])) { + $post->contact = (new Contact)->fill(['id'=>$post->metadata['contact']['id']]); + } + } + } + if ($post->message) { + if ($this->userHasManagePostPermissions()) { + $post->contact = $post->message->contact; + } else { + $post->contact = $post->message->contact->setVisible(["id"]); + } + } + break; + case 'locks': + $post->locks = new LockCollection($post->locks); + break; + + case 'source': + $message = $post->message; + $post->source = $post->source ?? ($message && isset($message->type) + ? $message->type + : Post::DEFAULT_SOURCE_TYPE); + + break; + + case 'data_source_message_id': + $post->data_source_message_id = null; + $message = $post->message; + if ($message) { + $post->data_source_message_id = $message->data_source_message_id ?? null; + } + break; + case 'message': + if ($post->message && !$this->userHasManagePostPermissions()) { + $post->message->makeHidden("contact"); + } + break; + case 'enabled_languages': + $post->enabled_languages = [ + 'default' => $post->base_language, + 'available' => $post->translations->groupBy('language')->keys() + ]; + $relations['enabled_languages'] = true; + break; + } + } + return $post; + } + public function hideFieldsUsedByRelationships(Post $post, array $fields = []) + { + foreach ($fields as $field) { + $post->offsetUnset($field); + } + $post->offsetUnset('values_int'); + + return $post; + } + public function hideUnwantedRelationships(Post $post, array $hydrates) + { + // hide post_content relationships + $post->makeHidden('survey'); + $post->makeHidden('valuesVarchar'); + $post->makeHidden('valuesInt'); + $post->makeHidden('valuesText'); + $post->makeHidden('valuesDatetime'); + $post->makeHidden('valuesDecimal'); + $post->makeHidden('valuesDecimal'); + $post->makeHidden('valuesGeometry'); + $post->makeHidden('valuesMarkdown'); + $post->makeHidden('valuesMedia'); + $post->makeHidden('valuesPoint'); + $post->makeHidden('valuesRelation'); + $post->makeHidden('valuesPostsMedia'); + $post->makeHidden('valuesPostsSet'); + $post->makeHidden('valuesPostTag'); + + // hide source relationships + if (!in_array('message', $hydrates)) { + $post->makeHidden('message'); + } + + // hide completed_stages relationships + $post->makeHidden('postStages'); + + + return $post; + } + + private function getResourcePostContent($post) + { + $values = $post->getPostValues(); // Calling method on Post Model + $no_values = $values->count() === 0 ? true : false; + $col = new Collection([ + 'values' => $values, + 'tasks' => $post->survey ? $post->survey->tasks : [] + ]); + if ($post->survey) { + $post_content = new PostValueCollection($col); + } else { + $post_content = Collection::make([]); + } + return $post_content; + } +}