311 lines
10 KiB
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);
|
|
}
|
|
}
|