Skip to content

Commit ccaee9a

Browse files
committed
Merge remote-tracking branch 'origin/practitioners' into dev
2 parents b70d997 + 2e3aecf commit ccaee9a

30 files changed

Lines changed: 407 additions & 282 deletions

ndb_rest_api/lib/ndb_rest_api/hospitals/hospital.ex

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,13 @@ defmodule NdbRestApi.Hospitals.Hospital do
55
schema "hospitals" do
66
field :name, :string
77
field :address, :string
8-
field :api_key, :string
98
field :region, :string
109
field :notes, :string
10+
field :api_key, :string
11+
12+
many_to_many :practitioners, NdbRestApi.Practitioners.Practitioner,
13+
join_through: "hospitals_practitioners",
14+
on_replace: :delete
1115

1216
timestamps(type: :utc_datetime)
1317
end
@@ -17,5 +21,15 @@ defmodule NdbRestApi.Hospitals.Hospital do
1721
hospital
1822
|> cast(attrs, [:name, :address, :region, :notes, :api_key])
1923
|> validate_required([:name, :address, :region, :notes, :api_key])
24+
|> put_assoc(:practitioners, get_practitioners(attrs))
2025
end
26+
27+
defp get_practitioners(%{"practitioner_ids" => practitioner_ids})
28+
when is_list(practitioner_ids) do
29+
practitioner_ids
30+
|> Enum.reject(&(&1 == ""))
31+
|> Enum.map(&NdbRestApi.Practitioners.get_practitioner!/1)
32+
end
33+
34+
defp get_practitioners(_), do: []
2135
end
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
defmodule NdbRestApi.HospitalsPractitioners do
2+
use Ecto.Schema
3+
import Ecto.Changeset
4+
5+
schema "hospitals_practitioners" do
6+
7+
8+
timestamps(type: :utc_datetime)
9+
end
10+
11+
@doc false
12+
def changeset(hospitals_practitioners, attrs) do
13+
hospitals_practitioners
14+
|> cast(attrs, [])
15+
|> validate_required([])
16+
end
17+
end

ndb_rest_api/lib/ndb_rest_api/practitioners.ex

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ defmodule NdbRestApi.Practitioners do
102102
Practitioner.changeset(practitioner, attrs)
103103
end
104104

