Skip to content

Commit

Permalink
Merge pull request #210 from avantifellows/feat/update-group-user-and-ER
Browse files Browse the repository at this point in the history
Feat: Enhance GroupUser Update Function for Type-Specific Handling
  • Loading branch information
Bahugunajii authored Aug 9, 2024
2 parents 314a9fa + fae2561 commit 8e1f5d4
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 0 deletions.
21 changes: 21 additions & 0 deletions lib/dbservice/group_users.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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.
Expand Down
49 changes: 49 additions & 0 deletions lib/dbservice_web/controllers/group_user_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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}")

Expand Down
1 change: 1 addition & 0 deletions lib/dbservice_web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -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"])
Expand Down

0 comments on commit 8e1f5d4

Please sign in to comment.