Skip to content

🏆 Final Challenge: āļĢāļ°āļšāļšāļˆāļ­āļ‡āļŦāđ‰āļ­āļ‡āļ›āļĢāļ°āļŠāļļāļĄ â€‹

āļĒāļīāļ™āļ”āļĩāļ”āđ‰āļ§āļĒāļ—āļĩāđˆāļ„āļļāļ“āđ€āļĢāļĩāļĒāļ™āļĢāļđāđ‰āđ€āļ™āļ·āđ‰āļ­āļŦāļēāđāļĨāļ°āļ—āļģ Workshop āļžāļ·āđ‰āļ™āļāļēāļ™āļ„āļĢāļšāđāļĨāđ‰āļ§! āļ•āļ­āļ™āļ™āļĩāđ‰āļ–āļķāļ‡āđ€āļ§āļĨāļēāļžāļīāļŠāļđāļˆāļ™āđŒāļāļĩāļĄāļ·āļ­āļ”āđ‰āļ§āļĒ "Final Project" āļ—āļĩāđˆāļ„āļļāļ“āļ•āđ‰āļ­āļ‡āļĨāļ‡āļĄāļ·āļ­āļ—āļģāđ€āļ­āļ‡ (āđ‚āļ”āļĒāļ”āļđāļ„āļđāđˆāļĄāļ·āļ­āđƒāļŦāđ‰āļ™āđ‰āļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”)

āđ‚āļˆāļ—āļĒāđŒ: āļŠāļĢāđ‰āļēāļ‡āļĢāļ°āļšāļš "Meeting Room Booking" (āļˆāļ­āļ‡āļŦāđ‰āļ­āļ‡āļ›āļĢāļ°āļŠāļļāļĄāļ­āļ­āļ™āđ„āļĨāļ™āđŒ)


ðŸŽŊ āļ„āļ§āļēāļĄāļ•āđ‰āļ­āļ‡āļāļēāļĢāļ‚āļ­āļ‡āļĢāļ°āļšāļš (Requirements) ​

1. Database Design (MySQL) ​

āļ•āđ‰āļ­āļ‡āļĄāļĩāļ•āļēāļĢāļēāļ‡āļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒāļ”āļąāļ‡āļ™āļĩāđ‰:

  • users: āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļœāļđāđ‰āđƒāļŠāđ‰āļ‡āļēāļ™ (id, name, email)
  • rooms: āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļŦāđ‰āļ­āļ‡āļ›āļĢāļ°āļŠāļļāļĄ (id, name, capacity, location)
  • bookings: āđ€āļāđ‡āļšāļ‚āđ‰āļ­āļĄāļđāļĨāļāļēāļĢāļˆāļ­āļ‡ (id, user_id, room_id, start_time, end_time, topic)

2. Backend API (Laravel) ​

āļŠāļĢāđ‰āļēāļ‡ API Endpoints āļ”āļąāļ‡āļ™āļĩāđ‰:

  • GET /api/rooms - āļ”āļđāļĢāļēāļĒāļāļēāļĢāļŦāđ‰āļ­āļ‡āļ›āļĢāļ°āļŠāļļāļĄāļ—āļąāđ‰āļ‡āļŦāļĄāļ”
  • GET /api/bookings - āļ”āļđāļ›āļĢāļ°āļ§āļąāļ•āļīāļāļēāļĢāļˆāļ­āļ‡āļ—āļąāđ‰āļ‡āļŦāļĄāļ”
  • POST /api/bookings - āļˆāļ­āļ‡āļŦāđ‰āļ­āļ‡āļ›āļĢāļ°āļŠāļļāļĄ (āļ•āđ‰āļ­āļ‡āļĢāļ°āļšāļļ user_id, room_id, āđ€āļ§āļĨāļē)
  • DELETE /api/bookings/{id} - āļĒāļāđ€āļĨāļīāļāļāļēāļĢāļˆāļ­āļ‡

Challenge Ideas (Option āđ€āļŠāļĢāļīāļĄ)

  • āļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāļˆāļ­āļ‡āļ‹āđ‰āļ­āļ™ (āļ–āđ‰āļēāđ€āļ§āļĨāļēāļ™āļąāđ‰āļ™āļŦāđ‰āļ­āļ‡āđ„āļĄāđˆāļ§āđˆāļēāļ‡ āļŦāđ‰āļēāļĄāđƒāļŦāđ‰āļˆāļ­āļ‡)
  • āļ„āđ‰āļ™āļŦāļēāļŦāđ‰āļ­āļ‡āļ§āđˆāļēāļ‡āļ•āļēāļĄāļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ—āļĩāđˆāļāļģāļŦāļ™āļ”