105-
106105
@doc """
107106
Gets a single practitioner by its email.
108107

ndb_rest_api/lib/ndb_rest_api/practitioners/practitioner.ex

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,75 @@ defmodule NdbRestApi.Practitioners.Practitioner do
88
field :surname, :string
99
field :date_of_birth, :date
1010
field :qualification, :string
11-
field :gender_id, :id
12-
field :role_id, :id
1311
has_many :medication_requests, NdbRestApi.MedicationRequests.MedicationRequest
12+
belongs_to :gender, NdbRestApi.Genders.Gender
13+
belongs_to :role, NdbRestApi.PractitionerRoles.PractitionerRole
14+
15+
many_to_many :hospitals, NdbRestApi.Hospitals.Hospital,
16+
join_through: "hospitals_practitioners",
17+
on_replace: :delete
18+
1419
timestamps(type: :utc_datetime)
1520
end
1621

22+
@spec changeset(
23+
{map(),
24+
%{
25+
optional(atom()) =>
26+
atom()
27+
| {:array | :assoc | :embed | :in | :map | :parameterized | :supertype | :try,
28+
any()}
29+
}}
30+
| %{
31+
:__struct__ => atom() | %{:__changeset__ => any(), optional(any()) => any()},
32+
optional(atom()) => any()
33+
},
34+
:invalid | %{optional(:__struct__) => none(), optional(atom() | binary()) => any()}
35+
) :: Ecto.Changeset.t()
36+
@spec changeset(
37+
{map(),
38+
%{
39+
optional(atom()) =>
40+
atom()
41+
| {:array | :assoc | :embed | :in | :map | :parameterized | :supertype | :try,
42+
any()}
43+
}}
44+
| %{
45+
:__struct__ => atom() | %{:__changeset__ => any(), optional(any()) => any()},
46+
optional(atom()) => any()
47+
},
48+
:invalid | %{optional(:__struct__) => none(), optional(atom() | binary()) => any()}
49+
) :: Ecto.Changeset.t()
1750
@doc false
1851
def changeset(practitioner, attrs) do
1952
practitioner
20-
|> cast(attrs, [:email, :forename, :surname, :date_of_birth, :qualification])
21-
|> validate_required([:email, :forename, :surname, :date_of_birth, :qualification])
53+
|> cast(attrs, [
54+
:email,
55+
:forename,
56+
:surname,
57+
:date_of_birth,
58+
:qualification,
59+
:gender_id,
60+
:role_id
61+
])
62+
|> validate_required([
63+
:email,
64+
:forename,
65+
:surname,
66+
:date_of_birth,
67+
:qualification,
68+
:gender_id,
69+
:role_id
70+
])
2271
|> unique_constraint(:email)
72+
|> put_assoc(:hospitals, get_hospitals(attrs))
2373
end
74+
75+
defp get_hospitals(%{"hospital_ids" => hospital_ids}) when is_list(hospital_ids) do
76+
hospital_ids
77+
|> Enum.reject(&(&1 == ""))
78+
|> Enum.map(&NdbRestApi.Hospitals.get_hospital!/1)
79+
end
80+
81+
defp get_hospitals(_), do: []
2482
end

ndb_rest_api/lib/ndb_rest_api_web/controllers/api/gender_controller.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ defmodule NdbRestApiWeb.Api.GenderController do
1515
with {:ok, %Gender{} = gender} <- Genders.create_gender(gender_params) do
1616
conn
1717
|> put_status(:created)
18-
|> put_resp_header("location", ~p"/api/api/genders/#{gender}")
18+
|> put_resp_header("location", ~p"/api/genders/#{gender}")
1919
|> render(:show, gender: gender)
2020
end
2121
end

ndb_rest_api/lib/ndb_rest_api_web/controllers/api/hospital_controller.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ defmodule NdbRestApiWeb.Api.HospitalController do
1515
with {:ok, %Hospital{} = hospital} <- Hospitals.create_hospital(hospital_params) do
1616
conn
1717
|> put_status(:created)
18-
|> put_resp_header("location", ~p"/api/api/hospitals/#{hospital}")
18+
|> put_resp_header("location", ~p"/api/hospitals/#{hospital}")
1919
|> render(:show, hospital: hospital)
2020
end
2121
end

ndb_rest_api/lib/ndb_rest_api_web/controllers/api/patient_controller.ex

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ defmodule NdbRestApiWeb.Api.PatientController do
33

44
alias NdbRestApi.Patients
55
alias NdbRestApi.Patients.Patient
6-
alias NdbRestApi.Genders
76
alias NdbRestApi.Repo
87

98
action_fallback NdbRestApiWeb.FallbackController
@@ -18,7 +17,7 @@ defmodule NdbRestApiWeb.Api.PatientController do
1817
with {:ok, %Patient{} = patient} <- Patients.create_patient(patient_params) do
1918
conn
2019
|> put_status(:created)
21-
|> put_resp_header("location", ~p"/api/api/patients/#{patient}")
20+
|> put_resp_header("location", ~p"/api/patients/#{patient}")
2221
|> render(:show, patient: patient)
2322
end
2423
end

ndb_rest_api/lib/ndb_rest_api_web/controllers/api/practitioner_controller.ex

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,38 +3,41 @@ defmodule NdbRestApiWeb.Api.PractitionerController do
33

44
alias NdbRestApi.Practitioners
55
alias NdbRestApi.Practitioners.Practitioner
6+
alias NdbRestApi.Repo
67

78
action_fallback NdbRestApiWeb.FallbackController
89

910
def index(conn, _params) do
10-
practitioners = Practitioners.list_practitioners()
11+
practitioners = Practitioners.list_practitioners() |> Repo.preload(:hospitals)
1112
render(conn, :index, practitioners: practitioners)
1213
end
1314

1415
def create(conn, %{"practitioner" => practitioner_params}) do
15-
with {:ok, %Practitioner{} = practitioner} <- Practitioners.create_practitioner(practitioner_params) do
16+
with {:ok, %Practitioner{} = practitioner} <-
17+
Practitioners.create_practitioner(practitioner_params) do
1618
conn
1719
|> put_status(:created)
18-
|> put_resp_header("location", ~p"/api/api/practitioners/#{practitioner}")
20+
|> put_resp_header("location", ~p"/api/practitioners/#{practitioner}")
1921
|> render(:show, practitioner: practitioner)
2022
end
2123
end
2224

2325
def show(conn, %{"id" => id}) do
24-
practitioner = Practitioners.get_practitioner!(id)
26+
practitioner = Practitioners.get_practitioner!(id) |> Repo.preload(:hospitals)
2527
render(conn, :show, practitioner: practitioner)
2628
end
2729

2830
def update(conn, %{"id" => id, "practitioner" => practitioner_params}) do
29-
practitioner = Practitioners.get_practitioner!(id)
31+
practitioner = Practitioners.get_practitioner!(id) |> Repo.preload(:hospitals)
3032

31-
with {:ok, %Practitioner{} = practitioner} <- Practitioners.update_practitioner(practitioner, practitioner_params) do
33+
with {:ok, %Practitioner{} = practitioner} <-
34+
Practitioners.update_practitioner(practitioner, practitioner_params) do
3235
render(conn, :show, practitioner: practitioner)
3336
end
3437
end
3538

3639
def delete(conn, %{"id" => id}) do
37-
practitioner = Practitioners.get_practitioner!(id)
40+
practitioner = Practitioners.get_practitioner!(id) |> Repo.preload(:hospitals)
3841

3942
with {:ok, %Practitioner{}} <- Practitioners.delete_practitioner(practitioner) do
4043
send_resp(conn, :no_content, "")

ndb_rest_api/lib/ndb_rest_api_web/controllers/api/practitioner_role_controller.ex

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ defmodule NdbRestApiWeb.Api.PractitionerRoleController do
1515
with {:ok, %PractitionerRole{} = practitioner_role} <- PractitionerRoles.create_practitioner_role(practitioner_role_params) do
1616
conn
1717
|> put_status(:created)
18-
|> put_resp_header("location", ~p"/api/api/practitioner_roles/#{practitioner_role}")
18+
|> put_resp_header("location", ~p"/api/practitioner_roles/#{practitioner_role}")
1919
|> render(:show, practitioner_role: practitioner_role)
2020
end
2121
end

ndb_rest_api/lib/ndb_rest_api_web/controllers/hospital_controller.ex

Lines changed: 23 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,42 +3,49 @@ defmodule NdbRestApiWeb.HospitalController do
33

44
alias NdbRestApi.Hospitals
55
alias NdbRestApi.Hospitals.Hospital
6+
alias NdbRestApi.Practitioners
7+
alias NdbRestApi.Repo
68

79
def index(conn, _params) do
8-
hospitals = Hospitals.list_hospitals()
10+
hospitals = Hospitals.list_hospitals() |> Repo.preload(:practitioners)
911
render(conn, :index, hospitals: hospitals)
1012
end
1113

1214
def new(conn, _params) do
13-
changeset = Hospitals.change_hospital(%Hospital{})
14-
render(conn, :new, changeset: changeset)
15+
changeset = Hospitals.change_hospital(%Hospital{practitioners: []})
16+
practitioners = Practitioners.list_practitioners()
17+
render(conn, :new, changeset: changeset, practitioners: practitioners)
1518
end
1619

1720
def create(conn, %{"hospital" => hospital_params}) do
1821
case Hospitals.create_hospital(hospital_params) do
1922
{:ok, hospital} ->
23+
hospital = Repo.preload(hospital, :practitioners)
24+
2025
conn
2126
|> put_flash(:info, "Hospital created successfully.")
2227
|> redirect(to: ~p"/hospitals/#{hospital}")
2328

2429
{:error, %Ecto.Changeset{} = changeset} ->
25-
render(conn, :new, changeset: changeset)
30+
practitioners = Practitioners.list_practitioners()
31+
render(conn, :new, changeset: changeset, practitioners: practitioners)
2632
end
2733
end
2834

2935
def show(conn, %{"id" => id}) do
30-
hospital = Hospitals.get_hospital!(id)
36+
hospital = Hospitals.get_hospital!(id) |> Repo.preload(:practitioners)
3137
render(conn, :show, hospital: hospital)
3238
end
3339

3440
def edit(conn, %{"id" => id}) do
35-
hospital = Hospitals.get_hospital!(id)
41+
hospital = Hospitals.get_hospital!(id) |> Repo.preload(:practitioners)
3642
changeset = Hospitals.change_hospital(hospital)
37-
render(conn, :edit, hospital: hospital, changeset: changeset)
43+
practitioners = Practitioners.list_practitioners()
44+
render(conn, :edit, hospital: hospital, changeset: changeset, practitioners: practitioners)
3845
end
3946

4047
def update(conn, %{"id" => id, "hospital" => hospital_params}) do
41-
hospital = Hospitals.get_hospital!(id)
48+
hospital = Hospitals.get_hospital!(id) |> Repo.preload(:practitioners)
4249

4350
case Hospitals.update_hospital(hospital, hospital_params) do
4451
{:ok, hospital} ->
@@ -47,12 +54,18 @@ defmodule NdbRestApiWeb.HospitalController do
4754
|> redirect(to: ~p"/hospitals/#{hospital}")
4855

4956
{:error, %Ecto.Changeset{} = changeset} ->
50-
render(conn, :edit, hospital: hospital, changeset: changeset)
57+
practitioners = Practitioners.list_practitioners()
58+
59+
render(conn, :edit,
60+
hospital: hospital,
61+
changeset: changeset,
62+
practitioners: practitioners
63+
)
5164
end
5265
end
5366

5467
def delete(conn, %{"id" => id}) do
55-
hospital = Hospitals.get_hospital!(id)
68+
hospital = Hospitals.get_hospital!(id) |> Repo.preload(:practitioners)
5669
{:ok, _hospital} = Hospitals.delete_hospital(hospital)
5770

5871
conn

0 commit comments

Comments
 (0)