Skip to content

Commit

Permalink
Feat/update users (#19)
Browse files Browse the repository at this point in the history
* update user endpoint

* add index users endpoint

* refactor enrollments

* changes show profile
  • Loading branch information
nmenag authored Dec 19, 2023
1 parent c5f714c commit 1a8cb10
Show file tree
Hide file tree
Showing 9 changed files with 92 additions and 54 deletions.
6 changes: 6 additions & 0 deletions apps/core/lib/core/schema/user.ex
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,12 @@ defmodule GoEscuelaLms.Core.Schema.User do
|> Repo.insert()
end

def update(%User{} = user, attrs) do
user
|> changeset(attrs)
|> Repo.update()
end

def find(uuid) when uuid in ["", nil], do: nil

def find(uuid) do
Expand Down
9 changes: 8 additions & 1 deletion apps/web/lib/web/controllers/courses/courses_json.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,14 @@ defmodule Web.Courses.CoursesJSON do
"""

def create(%{course: course}) do
%{data: %{name: course.name, enabled: course.enabled, description: course.description}}
%{
data: %{
id: course.uuid,
name: course.name,
enabled: course.enabled,
description: course.description
}
}
end

def index(%{}) do
Expand Down
45 changes: 13 additions & 32 deletions apps/web/lib/web/controllers/enrollments/enrollments_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,47 +4,28 @@ defmodule Web.Enrollments.EnrollmentsController do
action_fallback Web.FallbackController

import Web.Auth.AuthorizedPlug
import Web.Plug.CheckRequest

alias GoEscuelaLms.Core.Schema.{Course, Enrollment, User}
alias GoEscuelaLms.Core.Schema.{Enrollment}

plug :is_organizer_authorized when action in [:create]
plug :load_user when action in [:create]
plug :load_course when action in [:create]

def create(conn, params) do
user_id = params["users_id"]
course_id = params["courses_id"]
def create(conn, _params) do
course = conn.assigns.course
user = conn.assigns.user

with :ok <- valid_uuids(user_id),
:ok <- valid_uuids(course_id),
:ok <- valid_resources(user_id, course_id),
{:ok, enrollment} <- create_enrollment(user_id, course_id) do
render(conn, :create, %{enrollment: enrollment})
case create_enrollment(user, course) do
{:ok, enrollment} ->
render(conn, :create, %{enrollment: enrollment})
end
end

defp create_enrollment(user_id, course_id) do
defp create_enrollment(user, course) do
Enrollment.create(%{
course_id: course_id,
user_id: user_id
course_id: course.uuid,
user_id: user.uuid
})
end

defp valid_uuids(id) do
case Ecto.UUID.dump(id) do
{:ok, _} ->
:ok

_ ->
{:error, "invalid params"}
end
end

def valid_resources(user_id, course_id) do
with false <- is_nil(Course.find(course_id)),
false <- is_nil(User.find(user_id)) do
:ok
else
_ ->
{:error, "Resource does not exist"}
end
end
end
1 change: 0 additions & 1 deletion apps/web/lib/web/controllers/topics/topics_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ defmodule Web.Topics.TopicsController do

plug :is_permit_authorized when action in [:create]
plug :load_course when action in [:create]
plug :load_course when action in [:create]
plug :check_enrollment when action in [:create]

@create_params %{
Expand Down
5 changes: 4 additions & 1 deletion apps/web/lib/web/controllers/users/profile_json.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@ defmodule Web.Users.ProfileJSON do
Renders users
"""
def show(%{data: data}) do
%{email: data.email}
%{
email: data.email,
name: data.full_name
}
end
end
32 changes: 26 additions & 6 deletions apps/web/lib/web/controllers/users/users_controller.ex
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ defmodule Web.Users.UsersController do
action_fallback Web.FallbackController

import Web.Auth.AuthorizedPlug
import Web.Plug.CheckRequest

alias GoEscuelaLms.Core.Schema.User

plug :is_organizer_authorized when action in [:create]
plug :load_user when action in [:update]

@create_params %{
full_name: [type: :string, required: true],
Expand All @@ -16,6 +18,12 @@ defmodule Web.Users.UsersController do
password: [type: :string, required: true]
}

@update_params %{
full_name: :string,
email: :string,
role: [type: :string, in: User.roles()]
}

def create(conn, params) do
with {:ok, valid_params} <- Tarams.cast(params, @create_params),
{:ok, user} <- create_user(valid_params) do
Expand All @@ -24,18 +32,30 @@ defmodule Web.Users.UsersController do
end

def index(conn, _params) do
render(conn, :index, %{})
render(conn, :index, %{users: User.all()})
end

def update(conn, _params) do
render(conn, :update, %{})
def update(conn, params) do
user = conn.assigns.user

with {:ok, valid_params} <- Tarams.cast(params, @update_params),
{:ok, user_updated} <- update_user(user, valid_params) do
render(conn, :update, %{user: user_updated})
end
end

defp create_user(params) do
name = params |> get_in([:full_name])
defp update_user(user, params) do
user
|> User.update(%{
full_name: params |> get_in([:full_name]),
email: params |> get_in([:email]),
role: params |> get_in([:role])
})
end

defp create_user(params) do
User.create(%{
full_name: name,
full_name: params |> get_in([:full_name]),
email: params |> get_in([:email]),
role: params |> get_in([:role]),
password_hash: params |> get_in([:password])
Expand Down
19 changes: 14 additions & 5 deletions apps/web/lib/web/controllers/users/users_json.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,15 +3,24 @@ defmodule Web.Users.UsersJSON do
Renders users
"""

alias GoEscuelaLms.Core.Schema.User

def index(%{users: users}) do
%{data: for(user <- users, do: data(user))}
end

def create(%{user: user}) do
%{data: %{email: user.email, full_name: user.full_name}}
%{data: data(user)}
end

def index(%{}) do
%{data: %{}}
def update(%{user: user}) do
%{data: data(user)}
end

def update(%{}) do
%{data: %{}}
defp data(%User{} = user) do
%{
email: user.email,
full_name: user.full_name
}
end
end
27 changes: 20 additions & 7 deletions apps/web/lib/web/plug/check_request.ex
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ defmodule Web.Plug.CheckRequest do
This module plug check request and load resource
"""
import Plug.Conn
alias GoEscuelaLms.Core.Schema.{Course}
alias GoEscuelaLms.Core.Schema.{Course, User}

def load_course(conn, _) do
course_id = conn.params["courses_id"]
course_id = conn.params["id"] || conn.params["courses_id"]

with :ok <- valid_uuids(course_id),
course <- Course.find(course_id),
Expand All @@ -18,13 +18,16 @@ defmodule Web.Plug.CheckRequest do
end
end

defp valid_uuids(id) do
case Ecto.UUID.dump(id) do
{:ok, _} ->
:ok
def load_user(conn, _) do
id = conn.params["id"] || conn.params["users_id"]

with :ok <- valid_uuids(id),
object <- User.find(id),
false <- is_nil(object) do
assign(conn, :user, object)
else
_ ->
{:error, "invalid params"}
Web.FallbackController.call(conn, {:error, "invalid params"}) |> halt()
end
end

Expand All @@ -45,4 +48,14 @@ defmodule Web.Plug.CheckRequest do
Web.FallbackController.call(conn, {:error, :forbidden}) |> halt()
end
end

defp valid_uuids(id) do
case Ecto.UUID.dump(id) do
{:ok, _} ->
:ok

_ ->
{:error, "invalid params"}
end
end
end
2 changes: 1 addition & 1 deletion apps/web/lib/web/router.ex
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ defmodule Web.Router do
post "/onboarding/organizer", Onboarding.OrganizerController, :create
get "/onboarding/institution_info", Onboarding.InstitutionInfoController, :show

resources "/users", Users.UsersController do
resources "/users", Users.UsersController, only: [:create, :update, :index] do
resources "/courses", Courses.CoursesController, only: [:index] do
resources "/enrollments", Enrollments.EnrollmentsController, only: [:create]
end
Expand Down

0 comments on commit 1a8cb10

Please sign in to comment.