file import

This commit is contained in:
Inhji 2023-04-07 11:37:55 +02:00
parent 8d9a21e94d
commit 4c0a073d3d
6 changed files with 86 additions and 1 deletions

View file

@ -0,0 +1,13 @@
defmodule Chiya.Notes.NoteImport do
import Ecto.Changeset
defstruct [:file]
@types %{file: :string}
def change_note_import(params) do
{%Chiya.Notes.NoteImport{}, @types}
|> cast(params, Map.keys(@types))
|> validate_required(:file)
end
end

View file

@ -2,7 +2,7 @@ defmodule ChiyaWeb.NoteController do
use ChiyaWeb, :controller
alias Chiya.Notes
alias Chiya.Notes.Note
alias Chiya.Notes.{Note, NoteImport}
def index(conn, _params) do
notes = Notes.list_notes()
@ -95,6 +95,47 @@ defmodule ChiyaWeb.NoteController do
end
end
def import_prepare(conn, _params) do
render(conn, :import, changeset: NoteImport.change_note_import(%{}))
end
def import_run(conn, %{
"note_import" => %{
"file" => %{
path: path,
content_type: "text/markdown",
filename: filename
}
}
}) do
case File.read(path) do
{:ok, content} ->
note_params = %{
name: filename,
content: content
}
case Notes.create_note(note_params) do
{:ok, note} ->
conn
|> put_flash(:info, "Note created successfully.")
|> redirect(to: ~p"/admin/notes/#{note}")
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, :new, changeset: changeset, channels: to_channel_options())
end
_ ->
render(conn, :import, changeset: NoteImport.change_note_import(%{}))
end
end
def import_run(conn, _params) do
conn
|> put_flash(:error, "Error while importing.")
|> redirect(to: ~p"/admin/notes")
end
defp from_channel_ids(note_params) do
selected_ids = Enum.map(note_params["channels"] || [], &String.to_integer/1)

View file

@ -0,0 +1,15 @@
<.header>
Import
</.header>
<.simple_form :let={f} for={@changeset} action={~p"/admin/notes/import"} multipart={true}>
<.error :if={@changeset.action}>
Oops, something went wrong! Please check the errors below.
</.error>
<.input field={f[:file]} type="file" label="Markdown file" accept="text/markdown, text/plain" />
<:actions>
<.button>Import Note</.button>
</:actions>
</.simple_form>

View file

@ -4,6 +4,9 @@
<.link href={~p"/admin/notes/new"}>
<.button>New Note</.button>
</.link>
<.link href={~p"/admin/notes/import"}>
<.button>Import Note</.button>
</.link>
</:actions>
</.header>

View file

@ -36,6 +36,16 @@ defmodule ChiyaWeb.NoteShowLive do
<:item title="Channels"><%= @channels %></:item>
</.list>
<.line />
<details>
<summary>File Content</summary>
<section class="prose">
<%= raw ChiyaWeb.Markdown.render(@note.content) %>
</section>
</details>
<.line />
<%= if !Enum.empty?(@note.images) do %>

View file

@ -61,6 +61,9 @@ defmodule ChiyaWeb.Router do
resources "/settings", SettingController, singleton: true
resources "/identities", IdentityController
get "/notes/import", NoteController, :import_prepare
post "/notes/import", NoteController, :import_run
live "/notes/:id", NoteShowLive, :show
get "/notes/:id/raw", NoteController, :raw