Kumpulan perubahan yang udah numpuk di working tree: refactor Setup (Gate/Vehicle/Member), rapihin memberin & stiker, service parking baru (ParkingUtilsServices, NetworkService), model/migration lot-parking & DHCP reservation, dan fitur baru Intercom (controller/model/migration/ view). ReportTransaksiController versi lokal ini WIP (~90%, masih didebug) - versi yang bener ada di server, jadi dikeluarin dari git (ditambahin ke .gitignore) biar gak numpuk nindihin punya server pas git pull di sana. Sekalian keluarin dump mentah tabel softseting (1.8MB, nyasar ke-commit), file .bak, dan arsip ad-hoc (api.tgz, c.zip) yang emang bukan source code. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01EAJc2mrpj2cSTe4oowLPzQ
186 lines
5.1 KiB
PHP
186 lines
5.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Parking\Setup\Gate;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Services\Parking\NetworkService;
|
|
use App\Models\ConfigPosNetwork;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
class MasterConfigNetworkController extends Controller
|
|
{
|
|
public function index(NetworkService $dhcp)
|
|
{
|
|
$reservations = ConfigPosNetwork::orderBy("hostname")->get();
|
|
|
|
$dhcpStatus = $dhcp->status();
|
|
|
|
return view("setup.index", compact("reservations", "dhcpStatus"));
|
|
}
|
|
|
|
public function status(NetworkService $dhcp)
|
|
{
|
|
return response()->json($dhcp->status());
|
|
}
|
|
|
|
public function store(Request $request)
|
|
{
|
|
$data = $request->validate([
|
|
"hostname" => ["required", "string", "max:100", 'regex:/^[a-zA-Z0-9_-]+$/'],
|
|
|
|
"mac_address" => ["required", "string", 'regex:/^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$/'],
|
|
|
|
"ip_address" => ["required", "ip"],
|
|
|
|
"enabled" => ["nullable", "boolean"],
|
|
]);
|
|
|
|
$data["mac_address"] = strtoupper($data["mac_address"]);
|
|
|
|
$data["enabled"] = $request->boolean("enabled");
|
|
|
|
// Cek duplicate MAC
|
|
if (ConfigPosNetwork::where("mac_address", $data["mac_address"])->exists()) {
|
|
return response()->json(
|
|
[
|
|
"success" => false,
|
|
"message" => "MAC address already registered.",
|
|
],
|
|
422,
|
|
);
|
|
}
|
|
|
|
// Cek duplicate IP
|
|
if (ConfigPosNetwork::where("ip_address", $data["ip_address"])->exists()) {
|
|
return response()->json(
|
|
[
|
|
"success" => false,
|
|
"message" => "IP address already registered.",
|
|
],
|
|
422,
|
|
);
|
|
}
|
|
|
|
$reservation = ConfigPosNetwork::create($data);
|
|
|
|
return response()->json(
|
|
[
|
|
"success" => true,
|
|
"message" => "DHCP reservation created successfully.",
|
|
"data" => $reservation,
|
|
],
|
|
201,
|
|
);
|
|
}
|
|
|
|
public function update(Request $request, ConfigPosNetwork $reservation)
|
|
{
|
|
$data = $request->validate([
|
|
"hostname" => ["required", "string", "max:100", 'regex:/^[a-zA-Z0-9_-]+$/'],
|
|
|
|
"mac_address" => ["required", "string", 'regex:/^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$/'],
|
|
|
|
"ip_address" => ["required", "ip"],
|
|
|
|
"enabled" => ["nullable", "boolean"],
|
|
]);
|
|
|
|
$data["mac_address"] = strtoupper($data["mac_address"]);
|
|
|
|
$data["enabled"] = $request->boolean("enabled");
|
|
|
|
// Cek duplicate MAC,
|
|
// kecuali reservation yang sedang diedit
|
|
if (
|
|
ConfigPosNetwork::where("mac_address", $data["mac_address"])->where("id", "!=", $reservation->id)->exists()
|
|
) {
|
|
return response()->json(
|
|
[
|
|
"success" => false,
|
|
"message" => "MAC address already registered.",
|
|
],
|
|
422,
|
|
);
|
|
}
|
|
|
|
// Cek duplicate IP
|
|
if (ConfigPosNetwork::where("ip_address", $data["ip_address"])->where("id", "!=", $reservation->id)->exists()) {
|
|
return response()->json(
|
|
[
|
|
"success" => false,
|
|
"message" => "IP address already registered.",
|
|
],
|
|
422,
|
|
);
|
|
}
|
|
|
|
$reservation->update($data);
|
|
|
|
return response()->json([
|
|
"success" => true,
|
|
"message" => "DHCP reservation updated successfully.",
|
|
"data" => $reservation->fresh(),
|
|
]);
|
|
}
|
|
|
|
public function destroy(ConfigPosNetwork $reservation)
|
|
{
|
|
$reservation->delete();
|
|
|
|
return response()->json([
|
|
"success" => true,
|
|
"message" => "Reservation deleted successfully.",
|
|
]);
|
|
}
|
|
|
|
public function test(NetworkService $dhcp)
|
|
{
|
|
try {
|
|
$result = $dhcp->test();
|
|
|
|
return response()->json([
|
|
"success" => true,
|
|
"message" => "DHCP configuration is valid.",
|
|
"data" => $result,
|
|
]);
|
|
} catch (\Throwable $e) {
|
|
return response()->json(
|
|
[
|
|
"success" => false,
|
|
"message" => $e->getMessage(),
|
|
],
|
|
422,
|
|
);
|
|
}
|
|
}
|
|
|
|
public function apply(NetworkService $dhcp)
|
|
{
|
|
try {
|
|
$dhcp->apply();
|
|
|
|
return response()->json([
|
|
"success" => true,
|
|
"message" => "DHCP configuration applied successfully.",
|
|
]);
|
|
} catch (\Throwable $e) {
|
|
return response()->json(
|
|
[
|
|
"success" => false,
|
|
"message" => $e->getMessage(),
|
|
],
|
|
500,
|
|
);
|
|
}
|
|
}
|
|
|
|
public function logs(NetworkService $dhcp)
|
|
{
|
|
return response()->json([
|
|
"success" => true,
|
|
"logs" => $dhcp->logs(30),
|
|
]);
|
|
}
|
|
}
|