MIF_E31231302_WEBSITE/app/Http/Controllers/Api/ApiAuthController.php

311 lines
10 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\DB;
class ApiAuthController extends Controller
{
public function login(Request $request)
{
try {
$request->validate([
'nik' => 'required',
'password' => 'required'
]);
$user = User::where('nik', $request->nik)->first();
if ($user && Hash::check($request->password, $user->password)) {
$user->tokens()->delete();
$token = $user->createToken('auth_token')->plainTextToken;
$jkDisplay = "";
if ($user->jenis_kelamin == 'L') {
$jkDisplay = 'Laki-laki';
} elseif ($user->jenis_kelamin == 'P') {
$jkDisplay = 'Perempuan';
}
$isComplete = !empty($user->nama_lengkap) &&
!empty($user->email) &&
!empty($user->no_telp) &&
!empty($user->alamat) &&
!empty($user->jenis_kelamin) &&
!empty($user->nama_fasyankes);
return response()->json([
'success' => true,
'token' => $token,
'is_profile_complete' => $isComplete,
'user' => [
'id_user' => $user->id_user,
'nik' => $user->nik,
'role' => $user->role,
'nama_lengkap' => $user->nama_lengkap ?? "",
'email' => $user->email ?? "",
'no_telp' => $user->no_telp ?? "",
'alamat' => $user->alamat ?? "",
'tgl_lahir' => $user->tgl_lahir ?? "",
'jenis_kelamin' => $jkDisplay,
'nama_fasyankes' => $user->nama_fasyankes ?? "",
]
], 200);
}
return response()->json([
'success' => false,
'message' => 'NIK atau Password salah!'
], 401);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Error Server: ' . $e->getMessage()
], 500);
}
}
public function switchAccount(Request $request)
{
$request->validate(['nik' => 'required']);
$user = User::where('nik', $request->nik)->first();
if (!$user) {
return response()->json([
'success' => false,
'message' => 'Akun tidak ditemukan'
], 404);
}
$jkDisplay = "";
if ($user->jenis_kelamin == 'L') {
$jkDisplay = 'Laki-laki';
} elseif ($user->jenis_kelamin == 'P') {
$jkDisplay = 'Perempuan';
}
return response()->json([
'success' => true,
'message' => 'Akun valid',
'user' => [
'id_user' => $user->id_user,
'nik' => $user->nik,
'role' => $user->role,
'nama_lengkap' => $user->nama_lengkap ?? "",
'email' => $user->email ?? "",
'no_telp' => $user->no_telp ?? "",
'alamat' => $user->alamat ?? "",
'tgl_lahir' => $user->tgl_lahir ?? "",
'jenis_kelamin' => $jkDisplay,
'nama_fasyankes' => $user->nama_fasyankes ?? "",
]
], 200);
}
public function register(Request $request)
{
$request->validate([
'nik' => 'required|unique:users,nik|digits:16',
'email' => 'required|email',
'password' => 'required|min:8'
]);
try {
$isPasienMedis = DB::table('pasien_medis')
->join('users', 'pasien_medis.id_user', '=', 'users.id_user')
->where('users.nik', $request->nik)
->exists();
$assignedRole = $isPasienMedis ? 'pasien' : 'umum';
$user = User::create([
'nik' => $request->nik,
'password' => Hash::make($request->password),
'role' => $assignedRole,
'nama_lengkap' => "",
'email' => $request->email,
'no_telp' => "",
'alamat' => "",
'tgl_lahir' => '2000-01-01',
]);
return response()->json([
'success' => true,
'message' => 'Registrasi berhasil sebagai ' . $assignedRole . '! Silakan login.',
], 201);
} catch (\Exception $e) {
return response()->json([
'success' => false,
'message' => 'Gagal registrasi: ' . $e->getMessage()
], 500);
}
}
public function updateProfile(Request $request)
{
$request->validate([
'nik' => 'required',
'nama_lengkap' => 'required|string',
'email' => 'nullable|email',
'no_telp' => 'required',
'alamat' => 'required|string',
'tgl_lahir' => 'required',
'jenis_kelamin' => 'nullable',
'nama_fasyankes' => 'nullable',
'current_password' => 'nullable',
'password' => 'nullable|min:8',
]);
$user = User::where('nik', $request->nik)->first();
if ($user) {
$user->nama_lengkap = $request->nama_lengkap;
if ($request->filled('email')) {
$user->email = $request->email;
}
$user->no_telp = $request->no_telp;
$user->alamat = $request->alamat;
$user->tgl_lahir = $request->tgl_lahir;
// OTOMATIS KONVERSI SAAT SIMPAN: Laki-laki -> L, Perempuan -> P
if ($request->jenis_kelamin == 'Laki-laki') {
$user->jenis_kelamin = 'L';
} elseif ($request->jenis_kelamin == 'Perempuan') {
$user->jenis_kelamin = 'P';
} else {
$user->jenis_kelamin = $request->jenis_kelamin;
}
$user->nama_fasyankes = $request->nama_fasyankes;
if ($request->filled('password')) {
// VALIDASI PASSWORD SAAT INI
if (!$request->filled('current_password')) {
return response()->json([
'success' => false,
'message' => 'Password saat ini wajib diisi'
], 400);
}
// CEK PASSWORD LAMA
if (!Hash::check($request->current_password, $user->password)) {
return response()->json([
'success' => false,
'message' => 'Password saat ini salah'
], 400);
}
// SIMPAN PASSWORD BARU
$user->password = Hash::make($request->password);
}
$user->save();
$user->save();
$isComplete = !empty($user->nama_lengkap) &&
!empty($user->email) &&
!empty($user->no_telp) &&
!empty($user->alamat) &&
!empty($user->jenis_kelamin) &&
!empty($user->nama_fasyankes);
return response()->json([
'success' => true,
'message' => 'Profil berhasil diperbarui',
'user' => $user,
'is_profile_complete' => $isComplete
], 200);
}
return response()->json([
'success' => false,
'message' => 'User tidak ditemukan'
], 404);
}
public function getProfile(Request $request)
{
$nik = $request->query('nik');
$user = User::where('nik', $nik)->first();
if ($user) {
// Konversi L/P database ke teks lengkap untuk Flutter
$jkDisplay = "";
if ($user->jenis_kelamin == 'L') {
$jkDisplay = 'Laki-laki';
} elseif ($user->jenis_kelamin == 'P') {
$jkDisplay = 'Perempuan';
}
return response()->json([
'success' => true,
'user' => [
'id_user' => $user->id_user, // WAJIB ADA INI
'nik' => $user->nik,
'nama_lengkap' => $user->nama_lengkap ?? "",
'email' => $user->email ?? "",
'no_telp' => $user->no_telp ?? "",
'alamat' => $user->alamat ?? "",
'tgl_lahir' => $user->tgl_lahir ?? "",
'jenis_kelamin' => $jkDisplay,
'nama_fasyankes' => $user->nama_fasyankes ?? "",
'role' => $user->role ?? ""
]
], 200);
}
return response()->json([
'success' => false,
'message' => 'User tidak ditemukan'
], 404);
}
public function completeProfile(Request $request)
{
return $this->updateProfile($request);
}
public function forgotPassword(Request $request)
{
$request->validate([
'nik' => 'required',
// DIUBAH: no_telp menjadi email
'email' => 'required|email',
'tgl_lahir' => 'required',
'password' => 'required|min:8'
]);
$user = User::where('nik', $request->nik)
// DIUBAH: pencocokan berdasarkan email
->where('email', $request->email)
->where('tgl_lahir', $request->tgl_lahir)
->first();
if (!$user) {
return response()->json([
'success' => false,
'message' => 'Data tidak cocok.'
], 404);
}
$user->password = Hash::make($request->password);
$user->save();
return response()->json([
'success' => true,
'message' => 'Password berhasil diperbarui. Silakan login.'
], 200);
}
}