From 120bf89930ce7e136ba0b0499bce7b0f8b95f296 Mon Sep 17 00:00:00 2001 From: neodarz Date: Mon, 6 Feb 2017 16:52:00 +0100 Subject: Add a not secure function for upload files with curl --- web/controllers/audio_file_api_controller.ex | 67 ++++++++++++++++++++++++++++ web/controllers/audio_file_controller.ex | 2 - web/models/audio_file_api.ex | 23 ++++++++++ web/router.ex | 13 ++++-- web/views/audio_file_api_view.ex | 20 +++++++++ web/views/audio_file_view.ex | 5 +++ web/views/changeset_view.ex | 19 ++++++++ web/web.ex | 1 + 8 files changed, 144 insertions(+), 6 deletions(-) create mode 100644 web/controllers/audio_file_api_controller.ex create mode 100644 web/models/audio_file_api.ex create mode 100644 web/views/audio_file_api_view.ex create mode 100644 web/views/changeset_view.ex (limited to 'web') diff --git a/web/controllers/audio_file_api_controller.ex b/web/controllers/audio_file_api_controller.ex new file mode 100644 index 0000000..65b968c --- /dev/null +++ b/web/controllers/audio_file_api_controller.ex @@ -0,0 +1,67 @@ +defmodule TheTranscriberBackend.AudioFileAPIController do + use TheTranscriberBackend.Web, :controller + + alias TheTranscriberBackend.AudioFileAPI + alias TheTranscriberBackend.AudioFile + + def index(conn, _params) do + audio_file_api = Repo.all(AudioFile) + render(conn, "index.json", audio_file_api: audio_file_api) + end + + def create(conn, %{"audio_file" => %{"audio_duration" => audio_duration, "audio_path" => upload, "transcription_file_path" => transcription_file_path}}) do + + repo_last_id = (Repo.one(from x in AudioFileAPI, order_by: [desc: x.id], limit: 1)).id + + path = "/media/phoenix_test/#{repo_last_id}_#{upload.filename}" + File.cp(upload.path, path) + + changeset = AudioFile.changeset(%AudioFile{}, + %{audio_path: path, + transcription_file_path: transcription_file_path, + audio_duration: audio_duration}) + + IO.inspect path + + case Repo.insert(changeset) do + {:ok, audio_file_api} -> + conn + |> put_status(:created) + |> put_resp_header("location", audio_file_api_path(conn, :show, audio_file_api)) + |> render("show.json", audio_file_api: audio_file_api) + {:error, changeset} -> + conn + |> put_status(:unprocessable_entity) + |> render(TheTranscriberBackend.ChangesetView, "error.json", changeset: changeset) + end + end + + def show(conn, %{"id" => id}) do + audio_file_api = Repo.get!(AudioFileAPI, id) + render(conn, "show.json", audio_file_api: audio_file_api) + end + + def update(conn, %{"id" => id, "audio_file_api" => audio_file_api_params}) do + audio_file_api = Repo.get!(AudioFileAPI, id) + changeset = AudioFileAPI.changeset(audio_file_api, audio_file_api_params) + + case Repo.update(changeset) do + {:ok, audio_file_api} -> + render(conn, "show.json", audio_file_api: audio_file_api) + {:error, changeset} -> + conn + |> put_status(:unprocessable_entity) + |> render(TheTranscriberBackend.ChangesetView, "error.json", changeset: changeset) + end + end + + def delete(conn, %{"id" => id}) do + audio_file_api = Repo.get!(AudioFileAPI, id) + + # Here we use delete! (with a bang) because we expect + # it to always work (and if it does not, it will raise). + Repo.delete!(audio_file_api) + + send_resp(conn, :no_content, "") + end +end diff --git a/web/controllers/audio_file_controller.ex b/web/controllers/audio_file_controller.ex index db90da7..1c2acb9 100644 --- a/web/controllers/audio_file_controller.ex +++ b/web/controllers/audio_file_controller.ex @@ -23,8 +23,6 @@ defmodule TheTranscriberBackend.AudioFileController do transcription_file_path: transcription_file_path, audio_duration: audio_duration}) - IO.inspect changeset - case Repo.insert(changeset) do {:ok, _audio_file} -> conn diff --git a/web/models/audio_file_api.ex b/web/models/audio_file_api.ex new file mode 100644 index 0000000..15f2e42 --- /dev/null +++ b/web/models/audio_file_api.ex @@ -0,0 +1,23 @@ +defmodule TheTranscriberBackend.AudioFileAPI do + use TheTranscriberBackend.Web, :model + + #schema "audio_file_api" do + #belongs_to :audio_path, TheTranscriberBackend.AudioPath + + schema "audio_file" do + field :audio_path, :string + field :transcription_file_path, :string + field :audio_duration, :string + + timestamps() + end + + @doc """ + Builds a changeset based on the `struct` and `params`. + """ + def changeset(struct, params \\ %{}) do + struct + |> cast(params, []) + |> validate_required([]) + end +end diff --git a/web/router.ex b/web/router.ex index 453b1f7..0fd11d5 100644 --- a/web/router.ex +++ b/web/router.ex @@ -5,7 +5,7 @@ defmodule TheTranscriberBackend.Router do plug :accepts, ["html"] plug :fetch_session plug :fetch_flash - plug :protect_from_forgery + #plug :protect_from_forgery plug :put_secure_browser_headers end @@ -18,10 +18,15 @@ defmodule TheTranscriberBackend.Router do get "/", PageController, :index resources "/audio_file", AudioFileController + + post "/", PageController, :index + resources "/audio_file", AudioFileController end # Other scopes may use custom stacks. - # scope "/api", TheTranscriberBackend do - # pipe_through :api - # end + scope "/api", TheTranscriberBackend do + pipe_through :api + + resources "/audio_file", AudioFileAPIController + end end diff --git a/web/views/audio_file_api_view.ex b/web/views/audio_file_api_view.ex new file mode 100644 index 0000000..f5dbba9 --- /dev/null +++ b/web/views/audio_file_api_view.ex @@ -0,0 +1,20 @@ +defmodule TheTranscriberBackend.AudioFileAPIView do + use TheTranscriberBackend.Web, :view + + + + def render("index.json", %{audio_file_api: audio_file_api}) do + %{data: render_many(audio_file_api, TheTranscriberBackend.AudioFileAPIView, "audio_file_api.json")} + end + + def render("show.json", %{audio_file_api: audio_file_api}) do + %{data: render_one(audio_file_api, TheTranscriberBackend.AudioFileAPIView, "audio_file_api.json")} + end + + def render("audio_file_api.json", %{audio_file_api: audio_file_api}) do + %{id: audio_file_api.id, + audio_path: audio_file_api.audio_path, + audio_transcription_file_path: audio_file_api.transcription_file_path, + audio_duration: audio_file_api.audio_duration} + end +end diff --git a/web/views/audio_file_view.ex b/web/views/audio_file_view.ex index b2b2c26..8cefe83 100644 --- a/web/views/audio_file_view.ex +++ b/web/views/audio_file_view.ex @@ -1,3 +1,8 @@ defmodule TheTranscriberBackend.AudioFileView do use TheTranscriberBackend.Web, :view + + #attributes [:id, :audio_path, :transcription_file_path, :audio_duration] + + #has_many :audio_file_api, link + end diff --git a/web/views/changeset_view.ex b/web/views/changeset_view.ex new file mode 100644 index 0000000..767756e --- /dev/null +++ b/web/views/changeset_view.ex @@ -0,0 +1,19 @@ +defmodule TheTranscriberBackend.ChangesetView do + use TheTranscriberBackend.Web, :view + + @doc """ + Traverses and translates changeset errors. + + See `Ecto.Changeset.traverse_errors/2` and + `TheTranscriberBackend.ErrorHelpers.translate_error/1` for more details. + """ + def translate_errors(changeset) do + Ecto.Changeset.traverse_errors(changeset, &translate_error/1) + end + + def render("error.json", %{changeset: changeset}) do + # When encoded, the changeset returns its errors + # as a JSON object. So we just pass it forward. + %{errors: translate_errors(changeset)} + end +end diff --git a/web/web.ex b/web/web.ex index e919778..f04ce9d 100644 --- a/web/web.ex +++ b/web/web.ex @@ -42,6 +42,7 @@ defmodule TheTranscriberBackend.Web do def view do quote do use Phoenix.View, root: "web/templates" + #use JaSerializer.PhoenixView # Import convenience functions from controllers import Phoenix.Controller, only: [get_csrf_token: 0, get_flash: 2, view_module: 1] -- cgit v1.2.1