From 33ec6445bf3f7a04500e467a8fc274a690d30ed4 Mon Sep 17 00:00:00 2001 From: Bahugunajii Date: Thu, 8 Aug 2024 16:54:42 +0530 Subject: [PATCH 1/5] update group user and ER for provided user --- lib/dbservice/group_users.ex | 11 ++++++++ .../controllers/group_user_controller.ex | 28 +++++++++++++++---- lib/dbservice_web/router.ex | 1 + 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/lib/dbservice/group_users.ex b/lib/dbservice/group_users.ex index 1ff587b4..ccafcc37 100644 --- a/lib/dbservice/group_users.ex +++ b/lib/dbservice/group_users.ex @@ -7,6 +7,7 @@ defmodule Dbservice.GroupUsers do alias Dbservice.Repo alias Dbservice.Groups.GroupUser + alias Dbservice.Groups.Group @doc """ Returns the list of group_user. @@ -50,6 +51,16 @@ defmodule Dbservice.GroupUsers do Repo.get_by(GroupUser, user_id: user_id, group_id: group_id) end + def get_group_user_with_type(user_id, type) do + from(gu in GroupUser, + join: g in Group, + on: gu.group_id == g.id, + where: gu.user_id == ^user_id and g.type == ^type, + select: gu + ) + |> Repo.all() + end + @doc """ Gets a group-user by user ID. Raises `Ecto.NoResultsError` if the GroupUser does not exist. diff --git a/lib/dbservice_web/controllers/group_user_controller.ex b/lib/dbservice_web/controllers/group_user_controller.ex index 761db83d..4ad9e75b 100644 --- a/lib/dbservice_web/controllers/group_user_controller.ex +++ b/lib/dbservice_web/controllers/group_user_controller.ex @@ -97,11 +97,29 @@ defmodule DbserviceWeb.GroupUserController do end def update(conn, params) do - group_user = GroupUsers.get_group_user!(params["id"]) - - with {:ok, %GroupUser{} = group_user} <- - GroupUsers.update_group_user(group_user, params) do - render(conn, "show.json", group_user: group_user) + user_id = params["user_id"] + type = params["type"] + group = Groups.get_group_by_group_id_and_type(params["group_id"], type) + new_group_id = group.child_id + + # Fetch the GroupUser with the specified user_id and where the group type is type + group_user = GroupUsers.get_group_user_with_type(user_id, type) |> List.first() + + # Fetch the EnrollmentRecord with the specified user_id and where the group_type is type + enrollment_record = + from(er in EnrollmentRecord, + where: er.user_id == ^user_id and er.group_type == ^type + ) + |> Repo.one() + + # Update both the GroupUser and the EnrollmentRecord + with {:ok, %GroupUser{} = updated_group_user} <- + GroupUsers.update_group_user(group_user, params), + {:ok, %EnrollmentRecord{} = _updated_enrollment_record} <- + EnrollmentRecords.update_enrollment_record(enrollment_record, %{ + "group_id" => new_group_id + }) do + render(conn, "show.json", group_user: updated_group_user) end end diff --git a/lib/dbservice_web/router.ex b/lib/dbservice_web/router.ex index 5d542add..89df98c7 100644 --- a/lib/dbservice_web/router.ex +++ b/lib/dbservice_web/router.ex @@ -57,6 +57,7 @@ defmodule DbserviceWeb.Router do patch("/enrolled", StudentController, :enrolled) resources("/school-batch", SchoolBatchController, except: [:new, :edit]) post("/school-with-user", SchoolController, :create_school_with_user) + patch("/update-group-user", GroupUserController, :update) def swagger_info do source(["config/.env", "config/.env"]) From 40418a7626b4b174f430769aa81e8d694c1aff07 Mon Sep 17 00:00:00 2001 From: Bahugunajii Date: Thu, 8 Aug 2024 17:05:55 +0530 Subject: [PATCH 2/5] minor fixes --- lib/dbservice/group_users.ex | 12 +++++++++++- .../controllers/group_user_controller.ex | 17 ++++++++++++++--- lib/dbservice_web/router.ex | 2 +- 3 files changed, 26 insertions(+), 5 deletions(-) diff --git a/lib/dbservice/group_users.ex b/lib/dbservice/group_users.ex index ccafcc37..6cfe33d3 100644 --- a/lib/dbservice/group_users.ex +++ b/lib/dbservice/group_users.ex @@ -51,7 +51,17 @@ defmodule Dbservice.GroupUsers do Repo.get_by(GroupUser, user_id: user_id, group_id: group_id) end - def get_group_user_with_type(user_id, type) do + @doc """ + Gets a group-user based on `user_id` and `type`. + Returns a list of GroupUser entries that match the given user ID and group type. + ## Examples + iex> get_group_user_by_user_id_and_type(1, "school") + [%GroupUser{}, ...] + iex> get_group_user_by_user_id_and_type(abc, "invalid_type") + [] + + """ + def get_group_user_by_user_id_and_type(user_id, type) do from(gu in GroupUser, join: g in Group, on: gu.group_id == g.id, diff --git a/lib/dbservice_web/controllers/group_user_controller.ex b/lib/dbservice_web/controllers/group_user_controller.ex index 4ad9e75b..9c53fe09 100644 --- a/lib/dbservice_web/controllers/group_user_controller.ex +++ b/lib/dbservice_web/controllers/group_user_controller.ex @@ -97,15 +97,26 @@ defmodule DbserviceWeb.GroupUserController do end def update(conn, params) do + group_user = GroupUsers.get_group_user!(params["id"]) + + with {:ok, %GroupUser{} = group_user} <- + GroupUsers.update_group_user(group_user, params) do + render(conn, "show.json", group_user: group_user) + end + end + + def update_by_type(conn, params) do user_id = params["user_id"] type = params["type"] group = Groups.get_group_by_group_id_and_type(params["group_id"], type) new_group_id = group.child_id - # Fetch the GroupUser with the specified user_id and where the group type is type - group_user = GroupUsers.get_group_user_with_type(user_id, type) |> List.first() + # Fetch the GroupUser with the specified user_id and where the group type is the provided type + group_user = + GroupUsers.get_group_user_by_user_id_and_type(user_id, type) + |> List.first() - # Fetch the EnrollmentRecord with the specified user_id and where the group_type is type + # Fetch the EnrollmentRecord with the specified user_id and where the group_type matches the provided type enrollment_record = from(er in EnrollmentRecord, where: er.user_id == ^user_id and er.group_type == ^type diff --git a/lib/dbservice_web/router.ex b/lib/dbservice_web/router.ex index 89df98c7..69443285 100644 --- a/lib/dbservice_web/router.ex +++ b/lib/dbservice_web/router.ex @@ -57,7 +57,7 @@ defmodule DbserviceWeb.Router do patch("/enrolled", StudentController, :enrolled) resources("/school-batch", SchoolBatchController, except: [:new, :edit]) post("/school-with-user", SchoolController, :create_school_with_user) - patch("/update-group-user", GroupUserController, :update) + patch("/update-group-user-by-type", GroupUserController, :update_by_type) def swagger_info do source(["config/.env", "config/.env"]) From 61334147e5805a9045f398219959c47198f02ca7 Mon Sep 17 00:00:00 2001 From: Bahugunajii Date: Thu, 8 Aug 2024 18:35:18 +0530 Subject: [PATCH 3/5] added suggested changes --- lib/dbservice_web/controllers/group_user_controller.ex | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/dbservice_web/controllers/group_user_controller.ex b/lib/dbservice_web/controllers/group_user_controller.ex index 9c53fe09..3bcffe56 100644 --- a/lib/dbservice_web/controllers/group_user_controller.ex +++ b/lib/dbservice_web/controllers/group_user_controller.ex @@ -123,9 +123,10 @@ defmodule DbserviceWeb.GroupUserController do ) |> Repo.one() - # Update both the GroupUser and the EnrollmentRecord + # Update both the GroupUser and the EnrollmentRecord, if the enrollment record exists with {:ok, %GroupUser{} = updated_group_user} <- GroupUsers.update_group_user(group_user, params), + enrollment_record when not is_nil(enrollment_record) <- enrollment_record, {:ok, %EnrollmentRecord{} = _updated_enrollment_record} <- EnrollmentRecords.update_enrollment_record(enrollment_record, %{ "group_id" => new_group_id From 151edc3d9e365eaedf0af5279eca761798dd7e69 Mon Sep 17 00:00:00 2001 From: Bahugunajii Date: Thu, 8 Aug 2024 19:31:29 +0530 Subject: [PATCH 4/5] added suggested changes --- .../controllers/group_user_controller.ex | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/lib/dbservice_web/controllers/group_user_controller.ex b/lib/dbservice_web/controllers/group_user_controller.ex index 3bcffe56..8fe53b2e 100644 --- a/lib/dbservice_web/controllers/group_user_controller.ex +++ b/lib/dbservice_web/controllers/group_user_controller.ex @@ -118,20 +118,28 @@ defmodule DbserviceWeb.GroupUserController do # Fetch the EnrollmentRecord with the specified user_id and where the group_type matches the provided type enrollment_record = - from(er in EnrollmentRecord, - where: er.user_id == ^user_id and er.group_type == ^type - ) + from(er in EnrollmentRecord, where: er.user_id == ^user_id and er.group_type == ^type) |> Repo.one() - # Update both the GroupUser and the EnrollmentRecord, if the enrollment record exists - with {:ok, %GroupUser{} = updated_group_user} <- - GroupUsers.update_group_user(group_user, params), - enrollment_record when not is_nil(enrollment_record) <- enrollment_record, - {:ok, %EnrollmentRecord{} = _updated_enrollment_record} <- - EnrollmentRecords.update_enrollment_record(enrollment_record, %{ - "group_id" => new_group_id - }) do - render(conn, "show.json", group_user: updated_group_user) + case {group_user, enrollment_record} do + {nil, _} -> + # GroupUser not found + {:error, :not_found} + + {_, nil} -> + # EnrollmentRecord not found + {:error, :not_found} + + {group_user, enrollment_record} -> + # Update both the GroupUser and the EnrollmentRecord + with {:ok, %GroupUser{} = updated_group_user} <- + GroupUsers.update_group_user(group_user, params), + {:ok, %EnrollmentRecord{} = _updated_enrollment_record} <- + EnrollmentRecords.update_enrollment_record(enrollment_record, %{ + "group_id" => new_group_id + }) do + render(conn, "show.json", group_user: updated_group_user) + end end end From fae2561c53efaa1963bfb2fd14988a89564db54b Mon Sep 17 00:00:00 2001 From: Bahugunajii Date: Fri, 9 Aug 2024 12:52:58 +0530 Subject: [PATCH 5/5] suggested changes --- .../controllers/group_user_controller.ex | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lib/dbservice_web/controllers/group_user_controller.ex b/lib/dbservice_web/controllers/group_user_controller.ex index 8fe53b2e..d51ee154 100644 --- a/lib/dbservice_web/controllers/group_user_controller.ex +++ b/lib/dbservice_web/controllers/group_user_controller.ex @@ -105,6 +105,17 @@ defmodule DbserviceWeb.GroupUserController do end end + @doc """ + Updates the `GroupUser` and associated `EnrollmentRecord` for a given user and group type. + + ## Assumptions + - This method assumes that only one `EnrollmentRecord` will be updated per call. + - If the `GroupUser` or `EnrollmentRecord` is not found, it returns an error with a `:not_found` status. + + ## Returns + - Renders the updated `GroupUser` as JSON if both updates succeed. + - Returns an error tuple if the `GroupUser` or `EnrollmentRecord` is not found. + """ def update_by_type(conn, params) do user_id = params["user_id"] type = params["type"]