Skip to content

Commit 60dfb50

Browse files
committed
Qualify token filter columns; add tests
Prefix ambiguous columns in ProcessRequestToken::scopeFilter with process_request_tokens to avoid conflicts when queries include joins or subqueries. Add feature tests in TasksTest: one to verify free-text filtering returns matching tasks, and another to ensure scopeFilter works with a joined subquery (uses qualified column names). These changes prevent ambiguous column errors and validate filtering behavior.
1 parent 873d698 commit 60dfb50

2 files changed

Lines changed: 75 additions & 4 deletions

File tree

‎ProcessMaker/Models/ProcessRequestToken.php‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -651,10 +651,10 @@ public function scopeFilter($query, $filter)
651651
$query->where(DB::raw('LOWER(element_name)'), 'like', $filter)
652652
->orWhere(DB::raw('LOWER(data)'), 'like', $filter)
653653
->orWhere(DB::raw('LOWER(status)'), 'like', $filter)
654-
->orWhere('id', 'like', $filter)
655-
->orWhere('created_at', 'like', $filter)
656-
->orWhere('due_at', 'like', $filter)
657-
->orWhere('updated_at', 'like', $filter)
654+
->orWhere('process_request_tokens.id', 'like', $filter)
655+
->orWhere('process_request_tokens.created_at', 'like', $filter)
656+
->orWhere('process_request_tokens.due_at', 'like', $filter)
657+
->orWhere('process_request_tokens.updated_at', 'like', $filter)
658658
->orWhereHas('processRequest', function ($query) use ($filter) {
659659
$query->where(DB::raw('LOWER(name)'), 'like', $filter);
660660
})

‎tests/Feature/Api/TasksTest.php‎

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -913,4 +913,75 @@ public function testGetAllTaskTypes()
913913
$this->assertEquals($scriptTask->id, $response['data'][1]['id']);
914914
$this->assertEquals($gatewayTask->id, $response['data'][2]['id']);
915915
}
916+
917+
/**
918+
* Test that the free-text filter parameter works on the tasks endpoint.
919+
*/
920+
public function testFilterByFreeTextSearch()
921+
{
922+
$request = ProcessRequest::factory()->create();
923+
924+
$matchingTask = ProcessRequestToken::factory()->create([
925+
'element_type' => 'task',
926+
'element_name' => 'UniqueSearchableTaskName',
927+
'status' => 'ACTIVE',
928+
'process_request_id' => $request->id,
929+
]);
930+
931+
ProcessRequestToken::factory()->create([
932+
'element_type' => 'task',
933+
'element_name' => 'OtherTask',
934+
'status' => 'ACTIVE',
935+
'process_request_id' => $request->id,
936+
]);
937+
938+
$response = $this->apiCall('GET', route('api.' . $this->resource . '.index', [
939+
'filter' => 'UniqueSearchableTaskName',
940+
'per_page' => 50,
941+
]));
942+
943+
$response->assertStatus(200);
944+
$data = $response->json('data');
945+
$this->assertNotEmpty($data);
946+
$this->assertTrue(
947+
collect($data)->contains('id', $matchingTask->id),
948+
'Expected matching task to appear in filtered results'
949+
);
950+
}
951+
952+
/**
953+
* Test that scopeFilter uses qualified column names so it works
954+
* when the query has a join that introduces duplicate column names.
955+
*/
956+
public function testScopeFilterWorksWithJoinedSubquery()
957+
{
958+
$request = ProcessRequest::factory()->create();
959+
960+
ProcessRequestToken::factory()->create([
961+
'element_type' => 'task',
962+
'element_name' => 'JoinTestTask',
963+
'status' => 'ACTIVE',
964+
'process_request_id' => $request->id,
965+
]);
966+
967+
$query = ProcessRequestToken::query()
968+
->where('element_type', 'task');
969+
970+
$subQuery = clone $query;
971+
$subQuery->select('id', 'updated_at')->latest('updated_at')->take(25);
972+
973+
$query->select('process_request_tokens.*')
974+
->joinSub($subQuery, 'cte', function ($join) {
975+
$join->on('process_request_tokens.id', '=', 'cte.id');
976+
});
977+
978+
$query->filter('JoinTestTask');
979+
980+
$results = $query->get();
981+
982+
$this->assertNotEmpty($results);
983+
$this->assertTrue(
984+
$results->contains('element_name', 'JoinTestTask')
985+
);
986+
}
916987
}

0 commit comments

Comments
 (0)