Files
portal-api/app/Http/Controllers/Api/Admin/Employee/EmployeeController.php
T
2026-09-09 16:56:22 +07:00

169 lines
4.8 KiB
PHP

<?php
namespace App\Http\Controllers\Api\Admin\Employee;
use App\Http\Controllers\Controller;
use App\Http\Requests\EmployeeRequest;
use App\Repositories\Employee\EmployeeRepositoryInterface;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Spatie\Permission\Models\Role;
class EmployeeController extends Controller
{
public function __construct(
private readonly EmployeeRepositoryInterface $employeeRepository
) {}
public function index(Request $request): JsonResponse
{
$employees = $this->employeeRepository->filter($request->all());
return response()->json([
'error' => false,
'data' => $employees,
]);
}
public function store(EmployeeRequest $request): JsonResponse
{
$request->validated();
try {
DB::beginTransaction();
$employee = $this->employeeRepository->create([
'fullname' => $request->fullname,
'username' => $request->username,
'email' => $request->email,
'phone' => $request->phone,
'birthday' => $request->birthday,
'address' => $request->address,
'password' => Hash::make($request->password),
]);
$employee->syncRoles([$request->role]);
DB::commit();
return response()->json([
'error' => false,
'message' => 'Employee created successfully',
'data' => $employee->load('roles'),
], 201);
} catch (\Exception $e) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => $e->getMessage(),
], 500);
}
}
public function show(int $id): JsonResponse
{
$employee = $this->employeeRepository->find($id);
if (!$employee) {
return response()->json([
'error' => true,
'message' => "Can't find employee by ID #" . $id,
], 404);
}
return response()->json([
'error' => false,
'data' => $employee->load('roles'),
]);
}
public function update(int $id, EmployeeRequest $request): JsonResponse
{
$employee = $this->employeeRepository->find($id);
if (!$employee) {
return response()->json([
'error' => true,
'message' => "Can't find employee by ID #" . $id,
], 404);
}
$request->validated();
try {
DB::beginTransaction();
$data = [
'fullname' => $request->fullname,
'username' => $request->username,
'email' => $request->email,
'phone' => $request->phone,
'birthday' => $request->birthday,
'address' => $request->address,
];
if ($request->filled('password')) {
$data['password'] = Hash::make($request->password);
}
$this->employeeRepository->update($id, $data);
$employee->syncRoles([$request->role]);
DB::commit();
return response()->json([
'error' => false,
'message' => 'Employee updated successfully',
'data' => $this->employeeRepository->find($id)->load('roles'),
]);
} catch (\Exception $e) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => $e->getMessage(),
], 500);
}
}
public function destroy(int $id): JsonResponse
{
$employee = $this->employeeRepository->find($id);
if (!$employee) {
return response()->json([
'error' => true,
'message' => "Can't find employee by ID #" . $id,
], 404);
}
try {
DB::beginTransaction();
$this->employeeRepository->delete($id);
DB::commit();
return response()->json([
'error' => false,
'message' => 'Employee deleted successfully',
]);
} catch (\Exception $e) {
DB::rollBack();
return response()->json([
'error' => true,
'message' => $e->getMessage(),
], 500);
}
}
public function roles(): JsonResponse
{
$roles = Role::where('guard_name', 'admin')->get(['id', 'name']);
return response()->json([
'error' => false,
'data' => $roles,
]);
}
}