dashboard-admin/app/Http/Controllers/Login/LoginController.php

269 lines
8.2 KiB
PHP

<?php
namespace App\Http\Controllers\Login;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use App\Models\User;
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Storage;
use thiagoalessio\TesseractOCR\TesseractOCR;
use Intervention\Image\ImageManagerStatic as Image;
use Illuminate\Support\Facades\Session;
use Laravolt\Indonesia\Models\City;
use Laravolt\Indonesia\Models\District;
use Laravolt\Indonesia\Models\Province;
use Laravolt\Indonesia\Models\Village;
use Ramsey\Uuid\Uuid;
class LoginController extends Controller
{
// /**
// * Create a new AuthController instance.
// *
// * @return void
// */
// public function __construct()
// {
// $this->middleware('auth:api', ['except' => ['login', 'authenticate', 'register', 'hai']]);
// }
public function login()
{
$provinces = Province::all();
$cities = City::all();
$districts = District::all();
$villages = Village::all();
return view('index');
}
/**
* Get a JWT via given credentials.
*
* @return \Illuminate\Http\JsonResponse
*/
public function authenticate(Request $request)
{
// dd($request);
$credentials = $request->validate([
'email' => ['required', 'email'],
'password' => ['required', 'min:8'],
]);
if (Auth::attempt($credentials)) {
if (Auth::user()->status == 'Finished') {
$request->session()->regenerate();
if (ucwords(Auth::user()->role) == 'Admin') {
// return redirect()->route('admin.index');
return redirect()->intended('admin');
} else {
return redirect()->intended('user');
}
} else {
Session::flash('message', 'Akun tidak ditemukan atau sedang dalam pengajuan');
return redirect()->back();
}
}
return redirect()
->back()
->withErrors([
'email' => 'Email dengan' . $credentials['email'] . ' tidak tersedia.',
])
->onlyInput('email');
}
/**
* Log the user out (Invalidate the token).
*
* @return \Illuminate\Http\JsonResponse
*/
public function logout(Request $request)
{
Auth::logout();
$request->session()->invalidate();
$request->session()->regenerateToken();
return redirect()->route('login');
}
public function register(Request $request)
{
// input
$nama_depan = $request->get('nama-depan');
$nama_belakang = $request->get('nama-belakang');
$tanggal_lahir = $request->get('tanggal-lahir');
$new_password = $request->get('new-password');
$nik = $request->get('nik');
$email = $request->get('email');
$nohp = $request->get('nohp');
$alamat = $request->get('alamat');
$foto_ktp = '';
$foto_wajah = '';
$persentase_kemiripan = '0%';
$gender = $request->get('gender');
$kode_kelurahan = $request->get('kode-kelurahan');
$ktpBase64 = $request->request->get('ktp');
$wajahBase64 = $request->request->get('wajah');
$validatedData['email_verified_at'] = now();
if ($ktpBase64 && $wajahBase64) {
// Konversi string Base64 ke file gambar
$ktpFile = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $ktpBase64));
$wajahFile = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $wajahBase64));
$foto_ktp = 'Foto-KTP-' . $nama_depan . '-' . $nama_belakang . '.jpg';
$foto_wajah = 'Foto-Wajah-' . $nama_depan . '-' . $nama_belakang . '.jpg';
file_put_contents(public_path('storage/foto-ktp/' . $foto_ktp), $ktpFile);
file_put_contents(public_path('storage/foto-wajah/' . $foto_wajah), $wajahFile);
}
//OCR
try {
$fotoKTP = public_path('storage/foto-ktp/' . $foto_ktp);
$image = Image::make($fotoKTP);
$image->greyscale(); // Convert to grayscale
$image->contrast(10); // Increase contrast, adjust the value as needed
$preprocessedfotoKTP = storage_path('preprocessed_image.jpg');
$image->save($preprocessedfotoKTP);
$result = (new TesseractOCR($preprocessedfotoKTP))->run();
// (5) Normalize
$lines = explode("\n", $result);
$nikOCR = '';
$nikInputan = $nik;
$namaInputan = $nama_depan.' '.$nama_belakang;
foreach ($lines as $line) {
// Mencari NIK
if (strpos($line, $nikInputan) !== false) {
$nikOCR = preg_replace('/[^0-9]/', '', $line);
}
// Mencari nama
if (strpos($line, $namaInputan) !== false) {
$namaOCR = trim(substr($line, strpos($line, ':') + 1));
}
}
//Selesai
$persentase_kemiripan = (similar_text($nikInputan, $nikOCR, $percent) + similar_text($namaOCR, $namaOCR, $percent))/2;
// $status = 'Progress';
// if (similar_text($nikInputan, $nikOCR, $percent) >= 70 && similar_text($namaOCR, $namaOCR, $percent) >= 70) {
// $status = 'Progress';
// } else {
// $status = 'Progress';
// }
} catch (\Exception $e) {
// $status = 'Progress';
}
//OCR
//Deteksi wajah belum
$password = Hash::make($new_password);
// return response()->json([
// 'status' => true,
// 'message' => Uuid::uuid4(),
// ]);
$result = User::create([
'id' => Uuid::uuid4(),
'nama_depan' => $nama_depan,
'nama_belakang' => $nama_belakang,
'tanggal_lahir' => $tanggal_lahir,
'email' => $email,
'email_verified_at' => now(),
'password' => $password,
'nohp' => $nohp,
'nik' => $nik,
'alamat' => $alamat,
'foto_ktp' => $foto_ktp,
'foto_wajah' => $foto_wajah,
'foto_profil' => null,
'persentase_kemiripan' => $persentase_kemiripan,
'gender' => $gender,
'kode_kelurahan' => $kode_kelurahan,
'remember_token' => Str::random(10),
]);
if ($result) {
return response()->json([
'status' => true,
'message' => 'Akun anda sudah terdaftar dan butuh verifikasi hingga maksimal 1 hari kerja',
]);
} else {
return response()->json([
'status' => false,
'message' => 'Akun anda gagal terdaftar. Coba lagi! ' + $result,
]);
}
}
public function statusAkun($email)
{
$result = User::where('email', $email)->get();
if ($result->isNotEmpty()) {
return response()->json([
'status' => true,
'message' => $result,
]);
} else {
return response()->json([
'status' => false,
'message' => $result,
]);
}
}
public function cariProvinsi()
{
$data = Province::where('name', 'LIKE', '%' . strtoupper(request('q')) . '%')->paginate(10);
return response()->json($data);
}
public function cariKota($code)
{
$data = City::where('province_code', $code)
->where('name', 'LIKE', '%' . strtoupper(request('q')) . '%')
->paginate(10);
return response()->json($data);
}
public function cariKecamatan($code)
{
$data = District::where('city_code', $code)
->where('name', 'LIKE', '%' . strtoupper(request('q')) . '%')
->paginate(10);
return response()->json($data);
}
public function cariKelurahan($code)
{
$data = Village::where('district_code', $code)
->where('name', 'LIKE', '%' . strtoupper(request('q')) . '%')
->paginate(10);
return response()->json($data);
}
}