feat: Export dbs

This commit is contained in:
Ro 2024-09-29 19:53:00 -05:00
parent 2959a86f8f
commit 57088426f8
13 changed files with 59 additions and 13 deletions

3
.gitignore vendored
View file

@ -28,6 +28,9 @@ postland-*.tar
# Ignore assets that are produced by build tools.
/priv/static/assets/
# Ignore temporary files
/priv/tmp/
# Ignore digested assets cache.
/priv/static/cache_manifest.json

View file

@ -2,6 +2,7 @@
- Posting
- Deleting posts
- Approving / declining follows and authorized instance list
- Following
- Unfollowing
- Liking

View file

@ -21,9 +21,9 @@ kill_signal = 'SIGTERM'
[http_service]
internal_port = 8080
force_https = true
auto_stop_machines = 'stop'
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 0
min_machines_running = 1
processes = ['app']
[http_service.concurrency]

View file

@ -80,7 +80,7 @@ defmodule ActivityPub.Headers do
defp find_value(headers, key) do
Enum.find_value(headers, fn {key_candidate, value} ->
String.downcase(key_candidate) == key && value
String.downcase(key_candidate) == String.downcase(key) && value
end)
end
@ -94,7 +94,7 @@ defmodule ActivityPub.Headers do
key_map = result.body["publicKey"]
if key_map["id"] == key_id do
[public_key | _] =
public_key =
:public_key.pem_decode(key_map["publicKeyPem"])
|> hd()
|> :public_key.pem_entry_decode()

View file

@ -2,6 +2,8 @@ defmodule PostlandWeb.ActorController do
use PostlandWeb, :controller
def get(conn, _params) do
render(conn, :actor, %{})
conn
|> put_resp_content_type("application/activity+json")
|> render(:actor, %{})
end
end

View file

@ -0,0 +1,16 @@
defmodule PostlandWeb.ExportController do
use PostlandWeb, :controller
def export(conn, _params) do
db_path = Postland.Repo.config() |> Keyword.get(:database)
dirname = Path.dirname(db_path)
filename = Path.basename(db_path)
files = [filename, "#{filename}-shm", "#{filename}-wal"] |> Enum.map(&String.to_charlist/1)
zip_path = Path.join([File.cwd!(), "priv", "tmp", "db-export.zip"])
:zip.create(zip_path, files, cwd: dirname)
send_download(conn, {:file, zip_path}, filename: "db-export.zip")
end
end

View file

@ -10,13 +10,16 @@ defmodule PostlandWeb.InboxController do
if Headers.verify(conn.method, conn.request_path, conn.req_headers) do
case Activities.record_activity(params) do
{:ok, _activity} ->
render(conn, :ok)
send_resp(conn, 200, "ok")
error ->
Logger.error(error)
render(conn, :unprocessable_entity)
send_resp(conn, 422, "unprocessable_entity")
end
else
render(conn, :forbidden)
Logger.info("Failed to verify type=#{Map.get(params, "type")}")
send_resp(conn, 403, "forbidden")
end
end
end

View file

@ -1,7 +1,9 @@
defmodule PostlandWeb.OutboxController do
use PostlandWeb, :controller
use PostlandWeb, :controller
alias ActivityPub.Headers
require Logger
alias ActivityPub.Headers
def get(conn, _params) do
json = %{
@ -15,7 +17,7 @@ defmodule PostlandWeb.OutboxController do
if Headers.verify(conn.method, conn.request_path, conn.req_headers) do
render(conn, json)
else
render(conn, :forbidden)
send_resp(conn, 403, "forbidden")
end
end
end

View file

@ -2,6 +2,8 @@ defmodule PostlandWeb.WebfingerController do
use PostlandWeb, :controller
def get(conn, _params) do
render(conn, :webfinger, %{})
conn
|> put_resp_content_type("application/activity+json")
|> render(:webfinger, %{})
end
end

View file

@ -14,6 +14,11 @@ defmodule PostlandWeb.WebfingerJSON do
"rel" => "self",
"type" => "application/activity+json",
"href" => url(~p"/actor")
},
%{
"rel" => "http://webfinger.net/rel/profile-page",
"type" =>"text/html",
"href" => url(~p"/about")
}
]
}

View file

@ -0,0 +1,9 @@
defmodule PostlandWeb.ProfileLive do
use PostlandWeb, :live_view
def render(assigns) do
~H"""
<div>Nothing here yet.</div>
"""
end
end

View file

@ -27,7 +27,7 @@ defmodule PostlandWeb.Router do
get "/.well-known/webfinger", WebfingerController, :get
get "/actor", ActorController, :get
get "/inbox", InboxController, :post
post "/inbox", InboxController, :post
get "/outbox", OutboxController, :get
end
@ -35,6 +35,7 @@ defmodule PostlandWeb.Router do
pipe_through [:browser, :redirect_if_not_set_up]
get "/", PageController, :home
live "/about", ProfileLive, :show
end
# Other scopes may use custom stacks.
@ -74,6 +75,8 @@ defmodule PostlandWeb.Router do
scope "/", PostlandWeb do
pipe_through [:browser, :require_authenticated_user]
get "/system/export", ExportController, :export
live_session :require_authenticated_user,
on_mount: [{PostlandWeb.UserAuth, :ensure_authenticated}] do
live "/users/settings", UserSettingsLive, :edit

0
priv/tmp/.keep Normal file
View file