'integer', ]; public function scopePending($query) { return $query->where('status', 'pending'); } public function scopeInProgress($query) { return $query->where('status', 'in_progress'); } public function scopeDone($query) { return $query->where('status', 'done'); } public function scopeActive($query) { return $query->whereIn('status', ['pending', 'in_progress']); } /** * Order by priority using CASE statement with whitelisted values. * * This is a safe replacement for orderByRaw("FIELD(priority, ...)") which * could be vulnerable to SQL injection if extended with user input. */ public function scopeOrderByPriority($query, string $direction = 'asc') { return $query->orderByRaw('CASE priority WHEN ? THEN 1 WHEN ? THEN 2 WHEN ? THEN 3 WHEN ? THEN 4 ELSE 5 END ' . ($direction === 'desc' ? 'DESC' : 'ASC'), ['urgent', 'high', 'normal', 'low']); } /** * Order by status using CASE statement with whitelisted values. * * This is a safe replacement for orderByRaw("FIELD(status, ...)") which * could be vulnerable to SQL injection if extended with user input. */ public function scopeOrderByStatus($query, string $direction = 'asc') { return $query->orderByRaw('CASE status WHEN ? THEN 1 WHEN ? THEN 2 WHEN ? THEN 3 ELSE 4 END ' . ($direction === 'desc' ? 'DESC' : 'ASC'), ['in_progress', 'pending', 'done']); } public function getStatusBadgeAttribute(): string { return match ($this->status) { 'done' => '✓', 'in_progress' => '→', default => '○', }; } public function getPriorityBadgeAttribute(): string { return match ($this->priority) { 'urgent' => '🔴', 'high' => '🟠', 'low' => '🔵', default => '', }; } }