diff --git a/lib/rent_cars/rentals.ex b/lib/rent_cars/rentals.ex index 969e652..db99d81 100644 --- a/lib/rent_cars/rentals.ex +++ b/lib/rent_cars/rentals.ex @@ -1,5 +1,8 @@ defmodule RentCars.Rentals do + import Ecto.Query alias __MODULE__.CreateRental + alias RentCars.Rentals.Rental + alias RentCars.Repo def create(payload) do %{ @@ -10,4 +13,11 @@ defmodule RentCars.Rentals do CreateRental.execute(car_id, expected_return_date, user_id) end + + def list_rentals(user_id) do + Rental + |> where([r], r.user_id == ^user_id) + |> preload(:car) + |> Repo.all() + end end diff --git a/lib/rent_cars_web/controllers/api/rental_controller.ex b/lib/rent_cars_web/controllers/api/rental_controller.ex index b422c6b..47f31f5 100644 --- a/lib/rent_cars_web/controllers/api/rental_controller.ex +++ b/lib/rent_cars_web/controllers/api/rental_controller.ex @@ -13,4 +13,12 @@ defmodule RentCarsWeb.Api.RentalController do |> render(:show, rental: rental) end end + + def index(conn, _params) do + [user_id] = get_req_header(conn, "user_id") + rentals = Rentals.list_rentals(user_id) + + conn + |> render(:index, rentals: rentals) + end end diff --git a/lib/rent_cars_web/controllers/api/rental_json.ex b/lib/rent_cars_web/controllers/api/rental_json.ex index 0de6706..914c982 100644 --- a/lib/rent_cars_web/controllers/api/rental_json.ex +++ b/lib/rent_cars_web/controllers/api/rental_json.ex @@ -16,6 +16,12 @@ defmodule RentCarsWeb.Api.RentalJSON do %{data: data(rental)} end + def index(%{rentals: rentals}) do + %{ + data: Enum.map(rentals, &data/1) + } + end + def data(%Rental{} = rental) do %{ id: rental.id, diff --git a/lib/rent_cars_web/router.ex b/lib/rent_cars_web/router.ex index 4ab45a8..795a2d9 100644 --- a/lib/rent_cars_web/router.ex +++ b/lib/rent_cars_web/router.ex @@ -49,7 +49,9 @@ defmodule RentCarsWeb.Router do pipe_through :authenticated post "/session/me", SessionController, :me get "/users/:id", UserController, :show + post "/rentals", RentalController, :create + get "/rentals", RentalController, :index end post "/users", UserController, :create diff --git a/test/rent_cars_web/controllers/api/rental_controller_test.exs b/test/rent_cars_web/controllers/api/rental_controller_test.exs index 06c05ec..d35058d 100644 --- a/test/rent_cars_web/controllers/api/rental_controller_test.exs +++ b/test/rent_cars_web/controllers/api/rental_controller_test.exs @@ -1,11 +1,12 @@ defmodule RentCarsWeb.Api.RentalControllerTest do use RentCarsWeb.ConnCase import RentCars.CarsFixtures + import RentCars.RentalsFixtures - describe "handle with sessions" do + describe "rentals test" do setup :include_normal_user_token - test "create session", %{conn: conn} do + test "rent a car", %{conn: conn} do car = car_fixture() payload = %{ @@ -17,6 +18,19 @@ defmodule RentCarsWeb.Api.RentalControllerTest do assert json_response(conn, 201)["data"]["car"]["id"] == car.id end + + test "list all cars booked", %{conn: conn, user: user} do + car = car_fixture() + rental_fixture(%{user_id: user.id, car_id: car.id}) + + conn = get(conn, Routes.api_rental_path(conn, :index)) + + car_id = car.id + + assert %{ + "car" => %{"data" => %{"id" => ^car_id}} + } = json_response(conn, 200)["data"] |> hd() + end end defp create_expected_return_date do