diff --git a/app/Http/Controllers/Users/FamilyConnectionRequestController.php b/app/Http/Controllers/Users/FamilyConnectionRequestController.php index 5cf654a..180ddba 100644 --- a/app/Http/Controllers/Users/FamilyConnectionRequestController.php +++ b/app/Http/Controllers/Users/FamilyConnectionRequestController.php @@ -21,4 +21,31 @@ class FamilyConnectionRequestController extends Controller return back(); } + + public function update(Request $request, User $user) + { + $familyConnection = FamilyConnection::where([ + 'requester_id' => $user->id, + 'requested_id' => auth()->id(), + 'status_id' => FamilyConnection::STATUS_WAITING, + ])->first(); + + $familyConnection->status_id = FamilyConnection::STATUS_APPROVED; + $familyConnection->save(); + + return back(); + } + + public function destroy(Request $request, User $user) + { + $familyConnection = FamilyConnection::where([ + 'requester_id' => $user->id, + 'requested_id' => auth()->id(), + 'status_id' => FamilyConnection::STATUS_WAITING, + ])->first(); + + $familyConnection->delete(); + + return back(); + } } diff --git a/app/User.php b/app/User.php index 5bf29c3..ec6b1de 100644 --- a/app/User.php +++ b/app/User.php @@ -327,4 +327,15 @@ class User extends Authenticatable return !!$familyConnetction; } + + public function hasPendingFamilyConnectionRequestFrom(User $user) + { + $familyConnetction = FamilyConnection::where([ + 'requester_id' => $user->id, + 'requested_id' => $this->id, + 'status_id' => 0, + ])->count(); + + return !!$familyConnetction; + } } diff --git a/resources/views/users/partials/action-buttons.blade.php b/resources/views/users/partials/action-buttons.blade.php index f061cac..60668e8 100644 --- a/resources/views/users/partials/action-buttons.blade.php +++ b/resources/views/users/partials/action-buttons.blade.php @@ -8,9 +8,14 @@ {{ link_to_route('users.marriages', trans('app.show_marriages'), [$user->id], ['class' => Request::segment(3) == 'marriages' ? 'btn btn-default active' : 'btn btn-default']) }} @auth @if (auth()->user()->hasFamilyConnectionRequestTo($user)) - {!! FormField::formButton(['route' => ['users.family_connection_requests.delete', $user->id]], __('family_connection.cancel_request'), ['class' => 'btn btn-warning', 'id' => 'cancel_family_connection_request']) !!} + {!! FormField::formButton(['route' => ['users.family_connection_requests.destroy', $user->id]], __('family_connection.cancel_request'), ['class' => 'btn btn-warning', 'id' => 'cancel_family_connection_request']) !!} @else {!! FormField::formButton(['route' => ['users.family_connection_requests.store', $user->id]], __('family_connection.send_request'), ['class' => 'btn btn-success', 'id' => 'send_family_connection_request']) !!} @endif + + @if (auth()->user()->hasPendingFamilyConnectionRequestFrom($user)) + {!! FormField::formButton(['route' => ['users.family_connection_requests.update', $user->id], 'method' => 'patch'], __('family_connection.accept_request'), ['class' => 'btn btn-success', 'id' => 'accept_family_connection_request']) !!} + {!! FormField::delete(['route' => ['users.family_connection_requests.destroy', $user->id]], __('family_connection.reject_request'), ['class' => 'btn btn-danger', 'id' => 'reject_family_connection_request']) !!} + @endif @endauth diff --git a/routes/web.php b/routes/web.php index d640868..5e985c2 100644 --- a/routes/web.php +++ b/routes/web.php @@ -22,8 +22,11 @@ Route::group(['middleware' => 'auth'], function () { Route::post('users/{user}/send_family_connection_request', 'Users\FamilyConnectionRequestController@store') ->name('users.family_connection_requests.store'); - Route::delete('users/{user}/cancel_family_connection_request', 'Users\FamilyConnectionRequestController@store') - ->name('users.family_connection_requests.delete'); + Route::patch('users/{user}/accept_family_connection_request', 'Users\FamilyConnectionRequestController@update') + ->name('users.family_connection_requests.update'); + + Route::delete('users/{user}/cancel_family_connection_request', 'Users\FamilyConnectionRequestController@destroy') + ->name('users.family_connection_requests.destroy'); }); Route::get('home', 'HomeController@index')->name('home'); diff --git a/tests/Feature/FamilyConnectionRequestTest.php b/tests/Feature/FamilyConnectionRequestTest.php index 2ed5c2a..6a68441 100644 --- a/tests/Feature/FamilyConnectionRequestTest.php +++ b/tests/Feature/FamilyConnectionRequestTest.php @@ -2,8 +2,10 @@ namespace Tests\Feature; +use App\FamilyConnection; use App\User; use Illuminate\Foundation\Testing\RefreshDatabase; +use Ramsey\Uuid\Uuid; use Tests\TestCase; class FamilyConnectionRequestTest extends TestCase @@ -32,4 +34,55 @@ class FamilyConnectionRequestTest extends TestCase 'requested_id' => $otherPerson->id, ]); } + + /** @test */ + public function user_can_accept_family_connection_request_from_other_user() + { + $user = $this->loginAsUser(); + $otherPerson = factory(User::class)->create(); + + FamilyConnection::create([ + 'id' => Uuid::uuid4()->toString(), + 'requester_id' => $otherPerson->id, + 'requested_id' => $user->id, + ]); + + $this->visitRoute('users.show', $otherPerson); + $this->seeElement('button', ['id' => 'accept_family_connection_request']); + $this->press('accept_family_connection_request'); + + $this->seeRouteIs('users.show', $otherPerson); + $this->seeInDatabase('family_connections', [ + 'requester_id' => $otherPerson->id, + 'requested_id' => $user->id, + 'status_id' => FamilyConnection::STATUS_APPROVED, + ]); + } + + /** @test */ + public function user_can_reject_family_connection_request_from_other_user() + { + $user = $this->loginAsUser(); + $otherPerson = factory(User::class)->create(); + + FamilyConnection::create([ + 'id' => Uuid::uuid4()->toString(), + 'requester_id' => $otherPerson->id, + 'requested_id' => $user->id, + ]); + $this->seeInDatabase('family_connections', [ + 'requester_id' => $otherPerson->id, + 'requested_id' => $user->id, + ]); + + $this->visitRoute('users.show', $otherPerson); + $this->seeElement('button', ['id' => 'reject_family_connection_request']); + $this->press('reject_family_connection_request'); + + $this->seeRouteIs('users.show', $otherPerson); + $this->dontSeeInDatabase('family_connections', [ + 'requester_id' => $otherPerson->id, + 'requested_id' => $user->id, + ]); + } } diff --git a/tests/Unit/UserTest.php b/tests/Unit/UserTest.php index b6b2267..e94fdd6 100644 --- a/tests/Unit/UserTest.php +++ b/tests/Unit/UserTest.php @@ -285,4 +285,21 @@ class UserTest extends TestCase $this->assertTrue($john->hasFamilyConnectionRequestTo($jane)); } + + /** @test */ + public function a_user_model_has_method_has_pending_family_connection_request_from() + { + $john = factory(User::class)->create(); + $jane = factory(User::class)->create(); + + $this->assertFalse($jane->hasPendingFamilyConnectionRequestFrom($john)); + + FamilyConnection::create([ + 'id' => Uuid::uuid4()->toString(), + 'requester_id' => $john->id, + 'requested_id' => $jane->id, + ]); + + $this->assertTrue($jane->hasPendingFamilyConnectionRequestFrom($john)); + } }