first commit

This commit is contained in:
ghassan committed 2025-12-11 07:38:56 +00:00
commit 83e28827a1
64 files changed
+11127

No files matched your search

@@ -0,0 +1,105 @@
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\Car;
use App\Models\ParkingRecord;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\DB;
class CarParkingController extends Controller
{
public function registerCar(Request $request) {
$data = $request->validate([
'plate_number' => 'required|string|max:20',
]);
$car = Car::where('plate_number', $data['plate_number'])->first();
if ($car) {
return response()->json(['message' => 'Car already registered', 'car' => $car], 200);
}
$car = Car::create($data);
return response()->json(['message' => 'Car registered successfully', 'car' => $car], 201);
}
public function registerEntry(Request $request) {
$data = $request->validate([
'plate_number' => 'required|string|exists:cars,plate_number',
]);
$car = Car::where('plate_number', $data['plate_number'])->first();
// Check if there is an active parking record (entry_time set but exit_time null)
$activeParking = ParkingRecord::where('car_id', $car->id)
->whereNull('exit_time')
->first();
if ($activeParking) {
return response()->json(['message' => 'Car already parked inside'], 400);
}
$parkingRecord = ParkingRecord::create([
'car_id' => $car->id,
'entry_time' => now(),
]);
return response()->json(['message' => 'Car entry registered', 'parking_record' => $parkingRecord], 201);
}
public function registerExit(Request $request) {
$data = $request->validate([
'plate_number' => 'required|string|exists:cars,plate_number',
]);
$car = Car::where('plate_number', $data['plate_number'])->first();
$activeParking = ParkingRecord::where('car_id', $car->id)
->whereNull('exit_time')
->first();
if (!$activeParking) {
return response()->json(['message' => 'Car is not currently parked inside'], 400);
}
$activeParking->exit_time = now();
$activeParking->save();
return response()->json(['message' => 'Car exit registered', 'parking_record' => $activeParking]);
}
public function countCurrentParking() {
$count = ParkingRecord::whereNull('exit_time')->count();
return response()->json(['current_parked_cars' => $count]);
}
public function getCarHistory(Request $request) {
$data = $request->validate([
'plate_number' => 'required|string|exists:cars,plate_number',
]);
$car = Car::where('plate_number', $data['plate_number'])->first();
$history = $car->parkingRecords()->orderBy('entry_time', 'desc')->get(['entry_time', 'exit_time']);
return response()->json([
'plate_number' => $car->plate_number,
'history' => $history
]);
}
}
+8
View File
@@ -0,0 +1,8 @@
<?php
namespace App\Http\Controllers;
abstract class Controller
{
//
}
+18
View File
@@ -0,0 +1,18 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Car extends Model
{
use HasFactory;
protected $fillable = ['plate_number'];
public function parkingRecords()
{
return $this->hasMany(ParkingRecord::class);
}
}
+20
View File
@@ -0,0 +1,20 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class ParkingRecord extends Model
{
use HasFactory;
protected $fillable = ['car_id', 'entry_time', 'exit_time'];
protected $dates = ['entry_time', 'exit_time'];
public function car()
{
return $this->belongsTo(Car::class);
}
}
+48
View File
@@ -0,0 +1,48 @@
<?php
namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
/** @use HasFactory<\Database\Factories\UserFactory> */
use HasFactory, Notifiable;
/**
* The attributes that are mass assignable.
*
* @var list<string>
*/
protected $fillable = [
'name',
'email',
'password',
];
/**
* The attributes that should be hidden for serialization.
*
* @var list<string>
*/
protected $hidden = [
'password',
'remember_token',
];
/**
* Get the attributes that should be cast.
*
* @return array<string, string>
*/
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
];
}
}
+24
View File
@@ -0,0 +1,24 @@
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
class AppServiceProvider extends ServiceProvider
{
/**
* Register any application services.
*/
public function register(): void
{
//
}
/**
* Bootstrap any application services.
*/
public function boot(): void
{
//
}
}