From b59f5971fe3765cbc8316a5294f78723145bb569 Mon Sep 17 00:00:00 2001 From: Udi h Bauman Date: Fri, 23 Sep 2022 11:16:44 +0530 Subject: [PATCH 1/7] WIP entering specific flr --- bldg_server/lib/bldg_server/residents.ex | 6 +++++- .../bldg_server_web/controllers/resident_controller.ex | 9 +++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/bldg_server/lib/bldg_server/residents.ex b/bldg_server/lib/bldg_server/residents.ex index 39c8b3e..8195124 100644 --- a/bldg_server/lib/bldg_server/residents.ex +++ b/bldg_server/lib/bldg_server/residents.ex @@ -187,8 +187,12 @@ defmodule BldgServer.Residents do end def enter_bldg(%Resident{} = resident, address, bldg_url) do + enter_bldg(resident, address, bldg_url, "l0") + end + + def enter_bldg(%Resident{} = resident, address, bldg_url, flr) do {initial_x, initial_y} = {8, 40} # TODO read from config, per bldg type - changes = %{flr: "#{address}/l0", flr_url: "#{bldg_url}/l0", location: "#{address}/l0/b(#{initial_x},#{initial_y})", x: initial_x, y: initial_y} + changes = %{flr: "#{address}/#{flr}", flr_url: "#{bldg_url}/#{flr}", location: "#{address}/#{flr}/b(#{initial_x},#{initial_y})", x: initial_x, y: initial_y} update_resident(resident, changes) end diff --git a/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex b/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex index 9b679e3..7de12eb 100644 --- a/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex +++ b/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex @@ -156,12 +156,17 @@ defmodule BldgServerWeb.ResidentController do end end - # ENTER_BLDG action + # ENTER_BLDG action - without flr (defaulting to l0) def act(conn, %{"resident_email" => email, "action_type" => "ENTER_BLDG", "bldg_address" => address, "bldg_url" => bldg_url}) do + act(conn, %{"resident_email" => email, "action_type" => "ENTER_BLDG", "bldg_address" => address, "bldg_url" => bldg_url, "flr" => "l0"}) + end + + # ENTER_BLDG action + def act(conn, %{"resident_email" => email, "action_type" => "ENTER_BLDG", "bldg_address" => address, "bldg_url" => bldg_url, "flr" => flr}) do resident = Residents.get_resident_by_email!(email) # TODO validate that the resident is authorized to enter the given bldg - with {:ok, %Resident{} = upd_rsdt} <- Residents.enter_bldg(resident, address, bldg_url) do + with {:ok, %Resident{} = upd_rsdt} <- Residents.enter_bldg(resident, address, bldg_url, flr) do conn |> put_status(:ok) |> put_resp_header("location", Routes.resident_path(conn, :show, upd_rsdt)) From 70b37a1d2bcc55c541649b24263fe3d02fa5dc8b Mon Sep 17 00:00:00 2001 From: Udi h Bauman Date: Fri, 23 Sep 2022 12:36:01 +0530 Subject: [PATCH 2/7] removed the option to enter bldg without flr - need to figure out how to overload method --- bldg_server/lib/bldg_server/residents.ex | 4 ---- .../lib/bldg_server_web/controllers/resident_controller.ex | 5 ----- 2 files changed, 9 deletions(-) diff --git a/bldg_server/lib/bldg_server/residents.ex b/bldg_server/lib/bldg_server/residents.ex index 8195124..08782ed 100644 --- a/bldg_server/lib/bldg_server/residents.ex +++ b/bldg_server/lib/bldg_server/residents.ex @@ -186,10 +186,6 @@ defmodule BldgServer.Residents do update_resident(resident, changes) end - def enter_bldg(%Resident{} = resident, address, bldg_url) do - enter_bldg(resident, address, bldg_url, "l0") - end - def enter_bldg(%Resident{} = resident, address, bldg_url, flr) do {initial_x, initial_y} = {8, 40} # TODO read from config, per bldg type changes = %{flr: "#{address}/#{flr}", flr_url: "#{bldg_url}/#{flr}", location: "#{address}/#{flr}/b(#{initial_x},#{initial_y})", x: initial_x, y: initial_y} diff --git a/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex b/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex index 7de12eb..84634b9 100644 --- a/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex +++ b/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex @@ -156,11 +156,6 @@ defmodule BldgServerWeb.ResidentController do end end - # ENTER_BLDG action - without flr (defaulting to l0) - def act(conn, %{"resident_email" => email, "action_type" => "ENTER_BLDG", "bldg_address" => address, "bldg_url" => bldg_url}) do - act(conn, %{"resident_email" => email, "action_type" => "ENTER_BLDG", "bldg_address" => address, "bldg_url" => bldg_url, "flr" => "l0"}) - end - # ENTER_BLDG action def act(conn, %{"resident_email" => email, "action_type" => "ENTER_BLDG", "bldg_address" => address, "bldg_url" => bldg_url, "flr" => flr}) do resident = Residents.get_resident_by_email!(email) From 6b3d52f9d79a1d8646dde9c9ce91fcde3bf2644e Mon Sep 17 00:00:00 2001 From: Udi h Bauman Date: Fri, 23 Sep 2022 14:00:31 +0530 Subject: [PATCH 3/7] added nesting depth to resident as well --- bldg_server/lib/bldg_server/buildings.ex | 16 ++++++++++------ bldg_server/lib/bldg_server/residents.ex | 18 ++++++++++++++++-- .../lib/bldg_server/residents/resident.ex | 3 ++- .../controllers/resident_controller.ex | 4 ++++ .../lib/bldg_server_web/views/resident_view.ex | 1 + 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/bldg_server/lib/bldg_server/buildings.ex b/bldg_server/lib/bldg_server/buildings.ex index 0a77ae1..52a08f2 100644 --- a/bldg_server/lib/bldg_server/buildings.ex +++ b/bldg_server/lib/bldg_server/buildings.ex @@ -317,17 +317,21 @@ Given an entity: end - def calculate_nesting_depth(entity) do - num_slashes = Map.get(entity, "address") + def calculate_nesting_depth(address) do + num_slashes = address |> String.split(address_delimiter) - |> Enum.drop(1) |> length() - depth = case num_slashes do + |> Enum.drop(1) + |> length() + case num_slashes do 0 -> 0 _ -> trunc((num_slashes + 1) / 2) end - Map.put(entity, "nesting_depth", depth) end + def set_nesting_depth(entity) do + depth = calculate_nesting_depth(Map.get(entity, "address")) + Map.put(entity, "nesting_depth", depth) + end def remove_build_params(entity) do Map.delete(entity, "container_web_url") @@ -364,7 +368,7 @@ Given an entity: |> figure_out_flr() |> figure_out_bldg_url() |> decide_on_location() - |> calculate_nesting_depth() + |> set_nesting_depth() |> remove_build_params() end diff --git a/bldg_server/lib/bldg_server/residents.ex b/bldg_server/lib/bldg_server/residents.ex index 08782ed..0ce65c4 100644 --- a/bldg_server/lib/bldg_server/residents.ex +++ b/bldg_server/lib/bldg_server/residents.ex @@ -188,7 +188,14 @@ defmodule BldgServer.Residents do def enter_bldg(%Resident{} = resident, address, bldg_url, flr) do {initial_x, initial_y} = {8, 40} # TODO read from config, per bldg type - changes = %{flr: "#{address}/#{flr}", flr_url: "#{bldg_url}/#{flr}", location: "#{address}/#{flr}/b(#{initial_x},#{initial_y})", x: initial_x, y: initial_y} + changes = %{ + flr: "#{address}/#{flr}", + flr_url: "#{bldg_url}/#{flr}", + location: "#{address}/#{flr}/b(#{initial_x},#{initial_y})", + x: initial_x, + y: initial_y, + nesting_depth: Buildings.calculate_nesting_depth(address) + } update_resident(resident, changes) end @@ -202,7 +209,14 @@ defmodule BldgServer.Residents do new_x = x new_y = y + 6 - changes = %{flr: container_flr, flr_url: container_flr_url, location: "#{container_flr}/b(#{new_x},#{new_y})", x: new_x, y: new_y} + changes = %{ + flr: container_flr, + flr_url: container_flr_url, + location: "#{container_flr}/b(#{new_x},#{new_y})", + x: new_x, + y: new_y, + nesting_depth: Buildings.calculate_nesting_depth(container_flr) + } update_resident(resident, changes) end diff --git a/bldg_server/lib/bldg_server/residents/resident.ex b/bldg_server/lib/bldg_server/residents/resident.ex index 50f3eaf..8f278ad 100644 --- a/bldg_server/lib/bldg_server/residents/resident.ex +++ b/bldg_server/lib/bldg_server/residents/resident.ex @@ -18,6 +18,7 @@ defmodule BldgServer.Residents.Resident do field :x, :integer field :y, :integer field :flr_url, :string + field :nesting_depth, :integer timestamps() end @@ -25,7 +26,7 @@ defmodule BldgServer.Residents.Resident do @doc false def changeset(resident, attrs) do resident - |> cast(attrs, [:email, :alias, :name, :home_bldg, :is_online, :location, :direction, :previous_messages, :other_attributes, :session_id, :last_login_at, :flr, :flr_url, :x, :y]) + |> cast(attrs, [:email, :alias, :name, :home_bldg, :is_online, :location, :direction, :previous_messages, :other_attributes, :session_id, :last_login_at, :flr, :flr_url, :x, :y, :nesting_depth]) |> validate_required([:email, :alias, :name, :home_bldg]) |> unique_constraint(:email) end diff --git a/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex b/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex index 84634b9..1cf365f 100644 --- a/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex +++ b/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex @@ -162,6 +162,8 @@ defmodule BldgServerWeb.ResidentController do # TODO validate that the resident is authorized to enter the given bldg with {:ok, %Resident{} = upd_rsdt} <- Residents.enter_bldg(resident, address, bldg_url, flr) do + IO.puts("~~~~~~~~~~~ enter bldg done, resident returned:") + IO.inspect(upd_rsdt) conn |> put_status(:ok) |> put_resp_header("location", Routes.resident_path(conn, :show, upd_rsdt)) @@ -175,6 +177,8 @@ defmodule BldgServerWeb.ResidentController do # TODO validate that the resident is authorized to enter the container bldg (although if not, are they essentially locked?) with {:ok, %Resident{} = upd_rsdt} <- Residents.exit_bldg(resident, address, bldg_url) do + IO.puts("~~~~~~~~~~~ exit bldg done, resident returned:") + IO.inspect(upd_rsdt) conn |> put_status(:ok) |> put_resp_header("location", Routes.resident_path(conn, :show, upd_rsdt)) diff --git a/bldg_server/lib/bldg_server_web/views/resident_view.ex b/bldg_server/lib/bldg_server_web/views/resident_view.ex index f660a59..7cce343 100644 --- a/bldg_server/lib/bldg_server_web/views/resident_view.ex +++ b/bldg_server/lib/bldg_server_web/views/resident_view.ex @@ -24,6 +24,7 @@ defmodule BldgServerWeb.ResidentView do location: resident.location, flr: resident.flr, flr_url: resident.flr_url, + nesting_depth: resident.nesting_depth, x: resident.x, y: resident.y, direction: resident.direction, From 1ffc58f6235cf6af463fe3015a92fdc8bb68e773 Mon Sep 17 00:00:00 2001 From: Udi h Bauman Date: Fri, 23 Sep 2022 13:46:13 -0500 Subject: [PATCH 4/7] Added container_entity_type to resident, because we now need to know that in order to render the bldgs inside the container & the container, so getting it with the resident will allow fast rendering --- bldg_server/lib/bldg_server/residents.ex | 10 ++++++++-- bldg_server/lib/bldg_server/residents/resident.ex | 3 ++- .../bldg_server_web/controllers/resident_controller.ex | 6 ++---- bldg_server/lib/bldg_server_web/views/resident_view.ex | 1 + .../20220923073042_add_nesting_depth_to_resident.exs | 9 +++++++++ ...923183144_add_container_entity_type_to_resident.exs | 9 +++++++++ 6 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 bldg_server/priv/repo/migrations/20220923073042_add_nesting_depth_to_resident.exs create mode 100644 bldg_server/priv/repo/migrations/20220923183144_add_container_entity_type_to_resident.exs diff --git a/bldg_server/lib/bldg_server/residents.ex b/bldg_server/lib/bldg_server/residents.ex index 0ce65c4..dd178ef 100644 --- a/bldg_server/lib/bldg_server/residents.ex +++ b/bldg_server/lib/bldg_server/residents.ex @@ -187,6 +187,8 @@ defmodule BldgServer.Residents do end def enter_bldg(%Resident{} = resident, address, bldg_url, flr) do + container_bldg = Buildings.get_by_bldg_url(bldg_url) + {initial_x, initial_y} = {8, 40} # TODO read from config, per bldg type changes = %{ flr: "#{address}/#{flr}", @@ -194,7 +196,8 @@ defmodule BldgServer.Residents do location: "#{address}/#{flr}/b(#{initial_x},#{initial_y})", x: initial_x, y: initial_y, - nesting_depth: Buildings.calculate_nesting_depth(address) + nesting_depth: Buildings.calculate_nesting_depth(address), + container_entity_type: container_bldg.entity_type } update_resident(resident, changes) end @@ -204,6 +207,8 @@ defmodule BldgServer.Residents do container_flr = Buildings.get_container_flr(address) container_flr_url = Buildings.get_container_flr_url(bldg_url) + container_bldg = Buildings.get_by_bldg_url(container_flr_url) + # determine the location next to the door of the bldg exited {x, y} = Buildings.extract_coords(address) new_x = x @@ -215,7 +220,8 @@ defmodule BldgServer.Residents do location: "#{container_flr}/b(#{new_x},#{new_y})", x: new_x, y: new_y, - nesting_depth: Buildings.calculate_nesting_depth(container_flr) + nesting_depth: Buildings.calculate_nesting_depth(container_flr), + container_entity_type: container_bldg.entity_type } update_resident(resident, changes) end diff --git a/bldg_server/lib/bldg_server/residents/resident.ex b/bldg_server/lib/bldg_server/residents/resident.ex index 8f278ad..b6cb685 100644 --- a/bldg_server/lib/bldg_server/residents/resident.ex +++ b/bldg_server/lib/bldg_server/residents/resident.ex @@ -19,6 +19,7 @@ defmodule BldgServer.Residents.Resident do field :y, :integer field :flr_url, :string field :nesting_depth, :integer + field :container_entity_type, :string timestamps() end @@ -26,7 +27,7 @@ defmodule BldgServer.Residents.Resident do @doc false def changeset(resident, attrs) do resident - |> cast(attrs, [:email, :alias, :name, :home_bldg, :is_online, :location, :direction, :previous_messages, :other_attributes, :session_id, :last_login_at, :flr, :flr_url, :x, :y, :nesting_depth]) + |> cast(attrs, [:email, :alias, :name, :home_bldg, :is_online, :location, :direction, :previous_messages, :other_attributes, :session_id, :last_login_at, :flr, :flr_url, :x, :y, :nesting_depth, :container_entity_type]) |> validate_required([:email, :alias, :name, :home_bldg]) |> unique_constraint(:email) end diff --git a/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex b/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex index 1cf365f..37cc22a 100644 --- a/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex +++ b/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex @@ -157,13 +157,11 @@ defmodule BldgServerWeb.ResidentController do end # ENTER_BLDG action - def act(conn, %{"resident_email" => email, "action_type" => "ENTER_BLDG", "bldg_address" => address, "bldg_url" => bldg_url, "flr" => flr}) do + def act(conn, %{"resident_email" => email, "action_type" => "ENTER_BLDG", "bldg_address" => address, "bldg_url" => bldg_url, "flr" => flr, "container_entity_type" => container_entity_type}) do resident = Residents.get_resident_by_email!(email) # TODO validate that the resident is authorized to enter the given bldg - with {:ok, %Resident{} = upd_rsdt} <- Residents.enter_bldg(resident, address, bldg_url, flr) do - IO.puts("~~~~~~~~~~~ enter bldg done, resident returned:") - IO.inspect(upd_rsdt) + with {:ok, %Resident{} = upd_rsdt} <- Residents.enter_bldg(resident, address, bldg_url, flr, container_entity_type) do conn |> put_status(:ok) |> put_resp_header("location", Routes.resident_path(conn, :show, upd_rsdt)) diff --git a/bldg_server/lib/bldg_server_web/views/resident_view.ex b/bldg_server/lib/bldg_server_web/views/resident_view.ex index 7cce343..995314f 100644 --- a/bldg_server/lib/bldg_server_web/views/resident_view.ex +++ b/bldg_server/lib/bldg_server_web/views/resident_view.ex @@ -24,6 +24,7 @@ defmodule BldgServerWeb.ResidentView do location: resident.location, flr: resident.flr, flr_url: resident.flr_url, + container_entity_type: resident.container_entity_type, nesting_depth: resident.nesting_depth, x: resident.x, y: resident.y, diff --git a/bldg_server/priv/repo/migrations/20220923073042_add_nesting_depth_to_resident.exs b/bldg_server/priv/repo/migrations/20220923073042_add_nesting_depth_to_resident.exs new file mode 100644 index 0000000..296ac3f --- /dev/null +++ b/bldg_server/priv/repo/migrations/20220923073042_add_nesting_depth_to_resident.exs @@ -0,0 +1,9 @@ +defmodule BldgServer.Repo.Migrations.AddNestingDepthToResident do + use Ecto.Migration + + def change do + alter table("residents") do + add :nesting_depth, :integer + end + end +end diff --git a/bldg_server/priv/repo/migrations/20220923183144_add_container_entity_type_to_resident.exs b/bldg_server/priv/repo/migrations/20220923183144_add_container_entity_type_to_resident.exs new file mode 100644 index 0000000..3a3ef01 --- /dev/null +++ b/bldg_server/priv/repo/migrations/20220923183144_add_container_entity_type_to_resident.exs @@ -0,0 +1,9 @@ +defmodule BldgServer.Repo.Migrations.AddContainerEntityTypeToResident do + use Ecto.Migration + + def change do + alter table("residents") do + add :container_entity_type, :string + end + end +end From 22bc58246b246af3af9aae2867a4697d1e9095f9 Mon Sep 17 00:00:00 2001 From: Udi h Bauman Date: Fri, 23 Sep 2022 14:04:22 -0500 Subject: [PATCH 5/7] cleanup --- bldg_server/lib/bldg_server/residents.ex | 4 ++++ .../lib/bldg_server_web/controllers/resident_controller.ex | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/bldg_server/lib/bldg_server/residents.ex b/bldg_server/lib/bldg_server/residents.ex index dd178ef..33c9410 100644 --- a/bldg_server/lib/bldg_server/residents.ex +++ b/bldg_server/lib/bldg_server/residents.ex @@ -187,7 +187,10 @@ defmodule BldgServer.Residents do end def enter_bldg(%Resident{} = resident, address, bldg_url, flr) do + IO.puts("~~~~~ 1") container_bldg = Buildings.get_by_bldg_url(bldg_url) + IO.puts("~~~~~ 2") + IO.inspect(container_bldg) {initial_x, initial_y} = {8, 40} # TODO read from config, per bldg type changes = %{ @@ -199,6 +202,7 @@ defmodule BldgServer.Residents do nesting_depth: Buildings.calculate_nesting_depth(address), container_entity_type: container_bldg.entity_type } + IO.inspect(changes) update_resident(resident, changes) end diff --git a/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex b/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex index 37cc22a..e5cfc57 100644 --- a/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex +++ b/bldg_server/lib/bldg_server_web/controllers/resident_controller.ex @@ -157,11 +157,11 @@ defmodule BldgServerWeb.ResidentController do end # ENTER_BLDG action - def act(conn, %{"resident_email" => email, "action_type" => "ENTER_BLDG", "bldg_address" => address, "bldg_url" => bldg_url, "flr" => flr, "container_entity_type" => container_entity_type}) do + def act(conn, %{"resident_email" => email, "action_type" => "ENTER_BLDG", "bldg_address" => address, "bldg_url" => bldg_url, "flr" => flr}) do resident = Residents.get_resident_by_email!(email) # TODO validate that the resident is authorized to enter the given bldg - with {:ok, %Resident{} = upd_rsdt} <- Residents.enter_bldg(resident, address, bldg_url, flr, container_entity_type) do + with {:ok, %Resident{} = upd_rsdt} <- Residents.enter_bldg(resident, address, bldg_url, flr) do conn |> put_status(:ok) |> put_resp_header("location", Routes.resident_path(conn, :show, upd_rsdt)) From 7ecd4f6823cbb9d2ef51623db07fe78c8b624136 Mon Sep 17 00:00:00 2001 From: Udi h Bauman Date: Fri, 23 Sep 2022 15:32:12 -0500 Subject: [PATCH 6/7] bug fix --- bldg_server/lib/bldg_server/residents.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bldg_server/lib/bldg_server/residents.ex b/bldg_server/lib/bldg_server/residents.ex index 33c9410..61543a9 100644 --- a/bldg_server/lib/bldg_server/residents.ex +++ b/bldg_server/lib/bldg_server/residents.ex @@ -210,8 +210,8 @@ defmodule BldgServer.Residents do # get the container flr container_flr = Buildings.get_container_flr(address) container_flr_url = Buildings.get_container_flr_url(bldg_url) - - container_bldg = Buildings.get_by_bldg_url(container_flr_url) + container_bldg_url = Buildings.get_container(container_flr_url) + container_bldg = Buildings.get_by_bldg_url(container_bldg_url) # determine the location next to the door of the bldg exited {x, y} = Buildings.extract_coords(address) From 88fcf925b8302eada1b98dfed41fe18d0e4d973b Mon Sep 17 00:00:00 2001 From: Udi h Bauman Date: Thu, 29 Sep 2022 19:01:36 -0700 Subject: [PATCH 7/7] bug fix --- bldg_server/lib/bldg_server/residents.ex | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/bldg_server/lib/bldg_server/residents.ex b/bldg_server/lib/bldg_server/residents.ex index 61543a9..5be5c19 100644 --- a/bldg_server/lib/bldg_server/residents.ex +++ b/bldg_server/lib/bldg_server/residents.ex @@ -210,8 +210,13 @@ defmodule BldgServer.Residents do # get the container flr container_flr = Buildings.get_container_flr(address) container_flr_url = Buildings.get_container_flr_url(bldg_url) - container_bldg_url = Buildings.get_container(container_flr_url) - container_bldg = Buildings.get_by_bldg_url(container_bldg_url) + container_entity_type = case container_flr_url do + "g" -> "g" + _ -> + container_bldg_url = Buildings.get_container(container_flr_url) + container_bldg = Buildings.get_by_bldg_url(container_bldg_url) + container_bldg.entity_type + end # determine the location next to the door of the bldg exited {x, y} = Buildings.extract_coords(address) @@ -225,7 +230,7 @@ defmodule BldgServer.Residents do x: new_x, y: new_y, nesting_depth: Buildings.calculate_nesting_depth(container_flr), - container_entity_type: container_bldg.entity_type + container_entity_type: container_entity_type } update_resident(resident, changes) end