- def run(user) do
- with {:ok, path} <- create_dir(user),
- :ok <- actor(path, user),
- :ok <- statuses(path, user),
- :ok <- likes(path, user),
- :ok <- bookmarks(path, user),
- {:ok, zip_path} <- :zip.create('#{path}.zip', @files, cwd: path),
- {:ok, _} <- File.rm_rf(path) do
+ if diff > days do
+ :ok
+ else
+ {:error, "Last export was less than #{days} days ago"}
+ end
+
+ nil ->
+ :ok
+ end
+ end
+
+ def get_last(user_id) do
+ __MODULE__
+ |> where(user_id: ^user_id)
+ |> order_by(desc: :id)
+ |> limit(1)
+ |> Repo.one()
+ end
+
+ def process(%__MODULE__{} = backup) do
+ with {:ok, zip_file} <- zip(backup),
+ {:ok, %{size: size}} <- File.stat(zip_file),
+ {:ok, _upload} <- upload(backup, zip_file) do
+ backup
+ |> cast(%{file_size: size, processed: true}, [:file_size, :processed])
+ |> Repo.update()
+ end
+ end
+
+ @files ['actor.json', 'outbox.json', 'likes.json', 'bookmarks.json']
+ def zip(%__MODULE__{} = backup) do
+ backup = Repo.preload(backup, :user)
+ name = String.trim_trailing(backup.file_name, ".zip")
+ dir = Path.join(System.tmp_dir!(), name)
+
+ with :ok <- File.mkdir(dir),
+ :ok <- actor(dir, backup.user),
+ :ok <- statuses(dir, backup.user),
+ :ok <- likes(dir, backup.user),
+ :ok <- bookmarks(dir, backup.user),
+ {:ok, zip_path} <- :zip.create(String.to_charlist(dir <> ".zip"), @files, cwd: dir),
+ {:ok, _} <- File.rm_rf(dir) do