From 4bd5d1a4279fc1eb51f88de643867fb6d8127c03 Mon Sep 17 00:00:00 2001 From: Eko Julianto Salim Date: Sat, 9 Oct 2021 22:06:22 +0700 Subject: [PATCH 01/28] Sensible default for DB --- config/dev.exs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/config/dev.exs b/config/dev.exs index b56ce17..dfd7670 100755 --- a/config/dev.exs +++ b/config/dev.exs @@ -2,10 +2,11 @@ use Mix.Config # Configure your database config :diskuy, Diskuy.Repo, - username: "rafif", - password: "rafif123", - database: "diskuy_dev_new", + username: "postgres", + password: "postgres", + database: "diskuy", hostname: "localhost", + port: 5433, show_sensitive_data_on_connection_error: true, pool_size: 10 -- GitLab From 4133d07ae9297c81f015b26b08cfb56c3223db17 Mon Sep 17 00:00:00 2001 From: Eko Julianto Salim Date: Sat, 9 Oct 2021 22:06:37 +0700 Subject: [PATCH 02/28] Add new route for posts per user --- lib/diskuy/forum_post_page.ex | 6 ++++++ lib/diskuy_web/controllers/post_pages_controller.ex | 5 +++++ lib/diskuy_web/router.ex | 1 + 3 files changed, 12 insertions(+) diff --git a/lib/diskuy/forum_post_page.ex b/lib/diskuy/forum_post_page.ex index 421ec5d..b154ec4 100644 --- a/lib/diskuy/forum_post_page.ex +++ b/lib/diskuy/forum_post_page.ex @@ -14,6 +14,12 @@ defmodule Diskuy.ForumPostPage do |> order_by([p], asc: p.inserted_at) end + def post_per_user(username) do + query_start() + |> where([p, u], u.username == ^username) + |> order_by([p], desc: p.points, desc: p.inserted_at) + end + defp query_start do Post |> join(:inner, [p], u in User, as: :users, on: p.user_id == u.id) diff --git a/lib/diskuy_web/controllers/post_pages_controller.ex b/lib/diskuy_web/controllers/post_pages_controller.ex index 9e95719..b70ddfb 100644 --- a/lib/diskuy_web/controllers/post_pages_controller.ex +++ b/lib/diskuy_web/controllers/post_pages_controller.ex @@ -10,6 +10,11 @@ defmodule DiskuyWeb.PostPagesController do paginate_and_render(conn, query) end + def pages_user(conn, %{"username" => username}) do + query = ForumPostPage.post_per_user(username) + paginate_and_render(conn, query) + end + defp paginate_and_render(conn, query) do case conn.params do %{"page" => page_num} -> diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index 269ac2c..1a9075a 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -73,6 +73,7 @@ defmodule DiskuyWeb.Router do get "/post/pages/thread/:thread_id", PostPagesController, :pages_thread + get "/post/pages/user/:username", PostPagesController, :pages_user options "/post/pages/thread/:thread_id", PostPagesController, :options resources "/post", PostController, except: [:new, :edit, :create, :update, :delete] -- GitLab From bdf7c3ec56715feebf2143dfc4ab3af8252ea480 Mon Sep 17 00:00:00 2001 From: Jonathan Nicholas Date: Fri, 29 Oct 2021 20:57:32 +0700 Subject: [PATCH 03/28] rename dislike to unlike --- .gitignore | 1 + config/dev.exs | 6 +++--- lib/diskuy_web/router.ex | 8 ++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index f62cb51..f5446b3 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ diskuy-*.tar # this depending on your deployment strategy. /priv/static/ +.DS_store \ No newline at end of file diff --git a/config/dev.exs b/config/dev.exs index b56ce17..083b22d 100755 --- a/config/dev.exs +++ b/config/dev.exs @@ -2,9 +2,9 @@ use Mix.Config # Configure your database config :diskuy, Diskuy.Repo, - username: "rafif", - password: "rafif123", - database: "diskuy_dev_new", + username: "postgres", + password: "postgres", + database: "diskuy", hostname: "localhost", show_sensitive_data_on_connection_error: true, pool_size: 10 diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index 269ac2c..7205a25 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -28,15 +28,15 @@ defmodule DiskuyWeb.Router do post "/threads/like/:id", ThreadController, :add_like options "/threads/like/:id", ThreadController, :options - post "/threads/dislike/:id", ThreadController, :delete_like - options "/threads/dislike/:id", ThreadController, :options + post "/threads/unlike/:id", ThreadController, :delete_like + options "/threads/unlike/:id", ThreadController, :options get "/threads/checklike/:id", ThreadLikeController, :check_like options "/threads/checklike/:id", ThreadLikeController, :options post "/post/like/:id", PostController, :add_like options "/post/like/:id", PostController, :options - post "/post/dislike/:id", PostController, :delete_like - options "/post/dislike/:id", PostController, :options + post "/post/unlike/:id", PostController, :delete_like + options "/post/unlike/:id", PostController, :options get "/post/checklike/:id", PostLikeController, :check_like options "/post/checklike/:id", PostLikeController, :options -- GitLab From 6837afd9a5448ebf91d63303e8ba11a80917271a Mon Sep 17 00:00:00 2001 From: Aldi Naufal Fitrah Date: Sat, 30 Oct 2021 13:50:09 +0700 Subject: [PATCH 04/28] feat(thread-like): add is_dislike field in thread_likes table --- .../20211030064247_alter_thread_like_add_is_dislike.exs | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 priv/repo/migrations/20211030064247_alter_thread_like_add_is_dislike.exs diff --git a/priv/repo/migrations/20211030064247_alter_thread_like_add_is_dislike.exs b/priv/repo/migrations/20211030064247_alter_thread_like_add_is_dislike.exs new file mode 100644 index 0000000..c18de0b --- /dev/null +++ b/priv/repo/migrations/20211030064247_alter_thread_like_add_is_dislike.exs @@ -0,0 +1,9 @@ +defmodule Diskuy.Repo.Migrations.AlterThreadLikeAddIsDislike do + use Ecto.Migration + + def change do + alter table(:thread_likes) do + add :is_dislike, :boolean, default: false + end + end +end -- GitLab From 6d6c0706f7149314e0fc8ee838f8b0cbf8352d11 Mon Sep 17 00:00:00 2001 From: Aldi Naufal Fitrah Date: Sat, 30 Oct 2021 14:03:40 +0700 Subject: [PATCH 05/28] feat(thread-dislike): add dislike & undislike endpoints & controllers --- .../controllers/thread_controller.ex | 23 +++++++++++++++++++ lib/diskuy_web/router.ex | 6 +++++ 2 files changed, 29 insertions(+) diff --git a/lib/diskuy_web/controllers/thread_controller.ex b/lib/diskuy_web/controllers/thread_controller.ex index 9ba486f..cc98bcf 100644 --- a/lib/diskuy_web/controllers/thread_controller.ex +++ b/lib/diskuy_web/controllers/thread_controller.ex @@ -70,6 +70,29 @@ defmodule DiskuyWeb.ThreadController do end end + def add_dislike(conn, %{"id" => id}) do + current_user = Guardian.Plug.current_resource(conn) + thread = Forum.get_thread!(id) + + with {:ok, %ThreadLike{} = _thread_like} <- Likes.create_thread_like(%{"user_id" => current_user.id, + "thread_id" => id, + "is_dislike" => true}), + {:ok, %Thread{} = thread} <- Forum.update_thread(thread, %{"points" => (thread.points - 1)}) do + render(conn, "show.json", thread: thread) + end + end + + def delete_dislike(conn, %{"id" => id}) do + current_user = Guardian.Plug.current_resource(conn) + thread = Forum.get_thread!(id) + thread_like = Likes.get_thread_like_by_refer!(current_user.id, id) + + with {:ok, %ThreadLike{}} <- Likes.delete_thread_like(thread_like), + {:ok, %Thread{} = thread} <- Forum.update_thread(thread, %{"points" => (thread.points+1)}) do + render(conn, "show.json", thread: thread) + end + end + defp put_user_id(conn, %{"thread" => thread_params}) do current_user = Guardian.Plug.current_resource(conn) new_params = Map.put(thread_params, "user_id", current_user.id) diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index 7205a25..fab82ca 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -30,6 +30,12 @@ defmodule DiskuyWeb.Router do options "/threads/like/:id", ThreadController, :options post "/threads/unlike/:id", ThreadController, :delete_like options "/threads/unlike/:id", ThreadController, :options + + post "/threads/dislike/:id", ThreadController, :add_dislike + options "/threads/dislike/:id", ThreadController, :options + post "/threads/undislike/:id", ThreadController, :delete_dislike + options "/threads/undislike/:id", ThreadController, :options + get "/threads/checklike/:id", ThreadLikeController, :check_like options "/threads/checklike/:id", ThreadLikeController, :options -- GitLab From 6c2caa98628829b44d1d881667005628e3dfb51f Mon Sep 17 00:00:00 2001 From: "ganiilhamirsyadi@gmail.com" Date: Sat, 30 Oct 2021 22:46:28 +0700 Subject: [PATCH 06/28] Implement list_thread_by_user_id and list_posts_by_user_id --- lib/diskuy/forum.ex | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/diskuy/forum.ex b/lib/diskuy/forum.ex index 5944ca7..f83eff5 100644 --- a/lib/diskuy/forum.ex +++ b/lib/diskuy/forum.ex @@ -298,4 +298,20 @@ defmodule Diskuy.Forum do def change_post(%Post{} = post, attrs \\ %{}) do Post.changeset(post, attrs) end + + @doc """ + TODO + """ + def list_threads_by_user_id(user_id) do + query = from t in Thread, where: t.user_id == ^user_id + Repo.all(query) + end + + @doc """ + TODO + """ + def list_posts_by_user_id(user_id) do + query = from p in Post, order_by: p.inserted_at, where: p.user_id == ^user_id + Repo.all(query) + end end -- GitLab From 483ea35ca5fe020b0839da255a00dd120d9a14f7 Mon Sep 17 00:00:00 2001 From: "ganiilhamirsyadi@gmail.com" Date: Sat, 30 Oct 2021 22:47:53 +0700 Subject: [PATCH 07/28] Revert "Implement list_thread_by_user_id and list_posts_by_user_id" This reverts commit 6c2caa98628829b44d1d881667005628e3dfb51f. --- lib/diskuy/forum.ex | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/lib/diskuy/forum.ex b/lib/diskuy/forum.ex index f83eff5..5944ca7 100644 --- a/lib/diskuy/forum.ex +++ b/lib/diskuy/forum.ex @@ -298,20 +298,4 @@ defmodule Diskuy.Forum do def change_post(%Post{} = post, attrs \\ %{}) do Post.changeset(post, attrs) end - - @doc """ - TODO - """ - def list_threads_by_user_id(user_id) do - query = from t in Thread, where: t.user_id == ^user_id - Repo.all(query) - end - - @doc """ - TODO - """ - def list_posts_by_user_id(user_id) do - query = from p in Post, order_by: p.inserted_at, where: p.user_id == ^user_id - Repo.all(query) - end end -- GitLab From c169460bfc6b1ccd9e81f64be0878b704c671743 Mon Sep 17 00:00:00 2001 From: "ganiilhamirsyadi@gmail.com" Date: Sat, 30 Oct 2021 22:46:28 +0700 Subject: [PATCH 08/28] Implement list_thread_by_user_id and list_posts_by_user_id --- lib/diskuy/forum.ex | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/diskuy/forum.ex b/lib/diskuy/forum.ex index 5944ca7..f83eff5 100644 --- a/lib/diskuy/forum.ex +++ b/lib/diskuy/forum.ex @@ -298,4 +298,20 @@ defmodule Diskuy.Forum do def change_post(%Post{} = post, attrs \\ %{}) do Post.changeset(post, attrs) end + + @doc """ + TODO + """ + def list_threads_by_user_id(user_id) do + query = from t in Thread, where: t.user_id == ^user_id + Repo.all(query) + end + + @doc """ + TODO + """ + def list_posts_by_user_id(user_id) do + query = from p in Post, order_by: p.inserted_at, where: p.user_id == ^user_id + Repo.all(query) + end end -- GitLab From b02e05d18f92994c4acd25558529a3d71438f99a Mon Sep 17 00:00:00 2001 From: Alif Saddid Date: Tue, 9 Nov 2021 16:07:38 +0700 Subject: [PATCH 09/28] Created view for points and badges --- lib/diskuy_web/views/user_view.ex | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/diskuy_web/views/user_view.ex b/lib/diskuy_web/views/user_view.ex index a2b2732..ab3d7cf 100644 --- a/lib/diskuy_web/views/user_view.ex +++ b/lib/diskuy_web/views/user_view.ex @@ -14,6 +14,10 @@ defmodule DiskuyWeb.UserView do %{data: render_one(user, UserView, "user_token.json")} end + def render("show_user_points.json", %{points: points}) do + %{data: render_one(points, UserView, "user_points.json")} + end + def render("user.json", %{user: user}) do %{id: user.id, username: user.username, @@ -33,4 +37,18 @@ defmodule DiskuyWeb.UserView do token: token } end + + def render("user_points.json", %{user: points}) do + %{ + points: points + } + end + + def render("user_badges.json", %{badges: badges}) do + %{ + gold: badges.gold, + silver: badges.silver, + bronze: badges.bronze + } + end end -- GitLab From 3bce586523bc5bf439782d53ac9fff05ac930c4f Mon Sep 17 00:00:00 2001 From: Alif Saddid Date: Tue, 9 Nov 2021 16:08:10 +0700 Subject: [PATCH 10/28] Created dummy controllers for get user points --- lib/diskuy_web/controllers/user_controller.ex | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/diskuy_web/controllers/user_controller.ex b/lib/diskuy_web/controllers/user_controller.ex index 4d73833..753659f 100644 --- a/lib/diskuy_web/controllers/user_controller.ex +++ b/lib/diskuy_web/controllers/user_controller.ex @@ -33,6 +33,10 @@ defmodule DiskuyWeb.UserController do render(conn, "show.json", user: user) end + def get_user_points(conn, %{"name" => name}) do + user = Account.get_by_username!(name) + render(conn, "show_user_points.json", points: 5959) + end def update(conn, %{"user" => user_params}) do user = Guardian.Plug.current_resource(conn) -- GitLab From e1a48e0f1398a7788b6acbd823f19b8b8b9cd078 Mon Sep 17 00:00:00 2001 From: Alif Saddid Date: Tue, 9 Nov 2021 16:08:31 +0700 Subject: [PATCH 11/28] Added routes for get user points --- lib/diskuy_web/router.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index 269ac2c..37794b8 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -49,6 +49,7 @@ defmodule DiskuyWeb.Router do options "/users", UserController, :options options "/users/:id", UserController, :options get "/users/name/:name", UserController, :show_by_username + get "/users/points/:name", UserController, :get_user_points options "/users/name/:name", UserController, :options resources "/topics", TopicController, except: [:new, :edit, :create, :update, :delete] -- GitLab From dbd8365a219989129eaadb7d379b147f9156d134 Mon Sep 17 00:00:00 2001 From: Alif Saddid Date: Tue, 9 Nov 2021 16:41:42 +0700 Subject: [PATCH 12/28] Created view for user badges --- lib/diskuy_web/views/user_view.ex | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/diskuy_web/views/user_view.ex b/lib/diskuy_web/views/user_view.ex index ab3d7cf..b56b562 100644 --- a/lib/diskuy_web/views/user_view.ex +++ b/lib/diskuy_web/views/user_view.ex @@ -18,6 +18,10 @@ defmodule DiskuyWeb.UserView do %{data: render_one(points, UserView, "user_points.json")} end + def render("show_user_badges.json", %{badges: badges}) do + %{data: render_one(badges, UserView, "user_badges.json")} + end + def render("user.json", %{user: user}) do %{id: user.id, username: user.username, @@ -44,7 +48,7 @@ defmodule DiskuyWeb.UserView do } end - def render("user_badges.json", %{badges: badges}) do + def render("user_badges.json", %{user: badges}) do %{ gold: badges.gold, silver: badges.silver, -- GitLab From f5332e73a9c3ad574dc505a3d0396188ea234895 Mon Sep 17 00:00:00 2001 From: Alif Saddid Date: Tue, 9 Nov 2021 16:42:13 +0700 Subject: [PATCH 13/28] Created dummy controller for get user badges --- lib/diskuy_web/controllers/user_controller.ex | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/diskuy_web/controllers/user_controller.ex b/lib/diskuy_web/controllers/user_controller.ex index 753659f..5514483 100644 --- a/lib/diskuy_web/controllers/user_controller.ex +++ b/lib/diskuy_web/controllers/user_controller.ex @@ -38,6 +38,15 @@ defmodule DiskuyWeb.UserController do render(conn, "show_user_points.json", points: 5959) end + def get_user_badges(conn, %{"name" => name}) do + badges = %{ + gold: 1, + silver: 2, + bronze: 3 + } + render(conn, "show_user_badges.json", badges: badges) + end + def update(conn, %{"user" => user_params}) do user = Guardian.Plug.current_resource(conn) new_user_params = user_params |> Map.drop(["email", "id", "role"]) -- GitLab From ccef0f7c9c21c2dcc6a262133ea0e76ea176d729 Mon Sep 17 00:00:00 2001 From: Alif Saddid Date: Tue, 9 Nov 2021 16:42:31 +0700 Subject: [PATCH 14/28] Added route for get user badges --- lib/diskuy_web/router.ex | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index 37794b8..8eb19d8 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -50,6 +50,7 @@ defmodule DiskuyWeb.Router do options "/users/:id", UserController, :options get "/users/name/:name", UserController, :show_by_username get "/users/points/:name", UserController, :get_user_points + get "/users/badges/:name", UserController, :get_user_badges options "/users/name/:name", UserController, :options resources "/topics", TopicController, except: [:new, :edit, :create, :update, :delete] -- GitLab From b9cbba2978a4ac183544fec9a43f3a18079ccb7f Mon Sep 17 00:00:00 2001 From: "ganiilhamirsyadi@gmail.com" Date: Sat, 13 Nov 2021 22:42:03 +0700 Subject: [PATCH 15/28] Create query builder for calculating the Leaderboard --- lib/diskuy/leaderboard.ex | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 lib/diskuy/leaderboard.ex diff --git a/lib/diskuy/leaderboard.ex b/lib/diskuy/leaderboard.ex new file mode 100644 index 0000000..b8c09f0 --- /dev/null +++ b/lib/diskuy/leaderboard.ex @@ -0,0 +1,21 @@ +defmodule Diskuy.Leaderboard do + @moduledoc """ + The Query Builder For calculating the Leaderboard. + """ + + import Ecto.Query, warn: false + + def get_leaderboard do + query = """ + SELECT u.username as user_name, COALESCE(SUM(t.points + p.points), SUM(t.points)) as total_points + FROM threads as t + LEFT JOIN posts as p ON p.user_id = t.user_id + JOIN users as u ON u.id = t.user_id + GROUP BY u.username + ORDER BY total_points DESC + LIMIT 20 + """ + Ecto.Adapters.SQL.query!(Diskuy.Repo, query) + end + +end -- GitLab From aff0606042aa3c5e9fa7974ba1c61b294a766fb9 Mon Sep 17 00:00:00 2001 From: "ganiilhamirsyadi@gmail.com" Date: Sat, 13 Nov 2021 23:07:10 +0700 Subject: [PATCH 16/28] Update query builder for calculating the leaderboard --- config/dev.exs | 6 +++--- lib/diskuy/forum.ex | 15 --------------- lib/diskuy/leaderboard.ex | 5 ++--- .../controllers/leaderboard_controller.ex | 12 ++++++++++++ lib/diskuy_web/router.ex | 2 ++ lib/diskuy_web/views/leaderboard_view.ex | 18 ++++++++++++++++++ 6 files changed, 37 insertions(+), 21 deletions(-) create mode 100644 lib/diskuy_web/controllers/leaderboard_controller.ex create mode 100644 lib/diskuy_web/views/leaderboard_view.ex diff --git a/config/dev.exs b/config/dev.exs index b56ce17..083b22d 100755 --- a/config/dev.exs +++ b/config/dev.exs @@ -2,9 +2,9 @@ use Mix.Config # Configure your database config :diskuy, Diskuy.Repo, - username: "rafif", - password: "rafif123", - database: "diskuy_dev_new", + username: "postgres", + password: "postgres", + database: "diskuy", hostname: "localhost", show_sensitive_data_on_connection_error: true, pool_size: 10 diff --git a/lib/diskuy/forum.ex b/lib/diskuy/forum.ex index f83eff5..8f3ceb6 100644 --- a/lib/diskuy/forum.ex +++ b/lib/diskuy/forum.ex @@ -299,19 +299,4 @@ defmodule Diskuy.Forum do Post.changeset(post, attrs) end - @doc """ - TODO - """ - def list_threads_by_user_id(user_id) do - query = from t in Thread, where: t.user_id == ^user_id - Repo.all(query) - end - - @doc """ - TODO - """ - def list_posts_by_user_id(user_id) do - query = from p in Post, order_by: p.inserted_at, where: p.user_id == ^user_id - Repo.all(query) - end end diff --git a/lib/diskuy/leaderboard.ex b/lib/diskuy/leaderboard.ex index b8c09f0..98643c1 100644 --- a/lib/diskuy/leaderboard.ex +++ b/lib/diskuy/leaderboard.ex @@ -7,11 +7,10 @@ defmodule Diskuy.Leaderboard do def get_leaderboard do query = """ - SELECT u.username as user_name, COALESCE(SUM(t.points + p.points), SUM(t.points)) as total_points + SELECT t.user_id as user_id, COALESCE(SUM(t.points + p.points), SUM(t.points)) as total_points FROM threads as t LEFT JOIN posts as p ON p.user_id = t.user_id - JOIN users as u ON u.id = t.user_id - GROUP BY u.username + GROUP BY t.user_id ORDER BY total_points DESC LIMIT 20 """ diff --git a/lib/diskuy_web/controllers/leaderboard_controller.ex b/lib/diskuy_web/controllers/leaderboard_controller.ex new file mode 100644 index 0000000..b77477f --- /dev/null +++ b/lib/diskuy_web/controllers/leaderboard_controller.ex @@ -0,0 +1,12 @@ +defmodule DiskuyWeb.LeaderboardController do + use DiskuyWeb, :controller + alias Diskuy.Leaderboard + + action_fallback DiskuyWeb.FallbackController + + def index(conn, _params) do + leaderboard = Leaderboard.get_leaderboard() + render(conn, "index.json", leaderboard: leaderboard) + end + +end diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index 269ac2c..cd15bb8 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -79,6 +79,8 @@ defmodule DiskuyWeb.Router do options "/post", PostController, :options options "/post/:id", PostController, :options + resources "/leaderboard", LeaderboardController + # post "/users/signup", UserController, :create # options "/users/signup", PostController, :options # post "/users/signin", UserController, :signin diff --git a/lib/diskuy_web/views/leaderboard_view.ex b/lib/diskuy_web/views/leaderboard_view.ex new file mode 100644 index 0000000..b35501b --- /dev/null +++ b/lib/diskuy_web/views/leaderboard_view.ex @@ -0,0 +1,18 @@ +defmodule DiskuyWeb.LeaderboardView do + use DiskuyWeb, :view + alias DiskuyWeb.LeaderboardView + alias Diskuy.Account + + def render("index.json", %{leaderboard: leaderboard}) do + %{data: render_many(leaderboard, LeaderboardView, "leaderboard_row.json")} + end + + def render("leaderboard_row.json", %{leaderboard_row: leaderboard_row}) do + user = Account.get_user!(leaderboard_row.user_id) + %{ + username: user.username, + total_points: leaderboard_row.total_points, + } + end + +end -- GitLab From b0bf874f910116315fab97c60f80975e8810deed Mon Sep 17 00:00:00 2001 From: "ganiilhamirsyadi@gmail.com" Date: Sat, 13 Nov 2021 23:45:26 +0700 Subject: [PATCH 17/28] convert RAW SQL on Leaderboard Query Builder to use Ecto Query --- lib/diskuy/leaderboard.ex | 13 ++++++++++++- lib/diskuy_web/views/leaderboard_view.ex | 12 +----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/lib/diskuy/leaderboard.ex b/lib/diskuy/leaderboard.ex index 98643c1..2aacae4 100644 --- a/lib/diskuy/leaderboard.ex +++ b/lib/diskuy/leaderboard.ex @@ -1,9 +1,13 @@ defmodule Diskuy.Leaderboard do + @moduledoc """ The Query Builder For calculating the Leaderboard. """ import Ecto.Query, warn: false + alias Diskuy.Repo + alias Diskuy.Forum.Thread + alias Diskuy.Forum.Post def get_leaderboard do query = """ @@ -14,7 +18,14 @@ defmodule Diskuy.Leaderboard do ORDER BY total_points DESC LIMIT 20 """ - Ecto.Adapters.SQL.query!(Diskuy.Repo, query) + query = from t in Thread, + left_join: p in Post, + on: p.user_id == t.user_id, + group_by: t.user_id, + limit: 10, + select: %{total_points: sum(t.points + p.points) |> coalesce(sum(t.points)) |> coalesce(0), user_id: t.user_id}, + order_by: [desc: sum(t.points + p.points) |> coalesce(sum(t.points)) |> coalesce(0)] + Repo.all(query) end end diff --git a/lib/diskuy_web/views/leaderboard_view.ex b/lib/diskuy_web/views/leaderboard_view.ex index b35501b..8669f5f 100644 --- a/lib/diskuy_web/views/leaderboard_view.ex +++ b/lib/diskuy_web/views/leaderboard_view.ex @@ -1,18 +1,8 @@ defmodule DiskuyWeb.LeaderboardView do use DiskuyWeb, :view - alias DiskuyWeb.LeaderboardView - alias Diskuy.Account def render("index.json", %{leaderboard: leaderboard}) do - %{data: render_many(leaderboard, LeaderboardView, "leaderboard_row.json")} - end - - def render("leaderboard_row.json", %{leaderboard_row: leaderboard_row}) do - user = Account.get_user!(leaderboard_row.user_id) - %{ - username: user.username, - total_points: leaderboard_row.total_points, - } + %{data: leaderboard} end end -- GitLab From 95f9713a070783789044dd7305d3b6bc571fe1a5 Mon Sep 17 00:00:00 2001 From: Alif Saddid Date: Fri, 26 Nov 2021 16:37:46 +0700 Subject: [PATCH 18/28] Added function to retrieve total points and badges count --- lib/diskuy/account.ex | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/lib/diskuy/account.ex b/lib/diskuy/account.ex index b9557a3..736129c 100644 --- a/lib/diskuy/account.ex +++ b/lib/diskuy/account.ex @@ -7,6 +7,8 @@ defmodule Diskuy.Account do alias Diskuy.Repo alias Diskuy.Account.User + alias Diskuy.Forum.Post + alias Diskuy.Forum.Thread @doc """ Returns the list of users. @@ -123,4 +125,20 @@ defmodule Diskuy.Account do def change_user(%User{} = user, attrs \\ %{}) do User.changeset(user, attrs) end + + def get_points_by_user_id(id) do + query = from t in Thread, + limit: 1, + select: %{total_points: sum(t.points) |> coalesce(0)}, + where: (t.user_id == ^id) + Repo.one(query) + end + + def get_badged_post_count(id, minimum_points) do + query = from t in Thread, + limit: 1, + select: %{count: count(t.id) |> coalesce(0)}, + where: (t.user_id == ^id) and (t.points >= ^minimum_points) + Repo.one(query) + end end -- GitLab From b2424de33586153f96a0a54568113c30bd1637b8 Mon Sep 17 00:00:00 2001 From: Alif Saddid Date: Fri, 26 Nov 2021 16:38:20 +0700 Subject: [PATCH 19/28] Implemented get_user_points and get_user_badges --- lib/diskuy_web/controllers/user_controller.ex | 24 +++++++++++++------ 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/lib/diskuy_web/controllers/user_controller.ex b/lib/diskuy_web/controllers/user_controller.ex index 5514483..67974e3 100644 --- a/lib/diskuy_web/controllers/user_controller.ex +++ b/lib/diskuy_web/controllers/user_controller.ex @@ -6,6 +6,10 @@ defmodule DiskuyWeb.UserController do alias DiskuyWeb.Auth.Guardian alias DiskuyWeb.Auth.GoogleAuth + @bronze_treshold 20 + @silver_treshold 40 + @gold_treshold 80 + action_fallback DiskuyWeb.FallbackController def index(conn, _params) do @@ -35,16 +39,22 @@ defmodule DiskuyWeb.UserController do def get_user_points(conn, %{"name" => name}) do user = Account.get_by_username!(name) - render(conn, "show_user_points.json", points: 5959) + points = Account.get_points_by_user_id(user.id) + render(conn, "show_user_points.json", points: points.total_points) end def get_user_badges(conn, %{"name" => name}) do - badges = %{ - gold: 1, - silver: 2, - bronze: 3 - } - render(conn, "show_user_badges.json", badges: badges) + user = Account.get_by_username!(name) + + gold_badges = Account.get_badged_post_count(user.id, @gold_treshold) + silver_badges = Account.get_badged_post_count(user.id, @silver_treshold) + bronze_badges = Account.get_badged_post_count(user.id, @bronze_treshold) + + render(conn, "show_user_badges.json", badges: %{ + gold: gold_badges.count, + silver: silver_badges.count - gold_badges.count, + bronze: bronze_badges.count - silver_badges.count + }) end def update(conn, %{"user" => user_params}) do -- GitLab From dffeebb6e760472dc2bc9eba01b759051926df29 Mon Sep 17 00:00:00 2001 From: ganiirsyadi Date: Sat, 27 Nov 2021 21:30:55 +0700 Subject: [PATCH 20/28] remove unused code --- lib/diskuy/leaderboard.ex | 8 -------- 1 file changed, 8 deletions(-) diff --git a/lib/diskuy/leaderboard.ex b/lib/diskuy/leaderboard.ex index 2aacae4..8354041 100644 --- a/lib/diskuy/leaderboard.ex +++ b/lib/diskuy/leaderboard.ex @@ -10,14 +10,6 @@ defmodule Diskuy.Leaderboard do alias Diskuy.Forum.Post def get_leaderboard do - query = """ - SELECT t.user_id as user_id, COALESCE(SUM(t.points + p.points), SUM(t.points)) as total_points - FROM threads as t - LEFT JOIN posts as p ON p.user_id = t.user_id - GROUP BY t.user_id - ORDER BY total_points DESC - LIMIT 20 - """ query = from t in Thread, left_join: p in Post, on: p.user_id == t.user_id, -- GitLab From 3468b81126c84a291d61261cec746e31313ffb29 Mon Sep 17 00:00:00 2001 From: ganiirsyadi Date: Sat, 27 Nov 2021 21:59:22 +0700 Subject: [PATCH 21/28] add user_name on response --- lib/diskuy/leaderboard.ex | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/diskuy/leaderboard.ex b/lib/diskuy/leaderboard.ex index 8354041..5a40421 100644 --- a/lib/diskuy/leaderboard.ex +++ b/lib/diskuy/leaderboard.ex @@ -8,14 +8,17 @@ defmodule Diskuy.Leaderboard do alias Diskuy.Repo alias Diskuy.Forum.Thread alias Diskuy.Forum.Post + alias Diskuy.Account.User def get_leaderboard do query = from t in Thread, left_join: p in Post, on: p.user_id == t.user_id, - group_by: t.user_id, + left_join: u in User, + on: u.id == t.user_id, + group_by: u.username, limit: 10, - select: %{total_points: sum(t.points + p.points) |> coalesce(sum(t.points)) |> coalesce(0), user_id: t.user_id}, + select: %{total_points: sum(t.points + p.points) |> coalesce(sum(t.points)) |> coalesce(0), user_name: u.username}, order_by: [desc: sum(t.points + p.points) |> coalesce(sum(t.points)) |> coalesce(0)] Repo.all(query) end -- GitLab From 6378f876628c9c1dc6744c52a3aeebc5e83de4e4 Mon Sep 17 00:00:00 2001 From: Aldi Naufal Fitrah Date: Sat, 27 Nov 2021 22:02:57 +0700 Subject: [PATCH 22/28] feat(vote): add is_dislike to response --- lib/diskuy/likes/thread_like.ex | 1 + lib/diskuy_web/controllers/thread_controller.ex | 6 +++--- lib/diskuy_web/views/thread_like_view.ex | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/diskuy/likes/thread_like.ex b/lib/diskuy/likes/thread_like.ex index e1627f8..4329d32 100644 --- a/lib/diskuy/likes/thread_like.ex +++ b/lib/diskuy/likes/thread_like.ex @@ -5,6 +5,7 @@ defmodule Diskuy.Likes.ThreadLike do schema "thread_likes" do field :user_id, :id field :thread_id, :id + field :is_dislike, :boolean timestamps() end diff --git a/lib/diskuy_web/controllers/thread_controller.ex b/lib/diskuy_web/controllers/thread_controller.ex index cc98bcf..a246488 100644 --- a/lib/diskuy_web/controllers/thread_controller.ex +++ b/lib/diskuy_web/controllers/thread_controller.ex @@ -54,7 +54,7 @@ defmodule DiskuyWeb.ThreadController do with {:ok, %ThreadLike{} = _thread_like} <- Likes.create_thread_like(%{"user_id" => current_user.id, "thread_id" => id}), - {:ok, %Thread{} = thread} <- Forum.update_thread(thread, %{"points" => (thread.points+ 1)}) do + {:ok, %Thread{} = thread} <- Forum.update_thread(thread, %{"points" => (thread.points + 1)}) do render(conn, "show.json", thread: thread) end end @@ -65,7 +65,7 @@ defmodule DiskuyWeb.ThreadController do thread_like = Likes.get_thread_like_by_refer!(current_user.id, id) with {:ok, %ThreadLike{}} <- Likes.delete_thread_like(thread_like), - {:ok, %Thread{} = thread} <- Forum.update_thread(thread, %{"points" => (thread.points-1)}) do + {:ok, %Thread{} = thread} <- Forum.update_thread(thread, %{"points" => (thread.points - 1)}) do render(conn, "show.json", thread: thread) end end @@ -88,7 +88,7 @@ defmodule DiskuyWeb.ThreadController do thread_like = Likes.get_thread_like_by_refer!(current_user.id, id) with {:ok, %ThreadLike{}} <- Likes.delete_thread_like(thread_like), - {:ok, %Thread{} = thread} <- Forum.update_thread(thread, %{"points" => (thread.points+1)}) do + {:ok, %Thread{} = thread} <- Forum.update_thread(thread, %{"points" => (thread.points + 1)}) do render(conn, "show.json", thread: thread) end end diff --git a/lib/diskuy_web/views/thread_like_view.ex b/lib/diskuy_web/views/thread_like_view.ex index 7b48301..f35ae0e 100644 --- a/lib/diskuy_web/views/thread_like_view.ex +++ b/lib/diskuy_web/views/thread_like_view.ex @@ -13,6 +13,8 @@ defmodule DiskuyWeb.ThreadLikeView do def render("thread_like.json", %{thread_like: thread_like}) do %{id: thread_like.id, user_id: thread_like.user_id, - thread_id: thread_like.thread_id} + thread_id: thread_like.thread_id, + is_dislike: thread_like.is_dislike + } end end -- GitLab From 9f2776d79d5799db57fce29a8084bccb7db617fa Mon Sep 17 00:00:00 2001 From: Alif Saddid Date: Sat, 27 Nov 2021 22:34:11 +0700 Subject: [PATCH 23/28] Fixed query for calculate points --- lib/diskuy/account.ex | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/lib/diskuy/account.ex b/lib/diskuy/account.ex index 736129c..9d2fd7e 100644 --- a/lib/diskuy/account.ex +++ b/lib/diskuy/account.ex @@ -127,11 +127,16 @@ defmodule Diskuy.Account do end def get_points_by_user_id(id) do - query = from t in Thread, - limit: 1, - select: %{total_points: sum(t.points) |> coalesce(0)}, - where: (t.user_id == ^id) - Repo.one(query) + points_threads_query = from t in Thread, + select: %{total_points: sum(t.points)}, + where: (t.user_id == ^id) + points_posts_query = from p in Post, + select: %{total_points: sum(p.points)}, + where: (p.user_id == ^id), + union: ^points_threads_query + points_query = from p in subquery(points_posts_query), + select: %{total_points: sum(p.total_points)} + Repo.one(points_query) end def get_badged_post_count(id, minimum_points) do -- GitLab From c861cbc41ea769f73f40365933b72bc1ea0d3909 Mon Sep 17 00:00:00 2001 From: ganiirsyadi Date: Sat, 27 Nov 2021 22:53:11 +0700 Subject: [PATCH 24/28] Fix double count points --- lib/diskuy/leaderboard.ex | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/lib/diskuy/leaderboard.ex b/lib/diskuy/leaderboard.ex index 5a40421..43b22a5 100644 --- a/lib/diskuy/leaderboard.ex +++ b/lib/diskuy/leaderboard.ex @@ -11,15 +11,23 @@ defmodule Diskuy.Leaderboard do alias Diskuy.Account.User def get_leaderboard do - query = from t in Thread, - left_join: p in Post, - on: p.user_id == t.user_id, + in_query_1 = from t in Thread, + select: %{sum: sum(t.points), user_id: t.user_id}, + group_by: t.user_id + + in_query_2 = from p in Post, + select: %{sum: sum(p.points), user_id: p.user_id}, + group_by: p.user_id, + union_all: ^in_query_1 + + query = from res in subquery(in_query_2), left_join: u in User, - on: u.id == t.user_id, + on: res.user_id == u.id, group_by: u.username, + select: %{points: sum(res.sum), user_name: u.username}, limit: 10, - select: %{total_points: sum(t.points + p.points) |> coalesce(sum(t.points)) |> coalesce(0), user_name: u.username}, - order_by: [desc: sum(t.points + p.points) |> coalesce(sum(t.points)) |> coalesce(0)] + order_by: [desc: sum(res.sum) |> coalesce(0)] + Repo.all(query) end -- GitLab From 808a6d87ccbe71d342b10c542d72c975c37d08d9 Mon Sep 17 00:00:00 2001 From: Aldi Naufal Fitrah Date: Sat, 27 Nov 2021 23:07:41 +0700 Subject: [PATCH 25/28] feat(vote): create post dislike feature --- lib/diskuy/likes/post_like.ex | 1 + lib/diskuy_web/controllers/post_controller.ex | 27 +++++++++++++++++-- lib/diskuy_web/router.ex | 5 ++++ lib/diskuy_web/views/post_like_view.ex | 3 ++- ...7160455_alter_post_like_add_is_dislike.exs | 9 +++++++ 5 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 priv/repo/migrations/20211127160455_alter_post_like_add_is_dislike.exs diff --git a/lib/diskuy/likes/post_like.ex b/lib/diskuy/likes/post_like.ex index ce7ffef..b98a84d 100644 --- a/lib/diskuy/likes/post_like.ex +++ b/lib/diskuy/likes/post_like.ex @@ -5,6 +5,7 @@ defmodule Diskuy.Likes.PostLike do schema "post_likes" do field :user_id, :id field :post_id, :id + field :is_dislike, :boolean timestamps() end diff --git a/lib/diskuy_web/controllers/post_controller.ex b/lib/diskuy_web/controllers/post_controller.ex index 76bc663..1d98f29 100644 --- a/lib/diskuy_web/controllers/post_controller.ex +++ b/lib/diskuy_web/controllers/post_controller.ex @@ -55,7 +55,7 @@ defmodule DiskuyWeb.PostController do with {:ok, %PostLike{}} <- Likes.create_post_like(%{"user_id" => current_user.id, "post_id" => id}), - {:ok, %Post{} = post} <- Forum.update_post(post, %{"points" => (post.points+1)}) do + {:ok, %Post{} = post} <- Forum.update_post(post, %{"points" => (post.points + 1)}) do render(conn, "show.json", post: post) end end @@ -66,7 +66,30 @@ defmodule DiskuyWeb.PostController do post_like = Likes.get_post_like_by_refer!(current_user.id, id) with {:ok, %PostLike{}} <- Likes.delete_post_like(post_like), - {:ok, %Post{}} <- Forum.update_post(post, %{"points" => (post.points-1)}) do + {:ok, %Post{}} <- Forum.update_post(post, %{"points" => (post.points - 1)}) do + render(conn, "show.json", post: post) + end + end + + def add_dislike(conn, %{"id" => id}) do + current_user = Guardian.Plug.current_resource(conn) + post = Forum.get_post!(id) + + with {:ok, %PostLike{}} <- Likes.create_post_like(%{"user_id" => current_user.id, + "post_id" => id, + "is_dislike" => true}), + {:ok, %Post{} = post} <- Forum.update_post(post, %{"points" => (post.points - 1)}) do + render(conn, "show.json", post: post) + end + end + + def delete_dislike(conn, %{"id" => id}) do + current_user = Guardian.Plug.current_resource(conn) + post = Forum.get_post!(id) + post_like = Likes.get_post_like_by_refer!(current_user.id, id) + + with {:ok, %PostLike{}} <- Likes.delete_post_like(post_like), + {:ok, %Post{}} <- Forum.update_post(post, %{"points" => (post.points + 1)}) do render(conn, "show.json", post: post) end end diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index fab82ca..8903650 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -46,6 +46,11 @@ defmodule DiskuyWeb.Router do get "/post/checklike/:id", PostLikeController, :check_like options "/post/checklike/:id", PostLikeController, :options + post "/post/dislike/:id", PostController, :add_dislike + options "/post/dislike/:id", PostController, :options + post "/post/undislike/:id", PostController, :delete_dislike + options "/post/undislike/:id", PostController, :options + end scope "/api", DiskuyWeb do diff --git a/lib/diskuy_web/views/post_like_view.ex b/lib/diskuy_web/views/post_like_view.ex index c50e057..67b620e 100644 --- a/lib/diskuy_web/views/post_like_view.ex +++ b/lib/diskuy_web/views/post_like_view.ex @@ -13,6 +13,7 @@ defmodule DiskuyWeb.PostLikeView do def render("post_like.json", %{post_like: post_like}) do %{id: post_like.id, user_id: post_like.user_id, - thread_id: post_like.post_id} + thread_id: post_like.post_id, + is_dislike: post_like.is_dislike} end end diff --git a/priv/repo/migrations/20211127160455_alter_post_like_add_is_dislike.exs b/priv/repo/migrations/20211127160455_alter_post_like_add_is_dislike.exs new file mode 100644 index 0000000..97a9688 --- /dev/null +++ b/priv/repo/migrations/20211127160455_alter_post_like_add_is_dislike.exs @@ -0,0 +1,9 @@ +defmodule Diskuy.Repo.Migrations.AlterPostLikeAddIsDislike do + use Ecto.Migration + + def change do + alter table(:post_likes) do + add :is_dislike, :boolean, default: false + end + end +end -- GitLab From e9dc328c3b260073eaedf4575413bd19b2bb2e9a Mon Sep 17 00:00:00 2001 From: Eko Julianto Salim Date: Mon, 29 Nov 2021 07:18:50 +0700 Subject: [PATCH 26/28] Adjust Medal Treshold Slightly --- lib/diskuy_web/controllers/user_controller.ex | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/diskuy_web/controllers/user_controller.ex b/lib/diskuy_web/controllers/user_controller.ex index 67974e3..3883516 100644 --- a/lib/diskuy_web/controllers/user_controller.ex +++ b/lib/diskuy_web/controllers/user_controller.ex @@ -6,9 +6,9 @@ defmodule DiskuyWeb.UserController do alias DiskuyWeb.Auth.Guardian alias DiskuyWeb.Auth.GoogleAuth - @bronze_treshold 20 - @silver_treshold 40 - @gold_treshold 80 + @bronze_treshold 5 + @silver_treshold 20 + @gold_treshold 50 action_fallback DiskuyWeb.FallbackController @@ -51,8 +51,8 @@ defmodule DiskuyWeb.UserController do bronze_badges = Account.get_badged_post_count(user.id, @bronze_treshold) render(conn, "show_user_badges.json", badges: %{ - gold: gold_badges.count, - silver: silver_badges.count - gold_badges.count, + gold: gold_badges.count, + silver: silver_badges.count - gold_badges.count, bronze: bronze_badges.count - silver_badges.count }) end -- GitLab From 33adf513a2d63f181ecb8eb9ec2d1bb51f694b1f Mon Sep 17 00:00:00 2001 From: Eko Julianto Salim Date: Mon, 29 Nov 2021 08:50:11 +0700 Subject: [PATCH 27/28] Integrate Post Badge with Accounts --- config/dev.exs | 2 +- lib/diskuy/account.ex | 69 +++++++++++++++---- lib/diskuy_web/controllers/user_controller.ex | 40 ++++++++--- lib/diskuy_web/router.ex | 1 + lib/diskuy_web/views/user_view.ex | 24 ++++++- 5 files changed, 111 insertions(+), 25 deletions(-) diff --git a/config/dev.exs b/config/dev.exs index dfd7670..0350ba5 100755 --- a/config/dev.exs +++ b/config/dev.exs @@ -6,7 +6,7 @@ config :diskuy, Diskuy.Repo, password: "postgres", database: "diskuy", hostname: "localhost", - port: 5433, + port: 5432, show_sensitive_data_on_connection_error: true, pool_size: 10 diff --git a/lib/diskuy/account.ex b/lib/diskuy/account.ex index 9d2fd7e..b27a9db 100644 --- a/lib/diskuy/account.ex +++ b/lib/diskuy/account.ex @@ -9,6 +9,7 @@ defmodule Diskuy.Account do alias Diskuy.Account.User alias Diskuy.Forum.Post alias Diskuy.Forum.Thread + alias Diskuy.Forum.Topic @doc """ Returns the list of users. @@ -43,6 +44,7 @@ defmodule Diskuy.Account do case Repo.get_by(User, email: email) do nil -> {:error, :not_found} + user -> {:ok, user} end @@ -54,6 +56,7 @@ defmodule Diskuy.Account do case Repo.get_by(User, username: username) do nil -> {:error, :not_found} + user -> {:ok, user} end @@ -127,23 +130,63 @@ defmodule Diskuy.Account do end def get_points_by_user_id(id) do - points_threads_query = from t in Thread, - select: %{total_points: sum(t.points)}, - where: (t.user_id == ^id) - points_posts_query = from p in Post, - select: %{total_points: sum(p.points)}, - where: (p.user_id == ^id), - union: ^points_threads_query - points_query = from p in subquery(points_posts_query), - select: %{total_points: sum(p.total_points)} + points_threads_query = + from t in Thread, + select: %{total_points: sum(t.points)}, + where: t.user_id == ^id + + points_posts_query = + from p in Post, + select: %{total_points: sum(p.points)}, + where: p.user_id == ^id, + union: ^points_threads_query + + points_query = + from p in subquery(points_posts_query), + select: %{total_points: sum(p.total_points)} + Repo.one(points_query) end def get_badged_post_count(id, minimum_points) do - query = from t in Thread, - limit: 1, - select: %{count: count(t.id) |> coalesce(0)}, - where: (t.user_id == ^id) and (t.points >= ^minimum_points) + query = + from t in Thread, + limit: 1, + select: %{count: count(t.id) |> coalesce(0)}, + where: t.user_id == ^id and t.points >= ^minimum_points + Repo.one(query) end + + defp query_based_on_tresholds(query, tresholds) do + min_points = tresholds |> elem(0) + max_points = tresholds |> elem(1) + + if max_points != Nil do + where(query, [tr, u, to], tr.points >= ^min_points and tr.points < ^max_points) + else + where(query, [tr, u, to], tr.points >= ^min_points) + end + end + + def get_badged_posts(id, tresholds) do + Thread + |> join(:inner, [tr], u in User, as: :users, on: tr.user_id == u.id) + |> join(:inner, [tr], to in Topic, as: :topics, on: tr.topic_id == to.id) + |> where([tr, u, to], tr.user_id == ^id) + |> query_based_on_tresholds(tresholds) + |> select([tr, u, to], %{ + id: tr.id, + title: tr.title, + content: tr.content, + points: tr.points, + user_id: tr.user_id, + username: u.username, + topic_id: tr.topic_id, + topic_name: to.name, + inserted_at: tr.inserted_at, + updated_at: tr.updated_at + }) + |> Repo.all() + end end diff --git a/lib/diskuy_web/controllers/user_controller.ex b/lib/diskuy_web/controllers/user_controller.ex index 3883516..c79d5a1 100644 --- a/lib/diskuy_web/controllers/user_controller.ex +++ b/lib/diskuy_web/controllers/user_controller.ex @@ -50,16 +50,35 @@ defmodule DiskuyWeb.UserController do silver_badges = Account.get_badged_post_count(user.id, @silver_treshold) bronze_badges = Account.get_badged_post_count(user.id, @bronze_treshold) - render(conn, "show_user_badges.json", badges: %{ - gold: gold_badges.count, - silver: silver_badges.count - gold_badges.count, - bronze: bronze_badges.count - silver_badges.count - }) + render(conn, "show_user_badges.json", + badges: %{ + gold: gold_badges.count, + silver: silver_badges.count - gold_badges.count, + bronze: bronze_badges.count - silver_badges.count + } + ) + end + + def get_user_badged_posts(conn, %{"name" => name, "badge" => badge}) do + user = Account.get_by_username!(name) + + badge_name_treshold_map = %{ + "bronze" => {@bronze_treshold, @silver_treshold}, + "silver" => {@silver_treshold, @gold_treshold}, + "gold" => {@gold_treshold, Nil} + } + + badge_treshold = badge_name_treshold_map[badge] + + badged_posts = Account.get_badged_posts(user.id, badge_treshold) + + render(conn, "show_user_badged_posts.json", posts: badged_posts) end def update(conn, %{"user" => user_params}) do user = Guardian.Plug.current_resource(conn) new_user_params = user_params |> Map.drop(["email", "id", "role"]) + with {:ok, %User{} = user} <- Account.update_user(user, new_user_params) do render(conn, "show.json", user: user) end @@ -88,19 +107,22 @@ defmodule DiskuyWeb.UserController do def callback(conn, _params) do token_header = get_req_header(conn, "authorization") + case token_header do [] -> {:error, :unauthorized} - [token_bearer]-> - ["Bearer", token|_] = String.split(token_bearer, " ") - with {:ok, user, new_token}= GoogleAuth.create_local_token(token) do + + [token_bearer] -> + ["Bearer", token | _] = String.split(token_bearer, " ") + + with {:ok, user, new_token} = GoogleAuth.create_local_token(token) do conn |> put_status(:created) |> render("user_token.json", %{user: user, token: new_token}) end + _ -> {:error, :bad_request} end end - end diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index 96fcd19..e18bb2a 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -62,6 +62,7 @@ defmodule DiskuyWeb.Router do get "/users/name/:name", UserController, :show_by_username get "/users/points/:name", UserController, :get_user_points get "/users/badges/:name", UserController, :get_user_badges + get "/users/:name/badges/:badge", UserController, :get_user_badged_posts options "/users/name/:name", UserController, :options resources "/topics", TopicController, except: [:new, :edit, :create, :update, :delete] diff --git a/lib/diskuy_web/views/user_view.ex b/lib/diskuy_web/views/user_view.ex index b56b562..28f8a22 100644 --- a/lib/diskuy_web/views/user_view.ex +++ b/lib/diskuy_web/views/user_view.ex @@ -22,13 +22,18 @@ defmodule DiskuyWeb.UserView do %{data: render_one(badges, UserView, "user_badges.json")} end + def render("show_user_badged_posts.json", %{posts: posts}) do + %{data: render_many(posts, UserView, "user_badged_post.json", as: :post)} + end + def render("user.json", %{user: user}) do - %{id: user.id, + %{ + id: user.id, username: user.username, name: user.email, picture: user.picture, role: user.role - } + } end def render("user_token.json", %{user: user, token: token}) do @@ -55,4 +60,19 @@ defmodule DiskuyWeb.UserView do bronze: badges.bronze } end + + def render("user_badged_post.json", %{post: post}) do + %{ + id: post.id, + title: post.title, + points: post.points, + content: post.content, + user_id: post.user_id, + username: post.username, + topic_id: post.topic_id, + topic_name: post.topic_name, + inserted_at: post.inserted_at, + updated_at: post.updated_at + } + end end -- GitLab From 417d40eee0726c7fb74b588f6e707dc67e640fdf Mon Sep 17 00:00:00 2001 From: Eko Julianto Salim Date: Mon, 29 Nov 2021 10:04:09 +0700 Subject: [PATCH 28/28] Update entrypoint.sh to use appropriate env --- entrypoint.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/entrypoint.sh b/entrypoint.sh index 71d524f..eff5940 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -3,10 +3,10 @@ # docker entrypoint script. # assign a default for the database_user -DB_USER=${DATABASE_USER:-postgres} +DB_USER=${PGUSER:-postgres} # wait until Postgres is ready -while ! pg_isready -q -h $DATABASE_HOST -p 5432 -U $DB_USER +while ! pg_isready -q -h $PGHOST -p $PGPORT -U $DB_USER do echo "$(date) - waiting for database to start" sleep 2 -- GitLab