3. Frontend (React) ​

āļ—āļģāļŦāļ™āđ‰āļēāđ€āļ§āđ‡āļšāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 2 āļŦāļ™āđ‰āļē:

  1. Dashboard:
    • āđāļŠāļ”āļ‡āļĢāļēāļĒāļāļēāļĢāļŦāđ‰āļ­āļ‡āļ›āļĢāļ°āļŠāļļāļĄāļ—āļąāđ‰āļ‡āļŦāļĄāļ” (Card)
    • āđāļŠāļ”āļ‡āļ›āļāļīāļ—āļīāļ™āļŦāļĢāļ·āļ­āļĢāļēāļĒāļāļēāļĢāļāļēāļĢāļˆāļ­āļ‡āļ§āļąāļ™āļ™āļĩāđ‰
  2. Booking Form:
    • āđ€āļĨāļ·āļ­āļāļŦāđ‰āļ­āļ‡, āđ€āļĨāļ·āļ­āļāļœāļđāđ‰āļˆāļ­āļ‡ (Dropdown), āđ€āļĨāļ·āļ­āļāđ€āļ§āļĨāļē
    • āļāļ”āļ›āļļāđˆāļĄ "āļˆāļ­āļ‡āļ—āļąāļ™āļ—āļĩ" āđāļĨāđ‰āļ§āļŠāđˆāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ› Backend

📅 āļ‚āļąāđ‰āļ™āļ•āļ­āļ™āļāļēāļĢāļ—āļģāļ‡āļēāļ™āđāļ™āļ°āļ™āļģ ​

  1. āļ­āļ­āļāđāļšāļš Database: āļ§āļēāļ” ER Diagram āđƒāļ™āļāļĢāļ°āļ”āļēāļĐāļāđˆāļ­āļ™
  2. āļ‚āļķāđ‰āļ™āđ‚āļ„āļĢāļ‡ Laravel: āļŠāļĢāđ‰āļēāļ‡ Model, Migration, Controller, Route
  3. āļ—āļ”āļŠāļ­āļš API: āđƒāļŠāđ‰ Postman āļĒāļīāļ‡āļ—āļ”āļŠāļ­āļšāļ”āļđāļ§āđˆāļēāļšāļąāļ™āļ—āļķāļāļ‚āđ‰āļ­āļĄāļđāļĨāđ„āļ”āđ‰āļˆāļĢāļīāļ‡
  4. āļ‚āļķāđ‰āļ™āđ‚āļ„āļĢāļ‡ React: āļŠāļĢāđ‰āļēāļ‡ Component āđāļĨāļ°āļˆāļąāļ”āļŦāļ™āđ‰āļēāļ”āđ‰āļ§āļĒ CSS Framework āļ—āļĩāđˆāļŠāļ­āļš
  5. āđ€āļŠāļ·āđˆāļ­āļĄāļ•āđˆāļ­: āđƒāļŠāđ‰ fetch āļŦāļĢāļ·āļ­ axios āļ”āļķāļ‡āļ‚āđ‰āļ­āļĄāļđāļĨāļĄāļēāđāļŠāļ”āļ‡

ðŸ’Ą āđƒāļšāđ‰āđƒāļŦāđ‰āļ™āļīāļ”āļ™āļķāļ‡ (Hints) ​

Migration āļŠāļģāļŦāļĢāļąāļš bookings:

php
$table->foreignId('user_id')->constrained();
$table->foreignId('room_id')->constrained();
$table->dateTime('start_time');
$table->dateTime('end_time');
$table->string('topic');

Controller āļˆāļ­āļ‡āļŦāđ‰āļ­āļ‡:

php
public function store(Request $request) {
    // āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ§āđˆāļēāļŦāđ‰āļ­āļ‡āļ§āđˆāļēāļ‡āđ„āļŦāļĄ?
    $exists = Booking::where('room_id', $request->room_id)
        ->where('start_time', '<', $request->end_time)
        ->where('end_time', '>', $request->start_time)
        ->exists();

    if ($exists) {
        return response()->json(['error' => 'āļŦāđ‰āļ­āļ‡āđ„āļĄāđˆāļ§āđˆāļēāļ‡āđƒāļ™āļŠāđˆāļ§āļ‡āđ€āļ§āļĨāļēāļ™āļĩāđ‰'], 422);
    }

    return Booking::create($request->all());
}

āļ‚āļ­āđƒāļŦāđ‰āđ‚āļŠāļ„āļ”āļĩāļāļąāļšāļāļēāļĢāļ—āļģāđ‚āļ›āļĢāđ€āļˆāļāļ•āđŒāļŠāđˆāļ‡āļ—āđ‰āļēāļĒāļ„āļĢāļąāļš! 🚀