Refactor category API and transformer for query optimization

Signed-off-by: snipe <snipe@snipe.net>
This commit is contained in:
snipe 2023-01-10 13:30:01 -08:00
parent 17c308f3ca
commit 249b188654
2 changed files with 26 additions and 28 deletions

View file

@ -22,6 +22,24 @@ class CategoriesTransformer
public function transformCategory(Category $category = null) public function transformCategory(Category $category = null)
{ {
switch ($category->category_type) {
case 'asset':
$category->item_count = $category->assets_count;
break;
case 'accessory':
$category->item_count = $category->accessories_count;
break;
case 'consumable':
$category->item_count = $category->consumables_count;
break;
case 'component':
$category->item_count = $category->components_count;
break;
default:
$category->item_count = 0;
}
if ($category) { if ($category) {
$array = [ $array = [
'id' => (int) $category->id, 'id' => (int) $category->id,
@ -33,7 +51,7 @@ class CategoriesTransformer
'eula' => ($category->getEula()), 'eula' => ($category->getEula()),
'checkin_email' => ($category->checkin_email == '1'), 'checkin_email' => ($category->checkin_email == '1'),
'require_acceptance' => ($category->require_acceptance == '1'), 'require_acceptance' => ($category->require_acceptance == '1'),
'item_count' => (int) $category->itemCount(), 'item_count' => (int) $category->item_count,
'assets_count' => (int) $category->assets_count, 'assets_count' => (int) $category->assets_count,
'accessories_count' => (int) $category->accessories_count, 'accessories_count' => (int) $category->accessories_count,
'consumables_count' => (int) $category->consumables_count, 'consumables_count' => (int) $category->consumables_count,

View file

@ -10,6 +10,7 @@ use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Gate;
use Watson\Validating\ValidatingTrait; use Watson\Validating\ValidatingTrait;
use App\Helpers\Helper; use App\Helpers\Helper;
use Illuminate\Support\Str;
/** /**
* Model for Categories. Categories are a higher-level group * Model for Categories. Categories are a higher-level group
@ -97,8 +98,11 @@ class Category extends SnipeModel
*/ */
public function isDeletable() public function isDeletable()
{ {
return Gate::allows('delete', $this) if (Gate::allows('delete', $this)) {
&& ($this->itemCount() == 0); $category_type_var = Str::plural($this->category_type).'_count';
return $this->{$category_type_var};
}
} }
/** /**
@ -149,30 +153,6 @@ class Category extends SnipeModel
return $this->hasMany(\App\Models\Component::class); return $this->hasMany(\App\Models\Component::class);
} }
/**
* Get the number of items in the category
*
* @author [A. Gianotto] [<snipe@snipe.net>]
* @since [v2.0]
* @return int
*/
public function itemCount()
{
switch ($this->category_type) {
case 'asset':
return $this->assets()->count();
case 'accessory':
return $this->accessories()->count();
case 'component':
return $this->components()->count();
case 'consumable':
return $this->consumables()->count();
case 'license':
return $this->licenses()->count();
}
return '0';
}
/** /**
* Establishes the category -> assets relationship * Establishes the category -> assets relationship