diff --git a/Modules/Linksehat/Http/Controllers/Api/AuthController.php b/Modules/Linksehat/Http/Controllers/Api/AuthController.php index 6e678513..ee65a7df 100644 --- a/Modules/Linksehat/Http/Controllers/Api/AuthController.php +++ b/Modules/Linksehat/Http/Controllers/Api/AuthController.php @@ -7,6 +7,7 @@ use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Hash; +use Modules\Linksehat\Transformers\UserProfileResource; use Validator; class AuthController extends Controller @@ -103,7 +104,7 @@ class AuthController extends Controller return response([ 'message' => 'Selamat Datang', - 'user' => $user, + 'user' => UserProfileResource::make($user), 'token' => $user->createToken('app')->plainTextToken ]); } @@ -156,7 +157,7 @@ class AuthController extends Controller ]); $user = User::where((filter_var($request->phone_or_email, FILTER_VALIDATE_EMAIL) ? 'email' : 'phone'), $request->phone_or_email)->first(); - + if ($user) { return response()->json([ 'message' => 'OTP Anda', diff --git a/Modules/Linksehat/Http/Controllers/Api/ProfileController.php b/Modules/Linksehat/Http/Controllers/Api/ProfileController.php new file mode 100644 index 00000000..413051a2 --- /dev/null +++ b/Modules/Linksehat/Http/Controllers/Api/ProfileController.php @@ -0,0 +1,137 @@ +user(); + $user->load('person'); + + return response()->json([ + 'user' => UserProfileResource::make($user) + ]); + } + + /** + * Show the form for creating a new resource. + * @return Renderable + */ + public function create() + { + return view('linksehat::create'); + } + + /** + * Store a newly created resource in storage. + * @param Request $request + * @return Renderable + */ + public function store(Request $request) + { + // + } + + /** + * Show the specified resource. + * @param int $id + * @return Renderable + */ + public function show($id) + { + return view('linksehat::show'); + } + + /** + * Show the form for editing the specified resource. + * @param int $id + * @return Renderable + */ + public function edit($id) + { + return view('linksehat::edit'); + } + + /** + * Update the specified resource in storage. + * @param Request $request + * @param int $id + * @return Renderable + */ + public function update(Request $request) + { + $request->validate([ + 'nik' => 'numeric', + 'name_prefix' => '', + 'name' => '', + 'name_suffix' => '', + 'gender' => 'in:P,L', + 'birth_date' => 'sometimes:date', + // 'is_deceased' => '', + 'deceased_at' => 'sometimes:date', + 'marital_status' => 'in:S,M,C', + 'preferred_lang' => 'in:id,en' + ]); + + $user = auth()->user(); + if ($user->person) { // Update Profile + $user->person->fill($request->only([ + 'nik', 'name_prefix', 'name', 'name_suffix', 'gender', 'birth_date', 'deceased_at', 'marital_status' + ]))->save(); + + if ($request->has('preferred_lang')) { + $user->metas()->updateOrCreate([ + 'type' => 'preferred_lang' + ], [ + 'system' => 'default', + 'type' => 'preferred_lang', + 'value' => $request->preferred_lang, + ]); + } + } else { // Create If Not Exist + $newPerson = array_merge( + $request->only([ + 'nik', 'name_prefix', 'name', 'name_suffix', 'gender', 'birth_date', 'deceased_at', 'marital_status' + ]), + ['user_owner_id' => $user->id] + ); + $newPerson = $user->person()->create($newPerson); + $user->person_id = $newPerson->id; + $user->save(); + + if ($request->has('preferred_lang')) { + $user->metas()->updateOrCreate([ + 'type' => 'preferred_lang' + ], [ + 'system' => 'default', + 'type' => 'preferred_lang', + 'value' => $request->preferred_lang, + ]); + } + } + + $user = User::find($user->id); // ReLoad User Data + return response()->json(UserProfileResource::make($user)); + } + + /** + * Remove the specified resource from storage. + * @param int $id + * @return Renderable + */ + public function destroy($id) + { + // + } +} diff --git a/Modules/Linksehat/Routes/api.php b/Modules/Linksehat/Routes/api.php index 1d4ced7c..963c68ba 100644 --- a/Modules/Linksehat/Routes/api.php +++ b/Modules/Linksehat/Routes/api.php @@ -4,6 +4,7 @@ use Illuminate\Http\Request; use Modules\Linksehat\Http\Controllers\Api\AuthController; use Modules\Linksehat\Http\Controllers\Api\DoctorController; use Modules\Linksehat\Http\Controllers\Api\HospitalController; +use Modules\Linksehat\Http\Controllers\Api\ProfileController; /* |-------------------------------------------------------------------------- @@ -15,7 +16,7 @@ use Modules\Linksehat\Http\Controllers\Api\HospitalController; | is assigned the "api" middleware group. Enjoy building your API! | */ -Route::domain('api.linksehat.dev')->prefix('linksehat')->group(function () { +Route::prefix('linksehat')->group(function () { Route::post('otp-request', [AuthController::class, 'otpRequest']); Route::post('mock-otp', [AuthController::class, 'mockOtp']); @@ -33,7 +34,13 @@ Route::domain('api.linksehat.dev')->prefix('linksehat')->group(function () { Route::get('doctors/{id}', [DoctorController::class, 'show']); Route::get('doctors/{id}/schedule', [DoctorController::class, 'schedule']); - Route::middleware('auth:api')->get('/linksehat', function (Request $request) { - return $request->user(); + // Route::middleware('auth:api')->get('/linksehat', function (Request $request) { + // return $request->user(); + // }); + + + Route::middleware('auth:sanctum')->group(function () { + Route::get('profile', [ProfileController::class, 'index'])->name('profile'); + Route::post('profile', [ProfileController::class, 'update'])->name('profile.update'); }); }); \ No newline at end of file diff --git a/Modules/Linksehat/Transformers/UserProfileResource.php b/Modules/Linksehat/Transformers/UserProfileResource.php new file mode 100644 index 00000000..c5c5506f --- /dev/null +++ b/Modules/Linksehat/Transformers/UserProfileResource.php @@ -0,0 +1,36 @@ + $this->id, + 'email' => $this->email, + 'phone' => $this->phone, + 'email_verified_at' => $this->email_verified_at, + 'nik' => $this->person->nik ?? null, + 'name_prefix' => $this->person->name_prefix ?? null, + 'name' => $this->person->name ?? null, + 'name_suffix' => $this->person->name_suffix ?? null, + 'full_name' => $this->person->full_name ?? null, + 'gender' => $this->person->gender ?? null, + 'birth_date' => $this->person->birth_date ?? null, + 'age' => $this->person->age ?? null, + 'is_deceased' => $this->person->is_deceased ?? null, + 'deceased_at' => $this->person->deceased_at ?? null, + 'marital_status' => $this->person->marital_status ?? null, + 'preferred_lang' => $this->meta->preferred_lang ?? 'id', + ]; + } +} diff --git a/app/Models/Person.php b/app/Models/Person.php index 410ccdc3..ba495ab2 100644 --- a/app/Models/Person.php +++ b/app/Models/Person.php @@ -12,6 +12,7 @@ class Person extends Model protected $table = 'persons'; protected $fillable = [ + 'owner_user_id', 'nik', 'name_prefix', 'name', @@ -46,4 +47,9 @@ class Person extends Model { return $this->morphMany(Meta::class, 'metaable'); } + + public function owner() + { + return $this->belongsTo(User::class, 'owner_user_id'); + } } diff --git a/app/Models/User.php b/app/Models/User.php index e9041132..2b5fc328 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -18,12 +18,13 @@ class User extends Authenticatable * @var array */ protected $fillable = [ + 'person_id', 'name', 'email', 'password', 'phone', 'otp', - 'otp_created_at' + 'otp_created_at', ]; /** @@ -46,8 +47,32 @@ class User extends Authenticatable 'otp_created_at' => 'datetime' ]; + public $appends = [ + 'meta' + ]; + + public function getMetaAttribute() + { + $orgMeta = []; + foreach ($this->metas as $meta) { + $orgMeta[$meta->type] = $meta->value; + } + + return (object) $orgMeta; + } + public function managedCorporates() { return $this->belongsToMany(Corporate::class, 'corporate_manager', 'user_id', 'corporate_id'); } + + public function metas() + { + return $this->morphMany(Meta::class, 'metaable'); + } + + public function person() + { + return $this->belongsTo(Person::class, 'person_id'); + } } diff --git a/database/migrations/2022_09_20_014237_add_person_id_in_users_table.php b/database/migrations/2022_09_20_014237_add_person_id_in_users_table.php new file mode 100644 index 00000000..e6084721 --- /dev/null +++ b/database/migrations/2022_09_20_014237_add_person_id_in_users_table.php @@ -0,0 +1,40 @@ +foreignId('person_id')->nullable()->after('id'); + }); + + Schema::table('persons', function (Blueprint $table) { + $table->foreignId('owner_user_id')->nullable()->after('id'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn('person_id'); + }); + + Schema::table('persons', function (Blueprint $table) { + $table->dropColumn('owner_user_id'); + }); + } +};