diff --git a/app/Factory/DesignFactory.php b/app/Factory/DesignFactory.php index 0013e37d7ba3..b8b8fe2092ef 100644 --- a/app/Factory/DesignFactory.php +++ b/app/Factory/DesignFactory.php @@ -25,6 +25,8 @@ class DesignFactory $design->is_active = true; $design->is_custom = true; $design->name = ''; + $design->is_template = false; + $design->entities = ''; $design->design = new DesignBlocks(); return $design; diff --git a/app/Filters/DesignFilters.php b/app/Filters/DesignFilters.php index 88593f219845..0007a29d08f2 100644 --- a/app/Filters/DesignFilters.php +++ b/app/Filters/DesignFilters.php @@ -69,6 +69,17 @@ class DesignFilters extends QueryFilters }); } + public function template(string $template = 'false'): Builder + { + + if (strlen($template) == 0) { + return $this->builder; + } + + $bool_val = $template == 'true' ? true : false; + + return $this->builder->where('is_template', $bool_val); + } /** * Filter the designs by `is_custom` column. * diff --git a/app/Http/Controllers/DesignController.php b/app/Http/Controllers/DesignController.php index 3e97a8c609b1..9f537f6e447d 100644 --- a/app/Http/Controllers/DesignController.php +++ b/app/Http/Controllers/DesignController.php @@ -301,7 +301,10 @@ class DesignController extends BaseController */ public function create(CreateDesignRequest $request) { - $design = DesignFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $design = DesignFactory::create($user->company()->id, $user->id); return $this->itemResponse($design); } @@ -346,7 +349,11 @@ class DesignController extends BaseController */ public function store(StoreDesignRequest $request) { - $design = DesignFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $design = DesignFactory::create($user->company()->id, $user->id); + $design->fill($request->all()); $design->save(); diff --git a/app/Http/Requests/Design/StoreDesignRequest.php b/app/Http/Requests/Design/StoreDesignRequest.php index 2af551664c66..c1ab381badd1 100644 --- a/app/Http/Requests/Design/StoreDesignRequest.php +++ b/app/Http/Requests/Design/StoreDesignRequest.php @@ -23,20 +23,29 @@ class StoreDesignRequest extends Request */ public function authorize() : bool { - return auth()->user()->isAdmin() && auth()->user()->account->hasFeature(Account::FEATURE_API); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->isAdmin() && $user->account->hasFeature(Account::FEATURE_API); ; } public function rules() { + + /** @var \App\Models\User $user */ + $user = auth()->user(); + return [ //'name' => 'required', - 'name' => 'required|unique:designs,name,null,null,company_id,'.auth()->user()->companyId(), + 'name' => 'required|unique:designs,name,null,null,company_id,'.$user->companyId(), 'design' => 'required|array', 'design.header' => 'required|min:1', 'design.body' => 'required|min:1', 'design.footer' => 'required|min:1', 'design.includes' => 'required|min:1', + 'is_template' => 'sometimes|boolean', + 'entities' => 'sometimes|string' ]; } diff --git a/app/Http/Requests/Design/UpdateDesignRequest.php b/app/Http/Requests/Design/UpdateDesignRequest.php index bae0d93d92cc..5e643562bf19 100644 --- a/app/Http/Requests/Design/UpdateDesignRequest.php +++ b/app/Http/Requests/Design/UpdateDesignRequest.php @@ -30,7 +30,10 @@ class UpdateDesignRequest extends Request public function rules() { - return []; + return [ + 'is_template' => 'sometimes|boolean', + 'entities' => 'sometimes|string' + ]; } public function prepareForValidation() diff --git a/app/Models/Design.php b/app/Models/Design.php index 32c677357464..1b0bf79a8347 100644 --- a/app/Models/Design.php +++ b/app/Models/Design.php @@ -68,7 +68,7 @@ class Design extends BaseModel 'name', 'design', 'is_active', - // 'is_template', + 'is_template', ]; public function company() diff --git a/app/Transformers/DesignTransformer.php b/app/Transformers/DesignTransformer.php index 3e8bd2c2f98a..371733ce85d4 100644 --- a/app/Transformers/DesignTransformer.php +++ b/app/Transformers/DesignTransformer.php @@ -54,6 +54,8 @@ class DesignTransformer extends EntityTransformer 'created_at' => (int) $design->created_at, 'is_deleted' => (bool) $design->is_deleted, 'is_free' => ($design->id <= 4) ? true : false, + 'is_template' => (bool) $design->is_template, + 'entities' => (string) $design->entities ?: '', ]; } } diff --git a/database/migrations/2023_09_21_042010_add_template_flag_to_designs_table.php b/database/migrations/2023_09_21_042010_add_template_flag_to_designs_table.php index cc0d75c2d00a..f8639253a0d3 100644 --- a/database/migrations/2023_09_21_042010_add_template_flag_to_designs_table.php +++ b/database/migrations/2023_09_21_042010_add_template_flag_to_designs_table.php @@ -13,6 +13,7 @@ return new class extends Migration { Schema::table('designs', function (Blueprint $table) { $table->boolean('is_template')->default(false); + $table->text('entities')->nullable(); }); } diff --git a/tests/Feature/DesignApiTest.php b/tests/Feature/DesignApiTest.php index 1fa8bb9c2c1e..372bd1302291 100644 --- a/tests/Feature/DesignApiTest.php +++ b/tests/Feature/DesignApiTest.php @@ -14,6 +14,7 @@ namespace Tests\Feature; use Tests\TestCase; use App\Models\Design; use Tests\MockAccountData; +use App\Factory\DesignFactory; use App\Utils\Traits\MakesHash; use App\Events\Design\DesignWasCreated; use App\Events\Design\DesignWasDeleted; @@ -36,6 +37,8 @@ class DesignApiTest extends TestCase public $id; + public $faker; + protected function setUp() :void { parent::setUp(); @@ -49,6 +52,58 @@ class DesignApiTest extends TestCase Model::reguard(); } + public function testDesignTemplates() + { + $design = DesignFactory::create($this->company->id, $this->user->id); + $design->is_template = true; + $design->name = 'Test Template'; + $design->save(); + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/designs?template=true'); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertCount(1, $arr['data']); + } + + public function testDesignTemplatesExcluded() + { + $design = DesignFactory::create($this->company->id, $this->user->id); + $design->is_template = true; + $design->name = 'Test Template'; + $design->save(); + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/designs?template=false'); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertCount(11, $arr['data']); + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->get('/api/v1/designs'); + + $response->assertStatus(200); + + $arr = $response->json(); + + $this->assertCount(12, $arr['data']); + + + } + + public function testDesignPost() {