diff --git a/app/Http/Controllers/Oasis/ClientController.php b/app/Http/Controllers/Oasis/ClientController.php index be49afc2..58f89e65 100644 --- a/app/Http/Controllers/Oasis/ClientController.php +++ b/app/Http/Controllers/Oasis/ClientController.php @@ -2,10 +2,15 @@ namespace App\Http\Controllers\Oasis; +use App\Http\Requests\Oasis\StoreClientRequest; use App\Http\Resources\Oasis\OasisClientCollection; use App\Http\Controllers\Controller; +use App\Http\Resources\Oasis\OasisClientResource; use App\Models\Oasis\Client; use Auth; +use Illuminate\Contracts\Foundation\Application; +use Illuminate\Contracts\Routing\ResponseFactory; +use Illuminate\Http\Response; class ClientController extends Controller { @@ -34,4 +39,31 @@ class ClientController extends Controller new OasisClientCollection($results), 200 ); } + + /** + * @param StoreClientRequest $request + * @return Application|ResponseFactory|Response + */ + public function store(StoreClientRequest $request) + { + $client = $request->user() + ->clients() + ->create([ + 'avatar' => store_avatar($request, 'avatar') ?? null, + 'name' => $request->name, + 'email' => $request->email ?? null, + 'phone_number' => $request->phone_number ?? null, + 'address' => $request->address, + 'city' => $request->city, + 'postal_code' => $request->postal_code, + 'country' => $request->country, + 'ico' => $request->ico ?? null, + 'dic' => $request->dic ?? null, + 'ic_dph' => $request->ic_dph ?? null, + ]); + + return response( + new OasisClientResource($client), 201 + ); + } } diff --git a/app/Http/Requests/Oasis/StoreClientRequest.php b/app/Http/Requests/Oasis/StoreClientRequest.php new file mode 100644 index 00000000..aa61d5fd --- /dev/null +++ b/app/Http/Requests/Oasis/StoreClientRequest.php @@ -0,0 +1,40 @@ + 'sometimes|file|nullable', + 'name' => 'required|string', + 'email' => 'sometimes|email|nullable', + 'phone_number' => 'sometimes|string|nullable', + 'address' => 'required|string', + 'city' => 'required|string', + 'postal_code' => 'required|string', + 'country' => 'required|string', + 'ico' => 'required|string', + 'dic' => 'required|string', + 'ic_dph' => 'required|string', + ]; + } +} diff --git a/routes/oasis.php b/routes/oasis.php index 6491c1c7..be82f597 100644 --- a/routes/oasis.php +++ b/routes/oasis.php @@ -34,6 +34,8 @@ Route::group(['middleware' => 'api', 'prefix' => '/api/oasis'], function () { Route::group(['prefix' => 'clients'], function () { Route::get('/', [ClientController::class, 'index']); Route::get('/search', [ClientController::class, 'search']); + + Route::post('/', [ClientController::class, 'store']); }); }); diff --git a/tests/Feature/Oasis/OasisClientTest.php b/tests/Feature/Oasis/OasisClientTest.php index ec834f05..b5e078be 100644 --- a/tests/Feature/Oasis/OasisClientTest.php +++ b/tests/Feature/Oasis/OasisClientTest.php @@ -2,8 +2,11 @@ namespace Tests\Feature\Oasis; +use Carbon\Carbon; use Illuminate\Foundation\Testing\DatabaseMigrations; use App\Models\Oasis\Client; +use Illuminate\Http\UploadedFile; +use Illuminate\Support\Facades\Storage; use Laravel\Sanctum\Sanctum; use App\Models\User; use Tests\TestCase; @@ -25,6 +28,77 @@ class OasisClientTest extends TestCase ]); } + /** + * @test + */ + public function user_create_new_client_with_avatar() + { + Storage::fake('local'); + + $avatar = UploadedFile::fake() + ->image('fake-image.jpg'); + + $user = User::factory(User::class) + ->create(['role' => 'user']); + + Sanctum::actingAs($user); + + $this->postJson('/api/oasis/clients', [ + 'avatar' => $avatar, + 'name' => 'VueFileManager Inc.', + 'email' => 'howdy@hi5ve.digital', + 'phone_number' => '+421 950 123 456', + 'address' => 'Does 12', + 'city' => 'Bratislava', + 'postal_code' => '076 54', + 'country' => 'SK', + 'ico' => '11111111', + 'dic' => '11111111', + 'ic_dph' => 'SK11111111', + ])->assertStatus(201); + + $this->assertDatabaseHas('clients', [ + 'user_id' => $user->id, + 'name' => 'VueFileManager Inc.', + 'email' => 'howdy@hi5ve.digital', + ]); + + Storage::disk('local') + ->assertExists( + Client::first()->getRawOriginal('avatar') + ); + } + + /** + * @test + */ + public function user_create_new_client_without_avatar_and_contact_info() + { + $user = User::factory(User::class) + ->create(['role' => 'user']); + + Sanctum::actingAs($user); + + $this->postJson('/api/oasis/clients', [ + 'avatar' => null, + 'name' => 'VueFileManager Inc.', + 'email' => null, + 'phone_number' => null, + 'address' => 'Does 12', + 'city' => 'Bratislava', + 'postal_code' => '076 54', + 'country' => 'SK', + 'ico' => '11111111', + 'dic' => '11111111', + 'ic_dph' => 'SK11111111', + ])->assertStatus(201); + + $this->assertDatabaseHas('clients', [ + 'user_id' => $user->id, + 'name' => 'VueFileManager Inc.', + ]); + } + /** * @test */ @@ -59,8 +133,8 @@ class OasisClientTest extends TestCase $client = Client::factory(Client::class) ->create([ 'user_id' => $user->id, - 'name' => 'VueFileManager Inc.', - 'email' => 'info@company.com', + 'name' => 'VueFileManager Inc.', + 'email' => 'info@company.com', ]); $this->getJson('/api/oasis/clients/search?query=vue') diff --git a/tests/Feature/Oasis/OasisInvoiceTest.php b/tests/Feature/Oasis/OasisInvoiceTest.php index 1e908758..2b1cce1e 100644 --- a/tests/Feature/Oasis/OasisInvoiceTest.php +++ b/tests/Feature/Oasis/OasisInvoiceTest.php @@ -172,16 +172,17 @@ class OasisInvoiceTest extends TestCase public function user_create_new_invoice_with_storing_new_client() { Notification::fake(); + Storage::fake('local'); + $avatar = UploadedFile::fake() + ->image('fake-image.jpg'); + $user = User::factory(User::class) ->create(['role' => 'user']); Sanctum::actingAs($user); - $avatar = UploadedFile::fake() - ->image('fake-image.jpg'); - $this->postJson('/api/oasis/invoices', [ 'invoice_type' => 'regular-invoice', 'invoice_number' => '2120001', @@ -221,7 +222,9 @@ class OasisInvoiceTest extends TestCase ]); Storage::disk('local') - ->assertExists(Client::first()->getRawOriginal('avatar')); + ->assertExists( + Client::first()->getRawOriginal('avatar') + ); Notification::assertTimesSent(1, InvoiceDeliveryNotification::class); } @@ -335,7 +338,6 @@ class OasisInvoiceTest extends TestCase public function user_create_new_invoice_without_storing_client() { Notification::fake(); - Storage::fake('local'); $user = User::factory(User::class) ->create(['role' => 'user']); @@ -387,7 +389,6 @@ class OasisInvoiceTest extends TestCase public function user_create_new_invoice_with_existing_client() { Notification::fake(); - Storage::fake('local'); $user = User::factory(User::class) ->create(['role' => 'user']);