Compare commits

...

11 Commits

  1. 19
      app/FamilyConnection.php
  2. 62
      app/Http/Controllers/FamilyActionsController.php
  3. 55
      app/Http/Controllers/Users/FamilyConnectionRequestController.php
  4. 24
      app/User.php
  5. 36
      database/migrations/2021_03_28_091809_create_family_connections_table.php
  6. 14
      resources/views/users/partials/action-buttons.blade.php
  7. 9
      routes/web.php
  8. 110
      tests/Feature/FamilyConnectionRequestTest.php
  9. 56
      tests/Feature/ManageUserFamiliesTest.php
  10. 36
      tests/Unit/UserTest.php

19
app/FamilyConnection.php

@ -0,0 +1,19 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class FamilyConnection extends Model
{
const STATUS_WAITING = 0;
const STATUS_APPROVED = 1;
protected $fillable = [
'id', 'requester_id', 'requested_id', 'status_id',
];
public $incrementing = false;
protected $keyType = 'string';
}

62
app/Http/Controllers/FamilyActionsController.php

@ -2,10 +2,12 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\User;
use App\Couple; use App\Couple;
use Ramsey\Uuid\Uuid;
use App\FamilyConnection;
use App\User;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Ramsey\Uuid\Uuid;
class FamilyActionsController extends Controller class FamilyActionsController extends Controller
{ {
@ -26,6 +28,13 @@ class FamilyActionsController extends Controller
if ($request->get('set_father_id')) { if ($request->get('set_father_id')) {
$user->father_id = $request->get('set_father_id'); $user->father_id = $request->get('set_father_id');
$user->save(); $user->save();
FamilyConnection::create([
'id' => Uuid::uuid4()->toString(),
'requester_id' => $user->id,
'requested_id' => $request->get('set_father_id'),
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} else { } else {
$father = new User; $father = new User;
$father->id = Uuid::uuid4()->toString(); $father->id = Uuid::uuid4()->toString();
@ -35,6 +44,13 @@ class FamilyActionsController extends Controller
$father->manager_id = auth()->id(); $father->manager_id = auth()->id();
$user->setFather($father); $user->setFather($father);
FamilyConnection::create([
'id' => Uuid::uuid4()->toString(),
'requester_id' => $user->id,
'requested_id' => $father->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} }
return back(); return back();
@ -57,6 +73,13 @@ class FamilyActionsController extends Controller
if ($request->get('set_mother_id')) { if ($request->get('set_mother_id')) {
$user->mother_id = $request->get('set_mother_id'); $user->mother_id = $request->get('set_mother_id');
$user->save(); $user->save();
FamilyConnection::create([
'id' => Uuid::uuid4()->toString(),
'requester_id' => $user->id,
'requested_id' => $request->get('set_mother_id'),
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} else { } else {
$mother = new User; $mother = new User;
$mother->id = Uuid::uuid4()->toString(); $mother->id = Uuid::uuid4()->toString();
@ -66,6 +89,13 @@ class FamilyActionsController extends Controller
$mother->manager_id = auth()->id(); $mother->manager_id = auth()->id();
$user->setMother($mother); $user->setMother($mother);
FamilyConnection::create([
'id' => Uuid::uuid4()->toString(),
'requester_id' => $user->id,
'requested_id' => $mother->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} }
return back(); return back();
@ -107,8 +137,22 @@ class FamilyActionsController extends Controller
} else { } else {
if ($user->gender_id == 1) { if ($user->gender_id == 1) {
$child->setFather($user); $child->setFather($user);
FamilyConnection::create([
'id' => Uuid::uuid4()->toString(),
'requester_id' => $user->id,
'requested_id' => $child->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} else { } else {
$child->setMother($user); $child->setMother($user);
FamilyConnection::create([
'id' => Uuid::uuid4()->toString(),
'requester_id' => $user->id,
'requested_id' => $child->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} }
} }
@ -146,6 +190,13 @@ class FamilyActionsController extends Controller
$user->addWife($wife, $request->get('marriage_date')); $user->addWife($wife, $request->get('marriage_date'));
FamilyConnection::create([
'id' => Uuid::uuid4()->toString(),
'requester_id' => $user->id,
'requested_id' => $wife->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
return back(); return back();
} }
@ -177,6 +228,13 @@ class FamilyActionsController extends Controller
$user->addHusband($husband, $request->get('marriage_date')); $user->addHusband($husband, $request->get('marriage_date'));
FamilyConnection::create([
'id' => Uuid::uuid4()->toString(),
'requester_id' => $user->id,
'requested_id' => $husband->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
return back(); return back();
} }

55
app/Http/Controllers/Users/FamilyConnectionRequestController.php

@ -0,0 +1,55 @@
<?php
namespace App\Http\Controllers\Users;
use App\FamilyConnection;
use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Http\Request;
use Ramsey\Uuid\Uuid;
class FamilyConnectionRequestController extends Controller
{
public function store(Request $request, User $user)
{
FamilyConnection::create([
'id' => Uuid::uuid4()->toString(),
'requester_id' => auth()->id(),
'requested_id' => $user->id,
'status_id' => FamilyConnection::STATUS_WAITING,
]);
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,
])->orWhere([
'requester_id' => auth()->id(),
'requested_id' => $user->id,
'status_id' => FamilyConnection::STATUS_WAITING,
])->first();
$familyConnection->delete();
return back();
}
}

24
app/User.php

@ -147,6 +147,7 @@ class User extends Authenticatable
'marriage_date' => $marriageDate, 'marriage_date' => $marriageDate,
'manager_id' => auth()->id(), 'manager_id' => auth()->id(),
]); ]);
return $wife; return $wife;
} }
@ -166,6 +167,7 @@ class User extends Authenticatable
'marriage_date' => $marriageDate, 'marriage_date' => $marriageDate,
'manager_id' => auth()->id(), 'manager_id' => auth()->id(),
]); ]);
return $husband; return $husband;
} }
@ -314,4 +316,26 @@ class User extends Authenticatable
return Carbon::now()->diffInDays($this->birthday, false); return Carbon::now()->diffInDays($this->birthday, false);
} }
} }
public function hasFamilyConnectionRequestTo(User $user)
{
$familyConnetction = FamilyConnection::where([
'requester_id' => $this->id,
'requested_id' => $user->id,
'status_id' => 0,
])->count();
return !!$familyConnetction;
}
public function hasPendingFamilyConnectionRequestFrom(User $user)
{
$familyConnetction = FamilyConnection::where([
'requester_id' => $user->id,
'requested_id' => $this->id,
'status_id' => 0,
])->count();
return !!$familyConnetction;
}
} }

