diff --git a/lib/dbservice/group_users.ex b/lib/dbservice/group_users.ex index 1ff587b4..6cfe33d3 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,26 @@ defmodule Dbservice.GroupUsers do Repo.get_by(GroupUser, user_id: user_id, group_id: group_id) end + @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, + 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..d51ee154 100644 --- a/lib/dbservice_web/controllers/group_user_controller.ex +++ b/lib/dbservice_web/controllers/group_user_controller.ex @@ -105,6 +105,55 @@ 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"] + 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 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 matches the provided type + enrollment_record = + from(er in EnrollmentRecord, where: er.user_id == ^user_id and er.group_type == ^type) + |> Repo.one() + + 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 + swagger_path :delete do PhoenixSwagger.Path.delete("/api/group-user/{groupUserId}") diff --git a/lib/dbservice_web/router.ex b/lib/dbservice_web/router.ex index 5d542add..69443285 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-by-type", GroupUserController, :update_by_type) def swagger_info do source(["config/.env", "config/.env"])