546 lines
18 KiB
PHP
546 lines
18 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\API;
|
|
|
|
use App\Helpers\ResponseFormatter;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Models\User;
|
|
use App\Models\Progress;
|
|
use Exception;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
use Illuminate\Support\Facades\Hash;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
class UserControler extends Controller
|
|
{
|
|
public function register(Request $request)
|
|
{
|
|
try {
|
|
$request->validate([
|
|
'nama_lengkap' => ['required', 'string', 'max:255'],
|
|
'alamat' => ['required', 'string', 'max:255'],
|
|
'tgl_lahir' => ['required', 'date'],
|
|
'nama_wali' => ['nullable', 'string', 'max:255'],
|
|
'no_telp_wali' => ['nullable', 'string', 'max:255'],
|
|
'peran' => ['required', 'in:santri,pengajar'],
|
|
'email' => ['required', 'string', 'email', 'max:255', 'unique:users'],
|
|
'password' => ['required', 'string', 'min:8'],
|
|
]);
|
|
|
|
$user = User::create([
|
|
'nama_lengkap' => $request->nama_lengkap,
|
|
'alamat' => $request->alamat,
|
|
'tgl_lahir' => $request->tgl_lahir,
|
|
'nama_wali' => $request->nama_wali,
|
|
'no_telp_wali' => $request->no_telp_wali,
|
|
'peran' => $request->peran,
|
|
'email' => $request->email,
|
|
'password' => Hash::make($request->password),
|
|
]);
|
|
|
|
$tokenResult = $user->createToken('authToken')->plainTextToken;
|
|
|
|
return ResponseFormatter::success([
|
|
'access_token' => $tokenResult,
|
|
'token_type' => 'Bearer',
|
|
'user' => $user,
|
|
], 'User Registered');
|
|
} catch (Exception $error) {
|
|
return ResponseFormatter::error([
|
|
'message' => 'Something went wrong',
|
|
'error' => $error->getMessage(),
|
|
], 'Authentication Failed', 500);
|
|
}
|
|
}
|
|
|
|
public function login(Request $request)
|
|
{
|
|
try {
|
|
$request->validate([
|
|
'email' => 'required|string',
|
|
'password' => 'required'
|
|
]);
|
|
|
|
$user = User::where('email', $request->email)->first();
|
|
|
|
if (!$user || !Hash::check($request->password, $user->password)) {
|
|
return ResponseFormatter::error([
|
|
'message' => 'email atau password salah'
|
|
], 'Authentication Failed', 401);
|
|
}
|
|
|
|
$tokenResult = $user->createToken('authToken')->plainTextToken;
|
|
|
|
return ResponseFormatter::success([
|
|
'access_token' => $tokenResult,
|
|
'token_type' => 'Bearer',
|
|
// 'user' => $user
|
|
'user' => [
|
|
'peran' => $user->peran // Pastikan 'status' ada di sini
|
|
]
|
|
], 'Authenticated');
|
|
} catch (Exception $error) {
|
|
return ResponseFormatter::error([
|
|
'message' => 'Something went wrong',
|
|
'error' => $error->getMessage()
|
|
], 'Authentication Failed', 500);
|
|
}
|
|
}
|
|
|
|
public function loginWithTelp(Request $request)
|
|
{
|
|
try {
|
|
$request->validate([
|
|
'no_telp_wali' => 'required|string', // Validate 'no_telp_wali'
|
|
'password' => 'required' // Validate password
|
|
]);
|
|
|
|
// Find the user by 'no_telp_wali'
|
|
$user = User::where('no_telp_wali', $request->no_telp_wali)->first();
|
|
|
|
// Check if the user exists
|
|
if (!$user) {
|
|
return ResponseFormatter::error([
|
|
'message' => 'No telepon salah'
|
|
], 'Authentication Failed', 401);
|
|
}
|
|
|
|
// Check if the password is correct
|
|
if (!Hash::check($request->password, $user->password)) {
|
|
return ResponseFormatter::error([
|
|
'message' => 'Password salah'
|
|
], 'Authentication Failed', 401);
|
|
}
|
|
|
|
// Create token for the user
|
|
$tokenResult = $user->createToken('authToken')->plainTextToken;
|
|
|
|
return ResponseFormatter::success([
|
|
'access_token' => $tokenResult,
|
|
'token_type' => 'Bearer',
|
|
'user' => [
|
|
'id' => $user->id,
|
|
'peran' => $user->peran // Ensure 'peran' is included here
|
|
]
|
|
], 'Authenticated');
|
|
} catch (Exception $error) {
|
|
return ResponseFormatter::error([
|
|
'message' => 'Something went wrong',
|
|
'error' => $error->getMessage()
|
|
], 'Authentication Failed', 500);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
public function fetch(Request $request)
|
|
{
|
|
return ResponseFormatter::success($request->user(), 'Data berhasil di ambil');
|
|
}
|
|
|
|
public function logout(Request $request)
|
|
{
|
|
$token = $request->user()->currentAccessToken()->delete();
|
|
|
|
return ResponseFormatter::success($token, 'Token Revoked');
|
|
}
|
|
|
|
public function getUsersByRole(Request $request)
|
|
{
|
|
try {
|
|
// Ambil data user yang memiliki peran 'santri' dan urutkan berdasarkan created_at secara descending
|
|
$users = User::where('peran', 'santri')
|
|
->orderBy('created_at', 'desc')
|
|
->get();
|
|
|
|
// Jika tidak ada user dengan peran 'santri'
|
|
if ($users->isEmpty()) {
|
|
return ResponseFormatter::error(
|
|
null,
|
|
"Tidak ada pengguna dengan peran santri",
|
|
404
|
|
);
|
|
}
|
|
|
|
// Mengembalikan data pengguna dengan peran 'santri'
|
|
return ResponseFormatter::success(
|
|
$users,
|
|
"Pengguna dengan peran santri berhasil ditemukan"
|
|
);
|
|
} catch (Exception $error) {
|
|
return ResponseFormatter::error(
|
|
['message' => 'Something went wrong', 'error' => $error->getMessage()],
|
|
'Terjadi kesalahan',
|
|
500
|
|
);
|
|
}
|
|
}
|
|
|
|
|
|
public function getUserInfoById($id)
|
|
{
|
|
// Mencari user berdasarkan ID
|
|
$user = User::find($id);
|
|
|
|
// Jika pengguna tidak ditemukan, kembalikan response error
|
|
if (!$user) {
|
|
return ResponseFormatter::error(
|
|
null,
|
|
'User not found',
|
|
404
|
|
);
|
|
}
|
|
|
|
// Mengembalikan data pengguna dalam format JSON menggunakan ResponseFormatter
|
|
return ResponseFormatter::success(
|
|
[
|
|
'id' => $user->id,
|
|
'nama_lengkap' => $user->nama_lengkap,
|
|
'alamat' => $user->alamat,
|
|
'usia' => $user->usia,
|
|
'no_telp_wali' => $user->no_telp_wali,
|
|
'email' => $user->email,
|
|
'jenis_kelamin' => $user->jenis_kelamin,
|
|
'jenjang_pendidikan' => $user->jenjang_pendidikan,
|
|
],
|
|
'User data retrieved successfully'
|
|
);
|
|
}
|
|
|
|
public function updateUserById(Request $request, $id)
|
|
{
|
|
// Validate the incoming data
|
|
$validator = Validator::make($request->all(), [
|
|
'nama_lengkap' => 'required|string|max:255',
|
|
'alamat' => 'required|string|max:255',
|
|
'usia' => 'required|string|max:255',
|
|
'no_telp_wali' => 'required|string|max:20',
|
|
'email' => 'required|email|max:255',
|
|
'jenjang_pendidikan' => 'required|string|max:255',
|
|
'jenis_kelamin' => 'required|string|in:Laki-laki,Perempuan',
|
|
]);
|
|
|
|
// If validation fails, return error response
|
|
if ($validator->fails()) {
|
|
return ResponseFormatter::error(
|
|
null,
|
|
'Validation Error',
|
|
422
|
|
);
|
|
}
|
|
|
|
// Find the user by ID
|
|
$user = User::find($id);
|
|
|
|
// If the user does not exist, return an error response
|
|
if (!$user) {
|
|
return ResponseFormatter::error(
|
|
null,
|
|
'User not found',
|
|
404
|
|
);
|
|
}
|
|
|
|
// Update the user's details
|
|
$user->nama_lengkap = $request->nama_lengkap;
|
|
$user->alamat = $request->alamat;
|
|
$user->usia = $request->usia;
|
|
$user->no_telp_wali = $request->no_telp_wali;
|
|
$user->email = $request->email;
|
|
$user->jenjang_pendidikan = $request->jenjang_pendidikan;
|
|
$user->jenis_kelamin = $request->jenis_kelamin;
|
|
|
|
// Save the updated user data
|
|
$user->save();
|
|
|
|
// Return success response
|
|
return ResponseFormatter::success(
|
|
$user,
|
|
'User updated successfully'
|
|
);
|
|
}
|
|
|
|
|
|
public function tambahSantri(Request $request)
|
|
{
|
|
// Validasi input
|
|
$validator = Validator::make($request->all(), [
|
|
'nama_lengkap' => 'required|string|max:255',
|
|
'alamat' => 'required|string|max:255',
|
|
'usia' => 'required|string|max:255',
|
|
'no_telp_wali' => 'required|string|max:20',
|
|
'email' => 'required|email|max:255',
|
|
'jenis_kelamin' => 'required|string|in:Laki-laki,Perempuan',
|
|
'jenjang_pendidikan' => 'required|string|max:255',
|
|
]);
|
|
|
|
// Jika validasi gagal
|
|
if ($validator->fails()) {
|
|
return ResponseFormatter::error(
|
|
null,
|
|
'Validation Error',
|
|
422
|
|
);
|
|
}
|
|
|
|
// Ambil data santri dari request
|
|
$santri = $request->only([
|
|
'nama_lengkap', 'alamat', 'usia', 'no_telp_wali', 'email', 'jenis_kelamin', 'jenjang_pendidikan'
|
|
]);
|
|
|
|
// Simpan santri ke database
|
|
$santriInserted = User::create([
|
|
'nama_lengkap' => $santri['nama_lengkap'],
|
|
'alamat' => $santri['alamat'],
|
|
'usia' => $santri['usia'],
|
|
'no_telp_wali' => $santri['no_telp_wali'],
|
|
'email' => $santri['email'],
|
|
'jenis_kelamin' => $santri['jenis_kelamin'],
|
|
'jenjang_pendidikan' => $santri['jenjang_pendidikan'],
|
|
'peran' => 'santri',
|
|
'password' => bcrypt($santri['email']), // password = email (dihash)
|
|
]);
|
|
|
|
// Respon sukses
|
|
return ResponseFormatter::success(
|
|
$santriInserted,
|
|
'Santri data imported successfully'
|
|
);
|
|
}
|
|
|
|
public function changePassword(Request $request)
|
|
{
|
|
// Validasi inputan password baru
|
|
$validator = Validator::make($request->all(), [
|
|
'new_password' => 'required|string|min:8|confirmed', // Pastikan password baru minimal 8 karakter dan dikonfirmasi
|
|
]);
|
|
|
|
// Jika validasi gagal
|
|
if ($validator->fails()) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => $validator->errors(),
|
|
], 400);
|
|
}
|
|
|
|
// Ambil user yang terautentikasi
|
|
$user = Auth::user();
|
|
|
|
// Update password pengguna secara manual
|
|
DB::table('users') // Gunakan query builder untuk update langsung
|
|
->where('id', $user->id) // Menentukan user berdasarkan ID
|
|
->update(['password' => Hash::make($request->new_password)]); // Enkripsi password baru dan simpan
|
|
|
|
return response()->json([
|
|
'status' => 'success',
|
|
'message' => 'Password berhasil diubah',
|
|
], 200);
|
|
}
|
|
|
|
public function getUserInfoByToken(Request $request)
|
|
{
|
|
// Mendapatkan pengguna yang terautentikasi
|
|
$user = Auth::user();
|
|
|
|
// Jika pengguna tidak ditemukan (misalnya, token tidak valid)
|
|
if (!$user) {
|
|
return ResponseFormatter::error(
|
|
null,
|
|
'User not found',
|
|
404
|
|
);
|
|
}
|
|
|
|
// Mengembalikan data pengguna dalam format JSON menggunakan ResponseFormatter
|
|
return ResponseFormatter::success(
|
|
[
|
|
'id' => $user->id,
|
|
'nama_lengkap' => $user->nama_lengkap,
|
|
'alamat' => $user->alamat,
|
|
'usia' => $user->usia,
|
|
'no_telp_wali' => $user->no_telp_wali,
|
|
'email' => $user->email,
|
|
'jenis_kelamin' => $user->jenis_kelamin,
|
|
'jenjang_pendidikan' => $user->jenjang_pendidikan,
|
|
],
|
|
'User data retrieved successfully'
|
|
);
|
|
}
|
|
|
|
public function updateUserByToken(Request $request)
|
|
{
|
|
// Validasi data yang diterima
|
|
$validator = Validator::make($request->all(), [
|
|
'nama_lengkap' => 'required|string|max:255',
|
|
'alamat' => 'required|string|max:255',
|
|
'usia' => 'required|string|max:255',
|
|
'no_telp_wali' => 'required|string|max:20',
|
|
'email' => 'required|email|max:255',
|
|
'jenjang_pendidikan' => 'required|string|max:255',
|
|
'jenis_kelamin' => 'required|string|in:Laki-laki,Perempuan',
|
|
]);
|
|
|
|
// Jika validasi gagal, kembalikan respons error
|
|
if ($validator->fails()) {
|
|
return ResponseFormatter::error(
|
|
null,
|
|
'Validation Error',
|
|
422
|
|
);
|
|
}
|
|
|
|
// Mendapatkan pengguna yang terautentikasi
|
|
$user = Auth::user();
|
|
|
|
// Jika pengguna tidak ditemukan (misalnya, token tidak valid)
|
|
if (!$user) {
|
|
return ResponseFormatter::error(
|
|
null,
|
|
'User not found',
|
|
404
|
|
);
|
|
}
|
|
|
|
// Menggunakan DB::table untuk memperbarui data pengguna secara manual
|
|
DB::table('users')
|
|
->where('id', $user->id)
|
|
->update([
|
|
'nama_lengkap' => $request->nama_lengkap,
|
|
'alamat' => $request->alamat,
|
|
'usia' => $request->usia,
|
|
'no_telp_wali' => $request->no_telp_wali,
|
|
'email' => $request->email,
|
|
'jenjang_pendidikan' => $request->jenjang_pendidikan,
|
|
'jenis_kelamin' => $request->jenis_kelamin,
|
|
]);
|
|
|
|
// Mengembalikan respons sukses
|
|
return ResponseFormatter::success(
|
|
null,
|
|
'User updated successfully'
|
|
);
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function importSantri(Request $request)
|
|
{
|
|
// Validasi input
|
|
$validator = Validator::make($request->all(), [
|
|
'santri' => 'required|array',
|
|
'santri.*.nama_lengkap' => 'required|string|max:255',
|
|
'santri.*.alamat' => 'required|string|max:255',
|
|
'santri.*.usia' => 'required|string|max:255',
|
|
'santri.*.no_telp_wali' => 'required|string|max:20',
|
|
'santri.*.email' => 'required|email|max:255',
|
|
'santri.*.jenis_kelamin' => 'required|string|in:Laki-laki,Perempuan',
|
|
'santri.*.jenjang_pendidikan' => 'required|string|max:255',
|
|
]);
|
|
|
|
// Jika validasi gagal
|
|
if ($validator->fails()) {
|
|
return ResponseFormatter::error(
|
|
null,
|
|
'Validation Error',
|
|
422
|
|
);
|
|
}
|
|
|
|
// Ambil data santri dari request
|
|
$santriData = $request->input('santri');
|
|
$santriInserted = [];
|
|
|
|
// Simpan tiap santri ke database
|
|
foreach ($santriData as $santri) {
|
|
$santriInserted[] = User::create([
|
|
'nama_lengkap' => $santri['nama_lengkap'],
|
|
'alamat' => $santri['alamat'],
|
|
'usia' => $santri['usia'],
|
|
'no_telp_wali' => $santri['no_telp_wali'],
|
|
'email' => $santri['email'],
|
|
'jenis_kelamin' => $santri['jenis_kelamin'],
|
|
'jenjang_pendidikan' => $santri['jenjang_pendidikan'],
|
|
'peran' => 'santri',
|
|
'password' => bcrypt('almuhajirin'), // password = email (dihash)
|
|
]);
|
|
}
|
|
|
|
// Respon sukses
|
|
return ResponseFormatter::success(
|
|
$santriInserted,
|
|
'Santri data imported successfully'
|
|
);
|
|
}
|
|
|
|
public function getUserProgres(Request $request)
|
|
{
|
|
try {
|
|
// Ambil semua user dengan peran 'santri'
|
|
$santriUsers = User::where('peran', 'santri')->get(); // Ambil semua user dengan peran 'santri'
|
|
|
|
// Jika tidak ada santri
|
|
if ($santriUsers->isEmpty()) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Tidak ada santri yang ditemukan.',
|
|
], 404); // Status code 404 (Not Found)
|
|
}
|
|
|
|
// Ambil progres untuk setiap santri dan filter yang sudah menyelesaikan submateri
|
|
$santriProgressData = $santriUsers->map(function ($santri) {
|
|
// Ambil progres latihan yang telah diselesaikan oleh santri berdasarkan user ID
|
|
$progresData = Progress::where('user_id', $santri->id)
|
|
->where('status', 'selesai') // Menghitung submateri yang sudah selesai
|
|
->with('submateri') // Load data submateri yang terkait
|
|
->orderBy('updated_at', 'desc') // Ambil yang terakhir berdasarkan updated_at
|
|
->first(); // Ambil hanya satu data yang terbaru (progres terakhir)
|
|
|
|
// Cek jika progres ada dan sudah selesai
|
|
if ($progresData) {
|
|
return [
|
|
'user_id' => $santri->id,
|
|
'nama_lengkap' => $santri->nama_lengkap,
|
|
'no_telp_wali' => $santri->no_telp_wali,
|
|
'completed_submateri' => 1, // Hanya tampilkan yang sudah selesai
|
|
'status' => $progresData->status,
|
|
'nilai' => $progresData->nilai,
|
|
'updated_at' => $progresData->updated_at,
|
|
];
|
|
}
|
|
})->filter(function ($santri) {
|
|
return $santri !== null; // Filter out santri yang tidak ada progres yang selesai
|
|
});
|
|
|
|
// Jika tidak ada santri yang menyelesaikan submateri
|
|
if ($santriProgressData->isEmpty()) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Tidak ada santri yang telah menyelesaikan submateri.',
|
|
], 404); // Status code 404 (Not Found)
|
|
}
|
|
|
|
// Kirim data progres untuk setiap santri yang sudah selesai latihan
|
|
return response()->json([
|
|
'status' => 'success',
|
|
'data' => $santriProgressData, // Mengembalikan data progres yang telah diselesaikan
|
|
], 200);
|
|
|
|
} catch (\Exception $e) {
|
|
return response()->json([
|
|
'status' => 'error',
|
|
'message' => 'Something went wrong: ' . $e->getMessage(),
|
|
], 500);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|