From 0d873ec0e167da10bc16a220db27e4be9b2ef1e2 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Fri, 8 Oct 2021 18:13:35 +0700 Subject: [PATCH 01/46] Initial commit for survey question model --- lib/diskuy/survey/question.ex | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 lib/diskuy/survey/question.ex diff --git a/lib/diskuy/survey/question.ex b/lib/diskuy/survey/question.ex new file mode 100644 index 0000000..1771a1d --- /dev/null +++ b/lib/diskuy/survey/question.ex @@ -0,0 +1,8 @@ +defmodule Diskuy.Survey.Question do + use Ecto.Schema + import Ecto.Changeset + + schema "questions" do + field :question, :string + end +end -- GitLab From db54b4e9fca3255f434158491763da1f297fa2ff Mon Sep 17 00:00:00 2001 From: Iqrar Agalosi Nureyza <misteriqrar@gmail.com> Date: Fri, 8 Oct 2021 18:55:09 +0700 Subject: [PATCH 02/46] Add initial README.md for survey app --- lib/diskuy/survey/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 lib/diskuy/survey/README.md diff --git a/lib/diskuy/survey/README.md b/lib/diskuy/survey/README.md new file mode 100644 index 0000000..ce5273e --- /dev/null +++ b/lib/diskuy/survey/README.md @@ -0,0 +1,14 @@ +# Diskuy Survey Backend + +## Tentang fitur + +Fitur ini adalah sebuah fitur yang ditujukan untuk memfasilitasi pengguna Diskuy apabila akan mengadakan survey. Pengguna dapat mengadakan suatu survey lalu meminta pengguna lain untuk mengisi surveynya. Pembuat survey dapat melihat hasil survey apabila masa survey telah berakhir. + +## Authors +Kelompok MemePro + +* Qadzif Kamil Zahari - NPM: 1806205565 +* Iqrar Agalosi Nureyza - NPM: 1806204902 +* Christopher Samuel - NPM: 1806141151 +* Kezia Sulami - NPM: 1806133755 +* Ashila Ghassani - NPM : 1806205395 -- GitLab From 18d01e4bc875f03ed68a32bf3b8f48599dfa2947 Mon Sep 17 00:00:00 2001 From: Kezia <keziasulami.pooh@gmail.com> Date: Fri, 8 Oct 2021 18:10:55 +0100 Subject: [PATCH 03/46] Initial commit for answer model --- lib/diskuy/survey/answer.ex | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 lib/diskuy/survey/answer.ex diff --git a/lib/diskuy/survey/answer.ex b/lib/diskuy/survey/answer.ex new file mode 100644 index 0000000..6a48876 --- /dev/null +++ b/lib/diskuy/survey/answer.ex @@ -0,0 +1,8 @@ +defmodule Diskuy.Survey.Answer do + use Ecto.Schema + import Ecto.Changeset + + schema "answers" do + field :answer, :string + end +end -- GitLab From cc48aace2705bf11f4e9749f16718e8dfca93927 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Fri, 29 Oct 2021 12:07:27 +0700 Subject: [PATCH 04/46] Add field to question model + add changeset for validation --- lib/diskuy/survey/question.ex | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/diskuy/survey/question.ex b/lib/diskuy/survey/question.ex index 1771a1d..a281eaf 100644 --- a/lib/diskuy/survey/question.ex +++ b/lib/diskuy/survey/question.ex @@ -4,5 +4,14 @@ defmodule Diskuy.Survey.Question do schema "questions" do field :question, :string + field :user_id, :id end + + @doc false + def changeset(question, attrs) do + question + |> cast(attrs, [:user_id]) + |> validate_required([:user_id]) + end + end -- GitLab From 9ddb1569e7647d354eb3384ceefb3cc2f40b6f49 Mon Sep 17 00:00:00 2001 From: Iqrar Agalosi Nureyza --replace-all <iqrar.agalosi@ui.ac.id> Date: Sat, 30 Oct 2021 14:48:53 +0700 Subject: [PATCH 05/46] Add survey schema --- lib/diskuy/survey/survey.ex | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 lib/diskuy/survey/survey.ex diff --git a/lib/diskuy/survey/survey.ex b/lib/diskuy/survey/survey.ex new file mode 100644 index 0000000..ac49382 --- /dev/null +++ b/lib/diskuy/survey/survey.ex @@ -0,0 +1,10 @@ +defmodule Diskuy.Survey.Survey do + use Ecto.Schema + import Ecto.Changeset + + schema "surveys" do + field :title, :string + timestamps() + end + +end -- GitLab From a632ace58c85c458cea12074a82bc626523d64db Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Wed, 24 Nov 2021 19:49:06 +0700 Subject: [PATCH 06/46] Add fields and changeset for answers + questions --- lib/diskuy/survey/answer.ex | 11 +++++++++++ lib/diskuy/survey/question.ex | 6 ++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/lib/diskuy/survey/answer.ex b/lib/diskuy/survey/answer.ex index 6a48876..713a01d 100644 --- a/lib/diskuy/survey/answer.ex +++ b/lib/diskuy/survey/answer.ex @@ -4,5 +4,16 @@ defmodule Diskuy.Survey.Answer do schema "answers" do field :answer, :string + field :question_id, :id + field :user_id, :id + timestamps() end + + @doc false + def changeset(question, attrs) do + question + |> cast(attrs, [:answer, :question_id]) + |> validate_required([:answer, :question_id]) + end + end diff --git a/lib/diskuy/survey/question.ex b/lib/diskuy/survey/question.ex index a281eaf..ae0ad0c 100644 --- a/lib/diskuy/survey/question.ex +++ b/lib/diskuy/survey/question.ex @@ -4,14 +4,16 @@ defmodule Diskuy.Survey.Question do schema "questions" do field :question, :string + field :survey_id, :id field :user_id, :id + timestamps() end @doc false def changeset(question, attrs) do question - |> cast(attrs, [:user_id]) - |> validate_required([:user_id]) + |> cast(attrs, [:question, :survey_id, :user_id]) + |> validate_required([:question, :survey_id, :user_id]) end end -- GitLab From 1e60fabe84ef2850497e132bfcc2233449d7ff06 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Wed, 24 Nov 2021 20:44:02 +0700 Subject: [PATCH 07/46] Add base for Diskuy.Survey --- lib/diskuy/surveys.ex | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 lib/diskuy/surveys.ex diff --git a/lib/diskuy/surveys.ex b/lib/diskuy/surveys.ex new file mode 100644 index 0000000..7a99fee --- /dev/null +++ b/lib/diskuy/surveys.ex @@ -0,0 +1,20 @@ +defmodule Diskuy.Survey do + @moduledoc """ + The Survey Context. + """ + + import Ecto.Query, warn: false + alias Diskuy.Repo + + alias Diskuy.Survey.Survey + + def list_surveys do + query = from s in Survey + Repo.all(query) + end + + def get_survey!(id), do: Repo.get!(Survey, id) + + def get_survey_by_title!(title), do: Repo.get_by(Survey, title: title) + +end -- GitLab From 0dd1f887370524e9dbd577a193b065eca9cbbfdb Mon Sep 17 00:00:00 2001 From: Kezia <keziasulami.pooh@gmail.com> Date: Thu, 25 Nov 2021 14:04:29 +0700 Subject: [PATCH 08/46] Add Survey model --- lib/diskuy/surveys.ex | 104 ++++++++++++++++++ lib/diskuy/surveys/survey.ex | 17 +++ .../controllers/survey_controller.ex | 43 ++++++++ lib/diskuy_web/views/survey_view.ex | 17 +++ .../20211125070017_create_surveys.exs | 12 ++ test/diskuy/surveys_test.exs | 64 +++++++++++ .../controllers/survey_controller_test.exs | 88 +++++++++++++++ 7 files changed, 345 insertions(+) create mode 100644 lib/diskuy/surveys.ex create mode 100644 lib/diskuy/surveys/survey.ex create mode 100644 lib/diskuy_web/controllers/survey_controller.ex create mode 100644 lib/diskuy_web/views/survey_view.ex create mode 100644 priv/repo/migrations/20211125070017_create_surveys.exs create mode 100644 test/diskuy/surveys_test.exs create mode 100644 test/diskuy_web/controllers/survey_controller_test.exs diff --git a/lib/diskuy/surveys.ex b/lib/diskuy/surveys.ex new file mode 100644 index 0000000..fb02df7 --- /dev/null +++ b/lib/diskuy/surveys.ex @@ -0,0 +1,104 @@ +defmodule Diskuy.Surveys do + @moduledoc """ + The Surveys context. + """ + + import Ecto.Query, warn: false + alias Diskuy.Repo + + alias Diskuy.Surveys.Survey + + @doc """ + Returns the list of surveys. + + ## Examples + + iex> list_surveys() + [%Survey{}, ...] + + """ + def list_surveys do + Repo.all(Survey) + end + + @doc """ + Gets a single survey. + + Raises `Ecto.NoResultsError` if the Survey does not exist. + + ## Examples + + iex> get_survey!(123) + %Survey{} + + iex> get_survey!(456) + ** (Ecto.NoResultsError) + + """ + def get_survey!(id), do: Repo.get!(Survey, id) + + @doc """ + Creates a survey. + + ## Examples + + iex> create_survey(%{field: value}) + {:ok, %Survey{}} + + iex> create_survey(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_survey(attrs \\ %{}) do + %Survey{} + |> Survey.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a survey. + + ## Examples + + iex> update_survey(survey, %{field: new_value}) + {:ok, %Survey{}} + + iex> update_survey(survey, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_survey(%Survey{} = survey, attrs) do + survey + |> Survey.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a survey. + + ## Examples + + iex> delete_survey(survey) + {:ok, %Survey{}} + + iex> delete_survey(survey) + {:error, %Ecto.Changeset{}} + + """ + def delete_survey(%Survey{} = survey) do + Repo.delete(survey) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking survey changes. + + ## Examples + + iex> change_survey(survey) + %Ecto.Changeset{data: %Survey{}} + + """ + def change_survey(%Survey{} = survey, attrs \\ %{}) do + Survey.changeset(survey, attrs) + end +end diff --git a/lib/diskuy/surveys/survey.ex b/lib/diskuy/surveys/survey.ex new file mode 100644 index 0000000..9cbce60 --- /dev/null +++ b/lib/diskuy/surveys/survey.ex @@ -0,0 +1,17 @@ +defmodule Diskuy.Surveys.Survey do + use Ecto.Schema + import Ecto.Changeset + + schema "surveys" do + field :title, :string + + timestamps() + end + + @doc false + def changeset(survey, attrs) do + survey + |> cast(attrs, [:title]) + |> validate_required([:title]) + end +end diff --git a/lib/diskuy_web/controllers/survey_controller.ex b/lib/diskuy_web/controllers/survey_controller.ex new file mode 100644 index 0000000..a35c3af --- /dev/null +++ b/lib/diskuy_web/controllers/survey_controller.ex @@ -0,0 +1,43 @@ +defmodule DiskuyWeb.SurveyController do + use DiskuyWeb, :controller + + alias Diskuy.Surveys + alias Diskuy.Surveys.Survey + + action_fallback DiskuyWeb.FallbackController + + def index(conn, _params) do + surveys = Surveys.list_surveys() + render(conn, "index.json", surveys: surveys) + end + + def create(conn, %{"survey" => survey_params}) do + with {:ok, %Survey{} = survey} <- Surveys.create_survey(survey_params) do + conn + |> put_status(:created) + |> put_resp_header("location", Routes.survey_path(conn, :show, survey)) + |> render("show.json", survey: survey) + end + end + + def show(conn, %{"id" => id}) do + survey = Surveys.get_survey!(id) + render(conn, "show.json", survey: survey) + end + + def update(conn, %{"id" => id, "survey" => survey_params}) do + survey = Surveys.get_survey!(id) + + with {:ok, %Survey{} = survey} <- Surveys.update_survey(survey, survey_params) do + render(conn, "show.json", survey: survey) + end + end + + def delete(conn, %{"id" => id}) do + survey = Surveys.get_survey!(id) + + with {:ok, %Survey{}} <- Surveys.delete_survey(survey) do + send_resp(conn, :no_content, "") + end + end +end diff --git a/lib/diskuy_web/views/survey_view.ex b/lib/diskuy_web/views/survey_view.ex new file mode 100644 index 0000000..afa1317 --- /dev/null +++ b/lib/diskuy_web/views/survey_view.ex @@ -0,0 +1,17 @@ +defmodule DiskuyWeb.SurveyView do + use DiskuyWeb, :view + alias DiskuyWeb.SurveyView + + def render("index.json", %{surveys: surveys}) do + %{data: render_many(surveys, SurveyView, "survey.json")} + end + + def render("show.json", %{survey: survey}) do + %{data: render_one(survey, SurveyView, "survey.json")} + end + + def render("survey.json", %{survey: survey}) do + %{id: survey.id, + title: survey.title} + end +end diff --git a/priv/repo/migrations/20211125070017_create_surveys.exs b/priv/repo/migrations/20211125070017_create_surveys.exs new file mode 100644 index 0000000..ebb49a9 --- /dev/null +++ b/priv/repo/migrations/20211125070017_create_surveys.exs @@ -0,0 +1,12 @@ +defmodule Diskuy.Repo.Migrations.CreateSurveys do + use Ecto.Migration + + def change do + create table(:surveys) do + add :title, :string + + timestamps() + end + + end +end diff --git a/test/diskuy/surveys_test.exs b/test/diskuy/surveys_test.exs new file mode 100644 index 0000000..76463be --- /dev/null +++ b/test/diskuy/surveys_test.exs @@ -0,0 +1,64 @@ +defmodule Diskuy.SurveysTest do + use Diskuy.DataCase + + alias Diskuy.Surveys + + describe "surveys" do + alias Diskuy.Surveys.Survey + + @valid_attrs %{title: "some title"} + @update_attrs %{title: "some updated title"} + @invalid_attrs %{title: nil} + + def survey_fixture(attrs \\ %{}) do + {:ok, survey} = + attrs + |> Enum.into(@valid_attrs) + |> Surveys.create_survey() + + survey + end + + test "list_surveys/0 returns all surveys" do + survey = survey_fixture() + assert Surveys.list_surveys() == [survey] + end + + test "get_survey!/1 returns the survey with given id" do + survey = survey_fixture() + assert Surveys.get_survey!(survey.id) == survey + end + + test "create_survey/1 with valid data creates a survey" do + assert {:ok, %Survey{} = survey} = Surveys.create_survey(@valid_attrs) + assert survey.title == "some title" + end + + test "create_survey/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Surveys.create_survey(@invalid_attrs) + end + + test "update_survey/2 with valid data updates the survey" do + survey = survey_fixture() + assert {:ok, %Survey{} = survey} = Surveys.update_survey(survey, @update_attrs) + assert survey.title == "some updated title" + end + + test "update_survey/2 with invalid data returns error changeset" do + survey = survey_fixture() + assert {:error, %Ecto.Changeset{}} = Surveys.update_survey(survey, @invalid_attrs) + assert survey == Surveys.get_survey!(survey.id) + end + + test "delete_survey/1 deletes the survey" do + survey = survey_fixture() + assert {:ok, %Survey{}} = Surveys.delete_survey(survey) + assert_raise Ecto.NoResultsError, fn -> Surveys.get_survey!(survey.id) end + end + + test "change_survey/1 returns a survey changeset" do + survey = survey_fixture() + assert %Ecto.Changeset{} = Surveys.change_survey(survey) + end + end +end diff --git a/test/diskuy_web/controllers/survey_controller_test.exs b/test/diskuy_web/controllers/survey_controller_test.exs new file mode 100644 index 0000000..7340836 --- /dev/null +++ b/test/diskuy_web/controllers/survey_controller_test.exs @@ -0,0 +1,88 @@ +defmodule DiskuyWeb.SurveyControllerTest do + use DiskuyWeb.ConnCase + + alias Diskuy.Surveys + alias Diskuy.Surveys.Survey + + @create_attrs %{ + title: "some title" + } + @update_attrs %{ + title: "some updated title" + } + @invalid_attrs %{title: nil} + + def fixture(:survey) do + {:ok, survey} = Surveys.create_survey(@create_attrs) + survey + end + + setup %{conn: conn} do + {:ok, conn: put_req_header(conn, "accept", "application/json")} + end + + describe "index" do + test "lists all surveys", %{conn: conn} do + conn = get(conn, Routes.survey_path(conn, :index)) + assert json_response(conn, 200)["data"] == [] + end + end + + describe "create survey" do + test "renders survey when data is valid", %{conn: conn} do + conn = post(conn, Routes.survey_path(conn, :create), survey: @create_attrs) + assert %{"id" => id} = json_response(conn, 201)["data"] + + conn = get(conn, Routes.survey_path(conn, :show, id)) + + assert %{ + "id" => id, + "title" => "some title" + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn} do + conn = post(conn, Routes.survey_path(conn, :create), survey: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "update survey" do + setup [:create_survey] + + test "renders survey when data is valid", %{conn: conn, survey: %Survey{id: id} = survey} do + conn = put(conn, Routes.survey_path(conn, :update, survey), survey: @update_attrs) + assert %{"id" => ^id} = json_response(conn, 200)["data"] + + conn = get(conn, Routes.survey_path(conn, :show, id)) + + assert %{ + "id" => id, + "title" => "some updated title" + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn, survey: survey} do + conn = put(conn, Routes.survey_path(conn, :update, survey), survey: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "delete survey" do + setup [:create_survey] + + test "deletes chosen survey", %{conn: conn, survey: survey} do + conn = delete(conn, Routes.survey_path(conn, :delete, survey)) + assert response(conn, 204) + + assert_error_sent 404, fn -> + get(conn, Routes.survey_path(conn, :show, survey)) + end + end + end + + defp create_survey(_) do + survey = fixture(:survey) + %{survey: survey} + end +end -- GitLab From 697993f9ae69c0d50f0e33c09bf0cf28dc00adb2 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Thu, 25 Nov 2021 15:02:55 +0700 Subject: [PATCH 09/46] Used mix.ecto.context to generate better models + views + controllers --- lib/diskuy/survey/survey.ex | 10 - lib/diskuy/surveys.ex | 192 ++++++++++++++++++ lib/diskuy/{survey => surveys}/README.md | 0 lib/diskuy/{survey => surveys}/answer.ex | 12 +- lib/diskuy/{survey => surveys}/question.ex | 8 +- .../20211125075953_create_questions.exs | 16 ++ .../20211125080109_create_answers.exs | 16 ++ test/diskuy/surveys_test.exs | 118 +++++++++++ 8 files changed, 352 insertions(+), 20 deletions(-) delete mode 100644 lib/diskuy/survey/survey.ex rename lib/diskuy/{survey => surveys}/README.md (100%) rename lib/diskuy/{survey => surveys}/answer.ex (52%) rename lib/diskuy/{survey => surveys}/question.ex (61%) create mode 100644 priv/repo/migrations/20211125075953_create_questions.exs create mode 100644 priv/repo/migrations/20211125080109_create_answers.exs diff --git a/lib/diskuy/survey/survey.ex b/lib/diskuy/survey/survey.ex deleted file mode 100644 index ac49382..0000000 --- a/lib/diskuy/survey/survey.ex +++ /dev/null @@ -1,10 +0,0 @@ -defmodule Diskuy.Survey.Survey do - use Ecto.Schema - import Ecto.Changeset - - schema "surveys" do - field :title, :string - timestamps() - end - -end diff --git a/lib/diskuy/surveys.ex b/lib/diskuy/surveys.ex index fb02df7..9e90909 100644 --- a/lib/diskuy/surveys.ex +++ b/lib/diskuy/surveys.ex @@ -101,4 +101,196 @@ defmodule Diskuy.Surveys do def change_survey(%Survey{} = survey, attrs \\ %{}) do Survey.changeset(survey, attrs) end + + alias Diskuy.Surveys.Question + + @doc """ + Returns the list of questions. + + ## Examples + + iex> list_questions() + [%Question{}, ...] + + """ + def list_questions do + Repo.all(Question) + end + + @doc """ + Gets a single question. + + Raises `Ecto.NoResultsError` if the Question does not exist. + + ## Examples + + iex> get_question!(123) + %Question{} + + iex> get_question!(456) + ** (Ecto.NoResultsError) + + """ + def get_question!(id), do: Repo.get!(Question, id) + + @doc """ + Creates a question. + + ## Examples + + iex> create_question(%{field: value}) + {:ok, %Question{}} + + iex> create_question(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_question(attrs \\ %{}) do + %Question{} + |> Question.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a question. + + ## Examples + + iex> update_question(question, %{field: new_value}) + {:ok, %Question{}} + + iex> update_question(question, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_question(%Question{} = question, attrs) do + question + |> Question.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a question. + + ## Examples + + iex> delete_question(question) + {:ok, %Question{}} + + iex> delete_question(question) + {:error, %Ecto.Changeset{}} + + """ + def delete_question(%Question{} = question) do + Repo.delete(question) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking question changes. + + ## Examples + + iex> change_question(question) + %Ecto.Changeset{data: %Question{}} + + """ + def change_question(%Question{} = question, attrs \\ %{}) do + Question.changeset(question, attrs) + end + + alias Diskuy.Surveys.Answer + + @doc """ + Returns the list of answers. + + ## Examples + + iex> list_answers() + [%Answer{}, ...] + + """ + def list_answers do + Repo.all(Answer) + end + + @doc """ + Gets a single answer. + + Raises `Ecto.NoResultsError` if the Answer does not exist. + + ## Examples + + iex> get_answer!(123) + %Answer{} + + iex> get_answer!(456) + ** (Ecto.NoResultsError) + + """ + def get_answer!(id), do: Repo.get!(Answer, id) + + @doc """ + Creates a answer. + + ## Examples + + iex> create_answer(%{field: value}) + {:ok, %Answer{}} + + iex> create_answer(%{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def create_answer(attrs \\ %{}) do + %Answer{} + |> Answer.changeset(attrs) + |> Repo.insert() + end + + @doc """ + Updates a answer. + + ## Examples + + iex> update_answer(answer, %{field: new_value}) + {:ok, %Answer{}} + + iex> update_answer(answer, %{field: bad_value}) + {:error, %Ecto.Changeset{}} + + """ + def update_answer(%Answer{} = answer, attrs) do + answer + |> Answer.changeset(attrs) + |> Repo.update() + end + + @doc """ + Deletes a answer. + + ## Examples + + iex> delete_answer(answer) + {:ok, %Answer{}} + + iex> delete_answer(answer) + {:error, %Ecto.Changeset{}} + + """ + def delete_answer(%Answer{} = answer) do + Repo.delete(answer) + end + + @doc """ + Returns an `%Ecto.Changeset{}` for tracking answer changes. + + ## Examples + + iex> change_answer(answer) + %Ecto.Changeset{data: %Answer{}} + + """ + def change_answer(%Answer{} = answer, attrs \\ %{}) do + Answer.changeset(answer, attrs) + end end diff --git a/lib/diskuy/survey/README.md b/lib/diskuy/surveys/README.md similarity index 100% rename from lib/diskuy/survey/README.md rename to lib/diskuy/surveys/README.md diff --git a/lib/diskuy/survey/answer.ex b/lib/diskuy/surveys/answer.ex similarity index 52% rename from lib/diskuy/survey/answer.ex rename to lib/diskuy/surveys/answer.ex index 713a01d..f0ab17a 100644 --- a/lib/diskuy/survey/answer.ex +++ b/lib/diskuy/surveys/answer.ex @@ -1,4 +1,4 @@ -defmodule Diskuy.Survey.Answer do +defmodule Diskuy.Surveys.Answer do use Ecto.Schema import Ecto.Changeset @@ -6,14 +6,14 @@ defmodule Diskuy.Survey.Answer do field :answer, :string field :question_id, :id field :user_id, :id + timestamps() end @doc false - def changeset(question, attrs) do - question - |> cast(attrs, [:answer, :question_id]) - |> validate_required([:answer, :question_id]) + def changeset(answer, attrs) do + answer + |> cast(attrs, [:answer]) + |> validate_required([:answer]) end - end diff --git a/lib/diskuy/survey/question.ex b/lib/diskuy/surveys/question.ex similarity index 61% rename from lib/diskuy/survey/question.ex rename to lib/diskuy/surveys/question.ex index ae0ad0c..2327a2c 100644 --- a/lib/diskuy/survey/question.ex +++ b/lib/diskuy/surveys/question.ex @@ -1,4 +1,4 @@ -defmodule Diskuy.Survey.Question do +defmodule Diskuy.Surveys.Question do use Ecto.Schema import Ecto.Changeset @@ -6,14 +6,14 @@ defmodule Diskuy.Survey.Question do field :question, :string field :survey_id, :id field :user_id, :id + timestamps() end @doc false def changeset(question, attrs) do question - |> cast(attrs, [:question, :survey_id, :user_id]) - |> validate_required([:question, :survey_id, :user_id]) + |> cast(attrs, [:question]) + |> validate_required([:question]) end - end diff --git a/priv/repo/migrations/20211125075953_create_questions.exs b/priv/repo/migrations/20211125075953_create_questions.exs new file mode 100644 index 0000000..457e124 --- /dev/null +++ b/priv/repo/migrations/20211125075953_create_questions.exs @@ -0,0 +1,16 @@ +defmodule Diskuy.Repo.Migrations.CreateQuestions do + use Ecto.Migration + + def change do + create table(:questions) do + add :question, :string + add :survey_id, references(:surveys, on_delete: :nothing) + add :user_id, references(:users, on_delete: :nothing) + + timestamps() + end + + create index(:questions, [:survey_id]) + create index(:questions, [:user_id]) + end +end diff --git a/priv/repo/migrations/20211125080109_create_answers.exs b/priv/repo/migrations/20211125080109_create_answers.exs new file mode 100644 index 0000000..4cb1935 --- /dev/null +++ b/priv/repo/migrations/20211125080109_create_answers.exs @@ -0,0 +1,16 @@ +defmodule Diskuy.Repo.Migrations.CreateAnswers do + use Ecto.Migration + + def change do + create table(:answers) do + add :answer, :string + add :question_id, references(:questions, on_delete: :nothing) + add :user_id, references(:users, on_delete: :nothing) + + timestamps() + end + + create index(:answers, [:question_id]) + create index(:answers, [:user_id]) + end +end diff --git a/test/diskuy/surveys_test.exs b/test/diskuy/surveys_test.exs index 76463be..f304101 100644 --- a/test/diskuy/surveys_test.exs +++ b/test/diskuy/surveys_test.exs @@ -61,4 +61,122 @@ defmodule Diskuy.SurveysTest do assert %Ecto.Changeset{} = Surveys.change_survey(survey) end end + + describe "questions" do + alias Diskuy.Surveys.Question + + @valid_attrs %{question: "some question"} + @update_attrs %{question: "some updated question"} + @invalid_attrs %{question: nil} + + def question_fixture(attrs \\ %{}) do + {:ok, question} = + attrs + |> Enum.into(@valid_attrs) + |> Surveys.create_question() + + question + end + + test "list_questions/0 returns all questions" do + question = question_fixture() + assert Surveys.list_questions() == [question] + end + + test "get_question!/1 returns the question with given id" do + question = question_fixture() + assert Surveys.get_question!(question.id) == question + end + + test "create_question/1 with valid data creates a question" do + assert {:ok, %Question{} = question} = Surveys.create_question(@valid_attrs) + assert question.question == "some question" + end + + test "create_question/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Surveys.create_question(@invalid_attrs) + end + + test "update_question/2 with valid data updates the question" do + question = question_fixture() + assert {:ok, %Question{} = question} = Surveys.update_question(question, @update_attrs) + assert question.question == "some updated question" + end + + test "update_question/2 with invalid data returns error changeset" do + question = question_fixture() + assert {:error, %Ecto.Changeset{}} = Surveys.update_question(question, @invalid_attrs) + assert question == Surveys.get_question!(question.id) + end + + test "delete_question/1 deletes the question" do + question = question_fixture() + assert {:ok, %Question{}} = Surveys.delete_question(question) + assert_raise Ecto.NoResultsError, fn -> Surveys.get_question!(question.id) end + end + + test "change_question/1 returns a question changeset" do + question = question_fixture() + assert %Ecto.Changeset{} = Surveys.change_question(question) + end + end + + describe "answers" do + alias Diskuy.Surveys.Answer + + @valid_attrs %{answer: "some answer"} + @update_attrs %{answer: "some updated answer"} + @invalid_attrs %{answer: nil} + + def answer_fixture(attrs \\ %{}) do + {:ok, answer} = + attrs + |> Enum.into(@valid_attrs) + |> Surveys.create_answer() + + answer + end + + test "list_answers/0 returns all answers" do + answer = answer_fixture() + assert Surveys.list_answers() == [answer] + end + + test "get_answer!/1 returns the answer with given id" do + answer = answer_fixture() + assert Surveys.get_answer!(answer.id) == answer + end + + test "create_answer/1 with valid data creates a answer" do + assert {:ok, %Answer{} = answer} = Surveys.create_answer(@valid_attrs) + assert answer.answer == "some answer" + end + + test "create_answer/1 with invalid data returns error changeset" do + assert {:error, %Ecto.Changeset{}} = Surveys.create_answer(@invalid_attrs) + end + + test "update_answer/2 with valid data updates the answer" do + answer = answer_fixture() + assert {:ok, %Answer{} = answer} = Surveys.update_answer(answer, @update_attrs) + assert answer.answer == "some updated answer" + end + + test "update_answer/2 with invalid data returns error changeset" do + answer = answer_fixture() + assert {:error, %Ecto.Changeset{}} = Surveys.update_answer(answer, @invalid_attrs) + assert answer == Surveys.get_answer!(answer.id) + end + + test "delete_answer/1 deletes the answer" do + answer = answer_fixture() + assert {:ok, %Answer{}} = Surveys.delete_answer(answer) + assert_raise Ecto.NoResultsError, fn -> Surveys.get_answer!(answer.id) end + end + + test "change_answer/1 returns a answer changeset" do + answer = answer_fixture() + assert %Ecto.Changeset{} = Surveys.change_answer(answer) + end + end end -- GitLab From a7bead0ddd449835e8eb4ee5e87fd53f5b819fa9 Mon Sep 17 00:00:00 2001 From: Iqrar Agalosi Nureyza --replace-all <iqrar.agalosi@ui.ac.id> Date: Thu, 25 Nov 2021 17:15:37 +0700 Subject: [PATCH 10/46] Add survey router to read all surveys --- lib/diskuy_web/router.ex | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index 269ac2c..61d7c2d 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -79,6 +79,9 @@ defmodule DiskuyWeb.Router do options "/post", PostController, :options options "/post/:id", PostController, :options + get "/survey/", SurveyController, :index + options "/survey/:survey_id", SurveyController, :options + # post "/users/signup", UserController, :create # options "/users/signup", PostController, :options # post "/users/signin", UserController, :signin -- GitLab From 0ecb4c1b971a792ec3b45342e22e6c4535ce2dac Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 28 Nov 2021 14:19:57 +0700 Subject: [PATCH 11/46] Add config for heroku deployment --- Procfile | 1 + config/config.exs | 5 +++-- 2 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 Procfile diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..6506faf --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +web: mix phx.server diff --git a/config/config.exs b/config/config.exs index f77d697..c9254d5 100644 --- a/config/config.exs +++ b/config/config.exs @@ -12,8 +12,9 @@ config :diskuy, # Configures the endpoint config :diskuy, DiskuyWeb.Endpoint, - url: [host: "localhost"], - secret_key_base: "2vHhQp+z9WMYDBV5qTBRAul6jdLAlDYdFZVOaCZ0vYQSFJdkj5A/9dBRIDpe5tIv", + url: [scheme: "https", host: "secure-thicket-91695.herokuapp.com/", port: 443], + force_ssl: [rewrite_on: [:x_forwarded_proto]], + secret_key_base: "JOS07ODKR0cI/Fca/qJc5CHtGtUG0Q7qZxOIkbYt+Nmg5ku+YH3TGqLRR9GjmO9g", render_errors: [view: DiskuyWeb.ErrorView, accepts: ~w(json), layout: false], pubsub_server: Diskuy.PubSub, live_view: [signing_salt: "aKmTxBag"] -- GitLab From 2bd300a90acb7be526e865deeab0dc5fe68601b1 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 28 Nov 2021 14:22:47 +0700 Subject: [PATCH 12/46] Add elixir_buildpack.config --- elixir_buildpack.config | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 elixir_buildpack.config diff --git a/elixir_buildpack.config b/elixir_buildpack.config new file mode 100644 index 0000000..ebdf10b --- /dev/null +++ b/elixir_buildpack.config @@ -0,0 +1,2 @@ +# Elixir version +elixir_version=1.5.3 -- GitLab From 49e4304a1482a2d1c7184eb1f27edb2ab8883f24 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 28 Nov 2021 14:29:21 +0700 Subject: [PATCH 13/46] Change Elixir version + added configs --- elixir_buildpack.config | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/elixir_buildpack.config b/elixir_buildpack.config index ebdf10b..64dcdb9 100644 --- a/elixir_buildpack.config +++ b/elixir_buildpack.config @@ -1,2 +1,10 @@ # Elixir version -elixir_version=1.5.3 +elixir_version=1.7 + +# Erlang version +# https://github.com/HashNuke/heroku-buildpack-elixir-otp-builds/blob/master/otp-versions +erlang_version=24.0.3 + +# Invoke assets.deploy defined in your mix.exs to deploy assets with esbuild +# Note we nuke the esbuild executable from the image +hook_post_compile="eval mix assets.deploy && rm -f _build/esbuild" -- GitLab From 351a3df9873f2609e530a368b0b40693eb3f44af Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 28 Nov 2021 14:31:22 +0700 Subject: [PATCH 14/46] Change back elixir version --- elixir_buildpack.config | 2 +- mix.exs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/elixir_buildpack.config b/elixir_buildpack.config index 64dcdb9..53fd6df 100644 --- a/elixir_buildpack.config +++ b/elixir_buildpack.config @@ -1,5 +1,5 @@ # Elixir version -elixir_version=1.7 +elixir_version=1.5.3 # Erlang version # https://github.com/HashNuke/heroku-buildpack-elixir-otp-builds/blob/master/otp-versions diff --git a/mix.exs b/mix.exs index cabc8e4..fd91300 100644 --- a/mix.exs +++ b/mix.exs @@ -5,7 +5,7 @@ defmodule Diskuy.MixProject do [ app: :diskuy, version: "0.1.0", - elixir: "~> 1.7", + elixir: "~> 1.5.3", elixirc_paths: elixirc_paths(Mix.env()), compilers: [:phoenix, :gettext] ++ Mix.compilers(), start_permanent: Mix.env() == :prod, -- GitLab From 6dedb7c5f1527ad93a4961e5fa80a2f8faad15c4 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 28 Nov 2021 14:38:21 +0700 Subject: [PATCH 15/46] Fix mix.exs and elixir_buildpack.conf dependency versions --- elixir_buildpack.config | 6 +++--- mix.exs | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/elixir_buildpack.config b/elixir_buildpack.config index 53fd6df..8ce53ab 100644 --- a/elixir_buildpack.config +++ b/elixir_buildpack.config @@ -1,9 +1,9 @@ # Elixir version -elixir_version=1.5.3 +elixir_version=1.8.1 # Erlang version -# https://github.com/HashNuke/heroku-buildpack-elixir-otp-builds/blob/master/otp-versions -erlang_version=24.0.3 +# available versions https://github.com/HashNuke/heroku-buildpack-elixir-otp-builds/blob/master/otp-versions +erlang_version=21.2.5 # Invoke assets.deploy defined in your mix.exs to deploy assets with esbuild # Note we nuke the esbuild executable from the image diff --git a/mix.exs b/mix.exs index fd91300..cabc8e4 100644 --- a/mix.exs +++ b/mix.exs @@ -5,7 +5,7 @@ defmodule Diskuy.MixProject do [ app: :diskuy, version: "0.1.0", - elixir: "~> 1.5.3", + elixir: "~> 1.7", elixirc_paths: elixirc_paths(Mix.env()), compilers: [:phoenix, :gettext] ++ Mix.compilers(), start_permanent: Mix.env() == :prod, -- GitLab From 1a2adf4608ca3f835052683916e92944b7ae8dfe Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 28 Nov 2021 14:41:41 +0700 Subject: [PATCH 16/46] Remove assets.deploy use --- elixir_buildpack.config | 4 ---- 1 file changed, 4 deletions(-) diff --git a/elixir_buildpack.config b/elixir_buildpack.config index 8ce53ab..f71a941 100644 --- a/elixir_buildpack.config +++ b/elixir_buildpack.config @@ -4,7 +4,3 @@ elixir_version=1.8.1 # Erlang version # available versions https://github.com/HashNuke/heroku-buildpack-elixir-otp-builds/blob/master/otp-versions erlang_version=21.2.5 - -# Invoke assets.deploy defined in your mix.exs to deploy assets with esbuild -# Note we nuke the esbuild executable from the image -hook_post_compile="eval mix assets.deploy && rm -f _build/esbuild" -- GitLab From 66e9ca1bf8142ee43dfc3ef80f4fc6b594d2b9a5 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 28 Nov 2021 15:19:01 +0700 Subject: [PATCH 17/46] Change database credentials --- config/dev.exs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/config/dev.exs b/config/dev.exs index b56ce17..f584abf 100755 --- a/config/dev.exs +++ b/config/dev.exs @@ -2,10 +2,10 @@ use Mix.Config # Configure your database config :diskuy, Diskuy.Repo, - username: "rafif", - password: "rafif123", - database: "diskuy_dev_new", - hostname: "localhost", + username: "psoglatpvgebuv", + password: "83be7f58480218d7329a99744f735c87eb2ae1037bd81af20bcc3e2c90b600ac", + database: "d3hisatile1qae", + hostname: "ec2-23-23-219-25.compute-1.amazonaws.com", show_sensitive_data_on_connection_error: true, pool_size: 10 -- GitLab From 474e5ad38547c475ca51060eb2a499388631c205 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 28 Nov 2021 15:30:25 +0700 Subject: [PATCH 18/46] Change database credentials for production --- config/prod.exs | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/config/prod.exs b/config/prod.exs index ce39810..e5ffd78 100644 --- a/config/prod.exs +++ b/config/prod.exs @@ -1,5 +1,14 @@ use Mix.Config +# Configure your database +config :diskuy, Diskuy.Repo, + username: "psoglatpvgebuv", + password: "83be7f58480218d7329a99744f735c87eb2ae1037bd81af20bcc3e2c90b600ac", + database: "d3hisatile1qae", + hostname: "ec2-23-23-219-25.compute-1.amazonaws.com", + show_sensitive_data_on_connection_error: true, + pool_size: 10 + # For production, don't forget to configure the url host # to something meaningful, Phoenix uses this information # when generating URLs. @@ -10,12 +19,23 @@ use Mix.Config # which you should run after static files are built and # before starting your production server. config :diskuy, DiskuyWeb.Endpoint, - url: [host: "localhost", port: 4000] + http: [port: 4000], + debug_errors: true, + code_reloader: true, + check_origin: false, + watchers: [] # cache_static_manifest: "priv/static/cache_manifest.json" # Do not print debug messages in production config :logger, level: :info +# Set a higher stacktrace during development. Avoid configuring such +# in production as building large stacktraces may be expensive. +config :phoenix, :stacktrace_depth, 10 + +# Initialize plugs at runtime for faster development compilation +config :phoenix, :plug_init_mode, :runtime + # ## SSL Support # # To get SSL working, you will need to add the `https` key -- GitLab From 24ec72aae511cba7968d78f9ff6c64db71de3fd6 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 28 Nov 2021 16:00:45 +0700 Subject: [PATCH 19/46] Set ssl params to true --- config/prod.exs | 3 ++- config/releases.exs | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/config/prod.exs b/config/prod.exs index e5ffd78..2476e46 100644 --- a/config/prod.exs +++ b/config/prod.exs @@ -7,7 +7,8 @@ config :diskuy, Diskuy.Repo, database: "d3hisatile1qae", hostname: "ec2-23-23-219-25.compute-1.amazonaws.com", show_sensitive_data_on_connection_error: true, - pool_size: 10 + pool_size: 10, + ssl: true # For production, don't forget to configure the url host # to something meaningful, Phoenix uses this information diff --git a/config/releases.exs b/config/releases.exs index 48cb768..6613e2c 100644 --- a/config/releases.exs +++ b/config/releases.exs @@ -12,7 +12,7 @@ database_url = """ config :diskuy, Diskuy.Repo, - # ssl: true, + ssl: true, url: database_url, pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10") -- GitLab From 44469e55631fa2a8c60b947b215d523730af47df Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 28 Nov 2021 16:06:08 +0700 Subject: [PATCH 20/46] Change DiskuyWeb.EndPoint configs --- config/prod.exs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/config/prod.exs b/config/prod.exs index 2476e46..d170fe7 100644 --- a/config/prod.exs +++ b/config/prod.exs @@ -20,7 +20,9 @@ config :diskuy, Diskuy.Repo, # which you should run after static files are built and # before starting your production server. config :diskuy, DiskuyWeb.Endpoint, - http: [port: 4000], + http: [port: {:system, "PORT"}], + url: [scheme: "https", host: "secure-thicket-91695.herokuapp.com", port: 443], + force_ssl: [rewrite_on: [:x_forwarded_proto]], debug_errors: true, code_reloader: true, check_origin: false, -- GitLab From e31ec176431a07537cbb0ad262217bf84c8324ef Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Tue, 7 Dec 2021 20:15:56 +0700 Subject: [PATCH 21/46] Add function to get grouped answers + count by question id --- lib/diskuy/surveys.ex | 5 +++++ lib/diskuy_web/controllers/survey_controller.ex | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/lib/diskuy/surveys.ex b/lib/diskuy/surveys.ex index 9e90909..e92f4df 100644 --- a/lib/diskuy/surveys.ex +++ b/lib/diskuy/surveys.ex @@ -229,6 +229,11 @@ defmodule Diskuy.Surveys do """ def get_answer!(id), do: Repo.get!(Answer, id) + def get_grouped_answers_by_query!(id) do + from(a in Answer, where: a.question_id == ^id, group_by: a.answer, select: %{answer: a.answer, answer_count: count(a.id)}) + |> Repo.all() + end + @doc """ Creates a answer. diff --git a/lib/diskuy_web/controllers/survey_controller.ex b/lib/diskuy_web/controllers/survey_controller.ex index a35c3af..3115a34 100644 --- a/lib/diskuy_web/controllers/survey_controller.ex +++ b/lib/diskuy_web/controllers/survey_controller.ex @@ -3,6 +3,7 @@ defmodule DiskuyWeb.SurveyController do alias Diskuy.Surveys alias Diskuy.Surveys.Survey + alias Diskuy.Surveys.Question action_fallback DiskuyWeb.FallbackController @@ -25,6 +26,10 @@ defmodule DiskuyWeb.SurveyController do render(conn, "show.json", survey: survey) end + def show_answers(conn, %{"id" => id}) do + render(conn, "show.json", answers: Surveys.get_grouped_answers_by_query!(id)) + end + def update(conn, %{"id" => id, "survey" => survey_params}) do survey = Surveys.get_survey!(id) -- GitLab From 04118f0238a96b53334b207bfd3dde99e91c1d25 Mon Sep 17 00:00:00 2001 From: Iqrar Agalosi Nureyza --replace-all <iqrar.agalosi@ui.ac.id> Date: Fri, 10 Dec 2021 18:10:31 +0700 Subject: [PATCH 22/46] Add create survey endpoint --- lib/diskuy_web/router.ex | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index 61d7c2d..329a75e 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -40,6 +40,9 @@ defmodule DiskuyWeb.Router do get "/post/checklike/:id", PostLikeController, :check_like options "/post/checklike/:id", PostLikeController, :options + post "/survey/create", SurveyController, :create_survey + options "/survey/create", SurveyController, :options + end scope "/api", DiskuyWeb do -- GitLab From 02905e1d2b092afeaea3f741b1bc77ff3fe78a35 Mon Sep 17 00:00:00 2001 From: Iqrar Agalosi Nureyza --replace-all <iqrar.agalosi@ui.ac.id> Date: Fri, 10 Dec 2021 18:26:50 +0700 Subject: [PATCH 23/46] Add endpoint for answers data --- lib/diskuy_web/router.ex | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index 329a75e..b1ec9ba 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -43,6 +43,9 @@ defmodule DiskuyWeb.Router do post "/survey/create", SurveyController, :create_survey options "/survey/create", SurveyController, :options + get "/survey/:survey_id/:question_id/", SurveyController, :check_all_answers + options "/survey/:survey_id/:question_id/", SurveyController, :options + end scope "/api", DiskuyWeb do -- GitLab From 350cb60c01a349395c3117aa6aa0b17a7c9e7d4c Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Fri, 10 Dec 2021 19:38:41 +0700 Subject: [PATCH 24/46] Adjust route controller + adjust answer query --- lib/diskuy/surveys.ex | 21 +++++++++++++++++-- .../controllers/survey_controller.ex | 4 ++-- lib/diskuy_web/router.ex | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/diskuy/surveys.ex b/lib/diskuy/surveys.ex index e92f4df..0064980 100644 --- a/lib/diskuy/surveys.ex +++ b/lib/diskuy/surveys.ex @@ -229,9 +229,26 @@ defmodule Diskuy.Surveys do """ def get_answer!(id), do: Repo.get!(Answer, id) - def get_grouped_answers_by_query!(id) do - from(a in Answer, where: a.question_id == ^id, group_by: a.answer, select: %{answer: a.answer, answer_count: count(a.id)}) + def get_grouped_answers_by_query!(survey_id, question_id) do + Answer + |> join(:inner, [a], q in Question, on: a.question_id == q.id) + |> where([a, q], a.question_id == ^question_id) + |> where([a, q], q.survey_id == ^survey_id) + |> select([a], %{ + answer: a.answer, + answer_count: count(a.id) + }) + |> group_by([a], a.answer) |> Repo.all() + + # from(a in Answer, + # join: q in Question, + # on: a.question_id == q.id, + # where: a.question_id == ^question_id, + # where: q.survey_id == ^survey_id, + # group_by: a.answer, + # select: %{answer: a.answer, answer_count: count(a.id)}) + # |> Repo.all() end @doc """ diff --git a/lib/diskuy_web/controllers/survey_controller.ex b/lib/diskuy_web/controllers/survey_controller.ex index 3115a34..ed6710e 100644 --- a/lib/diskuy_web/controllers/survey_controller.ex +++ b/lib/diskuy_web/controllers/survey_controller.ex @@ -26,8 +26,8 @@ defmodule DiskuyWeb.SurveyController do render(conn, "show.json", survey: survey) end - def show_answers(conn, %{"id" => id}) do - render(conn, "show.json", answers: Surveys.get_grouped_answers_by_query!(id)) + def show_answers(conn, %{"survey_id" => survey_id, "question_id" => question_id}) do + render(conn, "show.json", answers: Surveys.get_grouped_answers_by_query!(survey_id, question_id)) end def update(conn, %{"id" => id, "survey" => survey_params}) do diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index b1ec9ba..e9e4b92 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -43,7 +43,7 @@ defmodule DiskuyWeb.Router do post "/survey/create", SurveyController, :create_survey options "/survey/create", SurveyController, :options - get "/survey/:survey_id/:question_id/", SurveyController, :check_all_answers + get "/survey/:survey_id/:question_id/", SurveyController, :show_answers options "/survey/:survey_id/:question_id/", SurveyController, :options end -- GitLab From c0de8dc06f064bcff4c11bbd8522fa01b1ca5eaa Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sat, 11 Dec 2021 14:03:34 +0700 Subject: [PATCH 25/46] Change dev config + add controller views and routes for answer + question --- config/dev.exs | 8 +- .../controllers/answer_controller.ex | 47 ++++++++++ .../controllers/question_controller.ex | 43 ++++++++++ .../controllers/survey_controller.ex | 5 -- lib/diskuy_web/router.ex | 10 +-- lib/diskuy_web/views/answer_view.ex | 16 ++++ lib/diskuy_web/views/question_view.ex | 16 ++++ .../controllers/answer_controller_test.exs | 86 +++++++++++++++++++ .../controllers/question_controller_test.exs | 86 +++++++++++++++++++ 9 files changed, 303 insertions(+), 14 deletions(-) create mode 100644 lib/diskuy_web/controllers/answer_controller.ex create mode 100644 lib/diskuy_web/controllers/question_controller.ex create mode 100644 lib/diskuy_web/views/answer_view.ex create mode 100644 lib/diskuy_web/views/question_view.ex create mode 100644 test/diskuy_web/controllers/answer_controller_test.exs create mode 100644 test/diskuy_web/controllers/question_controller_test.exs diff --git a/config/dev.exs b/config/dev.exs index f584abf..b56ce17 100755 --- a/config/dev.exs +++ b/config/dev.exs @@ -2,10 +2,10 @@ use Mix.Config # Configure your database config :diskuy, Diskuy.Repo, - username: "psoglatpvgebuv", - password: "83be7f58480218d7329a99744f735c87eb2ae1037bd81af20bcc3e2c90b600ac", - database: "d3hisatile1qae", - hostname: "ec2-23-23-219-25.compute-1.amazonaws.com", + username: "rafif", + password: "rafif123", + database: "diskuy_dev_new", + hostname: "localhost", show_sensitive_data_on_connection_error: true, pool_size: 10 diff --git a/lib/diskuy_web/controllers/answer_controller.ex b/lib/diskuy_web/controllers/answer_controller.ex new file mode 100644 index 0000000..9c5577e --- /dev/null +++ b/lib/diskuy_web/controllers/answer_controller.ex @@ -0,0 +1,47 @@ +defmodule DiskuyWeb.AnswerController do + use DiskuyWeb, :controller + + alias Diskuy.Surveys + alias Diskuy.Surveys.Answer + + action_fallback DiskuyWeb.FallbackController + + def index(conn, _params) do + answers = Surveys.list_answers() + render(conn, "index.json", answers: answers) + end + + def create(conn, %{"answer" => answer_params}) do + with {:ok, %Answer{} = answer} <- Surveys.create_answer(answer_params) do + conn + |> put_status(:created) + |> put_resp_header("location", Routes.answer_path(conn, :show, answer)) + |> render("show.json", answer: answer) + end + end + + def show(conn, %{"id" => id}) do + answer = Surveys.get_answer!(id) + render(conn, "show.json", answer: answer) + end + + def show_answers(conn, %{"survey_id" => survey_id, "question_id" => question_id}) do + render(conn, "show.json", answers: Surveys.get_grouped_answers_by_query!(survey_id, question_id)) + end + + def update(conn, %{"id" => id, "answer" => answer_params}) do + answer = Surveys.get_answer!(id) + + with {:ok, %Answer{} = answer} <- Surveys.update_answer(answer, answer_params) do + render(conn, "show.json", answer: answer) + end + end + + def delete(conn, %{"id" => id}) do + answer = Surveys.get_answer!(id) + + with {:ok, %Answer{}} <- Surveys.delete_answer(answer) do + send_resp(conn, :no_content, "") + end + end +end diff --git a/lib/diskuy_web/controllers/question_controller.ex b/lib/diskuy_web/controllers/question_controller.ex new file mode 100644 index 0000000..09a3d59 --- /dev/null +++ b/lib/diskuy_web/controllers/question_controller.ex @@ -0,0 +1,43 @@ +defmodule DiskuyWeb.QuestionController do + use DiskuyWeb, :controller + + alias Diskuy.Surveys + alias Diskuy.Surveys.Question + + action_fallback DiskuyWeb.FallbackController + + def index(conn, _params) do + questions = Surveys.list_questions() + render(conn, "index.json", questions: questions) + end + + def create(conn, %{"question" => question_params}) do + with {:ok, %Question{} = question} <- Surveys.create_question(question_params) do + conn + |> put_status(:created) + |> put_resp_header("location", Routes.question_path(conn, :show, question)) + |> render("show.json", question: question) + end + end + + def show(conn, %{"id" => id}) do + question = Surveys.get_question!(id) + render(conn, "show.json", question: question) + end + + def update(conn, %{"id" => id, "question" => question_params}) do + question = Surveys.get_question!(id) + + with {:ok, %Question{} = question} <- Surveys.update_question(question, question_params) do + render(conn, "show.json", question: question) + end + end + + def delete(conn, %{"id" => id}) do + question = Surveys.get_question!(id) + + with {:ok, %Question{}} <- Surveys.delete_question(question) do + send_resp(conn, :no_content, "") + end + end +end diff --git a/lib/diskuy_web/controllers/survey_controller.ex b/lib/diskuy_web/controllers/survey_controller.ex index ed6710e..a35c3af 100644 --- a/lib/diskuy_web/controllers/survey_controller.ex +++ b/lib/diskuy_web/controllers/survey_controller.ex @@ -3,7 +3,6 @@ defmodule DiskuyWeb.SurveyController do alias Diskuy.Surveys alias Diskuy.Surveys.Survey - alias Diskuy.Surveys.Question action_fallback DiskuyWeb.FallbackController @@ -26,10 +25,6 @@ defmodule DiskuyWeb.SurveyController do render(conn, "show.json", survey: survey) end - def show_answers(conn, %{"survey_id" => survey_id, "question_id" => question_id}) do - render(conn, "show.json", answers: Surveys.get_grouped_answers_by_query!(survey_id, question_id)) - end - def update(conn, %{"id" => id, "survey" => survey_params}) do survey = Surveys.get_survey!(id) diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index e9e4b92..f5e566f 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -22,6 +22,9 @@ defmodule DiskuyWeb.Router do resources "/threads", ThreadController, except: [:new, :edit, :show, :index] resources "/topics", TopicController, except: [:new, :edit, :show, :index] resources "/post", PostController, except: [:new, :edit, :show, :index] + resources "/surveys", SurveyController, except: [:new, :edit] + resources "/questions", QuestionController, except: [:new, :edit] + resources "/answers", AnswerController, except: [:new, :edit] put "/users/update", UserController, :update options "/users/update", UserController, :options @@ -40,11 +43,8 @@ defmodule DiskuyWeb.Router do get "/post/checklike/:id", PostLikeController, :check_like options "/post/checklike/:id", PostLikeController, :options - post "/survey/create", SurveyController, :create_survey - options "/survey/create", SurveyController, :options - - get "/survey/:survey_id/:question_id/", SurveyController, :show_answers - options "/survey/:survey_id/:question_id/", SurveyController, :options + get "/answers/:survey_id/:question_id/", AnswerController, :show_answers + options "/answers/:survey_id/:question_id/", AnswerController, :options end diff --git a/lib/diskuy_web/views/answer_view.ex b/lib/diskuy_web/views/answer_view.ex new file mode 100644 index 0000000..87307c4 --- /dev/null +++ b/lib/diskuy_web/views/answer_view.ex @@ -0,0 +1,16 @@ +defmodule DiskuyWeb.AnswerView do + use DiskuyWeb, :view + alias DiskuyWeb.AnswerView + + def render("index.json", %{answers: answers}) do + %{data: render_many(answers, AnswerView, "answer.json")} + end + + def render("show.json", %{answer: answer}) do + %{data: render_one(answer, AnswerView, "answer.json")} + end + + def render("answer.json", %{answer: answer}) do + %{id: answer.id} + end +end diff --git a/lib/diskuy_web/views/question_view.ex b/lib/diskuy_web/views/question_view.ex new file mode 100644 index 0000000..fad0771 --- /dev/null +++ b/lib/diskuy_web/views/question_view.ex @@ -0,0 +1,16 @@ +defmodule DiskuyWeb.QuestionView do + use DiskuyWeb, :view + alias DiskuyWeb.QuestionView + + def render("index.json", %{questions: questions}) do + %{data: render_many(questions, QuestionView, "question.json")} + end + + def render("show.json", %{question: question}) do + %{data: render_one(question, QuestionView, "question.json")} + end + + def render("question.json", %{question: question}) do + %{id: question.id} + end +end diff --git a/test/diskuy_web/controllers/answer_controller_test.exs b/test/diskuy_web/controllers/answer_controller_test.exs new file mode 100644 index 0000000..1682b41 --- /dev/null +++ b/test/diskuy_web/controllers/answer_controller_test.exs @@ -0,0 +1,86 @@ +defmodule DiskuyWeb.AnswerControllerTest do + use DiskuyWeb.ConnCase + + alias Diskuy.Surveys + alias Diskuy.Surveys.Answer + + @create_attrs %{ + + } + @update_attrs %{ + + } + @invalid_attrs %{} + + def fixture(:answer) do + {:ok, answer} = Surveys.create_answer(@create_attrs) + answer + end + + setup %{conn: conn} do + {:ok, conn: put_req_header(conn, "accept", "application/json")} + end + + describe "index" do + test "lists all answers", %{conn: conn} do + conn = get(conn, Routes.answer_path(conn, :index)) + assert json_response(conn, 200)["data"] == [] + end + end + + describe "create answer" do + test "renders answer when data is valid", %{conn: conn} do + conn = post(conn, Routes.answer_path(conn, :create), answer: @create_attrs) + assert %{"id" => id} = json_response(conn, 201)["data"] + + conn = get(conn, Routes.answer_path(conn, :show, id)) + + assert %{ + "id" => id + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn} do + conn = post(conn, Routes.answer_path(conn, :create), answer: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "update answer" do + setup [:create_answer] + + test "renders answer when data is valid", %{conn: conn, answer: %Answer{id: id} = answer} do + conn = put(conn, Routes.answer_path(conn, :update, answer), answer: @update_attrs) + assert %{"id" => ^id} = json_response(conn, 200)["data"] + + conn = get(conn, Routes.answer_path(conn, :show, id)) + + assert %{ + "id" => id + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn, answer: answer} do + conn = put(conn, Routes.answer_path(conn, :update, answer), answer: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "delete answer" do + setup [:create_answer] + + test "deletes chosen answer", %{conn: conn, answer: answer} do + conn = delete(conn, Routes.answer_path(conn, :delete, answer)) + assert response(conn, 204) + + assert_error_sent 404, fn -> + get(conn, Routes.answer_path(conn, :show, answer)) + end + end + end + + defp create_answer(_) do + answer = fixture(:answer) + %{answer: answer} + end +end diff --git a/test/diskuy_web/controllers/question_controller_test.exs b/test/diskuy_web/controllers/question_controller_test.exs new file mode 100644 index 0000000..7b37994 --- /dev/null +++ b/test/diskuy_web/controllers/question_controller_test.exs @@ -0,0 +1,86 @@ +defmodule DiskuyWeb.QuestionControllerTest do + use DiskuyWeb.ConnCase + + alias Diskuy.Surveys + alias Diskuy.Surveys.Question + + @create_attrs %{ + + } + @update_attrs %{ + + } + @invalid_attrs %{} + + def fixture(:question) do + {:ok, question} = Surveys.create_question(@create_attrs) + question + end + + setup %{conn: conn} do + {:ok, conn: put_req_header(conn, "accept", "application/json")} + end + + describe "index" do + test "lists all questions", %{conn: conn} do + conn = get(conn, Routes.question_path(conn, :index)) + assert json_response(conn, 200)["data"] == [] + end + end + + describe "create question" do + test "renders question when data is valid", %{conn: conn} do + conn = post(conn, Routes.question_path(conn, :create), question: @create_attrs) + assert %{"id" => id} = json_response(conn, 201)["data"] + + conn = get(conn, Routes.question_path(conn, :show, id)) + + assert %{ + "id" => id + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn} do + conn = post(conn, Routes.question_path(conn, :create), question: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "update question" do + setup [:create_question] + + test "renders question when data is valid", %{conn: conn, question: %Question{id: id} = question} do + conn = put(conn, Routes.question_path(conn, :update, question), question: @update_attrs) + assert %{"id" => ^id} = json_response(conn, 200)["data"] + + conn = get(conn, Routes.question_path(conn, :show, id)) + + assert %{ + "id" => id + } = json_response(conn, 200)["data"] + end + + test "renders errors when data is invalid", %{conn: conn, question: question} do + conn = put(conn, Routes.question_path(conn, :update, question), question: @invalid_attrs) + assert json_response(conn, 422)["errors"] != %{} + end + end + + describe "delete question" do + setup [:create_question] + + test "deletes chosen question", %{conn: conn, question: question} do + conn = delete(conn, Routes.question_path(conn, :delete, question)) + assert response(conn, 204) + + assert_error_sent 404, fn -> + get(conn, Routes.question_path(conn, :show, question)) + end + end + end + + defp create_question(_) do + question = fixture(:question) + %{question: question} + end +end -- GitLab From b03c697a04ecb32c4a109294661fe444a06e7711 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sat, 11 Dec 2021 15:06:05 +0700 Subject: [PATCH 26/46] Edited answer and question JSON response + add new render for grouped answers --- lib/diskuy_web/controllers/answer_controller.ex | 4 ++-- lib/diskuy_web/router.ex | 2 +- lib/diskuy_web/views/answer_view.ex | 7 ++++++- lib/diskuy_web/views/question_view.ex | 3 ++- 4 files changed, 11 insertions(+), 5 deletions(-) diff --git a/lib/diskuy_web/controllers/answer_controller.ex b/lib/diskuy_web/controllers/answer_controller.ex index 9c5577e..be08621 100644 --- a/lib/diskuy_web/controllers/answer_controller.ex +++ b/lib/diskuy_web/controllers/answer_controller.ex @@ -25,8 +25,8 @@ defmodule DiskuyWeb.AnswerController do render(conn, "show.json", answer: answer) end - def show_answers(conn, %{"survey_id" => survey_id, "question_id" => question_id}) do - render(conn, "show.json", answers: Surveys.get_grouped_answers_by_query!(survey_id, question_id)) + def show_grouped_answers(conn, %{"survey_id" => survey_id, "question_id" => question_id}) do + render(conn, "groupedAnswer.json", grouped_answers: Surveys.get_grouped_answers_by_query!(survey_id, question_id)) end def update(conn, %{"id" => id, "answer" => answer_params}) do diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index f5e566f..cca8ebc 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -43,7 +43,7 @@ defmodule DiskuyWeb.Router do get "/post/checklike/:id", PostLikeController, :check_like options "/post/checklike/:id", PostLikeController, :options - get "/answers/:survey_id/:question_id/", AnswerController, :show_answers + get "/answers/:survey_id/:question_id/", AnswerController, :show_grouped_answers options "/answers/:survey_id/:question_id/", AnswerController, :options end diff --git a/lib/diskuy_web/views/answer_view.ex b/lib/diskuy_web/views/answer_view.ex index 87307c4..322f93a 100644 --- a/lib/diskuy_web/views/answer_view.ex +++ b/lib/diskuy_web/views/answer_view.ex @@ -11,6 +11,11 @@ defmodule DiskuyWeb.AnswerView do end def render("answer.json", %{answer: answer}) do - %{id: answer.id} + %{id: answer.id, + answer: answer} + end + + def render("groupedAnswer.json", %{grouped_answers: grouped_answers}) do + %{grouped_answers: grouped_answers} end end diff --git a/lib/diskuy_web/views/question_view.ex b/lib/diskuy_web/views/question_view.ex index fad0771..ee1a258 100644 --- a/lib/diskuy_web/views/question_view.ex +++ b/lib/diskuy_web/views/question_view.ex @@ -11,6 +11,7 @@ defmodule DiskuyWeb.QuestionView do end def render("question.json", %{question: question}) do - %{id: question.id} + %{id: question.id, + question: question.question} end end -- GitLab From 78f798f434f91c42d0cb5a6f9c4510a8d87c2223 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sat, 11 Dec 2021 15:25:31 +0700 Subject: [PATCH 27/46] Added more info to response + fixed typo --- lib/diskuy_web/controllers/answer_controller.ex | 2 +- lib/diskuy_web/views/answer_view.ex | 7 ++++++- lib/diskuy_web/views/question_view.ex | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/diskuy_web/controllers/answer_controller.ex b/lib/diskuy_web/controllers/answer_controller.ex index be08621..6efed9f 100644 --- a/lib/diskuy_web/controllers/answer_controller.ex +++ b/lib/diskuy_web/controllers/answer_controller.ex @@ -26,7 +26,7 @@ defmodule DiskuyWeb.AnswerController do end def show_grouped_answers(conn, %{"survey_id" => survey_id, "question_id" => question_id}) do - render(conn, "groupedAnswer.json", grouped_answers: Surveys.get_grouped_answers_by_query!(survey_id, question_id)) + render(conn, "showGrouped.json", grouped_answers: Surveys.get_grouped_answers_by_query!(survey_id, question_id)) end def update(conn, %{"id" => id, "answer" => answer_params}) do diff --git a/lib/diskuy_web/views/answer_view.ex b/lib/diskuy_web/views/answer_view.ex index 322f93a..e5d1fa0 100644 --- a/lib/diskuy_web/views/answer_view.ex +++ b/lib/diskuy_web/views/answer_view.ex @@ -10,9 +10,14 @@ defmodule DiskuyWeb.AnswerView do %{data: render_one(answer, AnswerView, "answer.json")} end + def render("showGrouped.json", %{grouped_answers: grouped_answers}) do + %{data: render_one(grouped_answers, AnswerView, "groupedAnswer.json")} + end + def render("answer.json", %{answer: answer}) do %{id: answer.id, - answer: answer} + answer: answer.answer, + question_id: answer.question_id} end def render("groupedAnswer.json", %{grouped_answers: grouped_answers}) do diff --git a/lib/diskuy_web/views/question_view.ex b/lib/diskuy_web/views/question_view.ex index ee1a258..db0a1f7 100644 --- a/lib/diskuy_web/views/question_view.ex +++ b/lib/diskuy_web/views/question_view.ex @@ -12,6 +12,7 @@ defmodule DiskuyWeb.QuestionView do def render("question.json", %{question: question}) do %{id: question.id, - question: question.question} + question: question.question, + survey_id: question.survey_id} end end -- GitLab From 69c55a79f135cc859bb0e5e4087cf565190916dc Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sat, 11 Dec 2021 15:29:12 +0700 Subject: [PATCH 28/46] Add FK casts on changeset --- lib/diskuy/surveys/answer.ex | 4 ++-- lib/diskuy/surveys/question.ex | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/diskuy/surveys/answer.ex b/lib/diskuy/surveys/answer.ex index f0ab17a..27f25db 100644 --- a/lib/diskuy/surveys/answer.ex +++ b/lib/diskuy/surveys/answer.ex @@ -13,7 +13,7 @@ defmodule Diskuy.Surveys.Answer do @doc false def changeset(answer, attrs) do answer - |> cast(attrs, [:answer]) - |> validate_required([:answer]) + |> cast(attrs, [:answer, :question_id]) + |> validate_required([:answer, :question_id]) end end diff --git a/lib/diskuy/surveys/question.ex b/lib/diskuy/surveys/question.ex index 2327a2c..dde2fdb 100644 --- a/lib/diskuy/surveys/question.ex +++ b/lib/diskuy/surveys/question.ex @@ -13,7 +13,7 @@ defmodule Diskuy.Surveys.Question do @doc false def changeset(question, attrs) do question - |> cast(attrs, [:question]) - |> validate_required([:question]) + |> cast(attrs, [:question, :survey_id]) + |> validate_required([:question, :survey_id]) end end -- GitLab From be2392424b71222842e753530d514da92071c5c3 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sat, 11 Dec 2021 15:49:22 +0700 Subject: [PATCH 29/46] Add user id validation in changeset + update surveys + update render for grouped answers --- lib/diskuy/surveys/answer.ex | 4 ++-- lib/diskuy/surveys/question.ex | 4 ++-- lib/diskuy/surveys/survey.ex | 5 +++-- lib/diskuy_web/views/answer_view.ex | 2 +- priv/repo/migrations/20211211084707_update_surveys.exs | 9 +++++++++ 5 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 priv/repo/migrations/20211211084707_update_surveys.exs diff --git a/lib/diskuy/surveys/answer.ex b/lib/diskuy/surveys/answer.ex index 27f25db..a7c1ad8 100644 --- a/lib/diskuy/surveys/answer.ex +++ b/lib/diskuy/surveys/answer.ex @@ -13,7 +13,7 @@ defmodule Diskuy.Surveys.Answer do @doc false def changeset(answer, attrs) do answer - |> cast(attrs, [:answer, :question_id]) - |> validate_required([:answer, :question_id]) + |> cast(attrs, [:answer, :question_id, :user_id]) + |> validate_required([:answer, :question_id, :user_id]) end end diff --git a/lib/diskuy/surveys/question.ex b/lib/diskuy/surveys/question.ex index dde2fdb..cb3296d 100644 --- a/lib/diskuy/surveys/question.ex +++ b/lib/diskuy/surveys/question.ex @@ -13,7 +13,7 @@ defmodule Diskuy.Surveys.Question do @doc false def changeset(question, attrs) do question - |> cast(attrs, [:question, :survey_id]) - |> validate_required([:question, :survey_id]) + |> cast(attrs, [:question, :survey_id, :user_id]) + |> validate_required([:question, :survey_id, :user_id]) end end diff --git a/lib/diskuy/surveys/survey.ex b/lib/diskuy/surveys/survey.ex index 9cbce60..0499745 100644 --- a/lib/diskuy/surveys/survey.ex +++ b/lib/diskuy/surveys/survey.ex @@ -3,6 +3,7 @@ defmodule Diskuy.Surveys.Survey do import Ecto.Changeset schema "surveys" do + field :user_id, :id field :title, :string timestamps() @@ -11,7 +12,7 @@ defmodule Diskuy.Surveys.Survey do @doc false def changeset(survey, attrs) do survey - |> cast(attrs, [:title]) - |> validate_required([:title]) + |> cast(attrs, [:title, :user_id]) + |> validate_required([:title, :user_id]) end end diff --git a/lib/diskuy_web/views/answer_view.ex b/lib/diskuy_web/views/answer_view.ex index e5d1fa0..4045d18 100644 --- a/lib/diskuy_web/views/answer_view.ex +++ b/lib/diskuy_web/views/answer_view.ex @@ -11,7 +11,7 @@ defmodule DiskuyWeb.AnswerView do end def render("showGrouped.json", %{grouped_answers: grouped_answers}) do - %{data: render_one(grouped_answers, AnswerView, "groupedAnswer.json")} + %{data: render_many(grouped_answers, AnswerView, "groupedAnswer.json")} end def render("answer.json", %{answer: answer}) do diff --git a/priv/repo/migrations/20211211084707_update_surveys.exs b/priv/repo/migrations/20211211084707_update_surveys.exs new file mode 100644 index 0000000..0086b10 --- /dev/null +++ b/priv/repo/migrations/20211211084707_update_surveys.exs @@ -0,0 +1,9 @@ +defmodule Diskuy.Repo.Migrations.UpdateSurveys do + use Ecto.Migration + + def change do + alter table(:surveys) do + add :user_id, references(:users, on_delete: :nothing) + end + end +end -- GitLab From 0b6caca70544b84980f53b0128d311b76119cd8e Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 12 Dec 2021 12:20:06 +0700 Subject: [PATCH 30/46] Add OPTIONS to some routes in router --- lib/diskuy_web/router.ex | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index cca8ebc..dba853d 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -22,9 +22,18 @@ defmodule DiskuyWeb.Router do resources "/threads", ThreadController, except: [:new, :edit, :show, :index] resources "/topics", TopicController, except: [:new, :edit, :show, :index] resources "/post", PostController, except: [:new, :edit, :show, :index] + resources "/surveys", SurveyController, except: [:new, :edit] + options "/surveys", SurveyController, :options + options "/surveys/:id", SurveyController, :options + resources "/questions", QuestionController, except: [:new, :edit] + options "/questions", QuestionController, :options + options "/questions/:id", QuestionController, :options + resources "/answers", AnswerController, except: [:new, :edit] + options "/answers", AnswerController, :options + options "/answers/:id", AnswerController, :options put "/users/update", UserController, :update options "/users/update", UserController, :options @@ -85,9 +94,6 @@ defmodule DiskuyWeb.Router do options "/post", PostController, :options options "/post/:id", PostController, :options - get "/survey/", SurveyController, :index - options "/survey/:survey_id", SurveyController, :options - # post "/users/signup", UserController, :create # options "/users/signup", PostController, :options # post "/users/signin", UserController, :signin -- GitLab From c7977a5e1d95c7152c79b33efc27fa91462a9ff1 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 12 Dec 2021 13:00:00 +0700 Subject: [PATCH 31/46] Add new function and route to get questions by survey and fix grouped answer render --- lib/diskuy/surveys.ex | 14 +++++--------- lib/diskuy_web/controllers/question_controller.ex | 4 ++++ lib/diskuy_web/router.ex | 3 +++ lib/diskuy_web/views/answer_view.ex | 3 ++- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/lib/diskuy/surveys.ex b/lib/diskuy/surveys.ex index 0064980..29b86bb 100644 --- a/lib/diskuy/surveys.ex +++ b/lib/diskuy/surveys.ex @@ -133,6 +133,11 @@ defmodule Diskuy.Surveys do """ def get_question!(id), do: Repo.get!(Question, id) + def get_questions_by_survey_id!(survey_id) do + from(q in Question, where: q.survey_id == ^survey_id) + |> Repo.all() + end + @doc """ Creates a question. @@ -240,15 +245,6 @@ defmodule Diskuy.Surveys do }) |> group_by([a], a.answer) |> Repo.all() - - # from(a in Answer, - # join: q in Question, - # on: a.question_id == q.id, - # where: a.question_id == ^question_id, - # where: q.survey_id == ^survey_id, - # group_by: a.answer, - # select: %{answer: a.answer, answer_count: count(a.id)}) - # |> Repo.all() end @doc """ diff --git a/lib/diskuy_web/controllers/question_controller.ex b/lib/diskuy_web/controllers/question_controller.ex index 09a3d59..546f00a 100644 --- a/lib/diskuy_web/controllers/question_controller.ex +++ b/lib/diskuy_web/controllers/question_controller.ex @@ -25,6 +25,10 @@ defmodule DiskuyWeb.QuestionController do render(conn, "show.json", question: question) end + def show_all_questions_by_survey_id(conn, %{"survey_id" => survey_id}) do + render(conn, "showGrouped.json", questions: Surveys.get_questions_by_survey_id!(survey_id)) + end + def update(conn, %{"id" => id, "question" => question_params}) do question = Surveys.get_question!(id) diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index dba853d..15a3918 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -55,6 +55,9 @@ defmodule DiskuyWeb.Router do get "/answers/:survey_id/:question_id/", AnswerController, :show_grouped_answers options "/answers/:survey_id/:question_id/", AnswerController, :options + get "/questions/by_survey_id/:survey_id", QuestionController, :show_all_questions_by_survey_id + options "/questions/by_survey_id/:survey_id", QuestionController, :options + end scope "/api", DiskuyWeb do diff --git a/lib/diskuy_web/views/answer_view.ex b/lib/diskuy_web/views/answer_view.ex index 4045d18..8b30397 100644 --- a/lib/diskuy_web/views/answer_view.ex +++ b/lib/diskuy_web/views/answer_view.ex @@ -21,6 +21,7 @@ defmodule DiskuyWeb.AnswerView do end def render("groupedAnswer.json", %{grouped_answers: grouped_answers}) do - %{grouped_answers: grouped_answers} + %{answer: grouped_answers.answer, + answer_count: grouped_answers.answer_count} end end -- GitLab From 78e210ef4f82d5827b5ffb7ebec536885b49010f Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 12 Dec 2021 13:06:06 +0700 Subject: [PATCH 32/46] Fix render .json --- lib/diskuy_web/controllers/question_controller.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/diskuy_web/controllers/question_controller.ex b/lib/diskuy_web/controllers/question_controller.ex index 546f00a..7332eb5 100644 --- a/lib/diskuy_web/controllers/question_controller.ex +++ b/lib/diskuy_web/controllers/question_controller.ex @@ -26,7 +26,7 @@ defmodule DiskuyWeb.QuestionController do end def show_all_questions_by_survey_id(conn, %{"survey_id" => survey_id}) do - render(conn, "showGrouped.json", questions: Surveys.get_questions_by_survey_id!(survey_id)) + render(conn, "index.json", questions: Surveys.get_questions_by_survey_id!(survey_id)) end def update(conn, %{"id" => id, "question" => question_params}) do -- GitLab From 0537f055fe9d7e5e2a651d22828e4fb11d7575ac Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 12 Dec 2021 13:15:28 +0700 Subject: [PATCH 33/46] Fix pattern for grouped answer's render .json --- lib/diskuy_web/views/answer_view.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/diskuy_web/views/answer_view.ex b/lib/diskuy_web/views/answer_view.ex index 8b30397..2b29df3 100644 --- a/lib/diskuy_web/views/answer_view.ex +++ b/lib/diskuy_web/views/answer_view.ex @@ -21,7 +21,7 @@ defmodule DiskuyWeb.AnswerView do end def render("groupedAnswer.json", %{grouped_answers: grouped_answers}) do - %{answer: grouped_answers.answer, - answer_count: grouped_answers.answer_count} + %{answer: grouped_answers.answer.answer, + answer_count: grouped_answers.answer.answer_count} end end -- GitLab From 259469d393bb368dcd5755c91d1f3030a74ff9bd Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 12 Dec 2021 13:23:48 +0700 Subject: [PATCH 34/46] Fix pattern for grouped answer's render .json --- lib/diskuy_web/views/answer_view.ex | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/diskuy_web/views/answer_view.ex b/lib/diskuy_web/views/answer_view.ex index 2b29df3..60bb7ad 100644 --- a/lib/diskuy_web/views/answer_view.ex +++ b/lib/diskuy_web/views/answer_view.ex @@ -11,7 +11,7 @@ defmodule DiskuyWeb.AnswerView do end def render("showGrouped.json", %{grouped_answers: grouped_answers}) do - %{data: render_many(grouped_answers, AnswerView, "groupedAnswer.json")} + %{data: render_many(grouped_answers.answer, AnswerView, "groupedAnswer.json")} end def render("answer.json", %{answer: answer}) do @@ -21,7 +21,7 @@ defmodule DiskuyWeb.AnswerView do end def render("groupedAnswer.json", %{grouped_answers: grouped_answers}) do - %{answer: grouped_answers.answer.answer, - answer_count: grouped_answers.answer.answer_count} + %{answer: grouped_answers.answer, + answer_count: grouped_answers.answer_count} end end -- GitLab From 364e073362be6c3bb02def17207b52cba4d2c38e Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 12 Dec 2021 13:50:41 +0700 Subject: [PATCH 35/46] Moved 'render' json for grouped answer to controller --- lib/diskuy_web/controllers/answer_controller.ex | 3 ++- lib/diskuy_web/views/answer_view.ex | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/diskuy_web/controllers/answer_controller.ex b/lib/diskuy_web/controllers/answer_controller.ex index 6efed9f..7ec9803 100644 --- a/lib/diskuy_web/controllers/answer_controller.ex +++ b/lib/diskuy_web/controllers/answer_controller.ex @@ -26,7 +26,8 @@ defmodule DiskuyWeb.AnswerController do end def show_grouped_answers(conn, %{"survey_id" => survey_id, "question_id" => question_id}) do - render(conn, "showGrouped.json", grouped_answers: Surveys.get_grouped_answers_by_query!(survey_id, question_id)) + json(conn, Surveys.get_grouped_answers_by_query!(survey_id, question_id)) + # render(conn, "showGrouped.json", grouped_answers: Surveys.get_grouped_answers_by_query!(survey_id, question_id)) end def update(conn, %{"id" => id, "answer" => answer_params}) do diff --git a/lib/diskuy_web/views/answer_view.ex b/lib/diskuy_web/views/answer_view.ex index 60bb7ad..8b30397 100644 --- a/lib/diskuy_web/views/answer_view.ex +++ b/lib/diskuy_web/views/answer_view.ex @@ -11,7 +11,7 @@ defmodule DiskuyWeb.AnswerView do end def render("showGrouped.json", %{grouped_answers: grouped_answers}) do - %{data: render_many(grouped_answers.answer, AnswerView, "groupedAnswer.json")} + %{data: render_many(grouped_answers, AnswerView, "groupedAnswer.json")} end def render("answer.json", %{answer: answer}) do -- GitLab From 6001f7ff5778783f5e2436d622200fdec2012cac Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 12 Dec 2021 14:42:59 +0700 Subject: [PATCH 36/46] Removed unused functions in views + add logic to get user id in BE --- lib/diskuy_web/controllers/answer_controller.ex | 11 +++++++++-- lib/diskuy_web/controllers/question_controller.ex | 10 +++++++++- lib/diskuy_web/controllers/survey_controller.ex | 10 +++++++++- lib/diskuy_web/views/answer_view.ex | 9 --------- 4 files changed, 27 insertions(+), 13 deletions(-) diff --git a/lib/diskuy_web/controllers/answer_controller.ex b/lib/diskuy_web/controllers/answer_controller.ex index 7ec9803..06353ce 100644 --- a/lib/diskuy_web/controllers/answer_controller.ex +++ b/lib/diskuy_web/controllers/answer_controller.ex @@ -3,6 +3,7 @@ defmodule DiskuyWeb.AnswerController do alias Diskuy.Surveys alias Diskuy.Surveys.Answer + alias DiskuyWeb.Auth.Guardian action_fallback DiskuyWeb.FallbackController @@ -12,7 +13,8 @@ defmodule DiskuyWeb.AnswerController do end def create(conn, %{"answer" => answer_params}) do - with {:ok, %Answer{} = answer} <- Surveys.create_answer(answer_params) do + new_params = put_user_id(conn, %{"answer" => answer_params}) + with {:ok, %Answer{} = answer} <- Surveys.create_answer(new_params) do conn |> put_status(:created) |> put_resp_header("location", Routes.answer_path(conn, :show, answer)) @@ -27,7 +29,6 @@ defmodule DiskuyWeb.AnswerController do def show_grouped_answers(conn, %{"survey_id" => survey_id, "question_id" => question_id}) do json(conn, Surveys.get_grouped_answers_by_query!(survey_id, question_id)) - # render(conn, "showGrouped.json", grouped_answers: Surveys.get_grouped_answers_by_query!(survey_id, question_id)) end def update(conn, %{"id" => id, "answer" => answer_params}) do @@ -45,4 +46,10 @@ defmodule DiskuyWeb.AnswerController do send_resp(conn, :no_content, "") end end + + defp put_user_id(conn, %{"answer" => answer_params}) do + current_user = Guardian.Plug.current_resource(conn) + new_params = Map.put(answer_params, "user_id", current_user.id) + new_params + end end diff --git a/lib/diskuy_web/controllers/question_controller.ex b/lib/diskuy_web/controllers/question_controller.ex index 7332eb5..6726edf 100644 --- a/lib/diskuy_web/controllers/question_controller.ex +++ b/lib/diskuy_web/controllers/question_controller.ex @@ -3,6 +3,7 @@ defmodule DiskuyWeb.QuestionController do alias Diskuy.Surveys alias Diskuy.Surveys.Question + alias DiskuyWeb.Auth.Guardian action_fallback DiskuyWeb.FallbackController @@ -12,7 +13,8 @@ defmodule DiskuyWeb.QuestionController do end def create(conn, %{"question" => question_params}) do - with {:ok, %Question{} = question} <- Surveys.create_question(question_params) do + new_params = put_user_id(conn, %{"question" => question_params}) + with {:ok, %Question{} = question} <- Surveys.create_question(new_params) do conn |> put_status(:created) |> put_resp_header("location", Routes.question_path(conn, :show, question)) @@ -44,4 +46,10 @@ defmodule DiskuyWeb.QuestionController do send_resp(conn, :no_content, "") end end + + defp put_user_id(conn, %{"question" => question_params}) do + current_user = Guardian.Plug.current_resource(conn) + new_params = Map.put(question_params, "user_id", current_user.id) + new_params + end end diff --git a/lib/diskuy_web/controllers/survey_controller.ex b/lib/diskuy_web/controllers/survey_controller.ex index a35c3af..166232f 100644 --- a/lib/diskuy_web/controllers/survey_controller.ex +++ b/lib/diskuy_web/controllers/survey_controller.ex @@ -3,6 +3,7 @@ defmodule DiskuyWeb.SurveyController do alias Diskuy.Surveys alias Diskuy.Surveys.Survey + alias DiskuyWeb.Auth.Guardian action_fallback DiskuyWeb.FallbackController @@ -12,7 +13,8 @@ defmodule DiskuyWeb.SurveyController do end def create(conn, %{"survey" => survey_params}) do - with {:ok, %Survey{} = survey} <- Surveys.create_survey(survey_params) do + new_params = put_user_id(conn, %{"survey" => survey_params}) + with {:ok, %Survey{} = survey} <- Surveys.create_survey(new_params) do conn |> put_status(:created) |> put_resp_header("location", Routes.survey_path(conn, :show, survey)) @@ -40,4 +42,10 @@ defmodule DiskuyWeb.SurveyController do send_resp(conn, :no_content, "") end end + + defp put_user_id(conn, %{"survey" => survey_params}) do + current_user = Guardian.Plug.current_resource(conn) + new_params = Map.put(survey_params, "user_id", current_user.id) + new_params + end end diff --git a/lib/diskuy_web/views/answer_view.ex b/lib/diskuy_web/views/answer_view.ex index 8b30397..2616819 100644 --- a/lib/diskuy_web/views/answer_view.ex +++ b/lib/diskuy_web/views/answer_view.ex @@ -10,18 +10,9 @@ defmodule DiskuyWeb.AnswerView do %{data: render_one(answer, AnswerView, "answer.json")} end - def render("showGrouped.json", %{grouped_answers: grouped_answers}) do - %{data: render_many(grouped_answers, AnswerView, "groupedAnswer.json")} - end - def render("answer.json", %{answer: answer}) do %{id: answer.id, answer: answer.answer, question_id: answer.question_id} end - - def render("groupedAnswer.json", %{grouped_answers: grouped_answers}) do - %{answer: grouped_answers.answer, - answer_count: grouped_answers.answer_count} - end end -- GitLab From 168b383635deb87da7e0ca59e505fe09ffcea6c3 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 12 Dec 2021 15:08:36 +0700 Subject: [PATCH 37/46] Add new endpoint to get survey title + all questions related --- lib/diskuy_web/controllers/survey_controller.ex | 6 ++++++ lib/diskuy_web/router.ex | 3 +++ 2 files changed, 9 insertions(+) diff --git a/lib/diskuy_web/controllers/survey_controller.ex b/lib/diskuy_web/controllers/survey_controller.ex index 166232f..864128a 100644 --- a/lib/diskuy_web/controllers/survey_controller.ex +++ b/lib/diskuy_web/controllers/survey_controller.ex @@ -27,6 +27,12 @@ defmodule DiskuyWeb.SurveyController do render(conn, "show.json", survey: survey) end + def show_all_survey_questions(conn, %{"survey_id" => survey_id}) do + questions = Surveys.get_questions_by_survey_id!(survey_id) + survey = Surveys.get_survey!(survey_id) + json(conn, %{title: survey.title, questions: questions}) + end + def update(conn, %{"id" => id, "survey" => survey_params}) do survey = Surveys.get_survey!(id) diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index 15a3918..cead3d8 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -52,6 +52,9 @@ defmodule DiskuyWeb.Router do get "/post/checklike/:id", PostLikeController, :check_like options "/post/checklike/:id", PostLikeController, :options + get "/surveys/show_questions/:survey_id", SurveyController, :show_all_survey_questions + options "/surveys/show_questions/:survey_id", SurveyController, :options + get "/answers/:survey_id/:question_id/", AnswerController, :show_grouped_answers options "/answers/:survey_id/:question_id/", AnswerController, :options -- GitLab From e5b0afec232529874f564c56ec7f48bc81333860 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 12 Dec 2021 15:32:17 +0700 Subject: [PATCH 38/46] Modified json response for survey all question --- lib/diskuy/surveys.ex | 3 ++- lib/diskuy_web/controllers/survey_controller.ex | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/diskuy/surveys.ex b/lib/diskuy/surveys.ex index 29b86bb..5e5c96a 100644 --- a/lib/diskuy/surveys.ex +++ b/lib/diskuy/surveys.ex @@ -134,7 +134,8 @@ defmodule Diskuy.Surveys do def get_question!(id), do: Repo.get!(Question, id) def get_questions_by_survey_id!(survey_id) do - from(q in Question, where: q.survey_id == ^survey_id) + Question + |> where([q], q.survey_id == ^survey_id) |> Repo.all() end diff --git a/lib/diskuy_web/controllers/survey_controller.ex b/lib/diskuy_web/controllers/survey_controller.ex index 864128a..2d07a10 100644 --- a/lib/diskuy_web/controllers/survey_controller.ex +++ b/lib/diskuy_web/controllers/survey_controller.ex @@ -30,7 +30,8 @@ defmodule DiskuyWeb.SurveyController do def show_all_survey_questions(conn, %{"survey_id" => survey_id}) do questions = Surveys.get_questions_by_survey_id!(survey_id) survey = Surveys.get_survey!(survey_id) - json(conn, %{title: survey.title, questions: questions}) + result = %{title: survey.title, questions: questions} + json(conn, result) end def update(conn, %{"id" => id, "survey" => survey_params}) do -- GitLab From c22afcc002403af5b6ac0471ea371107e8231665 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Sun, 12 Dec 2021 15:35:43 +0700 Subject: [PATCH 39/46] Add select in survey all questions query --- lib/diskuy/surveys.ex | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/diskuy/surveys.ex b/lib/diskuy/surveys.ex index 5e5c96a..3b1ac5b 100644 --- a/lib/diskuy/surveys.ex +++ b/lib/diskuy/surveys.ex @@ -136,6 +136,10 @@ defmodule Diskuy.Surveys do def get_questions_by_survey_id!(survey_id) do Question |> where([q], q.survey_id == ^survey_id) + |> select([q], %{ + id: q.id, + question: q.question + }) |> Repo.all() end -- GitLab From 1f0aedd5c77707986e1d8514c99ccc46947b8fdb Mon Sep 17 00:00:00 2001 From: Iqrar Agalosi Nureyza --replace-all <iqrar.agalosi@ui.ac.id> Date: Sun, 12 Dec 2021 16:53:44 +0700 Subject: [PATCH 40/46] Delete unnecessary endpoint --- lib/diskuy_web/router.ex | 3 --- 1 file changed, 3 deletions(-) diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index cead3d8..6105716 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -58,9 +58,6 @@ defmodule DiskuyWeb.Router do get "/answers/:survey_id/:question_id/", AnswerController, :show_grouped_answers options "/answers/:survey_id/:question_id/", AnswerController, :options - get "/questions/by_survey_id/:survey_id", QuestionController, :show_all_questions_by_survey_id - options "/questions/by_survey_id/:survey_id", QuestionController, :options - end scope "/api", DiskuyWeb do -- GitLab From c0587d2632be53157a008ce6769b7863515554f0 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Mon, 13 Dec 2021 14:33:02 +0700 Subject: [PATCH 41/46] Add more info on survey render + added pagination functions for surveys main page --- lib/diskuy/surveys_page.ex | 40 ++++++++++++++ .../controllers/survey_pages_controller.ex | 52 +++++++++++++++++++ lib/diskuy_web/router.ex | 9 ++++ lib/diskuy_web/views/survey_pages_view.ex | 15 ++++++ lib/diskuy_web/views/survey_view.ex | 7 ++- 5 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 lib/diskuy/surveys_page.ex create mode 100644 lib/diskuy_web/controllers/survey_pages_controller.ex create mode 100644 lib/diskuy_web/views/survey_pages_view.ex diff --git a/lib/diskuy/surveys_page.ex b/lib/diskuy/surveys_page.ex new file mode 100644 index 0000000..f60e9ac --- /dev/null +++ b/lib/diskuy/surveys_page.ex @@ -0,0 +1,40 @@ +defmodule Diskuy.SurveysPage do + @moduledoc """ + The Query Builder For Paging Thread Schema. + """ + + import Ecto.Query, warn: false + alias Diskuy.Account.User + alias Diskuy.Surveys.Survey + + def page_recent do + query = query_start() + |> order_by([s], desc: s.inserted_at, asc: s.title) + query + end + + def page_top do + query_start() + |> order_by([s], desc: s.points, desc: s.inserted_at, asc: s.title) + end + + def page_search(title)do + query_start() + |> where([s], ilike(s.title, ^"%#{String.replace(title, ~r/[%_(\\)]/, "\\\\\\0") }%")) + |> order_by([s], asc: s.title , desc: s.inserted_at ) + end + + def page_per_user(username) do + query_start() + |> where([s, u], u.username == ^username) + |> order_by([s], desc: s.inserted_at, asc: s.title) + end + + defp query_start do + Survey + |> join(:inner, [s], u in User, as: :users, on: s.user_id == u.id) + |> select([s, u], %{survey: %{id: s.id, title: s.title, + user_id: s.user_id, username: u.username, + inserted_at: s.inserted_at, updated_at: s.updated_at}}) + end +end diff --git a/lib/diskuy_web/controllers/survey_pages_controller.ex b/lib/diskuy_web/controllers/survey_pages_controller.ex new file mode 100644 index 0000000..1fb9d99 --- /dev/null +++ b/lib/diskuy_web/controllers/survey_pages_controller.ex @@ -0,0 +1,52 @@ +defmodule DiskuyWeb.SurveyPagesController do + use DiskuyWeb, :controller + alias Diskuy.SurveysPage + alias Diskuy.Repo + + action_fallback DiskuyWeb.FallbackController + + # Pages Top Pattern Matching + def pages_top(conn, _params) do + query = SurveysPage.page_top() + paginate_and_render(conn, query) + end + + + # Pages Recent Pattern Matching + def pages_recent(conn, _params) do + query = SurveysPage.page_recent() + paginate_and_render(conn, query) + end + + + # Pages Search Pattern Matching + def pages_search(conn, %{"title" => title}) do + query = SurveysPage.page_search(title) + paginate_and_render(conn, query) + end + + # Pages Per User + def pages_user(conn, %{"username" => username}) do + query = SurveysPage.page_per_user(username) + paginate_and_render(conn, query) + end + + + defp paginate_and_render(conn, query) do + case conn.params do + %{"page" => page_num} -> + query + |> Repo.paginate(page: page_num) |> render_helper(conn) + _ -> + query + |> Repo.paginate(page: 1) |> render_helper(conn) + end + end + + defp render_helper(page, conn) do + with %{entries: _entries} <- page do + render(conn, "pages.json", %{page: page}) + end + end + +end diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex index 6105716..d74fea4 100644 --- a/lib/diskuy_web/router.ex +++ b/lib/diskuy_web/router.ex @@ -84,6 +84,15 @@ defmodule DiskuyWeb.Router do get "/threads/pages/user/:username", ThreadPagesController, :pages_user options "/threads/pages/user/:username", ThreadPagesController, :options + get "/surveys/pages/recent", SurveyPagesController, :pages_recent + options "/surveys/pages/recent", SurveyPagesController, :options + get "/surveys/pages/top", SurveyPagesController, :pages_top + options "/surveys/pages/top", SurveyPagesController, :options + get "/surveys/pages/search/:title", SurveyPagesController, :pages_search + options "/surveys/pages/search/:title", SurveyPagesController, :options + get "/surveys/pages/user/:username", SurveyPagesController, :pages_user + options "/surveys/pages/user/:username", SurveyPagesController, :options + resources "/threads", ThreadController, except: [:new, :edit, :create, :update, :delete] options "/threads", ThreadController, :options diff --git a/lib/diskuy_web/views/survey_pages_view.ex b/lib/diskuy_web/views/survey_pages_view.ex new file mode 100644 index 0000000..c4a1b88 --- /dev/null +++ b/lib/diskuy_web/views/survey_pages_view.ex @@ -0,0 +1,15 @@ +defmodule DiskuyWeb.SurveyPagesView do + use DiskuyWeb, :view + + def render("pages.json", %{page: page}) do + %{ + data: Enum.map(page.entries, fn x -> x.survey end), + metadata: %{ + page_number: page.page_number, + page_size: page.page_size, + total_data: page.total_entries, + total_pages: page.total_pages + } + } + end +end diff --git a/lib/diskuy_web/views/survey_view.ex b/lib/diskuy_web/views/survey_view.ex index afa1317..8e6668c 100644 --- a/lib/diskuy_web/views/survey_view.ex +++ b/lib/diskuy_web/views/survey_view.ex @@ -1,6 +1,7 @@ defmodule DiskuyWeb.SurveyView do use DiskuyWeb, :view alias DiskuyWeb.SurveyView + alias Diskuy.Account def render("index.json", %{surveys: surveys}) do %{data: render_many(surveys, SurveyView, "survey.json")} @@ -11,7 +12,11 @@ defmodule DiskuyWeb.SurveyView do end def render("survey.json", %{survey: survey}) do + user = Account.get_user!(survey.user_id) %{id: survey.id, - title: survey.title} + title: survey.title, + username: user.username, + inserted_at: survey.inserted_at, + updated_at: survey.updated_at} end end -- GitLab From e96884111da6e63b874d09b839338ea84a6f20ce Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Mon, 13 Dec 2021 14:47:01 +0700 Subject: [PATCH 42/46] Removed excess column --- lib/diskuy/surveys_page.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/diskuy/surveys_page.ex b/lib/diskuy/surveys_page.ex index f60e9ac..61438cd 100644 --- a/lib/diskuy/surveys_page.ex +++ b/lib/diskuy/surveys_page.ex @@ -15,7 +15,7 @@ defmodule Diskuy.SurveysPage do def page_top do query_start() - |> order_by([s], desc: s.points, desc: s.inserted_at, asc: s.title) + |> order_by([s], desc: s.inserted_at, asc: s.title) end def page_search(title)do -- GitLab From dcf1ab1f91ebb0847312f8c7905d63be85ab7a36 Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Mon, 13 Dec 2021 17:05:44 +0700 Subject: [PATCH 43/46] Change FK constraints to delete all --- .../migrations/20211213095711_update_survey_fk.exs | 10 ++++++++++ .../20211213100227_update_questions_fk.exs | 12 ++++++++++++ .../migrations/20211213100337_update_answers_fk.exs | 12 ++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 priv/repo/migrations/20211213095711_update_survey_fk.exs create mode 100644 priv/repo/migrations/20211213100227_update_questions_fk.exs create mode 100644 priv/repo/migrations/20211213100337_update_answers_fk.exs diff --git a/priv/repo/migrations/20211213095711_update_survey_fk.exs b/priv/repo/migrations/20211213095711_update_survey_fk.exs new file mode 100644 index 0000000..f848791 --- /dev/null +++ b/priv/repo/migrations/20211213095711_update_survey_fk.exs @@ -0,0 +1,10 @@ +defmodule Diskuy.Repo.Migrations.UpdateSurveyFk do + use Ecto.Migration + + def change do + drop constraint(:surveys, "surveys_user_id_fkey") + alter table(:surveys) do + modify :user_id, references(:users, on_delete: :delete_all, type: :id) + end + end +end diff --git a/priv/repo/migrations/20211213100227_update_questions_fk.exs b/priv/repo/migrations/20211213100227_update_questions_fk.exs new file mode 100644 index 0000000..d93be49 --- /dev/null +++ b/priv/repo/migrations/20211213100227_update_questions_fk.exs @@ -0,0 +1,12 @@ +defmodule Diskuy.Repo.Migrations.UpdateQuestionsFk do + use Ecto.Migration + + def change do + drop constraint(:questions, "questions_user_id_fkey") + drop constraint(:questions, "questions_survey_id_fkey") + alter table(:questions) do + modify :user_id, references(:users, on_delete: :delete_all, type: :id) + modify :survey_id, references(:surveys, on_delete: :delete_all, type: :id) + end + end +end diff --git a/priv/repo/migrations/20211213100337_update_answers_fk.exs b/priv/repo/migrations/20211213100337_update_answers_fk.exs new file mode 100644 index 0000000..66ee6e6 --- /dev/null +++ b/priv/repo/migrations/20211213100337_update_answers_fk.exs @@ -0,0 +1,12 @@ +defmodule Diskuy.Repo.Migrations.UpdateAnswersFk do + use Ecto.Migration + + def change do + drop constraint(:answers, "answers_user_id_fkey") + drop constraint(:answers, "answers_question_id_fkey") + alter table(:answers) do + modify :user_id, references(:users, on_delete: :delete_all, type: :id) + modify :question_id, references(:questions, on_delete: :delete_all, type: :id) + end + end +end -- GitLab From 419b03ab6fb7386820def4013d35de510469536f Mon Sep 17 00:00:00 2001 From: Christopher Samuel <samwinar@gmail.com> Date: Wed, 5 Jan 2022 11:18:16 +0700 Subject: [PATCH 44/46] Push to feature branch --- config/docker.env | 4 ++-- config/prod.exs | 25 +------------------------ 2 files changed, 3 insertions(+), 26 deletions(-) diff --git a/config/docker.env b/config/docker.env index 33390b8..6a4f73b 100644 --- a/config/docker.env +++ b/config/docker.env @@ -1,5 +1,5 @@ -SECRET_KEY_BASE=REALLY_LONG_SECRET ## Generate it with "mix phx.gen.secret" -GUARDIAN_SECRET_KEY_BASE=REALLY_LONG_SECRET ## Generate it with "guardian phx.gen.secret" +SECRET_KEY_BASE=QmHf7y4xgA9TVNSwBcdGqH+395fgqUMz11FtXxc5uXKrovCs4X+asPhbaczXpQTl ## Generate it with "mix phx.gen.secret" +GUARDIAN_SECRET_KEY_BASE=F7EZAHOd6ZjmIf4fT1gADQCtsohYcQ6wyZ50Pma0G+h6YtUB57EPDBK+Pn7O3KZd ## Generate it with "guardian phx.gen.secret" DATABASE_USER=postgres DATABASE_HOST=db DATABASE_URL=ecto://postgres:postgres@db/postgres diff --git a/config/prod.exs b/config/prod.exs index d170fe7..ce39810 100644 --- a/config/prod.exs +++ b/config/prod.exs @@ -1,15 +1,5 @@ use Mix.Config -# Configure your database -config :diskuy, Diskuy.Repo, - username: "psoglatpvgebuv", - password: "83be7f58480218d7329a99744f735c87eb2ae1037bd81af20bcc3e2c90b600ac", - database: "d3hisatile1qae", - hostname: "ec2-23-23-219-25.compute-1.amazonaws.com", - show_sensitive_data_on_connection_error: true, - pool_size: 10, - ssl: true - # For production, don't forget to configure the url host # to something meaningful, Phoenix uses this information # when generating URLs. @@ -20,25 +10,12 @@ config :diskuy, Diskuy.Repo, # which you should run after static files are built and # before starting your production server. config :diskuy, DiskuyWeb.Endpoint, - http: [port: {:system, "PORT"}], - url: [scheme: "https", host: "secure-thicket-91695.herokuapp.com", port: 443], - force_ssl: [rewrite_on: [:x_forwarded_proto]], - debug_errors: true, - code_reloader: true, - check_origin: false, - watchers: [] + url: [host: "localhost", port: 4000] # cache_static_manifest: "priv/static/cache_manifest.json" # Do not print debug messages in production config :logger, level: :info -# Set a higher stacktrace during development. Avoid configuring such -# in production as building large stacktraces may be expensive. -config :phoenix, :stacktrace_depth, 10 - -# Initialize plugs at runtime for faster development compilation -config :phoenix, :plug_init_mode, :runtime - # ## SSL Support # # To get SSL working, you will need to add the `https` key -- GitLab From d1e8947f4327bab2125f3443378cb161b43bf82b Mon Sep 17 00:00:00 2001 From: Muhammad Rafif Elfazri <rafif.elfazri@gmail.com> Date: Wed, 5 Jan 2022 13:52:45 +0700 Subject: [PATCH 45/46] Fix herokuapp residue deployment --- Procfile | 1 - config/config.exs | 5 ++--- config/releases.exs | 2 +- elixir_buildpack.config | 6 ------ 4 files changed, 3 insertions(+), 11 deletions(-) delete mode 100644 Procfile delete mode 100644 elixir_buildpack.config diff --git a/Procfile b/Procfile deleted file mode 100644 index 6506faf..0000000 --- a/Procfile +++ /dev/null @@ -1 +0,0 @@ -web: mix phx.server diff --git a/config/config.exs b/config/config.exs index c9254d5..f77d697 100644 --- a/config/config.exs +++ b/config/config.exs @@ -12,9 +12,8 @@ config :diskuy, # Configures the endpoint config :diskuy, DiskuyWeb.Endpoint, - url: [scheme: "https", host: "secure-thicket-91695.herokuapp.com/", port: 443], - force_ssl: [rewrite_on: [:x_forwarded_proto]], - secret_key_base: "JOS07ODKR0cI/Fca/qJc5CHtGtUG0Q7qZxOIkbYt+Nmg5ku+YH3TGqLRR9GjmO9g", + url: [host: "localhost"], + secret_key_base: "2vHhQp+z9WMYDBV5qTBRAul6jdLAlDYdFZVOaCZ0vYQSFJdkj5A/9dBRIDpe5tIv", render_errors: [view: DiskuyWeb.ErrorView, accepts: ~w(json), layout: false], pubsub_server: Diskuy.PubSub, live_view: [signing_salt: "aKmTxBag"] diff --git a/config/releases.exs b/config/releases.exs index 6613e2c..48cb768 100644 --- a/config/releases.exs +++ b/config/releases.exs @@ -12,7 +12,7 @@ database_url = """ config :diskuy, Diskuy.Repo, - ssl: true, + # ssl: true, url: database_url, pool_size: String.to_integer(System.get_env("POOL_SIZE") || "10") diff --git a/elixir_buildpack.config b/elixir_buildpack.config deleted file mode 100644 index f71a941..0000000 --- a/elixir_buildpack.config +++ /dev/null @@ -1,6 +0,0 @@ -# Elixir version -elixir_version=1.8.1 - -# Erlang version -# available versions https://github.com/HashNuke/heroku-buildpack-elixir-otp-builds/blob/master/otp-versions -erlang_version=21.2.5 -- GitLab From 7708e499458c7263a61411997864f8cac2759137 Mon Sep 17 00:00:00 2001 From: Muhammad Rafif Elfazri <rafif.elfazri@gmail.com> Date: Wed, 5 Jan 2022 13:54:49 +0700 Subject: [PATCH 46/46] remove randomstrings for secrets --- config/docker.env | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/docker.env b/config/docker.env index 6a4f73b..f9b7b0e 100644 --- a/config/docker.env +++ b/config/docker.env @@ -1,5 +1,5 @@ -SECRET_KEY_BASE=QmHf7y4xgA9TVNSwBcdGqH+395fgqUMz11FtXxc5uXKrovCs4X+asPhbaczXpQTl ## Generate it with "mix phx.gen.secret" -GUARDIAN_SECRET_KEY_BASE=F7EZAHOd6ZjmIf4fT1gADQCtsohYcQ6wyZ50Pma0G+h6YtUB57EPDBK+Pn7O3KZd ## Generate it with "guardian phx.gen.secret" +SECRET_KEY_BASE=REALLY_LONG_SECRET ## Generate it with "mix phx.gen.secret" +GUARDIAN_SECRET_KEY_BASE=REALLY_LONG_SECRET ## Generate it with "guardian phx.gen.secret" DATABASE_USER=postgres DATABASE_HOST=db DATABASE_URL=ecto://postgres:postgres@db/postgres -- GitLab