diff --git a/plugins/one_chat/lib/one_chat_web/views/message_view.ex b/plugins/one_chat/lib/one_chat_web/views/message_view.ex index fffc224..6389b9d 100644 --- a/plugins/one_chat/lib/one_chat_web/views/message_view.ex +++ b/plugins/one_chat/lib/one_chat_web/views/message_view.ex @@ -407,7 +407,6 @@ defmodule OneChatWeb.MessageView do |> encode_mentions(user, require_space) |> encode_room_links |> EmojiOne.shortname_to_image(single_class: "big") - |> IO.inspect(label: "before mrp") |> run_message_replacement_patterns() |> autolink() end @@ -449,7 +448,8 @@ defmodule OneChatWeb.MessageView do [first, markdown | rest] -> markdown = String.trim_leading(markdown, "\n") first <> ~s|
| <> - Earmark.as_html!(markdown, %Earmark.Options{gfm: true, plugins: %{"" => InfinityOne.EarmarkPlugin.Task}}) + Earmark.as_html!(markdown, %Earmark.Options{gfm: true, plugins: + %{"" => InfinityOne.EarmarkPlugin.Task}}) <> "
" <> String.trim_leading(Enum.join(rest, "")) _ -> body @@ -468,15 +468,8 @@ defmodule OneChatWeb.MessageView do def encode_users(body, username, require_space) do sp = if require_space, do: "(?:^|\s)", else: "(?:^|\s|>)" - Logger.warn "sp: " <> sp - # Regex.replace ~r/(^|\s)@([\.a-zA-Z0-9-_]+)/, body, fn x, y -> Regex.replace ~r/#{sp}@([\.a-zA-Z0-9-_]+)/, body, fn x, y -> - # Regex.replace ~r/(?:^|\s|>)@([\.a-zA-Z0-9-_]+)/, body, fn x, y -> - Logger.warn "{x,y}: " <> inspect({x,y}) x = String.trim_trailing(x, "@" <> y) - # y = String.trim_trailing(y, ">") - # ~s'#{y} - # ~s' data-fun="flex_user_open" class="mention-link#{get_own_class(username, x)}" data-username="#{x}">#{x}' ~s'#{x} ~s' data-fun="flex_user_open" class="mention-link#{get_own_class(username, y)}" data-username="#{y}">@#{y}' end diff --git a/plugins/one_wiki/lib/one_wiki/models/one_page.ex b/plugins/one_wiki/lib/one_wiki/models/one_page.ex index e8408ad..97a81b7 100644 --- a/plugins/one_wiki/lib/one_wiki/models/one_page.ex +++ b/plugins/one_wiki/lib/one_wiki/models/one_page.ex @@ -4,49 +4,80 @@ defmodule OneWiki.Page do """ use OneModel, schema: OneWiki.Schema.Page alias Ecto.Multi + alias InfinityOne.Accounts.User require Logger - def changeset(user, params) do + def changeset(%User{} = user, params) do changeset %@schema{}, user, params end + def changeset(%@schema{} = struct, %User{} = user) do + changeset(struct, user, %{}) + end + def changeset(struct, user, params) do struct |> @schema.changeset(params) |> validate_permission(user) end - # def create(user, params) do - # user - # |> changeset(params) - # |> create - # end + @doc """ + Create a new page. + + Creates the database entry for the page. Also creates a file with the page + body in `priv/static/uploads/pages` directory. This directory is a git repo. + After writing the file, it is committed to the git repo, providing version + control of each page revision. + """ def create(user, params) do - case transaction(user, params) |> @repo.transaction() do + case create_transaction(user, params) |> @repo.transaction() do {:ok, %{insert: insert}} -> {:ok, insert} {:error, _, reason} -> {:error, reason} {:error, _, reason, _} -> {:error, reason} end - |> IO.inspect(label: "transaction result") end - def transaction(user, params) do + defp create_transaction(user, params) do Multi.new() - |> Multi.run(:insert, fn _ -> insert(user, params) end) + |> Multi.run(:insert, fn _ -> run_insert(user, params) end) |> Multi.run(:create_file, &create_file(user, &1.insert)) end - defp insert(user, params) do + defp run_insert(user, params) do user |> changeset(params) |> create end + @doc """ + Updates an existing page. + + Updates the database record with the modified page. Runs the same git commands + as create/2 to commit the revisions in git. + """ + def update(user, page, params) do + case update_transaction(user, page, params) |> @repo.transaction() do + {:ok, %{update: update}} -> {:ok, update} + {:error, _, reason} -> {:error, reason} + {:error, _, reason, _} -> {:error, reason} + end + end + + defp update_transaction(user, page, params) do + Multi.new() + |> Multi.run(:update, fn _ -> run_update(user, page, params) end) + |> Multi.run(:create_file, &create_file(user, &1.update, :updated)) + end + + defp run_update(user, page, params) do + page + |> changeset(user, params) + |> __MODULE__.update() + end + defp create_file(user, page, action \\ :added) do - Logger.warn "page: " <> inspect(page) contents = page.body - # contents = "Title: " <> page.title <> "\n" <> page.body <> "\n" repo = Git.new OneWiki.pages_path() message = "'#{page.title}' #{action} by @#{user.username}" path = Path.join(OneWiki.pages_path(), page.id) @@ -60,22 +91,41 @@ defmodule OneWiki.Page do end end - def update(user, page, params) do - case update_transaction(user, page, params) |> @repo.transaction() do - {:ok, %{update: update}} -> {:ok, update} + def delete(user, id) do + case delete_transaction(user, id) |> @repo.transaction() do + {:ok, %{delete: delete}} -> {:ok, delete} {:error, _, reason} -> {:error, reason} {:error, _, reason, _} -> {:error, reason} end - |> IO.inspect(label: "transaction result") end - defp update_transaction(user, page, params) do + defp delete_transaction(user, id) do Multi.new() - |> Multi.run(:update, fn _ -> __MODULE__.update(page, params) end) - |> Multi.run(:create_file, &create_file(user, &1.update, :updated)) + |> Multi.run(:delete, fn _ -> run_delete(user, id) end) + |> Multi.run(:delete_file, &delete_file(user, &1.delete)) + end + + defp run_delete(user, page_id) do + page_id + |> get() + |> changeset(user) + |> delete() + end + + defp delete_file(user, page) do + repo = Git.new OneWiki.pages_path() + message = "'#{page.title}' delete by @#{user.username}" + path = Path.join(OneWiki.pages_path(), page.id) + with :ok <- File.rm(path), + {:ok, _} <- Git.commit(repo, ["-am", message]) do + {:ok, path} + else + {:error, error} -> {:error, error} + other -> {:error, other} + end end - def validate_permission(changeset, _user) do + defp validate_permission(changeset, _user) do changeset end diff --git a/plugins/one_wiki/lib/one_wiki_web/channels/wiki_channel.ex b/plugins/one_wiki/lib/one_wiki_web/channels/wiki_channel.ex index cc94cc9..fef1664 100644 --- a/plugins/one_wiki/lib/one_wiki_web/channels/wiki_channel.ex +++ b/plugins/one_wiki/lib/one_wiki_web/channels/wiki_channel.ex @@ -103,13 +103,9 @@ defmodule OneWikiWeb.WikiChannel do end def create_page(socket, %{"form" => form} = _sender) do - # Logger.warn "sender: " <> inspect(sender) - # Logger.warn "assigns: " <> inspect(socket.assigns) - # sidenav(socket) user = get_user(socket) resource_params = Helpers.normalize_params(form)["wiki"] - # |> IO.inspect(label: "resource_params") case Page.create(user, resource_params) do {:ok, page} -> @@ -117,29 +113,19 @@ defmodule OneWikiWeb.WikiChannel do OnePubSub.broadcast("wiki:all", "create:page", %{page: page}) render_page(page, socket) {:error, changeset} -> - errors = SharedView.format_errors(changeset) - Client.toastr(socket, :error, gettext("Problem creating page: %{errors}", errors: errors)) + page_action_error(socket, changeset, :creating) end end def edit_page(socket, sender) do - # Logger.warn "sender: " <> inspect(sender) - # Logger.warn "assigns: " <> inspect(socket.assigns) - # user = Accounts.get_user socket.assigns.user_id, default_preload: true - page = Page.get(sender["dataset"]["id"]) - # html = Phoenix.View.render_to_string(PageView, "edit.html", title: page.title, body: page.body, id: page.id) - # Rebel.Query.update(socket, :html, set: html, on: ".main-content") render_to_string({ [title: page.title, body: page.body, id: page.id], get_user(socket), page, "edit.html", socket}) end def update_page(socket, %{"form" => form} = _sender) do - # Logger.warn "sender: " <> inspect(sender) - # Logger.warn "assigns: " <> inspect(socket.assigns) - resource_params = (Helpers.normalize_params(form)["wiki"]) case Page.update(get_user(socket), Page.get(form["id"]), resource_params) do {:ok, page} -> @@ -147,11 +133,25 @@ defmodule OneWikiWeb.WikiChannel do OnePubSub.broadcast("wiki:all", "update:page", %{page: page}) render_page(page, socket) {:error, changeset} -> - errors = SharedView.format_errors(changeset) - Client.toastr(socket, :error, gettext("Problem updating page: %{errors}", errors: errors)) + page_action_error(socket, changeset, :updating) end end + def delete_page(socket, sender) do + id = sender["dataset"]["id"] + user = get_user(socket) + Logger.warn "delete_page #{id}" + case Page.delete(user, id) do + {:ok, page} -> + Client.toastr(socket, :success, ~g(Page deleted successfully.)) + OnePubSub.broadcast("wiki:all", "page:delete", %{page: page}) + socket |> update_users_page_list() |> close_sidenav() + {:error, changeset} -> + page_action_error(socket, changeset, :deleting) + end + + end + def cancel_edit(socket, %{"form" => form} = sender) do # Logger.warn "sender: " <> inspect(sender) # Logger.warn "assigns: " <> inspect(socket.assigns) @@ -376,4 +376,16 @@ defmodule OneWikiWeb.WikiChannel do |> Rebel.Core.async_js(~s/$('h3.add-room.wiki .room-count-small').text(#{count})/) end + defp page_action_error(socket, changeset, action) do + errors = + case changeset do + %Ecto.Changeset{} = changeset -> + SharedView.format_errors(changeset) + string when is_binary(string) -> + string + end + Client.toastr(socket, :error, gettext("Problem %{action} page: %{errors}", + errors: errors, action: to_string(action))) + end + end diff --git a/plugins/one_wiki/lib/one_wiki_web/templates/page/show.html.slime b/plugins/one_wiki/lib/one_wiki_web/templates/page/show.html.slime index 8b167e2..a933007 100644 --- a/plugins/one_wiki/lib/one_wiki_web/templates/page/show.html.slime +++ b/plugins/one_wiki/lib/one_wiki_web/templates/page/show.html.slime @@ -9,6 +9,8 @@ section.page-container.page-home.page-static .submit button.button.primary.save rebel-channel="wiki" rebel-click="edit_page" data-id="#{@id}" span = ~g(Edit Page) + button.button.danger.delete rebel-channel="wiki" rebel-click="delete_page" data-id="#{@id}" + span = ~g(Delete Page) .content.wiki.markdown-body.message = raw @body