feat: Export dbs
This commit is contained in:
parent
2959a86f8f
commit
57088426f8
13 changed files with 59 additions and 13 deletions
3
.gitignore
vendored
3
.gitignore
vendored
|
|
@ -28,6 +28,9 @@ postland-*.tar
|
||||||
# Ignore assets that are produced by build tools.
|
# Ignore assets that are produced by build tools.
|
||||||
/priv/static/assets/
|
/priv/static/assets/
|
||||||
|
|
||||||
|
# Ignore temporary files
|
||||||
|
/priv/tmp/
|
||||||
|
|
||||||
# Ignore digested assets cache.
|
# Ignore digested assets cache.
|
||||||
/priv/static/cache_manifest.json
|
/priv/static/cache_manifest.json
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
- Posting
|
- Posting
|
||||||
- Deleting posts
|
- Deleting posts
|
||||||
|
- Approving / declining follows and authorized instance list
|
||||||
- Following
|
- Following
|
||||||
- Unfollowing
|
- Unfollowing
|
||||||
- Liking
|
- Liking
|
||||||
|
|
|
||||||
4
fly.toml
4
fly.toml
|
|
@ -21,9 +21,9 @@ kill_signal = 'SIGTERM'
|
||||||
[http_service]
|
[http_service]
|
||||||
internal_port = 8080
|
internal_port = 8080
|
||||||
force_https = true
|
force_https = true
|
||||||
auto_stop_machines = 'stop'
|
auto_stop_machines = false
|
||||||
auto_start_machines = true
|
auto_start_machines = true
|
||||||
min_machines_running = 0
|
min_machines_running = 1
|
||||||
processes = ['app']
|
processes = ['app']
|
||||||
|
|
||||||
[http_service.concurrency]
|
[http_service.concurrency]
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ defmodule ActivityPub.Headers do
|
||||||
|
|
||||||
defp find_value(headers, key) do
|
defp find_value(headers, key) do
|
||||||
Enum.find_value(headers, fn {key_candidate, value} ->
|
Enum.find_value(headers, fn {key_candidate, value} ->
|
||||||
String.downcase(key_candidate) == key && value
|
String.downcase(key_candidate) == String.downcase(key) && value
|
||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -94,7 +94,7 @@ defmodule ActivityPub.Headers do
|
||||||
key_map = result.body["publicKey"]
|
key_map = result.body["publicKey"]
|
||||||
|
|
||||||
if key_map["id"] == key_id do
|
if key_map["id"] == key_id do
|
||||||
[public_key | _] =
|
public_key =
|
||||||
:public_key.pem_decode(key_map["publicKeyPem"])
|
:public_key.pem_decode(key_map["publicKeyPem"])
|
||||||
|> hd()
|
|> hd()
|
||||||
|> :public_key.pem_entry_decode()
|
|> :public_key.pem_entry_decode()
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ defmodule PostlandWeb.ActorController do
|
||||||
use PostlandWeb, :controller
|
use PostlandWeb, :controller
|
||||||
|
|
||||||
def get(conn, _params) do
|
def get(conn, _params) do
|
||||||
render(conn, :actor, %{})
|
conn
|
||||||
|
|> put_resp_content_type("application/activity+json")
|
||||||
|
|> render(:actor, %{})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
16
lib/postland_web/controllers/export_controller.ex
Normal file
16
lib/postland_web/controllers/export_controller.ex
Normal 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
|
||||||
|
|
@ -10,13 +10,16 @@ defmodule PostlandWeb.InboxController do
|
||||||
if Headers.verify(conn.method, conn.request_path, conn.req_headers) do
|
if Headers.verify(conn.method, conn.request_path, conn.req_headers) do
|
||||||
case Activities.record_activity(params) do
|
case Activities.record_activity(params) do
|
||||||
{:ok, _activity} ->
|
{:ok, _activity} ->
|
||||||
render(conn, :ok)
|
send_resp(conn, 200, "ok")
|
||||||
|
|
||||||
error ->
|
error ->
|
||||||
Logger.error(error)
|
Logger.error(error)
|
||||||
render(conn, :unprocessable_entity)
|
send_resp(conn, 422, "unprocessable_entity")
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
render(conn, :forbidden)
|
Logger.info("Failed to verify type=#{Map.get(params, "type")}")
|
||||||
|
|
||||||
|
send_resp(conn, 403, "forbidden")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
defmodule PostlandWeb.OutboxController do
|
defmodule PostlandWeb.OutboxController do
|
||||||
use PostlandWeb, :controller
|
use PostlandWeb, :controller
|
||||||
|
|
||||||
alias ActivityPub.Headers
|
require Logger
|
||||||
|
|
||||||
|
alias ActivityPub.Headers
|
||||||
|
|
||||||
def get(conn, _params) do
|
def get(conn, _params) do
|
||||||
json = %{
|
json = %{
|
||||||
|
|
@ -15,7 +17,7 @@ defmodule PostlandWeb.OutboxController do
|
||||||
if Headers.verify(conn.method, conn.request_path, conn.req_headers) do
|
if Headers.verify(conn.method, conn.request_path, conn.req_headers) do
|
||||||
render(conn, json)
|
render(conn, json)
|
||||||
else
|
else
|
||||||
render(conn, :forbidden)
|
send_resp(conn, 403, "forbidden")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,8 @@ defmodule PostlandWeb.WebfingerController do
|
||||||
use PostlandWeb, :controller
|
use PostlandWeb, :controller
|
||||||
|
|
||||||
def get(conn, _params) do
|
def get(conn, _params) do
|
||||||
render(conn, :webfinger, %{})
|
conn
|
||||||
|
|> put_resp_content_type("application/activity+json")
|
||||||
|
|> render(:webfinger, %{})
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,11 @@ defmodule PostlandWeb.WebfingerJSON do
|
||||||
"rel" => "self",
|
"rel" => "self",
|
||||||
"type" => "application/activity+json",
|
"type" => "application/activity+json",
|
||||||
"href" => url(~p"/actor")
|
"href" => url(~p"/actor")
|
||||||
|
},
|
||||||
|
%{
|
||||||
|
"rel" => "http://webfinger.net/rel/profile-page",
|
||||||
|
"type" =>"text/html",
|
||||||
|
"href" => url(~p"/about")
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
9
lib/postland_web/live/profile_live.ex
Normal file
9
lib/postland_web/live/profile_live.ex
Normal 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
|
||||||
|
|
@ -27,7 +27,7 @@ defmodule PostlandWeb.Router do
|
||||||
get "/.well-known/webfinger", WebfingerController, :get
|
get "/.well-known/webfinger", WebfingerController, :get
|
||||||
|
|
||||||
get "/actor", ActorController, :get
|
get "/actor", ActorController, :get
|
||||||
get "/inbox", InboxController, :post
|
post "/inbox", InboxController, :post
|
||||||
get "/outbox", OutboxController, :get
|
get "/outbox", OutboxController, :get
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
@ -35,6 +35,7 @@ defmodule PostlandWeb.Router do
|
||||||
pipe_through [:browser, :redirect_if_not_set_up]
|
pipe_through [:browser, :redirect_if_not_set_up]
|
||||||
|
|
||||||
get "/", PageController, :home
|
get "/", PageController, :home
|
||||||
|
live "/about", ProfileLive, :show
|
||||||
end
|
end
|
||||||
|
|
||||||
# Other scopes may use custom stacks.
|
# Other scopes may use custom stacks.
|
||||||
|
|
@ -74,6 +75,8 @@ defmodule PostlandWeb.Router do
|
||||||
scope "/", PostlandWeb do
|
scope "/", PostlandWeb do
|
||||||
pipe_through [:browser, :require_authenticated_user]
|
pipe_through [:browser, :require_authenticated_user]
|
||||||
|
|
||||||
|
get "/system/export", ExportController, :export
|
||||||
|
|
||||||
live_session :require_authenticated_user,
|
live_session :require_authenticated_user,
|
||||||
on_mount: [{PostlandWeb.UserAuth, :ensure_authenticated}] do
|
on_mount: [{PostlandWeb.UserAuth, :ensure_authenticated}] do
|
||||||
live "/users/settings", UserSettingsLive, :edit
|
live "/users/settings", UserSettingsLive, :edit
|
||||||
|
|
|
||||||
0
priv/tmp/.keep
Normal file
0
priv/tmp/.keep
Normal file
Loading…
Reference in a new issue