fix(fs): handle File.mkdir_p errors and remove bang variants in sidecars and release packaging (CSM-030)

This commit is contained in:
2026-05-11 20:25:06 +02:00
parent 4a089b0856
commit b052d59376
6 changed files with 88 additions and 29 deletions

View File

@@ -1,6 +1,8 @@
defmodule BDS.Media.Linking do
@moduledoc false
require Logger
import Ecto.Query
alias BDS.Media.Media
@@ -64,7 +66,7 @@ defmodule BDS.Media.Linking do
end
end) do
{:ok, _result} ->
:ok = Sidecars.write_sidecar(project, media)
log_sidecar_error(Sidecars.write_sidecar(project, media), media.id)
{:ok, :linked}
{:error, reason} ->
@@ -93,7 +95,7 @@ defmodule BDS.Media.Linking do
:ok
end) do
{:ok, :ok} ->
:ok = Sidecars.write_sidecar(project, media)
log_sidecar_error(Sidecars.write_sidecar(project, media), media.id)
{:ok, :unlinked}
{:error, reason} ->
@@ -112,6 +114,12 @@ defmodule BDS.Media.Linking do
)
end
defp log_sidecar_error(:ok, _media_id), do: :ok
defp log_sidecar_error({:error, reason}, media_id) do
Logger.warning("Sidecar write failed for media #{media_id}: #{inspect(reason)}")
end
defp next_sort_order(media_id) do
case Repo.one(
from pm in PostMedia,

View File

@@ -18,10 +18,9 @@ defmodule BDS.Media.Sidecars do
alias BDS.Search
alias BDS.Sidecar
@spec write_sidecar(BDS.Projects.Project.t(), Media.t()) :: :ok
@spec write_sidecar(BDS.Projects.Project.t(), Media.t()) :: :ok | {:error, File.posix()}
def write_sidecar(project, media) do
path = Path.join(Projects.project_data_dir(project), media.sidecar_path)
:ok = File.mkdir_p(Path.dirname(path))
atomic_write(
path,
@@ -45,7 +44,8 @@ defmodule BDS.Media.Sidecars do
)
end
@spec write_translation_sidecar(BDS.Projects.Project.t(), Media.t(), Translation.t()) :: :ok
@spec write_translation_sidecar(BDS.Projects.Project.t(), Media.t(), Translation.t()) ::
:ok | {:error, File.posix()}
def write_translation_sidecar(project, media, translation) do
path =
Path.join(
@@ -53,8 +53,6 @@ defmodule BDS.Media.Sidecars do
translation_sidecar_path(media, translation.language)
)
:ok = File.mkdir_p(Path.dirname(path))
atomic_write(
path,
Sidecar.serialize_document([
@@ -189,8 +187,7 @@ defmodule BDS.Media.Sidecars do
media ->
project = Projects.get_project!(media.project_id)
:ok = write_sidecar(project, media)
:ok
write_sidecar(project, media)
end
end
@@ -224,8 +221,11 @@ defmodule BDS.Media.Sidecars do
%Translation{} = translation ->
media = Repo.get!(Media, translation.translation_for)
project = Projects.get_project!(media.project_id)
:ok = write_translation_sidecar(project, media, translation)
{:ok, translation}
case write_translation_sidecar(project, media, translation) do
:ok -> {:ok, translation}
{:error, reason} -> {:error, reason}
end
end
end