diff --git a/app/Http/Controllers/Oasis/ClientController.php b/app/Http/Controllers/Oasis/ClientController.php index 58f89e65..c55fa878 100644 --- a/app/Http/Controllers/Oasis/ClientController.php +++ b/app/Http/Controllers/Oasis/ClientController.php @@ -66,4 +66,17 @@ class ClientController extends Controller new OasisClientResource($client), 201 ); } + + /** + * @param Client $client + * @throws \Exception + */ + public function destroy(Client $client) + { + if ($client->user_id === Auth::id()) { + $client->delete(); + + return response('Done', 204); + } + } } diff --git a/app/Models/Oasis/Client.php b/app/Models/Oasis/Client.php index 0a184a15..c3125971 100644 --- a/app/Models/Oasis/Client.php +++ b/app/Models/Oasis/Client.php @@ -78,8 +78,14 @@ class Client extends Model { parent::boot(); - static::creating(function ($order) { - $order->id = (string) Str::uuid(); + static::creating(function ($client) { + $client->id = (string) Str::uuid(); + }); + + static::deleting(function ($client) { + if ($client->getRawOriginal('avatar')) { + Storage::delete($client->getRawOriginal('avatar')); + } }); } } diff --git a/routes/oasis.php b/routes/oasis.php index 8fefea98..1f686e52 100644 --- a/routes/oasis.php +++ b/routes/oasis.php @@ -42,6 +42,7 @@ Route::group(['middleware' => 'api', 'prefix' => '/api/oasis'], function () { Route::get('/search', [ClientController::class, 'search']); Route::post('/', [ClientController::class, 'store']); + Route::delete('/{client}', [ClientController::class, 'destroy']); }); }); diff --git a/tests/Feature/Oasis/OasisClientTest.php b/tests/Feature/Oasis/OasisClientTest.php index a36ae730..37159c48 100644 --- a/tests/Feature/Oasis/OasisClientTest.php +++ b/tests/Feature/Oasis/OasisClientTest.php @@ -99,6 +99,36 @@ class OasisClientTest extends TestCase ]); } + /** + * @test + */ + public function user_delete_client() + { + Storage::fake('local'); + + $user = User::factory(User::class) + ->create(['role' => 'user']); + + Sanctum::actingAs($user); + + $avatar = UploadedFile::fake() + ->image('fake-image.jpg'); + + Storage::putFileAs('avatar', $avatar, 'fake-image.jpg'); + + $client = Client::factory(Client::class) + ->create([ + 'avatar' => 'avatar/fake-image.jpg', + 'user_id' => $user->id, + ]); + + $this->deleteJson("/api/oasis/clients/$client->id") + ->assertStatus(204); + + Storage::disk('local') + ->assertMissing('avatar/fake-image.jpg'); + } + /** * @test */