36
database/migrations/2021_03_28_091809_create_family_connections_table.php

@ -0,0 +1,36 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateFamilyConnectionsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('family_connections', function (Blueprint $table) {
$table->uuid('id')->primary();
$table->uuid('requester_id');
$table->uuid('requested_id');
$table->unsignedTinyInteger('status_id')->default(0);
$table->timestamps();
$table->unique(['requester_id', 'requested_id']);
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('family_member_connections');
}
}

14
resources/views/users/partials/action-buttons.blade.php

@ -6,4 +6,16 @@
{{ link_to_route('users.chart', trans('app.show_family_chart'), [$user->id], ['class' => Request::segment(3) == 'chart' ? 'btn btn-default active' : 'btn btn-default']) }} {{ link_to_route('users.chart', trans('app.show_family_chart'), [$user->id], ['class' => Request::segment(3) == 'chart' ? 'btn btn-default active' : 'btn btn-default']) }}
{{ link_to_route('users.tree', trans('app.show_family_tree'), [$user->id], ['class' => Request::segment(3) == 'tree' ? 'btn btn-default active' : 'btn btn-default']) }} {{ link_to_route('users.tree', trans('app.show_family_tree'), [$user->id], ['class' => Request::segment(3) == 'tree' ? 'btn btn-default active' : 'btn btn-default']) }}
{{ link_to_route('users.marriages', trans('app.show_marriages'), [$user->id], ['class' => Request::segment(3) == 'marriages' ? 'btn btn-default active' : 'btn btn-default']) }} {{ link_to_route('users.marriages', trans('app.show_marriages'), [$user->id], ['class' => Request::segment(3) == 'marriages' ? 'btn btn-default active' : 'btn btn-default']) }}
</div>
@auth
@if (auth()->user()->hasFamilyConnectionRequestTo($user))
{!! FormField::delete(['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
</div>

9
routes/web.php

@ -18,6 +18,15 @@ Auth::routes();
Route::group(['middleware' => 'auth'], function () { Route::group(['middleware' => 'auth'], function () {
Route::get('password/change', 'Auth\ChangePasswordController@show')->name('password.change'); Route::get('password/change', 'Auth\ChangePasswordController@show')->name('password.change');
Route::post('password/change', 'Auth\ChangePasswordController@update')->name('password.change'); Route::post('password/change', 'Auth\ChangePasswordController@update')->name('password.change');
Route::post('users/{user}/send_family_connection_request', 'Users\FamilyConnectionRequestController@store')
->name('users.family_connection_requests.store');
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'); Route::get('home', 'HomeController@index')->name('home');

110
tests/Feature/FamilyConnectionRequestTest.php

@ -0,0 +1,110 @@
<?php
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
{
use RefreshDatabase;
/** @test */
public function user_can_send_family_connection_request_to_other_user()
{
$user = $this->loginAsUser();
$otherPerson = factory(User::class)->create();
$this->dontSeeInDatabase('family_connections', [
'requester_id' => $user->id,
'requested_id' => $otherPerson->id,
]);
$this->visitRoute('users.show', $otherPerson);
$this->seeElement('button', ['id' => 'send_family_connection_request']);
$this->press('send_family_connection_request');
$this->seeRouteIs('users.show', $otherPerson);
$this->seeElement('button', ['id' => 'cancel_family_connection_request']);
$this->seeInDatabase('family_connections', [
'requester_id' => $user->id,
'requested_id' => $otherPerson->id,
]);
}
/** @test */
public function user_can_cancel_family_connection_request_to_other_user()
{
$user = $this->loginAsUser();
$otherPerson = factory(User::class)->create();
FamilyConnection::create([
'id' => Uuid::uuid4()->toString(),
'requester_id' => $user->id,
'requested_id' => $otherPerson->id,
]);
$this->visitRoute('users.show', $otherPerson);
$this->seeElement('button', ['id' => 'cancel_family_connection_request']);
$this->press('cancel_family_connection_request');
$this->dontSeeInDatabase('family_connections', [
'requester_id' => $otherPerson->id,
'requested_id' => $user->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,
]);
}
}

56
tests/Feature/ManageUserFamiliesTest.php

@ -2,6 +2,7 @@
namespace Tests\Feature; namespace Tests\Feature;
use App\FamilyConnection;
use App\User; use App\User;
use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase; use Tests\TestCase;
@ -30,6 +31,12 @@ class ManageUserFamiliesTest extends TestCase
]); ]);
$this->assertEquals('Nama Ayah', $user->fresh()->father->nickname); $this->assertEquals('Nama Ayah', $user->fresh()->father->nickname);
$this->seeInDatabase('family_connections', [
'requester_id' => $user->id,
'requested_id' => $user->fresh()->father->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} }
/** @test */ /** @test */
@ -53,6 +60,12 @@ class ManageUserFamiliesTest extends TestCase
]); ]);
$this->assertEquals('Nama Ibu', $user->fresh()->mother->nickname); $this->assertEquals('Nama Ibu', $user->fresh()->mother->nickname);
$this->seeInDatabase('family_connections', [
'requester_id' => $user->id,
'requested_id' => $user->fresh()->mother->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} }
/** @test */ /** @test */
@ -80,6 +93,13 @@ class ManageUserFamiliesTest extends TestCase
'parent_id' => null, 'parent_id' => null,
'manager_id' => $user->id, 'manager_id' => $user->id,
]); ]);
$child = User::where('name', 'Nama Anak 1')->first();
$this->seeInDatabase('family_connections', [
'requester_id' => $user->id,
'requested_id' => $child->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} }
/** @test */ /** @test */
@ -170,6 +190,12 @@ class ManageUserFamiliesTest extends TestCase
'marriage_date' => '2010-01-01', 'marriage_date' => '2010-01-01',
'manager_id' => $user->id, 'manager_id' => $user->id,
]); ]);
$this->seeInDatabase('family_connections', [
'requester_id' => $user->id,
'requested_id' => $wife->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} }
/** @test */ /** @test */
@ -203,6 +229,12 @@ class ManageUserFamiliesTest extends TestCase
'marriage_date' => '2010-03-03', 'marriage_date' => '2010-03-03',
'manager_id' => $user->id, 'manager_id' => $user->id,
]); ]);
$this->seeInDatabase('family_connections', [
'requester_id' => $user->id,
'requested_id' => $husband->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} }
/** @test */ /** @test */
@ -225,6 +257,12 @@ class ManageUserFamiliesTest extends TestCase
]); ]);
$this->assertEquals($father->nickname, $user->fresh()->father->nickname); $this->assertEquals($father->nickname, $user->fresh()->father->nickname);
$this->seeInDatabase('family_connections', [
'requester_id' => $user->id,
'requested_id' => $father->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} }
/** @test */ /** @test */
@ -247,6 +285,12 @@ class ManageUserFamiliesTest extends TestCase
]); ]);
$this->assertEquals($mother->nickname, $user->fresh()->mother->nickname); $this->assertEquals($mother->nickname, $user->fresh()->mother->nickname);
$this->seeInDatabase('family_connections', [
'requester_id' => $user->id,
'requested_id' => $mother->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} }
/** @test */ /** @test */
@ -273,6 +317,12 @@ class ManageUserFamiliesTest extends TestCase
'marriage_date' => '2010-01-01', 'marriage_date' => '2010-01-01',
'manager_id' => $user->id, 'manager_id' => $user->id,
]); ]);
$this->seeInDatabase('family_connections', [
'requester_id' => $user->id,
'requested_id' => $wife->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} }
/** @test */ /** @test */
@ -299,6 +349,12 @@ class ManageUserFamiliesTest extends TestCase
'marriage_date' => '2010-03-03', 'marriage_date' => '2010-03-03',
'manager_id' => $user->id, 'manager_id' => $user->id,
]); ]);
$this->seeInDatabase('family_connections', [
'requester_id' => $user->id,
'requested_id' => $husband->id,
'status_id' => FamilyConnection::STATUS_APPROVED,
]);
} }
/** @test */ /** @test */

36
tests/Unit/UserTest.php

@ -3,10 +3,12 @@
namespace Tests\Unit; namespace Tests\Unit;
use App\Couple; use App\Couple;
use App\FamilyConnection;
use App\User; use App\User;
use Carbon\Carbon; use Carbon\Carbon;
use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Support\Collection; use Illuminate\Support\Collection;
use Ramsey\Uuid\Uuid;
use Tests\TestCase; use Tests\TestCase;
class UserTest extends TestCase class UserTest extends TestCase
@ -266,4 +268,38 @@ class UserTest extends TestCase
$customer->birthday_remaining $customer->birthday_remaining
); );
} }
/** @test */
public function a_user_model_has_method_has_family_connection_request_to()
{
$john = factory(User::class)->create();
$jane = factory(User::class)->create();
$this->assertFalse($john->hasFamilyConnectionRequestTo($jane));
FamilyConnection::create([
'id' => Uuid::uuid4()->toString(),
'requester_id' => $john->id,
'requested_id' => $jane->id,
]);
$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));
}
} }
Loading…
Cancel
Save