From 1a8cb1085ee10e3478cf8423dacc07add2108a78 Mon Sep 17 00:00:00 2001 From: Nicolas Mena Date: Mon, 18 Dec 2023 22:14:23 -0500 Subject: [PATCH] Feat/update users (#19) * update user endpoint * add index users endpoint * refactor enrollments * changes show profile --- apps/core/lib/core/schema/user.ex | 6 +++ .../web/controllers/courses/courses_json.ex | 9 +++- .../enrollments/enrollments_controller.ex | 45 ++++++------------- .../controllers/topics/topics_controller.ex | 1 - .../lib/web/controllers/users/profile_json.ex | 5 ++- .../web/controllers/users/users_controller.ex | 32 ++++++++++--- .../lib/web/controllers/users/users_json.ex | 19 +++++--- apps/web/lib/web/plug/check_request.ex | 27 ++++++++--- apps/web/lib/web/router.ex | 2 +- 9 files changed, 92 insertions(+), 54 deletions(-) diff --git a/apps/core/lib/core/schema/user.ex b/apps/core/lib/core/schema/user.ex index 93d7dba..e28453f 100644 --- a/apps/core/lib/core/schema/user.ex +++ b/apps/core/lib/core/schema/user.ex @@ -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 diff --git a/apps/web/lib/web/controllers/courses/courses_json.ex b/apps/web/lib/web/controllers/courses/courses_json.ex index 95a0d68..d7c0f7b 100644 --- a/apps/web/lib/web/controllers/courses/courses_json.ex +++ b/apps/web/lib/web/controllers/courses/courses_json.ex @@ -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 diff --git a/apps/web/lib/web/controllers/enrollments/enrollments_controller.ex b/apps/web/lib/web/controllers/enrollments/enrollments_controller.ex index 52ad0c8..84c4f06 100644 --- a/apps/web/lib/web/controllers/enrollments/enrollments_controller.ex +++ b/apps/web/lib/web/controllers/enrollments/enrollments_controller.ex @@ -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 diff --git a/apps/web/lib/web/controllers/topics/topics_controller.ex b/apps/web/lib/web/controllers/topics/topics_controller.ex index 54cc392..95b0b85 100644 --- a/apps/web/lib/web/controllers/topics/topics_controller.ex +++ b/apps/web/lib/web/controllers/topics/topics_controller.ex @@ -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 %{ diff --git a/apps/web/lib/web/controllers/users/profile_json.ex b/apps/web/lib/web/controllers/users/profile_json.ex index 506c9fc..a72fdd3 100644 --- a/apps/web/lib/web/controllers/users/profile_json.ex +++ b/apps/web/lib/web/controllers/users/profile_json.ex @@ -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 diff --git a/apps/web/lib/web/controllers/users/users_controller.ex b/apps/web/lib/web/controllers/users/users_controller.ex index 863c3ef..26aeeff 100644 --- a/apps/web/lib/web/controllers/users/users_controller.ex +++ b/apps/web/lib/web/controllers/users/users_controller.ex @@ -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], @@ -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 @@ -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]) diff --git a/apps/web/lib/web/controllers/users/users_json.ex b/apps/web/lib/web/controllers/users/users_json.ex index 6ea8f57..abc9150 100644 --- a/apps/web/lib/web/controllers/users/users_json.ex +++ b/apps/web/lib/web/controllers/users/users_json.ex @@ -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 diff --git a/apps/web/lib/web/plug/check_request.ex b/apps/web/lib/web/plug/check_request.ex index 7a3d640..d3d83ff 100644 --- a/apps/web/lib/web/plug/check_request.ex +++ b/apps/web/lib/web/plug/check_request.ex @@ -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), @@ -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 @@ -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 diff --git a/apps/web/lib/web/router.ex b/apps/web/lib/web/router.ex index 647e7eb..a69f7cf 100644 --- a/apps/web/lib/web/router.ex +++ b/apps/web/lib/web/router.ex @@ -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