diff --git a/lib/recycledcloud/support_request.ex b/lib/recycledcloud/support_request.ex new file mode 100644 index 0000000..3492d4d --- /dev/null +++ b/lib/recycledcloud/support_request.ex @@ -0,0 +1,45 @@ +defmodule RecycledCloud.SupportRequest do + use Ecto.Schema + import Ecto.Changeset + import Bamboo.Email + + alias RecycledCloud.SupportRequest + alias RecycledCloud.Mailer + + embedded_schema do + field :name, :string + field :email, :string + field :message, :string + + timestamps() + end + + def changeset(key, attrs) do + key + |> cast(attrs, [:name, :email, :message]) + |> validate_required([:name, :email, :message]) + end + + def send(%SupportRequest{} = request) do + admin_email = Application.get_env(:recycledcloud, :admin_email) + host = Application.get_env(:recycledcloud, RecycledCloudWeb.Endpoint) + |> Keyword.get(:url, []) + |> Keyword.get(:host, "localhost") + + body = """ + A new request has been received on #{host}: + + From: #{request.name} // #{request.email} + ~~~ + #{request.message} + """ + + Mailer.template() + |> to(request.email) + |> bcc(admin_email) + |> put_header("Reply-To", request.email) + |> subject("Recycled Cloud Support Request") + |> text_body(body) + |> Mailer.deliver_now() + end +end diff --git a/lib/recycledcloud_web/controllers/support_controller.ex b/lib/recycledcloud_web/controllers/support_controller.ex new file mode 100644 index 0000000..bc84c9c --- /dev/null +++ b/lib/recycledcloud_web/controllers/support_controller.ex @@ -0,0 +1,29 @@ +defmodule RecycledCloudWeb.SupportController do + use RecycledCloudWeb, :controller + + alias RecycledCloud.SupportRequest + + def new(conn, _params) do + conn + |> assign(:request_changeset, SupportRequest.changeset(%SupportRequest{}, %{})) + |> render("new.html") + end + + def create(conn, %{"support_request" => request} = params) do + action = SupportRequest.changeset(%SupportRequest{}, request) + |> Ecto.Changeset.apply_action(:update) + case action do + {:ok, request} -> + SupportRequest.send(request) + + conn + |> put_flash(:info, "Request has been sent. We'll come back to you.") + |> redirect(to: Routes.page_path(conn, :index)) + + {:error, changeset} -> + conn + |> assign(:request_changeset, changeset) + |> render("new.html") + end + end +end diff --git a/lib/recycledcloud_web/router.ex b/lib/recycledcloud_web/router.ex index cfa122b..1e44550 100644 --- a/lib/recycledcloud_web/router.ex +++ b/lib/recycledcloud_web/router.ex @@ -45,6 +45,9 @@ defmodule RecycledCloudWeb.Router do post "/users/reset_password", UserResetPasswordController, :create get "/users/reset_password/:token", UserResetPasswordController, :edit put "/users/reset_password/:token", UserResetPasswordController, :update + + get "/support/new", SupportController, :new + post "/support/new", SupportController, :create end scope "/", RecycledCloudWeb do diff --git a/lib/recycledcloud_web/templates/support/new.html.eex b/lib/recycledcloud_web/templates/support/new.html.eex new file mode 100644 index 0000000..9fe7299 --- /dev/null +++ b/lib/recycledcloud_web/templates/support/new.html.eex @@ -0,0 +1,26 @@ +

New support request

+ +<%= form_for @request_changeset, Routes.support_path(@conn, :new), fn f -> %> + <%= if @request_changeset.action do %> +
+

Oops, something went wrong! Please check the errors below.

+
+ <% end %> + + <%= text_input f, :name, placeholder: "Name" %> + <%= error_tag f, :name %> + +
+ + <%= email_input f, :email, placeholder: "Email" %> + <%= error_tag f, :email %> + +
+ + <%= textarea f, :message, placeholder: "Your message" %> + <%= error_tag f, :message %> + +
+ <%= submit "Send" %> +
+<% end %> diff --git a/lib/recycledcloud_web/views/support_view.ex b/lib/recycledcloud_web/views/support_view.ex new file mode 100644 index 0000000..8dd26ac --- /dev/null +++ b/lib/recycledcloud_web/views/support_view.ex @@ -0,0 +1,3 @@ +defmodule RecycledCloudWeb.SupportView do + use RecycledCloudWeb, :view +end