refactor: add Builder return types to all Eloquent query scopes
Some checks failed
CI / PHP 8.3 (pull_request) Failing after 1m11s
CI / PHP 8.4 (pull_request) Failing after 1m2s

Add `Builder $query` parameter type and `: Builder` return type to
18 query scopes across 8 model files. Import `Illuminate\Database\Eloquent\Builder`
in each affected model.

Affected models: Task, AgentSession, AgentApiKey, AgentPhase, AgentPlan,
Prompt, AgentWorkspaceState, WorkspaceState.

Closes #16

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
darbs-claude 2026-02-23 05:32:38 +00:00
parent 52b4ee42d2
commit 2bc17efa47
8 changed files with 32 additions and 24 deletions

View file

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Core\Mod\Agentic\Models; namespace Core\Mod\Agentic\Models;
use Core\Tenant\Models\Workspace; use Core\Tenant\Models\Workspace;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Support\Str; use Illuminate\Support\Str;
@ -120,7 +121,7 @@ class AgentApiKey extends Model
} }
// Scopes // Scopes
public function scopeActive($query) public function scopeActive(Builder $query): Builder
{ {
return $query->whereNull('revoked_at') return $query->whereNull('revoked_at')
->where(function ($q) { ->where(function ($q) {
@ -136,12 +137,12 @@ class AgentApiKey extends Model
return $query->where('workspace_id', $workspaceId); return $query->where('workspace_id', $workspaceId);
} }
public function scopeRevoked($query) public function scopeRevoked(Builder $query): Builder
{ {
return $query->whereNotNull('revoked_at'); return $query->whereNotNull('revoked_at');
} }
public function scopeExpired($query) public function scopeExpired(Builder $query): Builder
{ {
return $query->whereNotNull('expires_at') return $query->whereNotNull('expires_at')
->where('expires_at', '<=', now()); ->where('expires_at', '<=', now());

View file

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Core\Mod\Agentic\Models; namespace Core\Mod\Agentic\Models;
use Core\Mod\Agentic\Database\Factories\AgentPhaseFactory; use Core\Mod\Agentic\Database\Factories\AgentPhaseFactory;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -82,22 +83,22 @@ class AgentPhase extends Model
} }
// Scopes // Scopes
public function scopePending($query) public function scopePending(Builder $query): Builder
{ {
return $query->where('status', self::STATUS_PENDING); return $query->where('status', self::STATUS_PENDING);
} }
public function scopeInProgress($query) public function scopeInProgress(Builder $query): Builder
{ {
return $query->where('status', self::STATUS_IN_PROGRESS); return $query->where('status', self::STATUS_IN_PROGRESS);
} }
public function scopeCompleted($query) public function scopeCompleted(Builder $query): Builder
{ {
return $query->where('status', self::STATUS_COMPLETED); return $query->where('status', self::STATUS_COMPLETED);
} }
public function scopeBlocked($query) public function scopeBlocked(Builder $query): Builder
{ {
return $query->where('status', self::STATUS_BLOCKED); return $query->where('status', self::STATUS_BLOCKED);
} }

View file

@ -7,6 +7,7 @@ namespace Core\Mod\Agentic\Models;
use Core\Mod\Agentic\Database\Factories\AgentPlanFactory; use Core\Mod\Agentic\Database\Factories\AgentPlanFactory;
use Core\Tenant\Concerns\BelongsToWorkspace; use Core\Tenant\Concerns\BelongsToWorkspace;
use Core\Tenant\Models\Workspace; use Core\Tenant\Models\Workspace;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -99,17 +100,17 @@ class AgentPlan extends Model
} }
// Scopes // Scopes
public function scopeActive($query) public function scopeActive(Builder $query): Builder
{ {
return $query->where('status', self::STATUS_ACTIVE); return $query->where('status', self::STATUS_ACTIVE);
} }
public function scopeDraft($query) public function scopeDraft(Builder $query): Builder
{ {
return $query->where('status', self::STATUS_DRAFT); return $query->where('status', self::STATUS_DRAFT);
} }
public function scopeNotArchived($query) public function scopeNotArchived(Builder $query): Builder
{ {
return $query->where('status', '!=', self::STATUS_ARCHIVED); return $query->where('status', '!=', self::STATUS_ARCHIVED);
} }
@ -120,7 +121,7 @@ class AgentPlan extends Model
* This is a safe replacement for orderByRaw("FIELD(status, ...)") which * This is a safe replacement for orderByRaw("FIELD(status, ...)") which
* could be vulnerable to SQL injection if extended with user input. * could be vulnerable to SQL injection if extended with user input.
*/ */
public function scopeOrderByStatus($query, string $direction = 'asc') public function scopeOrderByStatus(Builder $query, string $direction = 'asc'): Builder
{ {
return $query->orderByRaw('CASE status return $query->orderByRaw('CASE status
WHEN ? THEN 1 WHEN ? THEN 1

View file

@ -7,6 +7,7 @@ namespace Core\Mod\Agentic\Models;
use Core\Mod\Agentic\Database\Factories\AgentSessionFactory; use Core\Mod\Agentic\Database\Factories\AgentSessionFactory;
use Core\Tenant\Concerns\BelongsToWorkspace; use Core\Tenant\Concerns\BelongsToWorkspace;
use Core\Tenant\Models\Workspace; use Core\Tenant\Models\Workspace;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -107,12 +108,12 @@ class AgentSession extends Model
} }
// Scopes // Scopes
public function scopeActive($query) public function scopeActive(Builder $query): Builder
{ {
return $query->where('status', self::STATUS_ACTIVE); return $query->where('status', self::STATUS_ACTIVE);
} }
public function scopeForPlan($query, AgentPlan|int $plan) public function scopeForPlan(Builder $query, AgentPlan|int $plan): Builder
{ {
$planId = $plan instanceof AgentPlan ? $plan->id : $plan; $planId = $plan instanceof AgentPlan ? $plan->id : $plan;

View file

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace Core\Mod\Agentic\Models; namespace Core\Mod\Agentic\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -54,14 +55,14 @@ class AgentWorkspaceState extends Model
} }
// Scopes // Scopes
public function scopeForPlan($query, AgentPlan|int $plan) public function scopeForPlan(Builder $query, AgentPlan|int $plan): Builder
{ {
$planId = $plan instanceof AgentPlan ? $plan->id : $plan; $planId = $plan instanceof AgentPlan ? $plan->id : $plan;
return $query->where('agent_plan_id', $planId); return $query->where('agent_plan_id', $planId);
} }
public function scopeOfType($query, string $type) public function scopeOfType(Builder $query, string $type): Builder
{ {
return $query->where('type', $type); return $query->where('type', $type);
} }

View file

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace Core\Mod\Agentic\Models; namespace Core\Mod\Agentic\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
@ -82,7 +83,7 @@ class Prompt extends Model
/** /**
* Scope to only active prompts. * Scope to only active prompts.
*/ */
public function scopeActive($query) public function scopeActive(Builder $query): Builder
{ {
return $query->where('is_active', true); return $query->where('is_active', true);
} }
@ -90,7 +91,7 @@ class Prompt extends Model
/** /**
* Scope by category. * Scope by category.
*/ */
public function scopeCategory($query, string $category) public function scopeCategory(Builder $query, string $category): Builder
{ {
return $query->where('category', $category); return $query->where('category', $category);
} }
@ -98,7 +99,7 @@ class Prompt extends Model
/** /**
* Scope by model provider. * Scope by model provider.
*/ */
public function scopeForModel($query, string $model) public function scopeForModel(Builder $query, string $model): Builder
{ {
return $query->where('model', $model); return $query->where('model', $model);
} }

View file

@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Core\Mod\Agentic\Models; namespace Core\Mod\Agentic\Models;
use Core\Tenant\Concerns\BelongsToWorkspace; use Core\Tenant\Concerns\BelongsToWorkspace;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
class Task extends Model class Task extends Model
@ -26,22 +27,22 @@ class Task extends Model
'line_ref' => 'integer', 'line_ref' => 'integer',
]; ];
public function scopePending($query) public function scopePending(Builder $query): Builder
{ {
return $query->where('status', 'pending'); return $query->where('status', 'pending');
} }
public function scopeInProgress($query) public function scopeInProgress(Builder $query): Builder
{ {
return $query->where('status', 'in_progress'); return $query->where('status', 'in_progress');
} }
public function scopeDone($query) public function scopeDone(Builder $query): Builder
{ {
return $query->where('status', 'done'); return $query->where('status', 'done');
} }
public function scopeActive($query) public function scopeActive(Builder $query): Builder
{ {
return $query->whereIn('status', ['pending', 'in_progress']); return $query->whereIn('status', ['pending', 'in_progress']);
} }

View file

@ -4,6 +4,7 @@ declare(strict_types=1);
namespace Core\Mod\Agentic\Models; namespace Core\Mod\Agentic\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsTo;
@ -132,7 +133,7 @@ class WorkspaceState extends Model
/** /**
* Scope: for plan. * Scope: for plan.
*/ */
public function scopeForPlan($query, int $planId) public function scopeForPlan(Builder $query, int $planId): Builder
{ {
return $query->where('agent_plan_id', $planId); return $query->where('agent_plan_id', $planId);
} }
@ -140,7 +141,7 @@ class WorkspaceState extends Model
/** /**
* Scope: by type. * Scope: by type.
*/ */
public function scopeByType($query, string $type) public function scopeByType(Builder $query, string $type): Builder
{ {
return $query->where('type', $type); return $query->where('type', $type);
} }