First pass at seeding database
The task takes the Obsidian record folder as an argument. It's not idempotent, so it will create duplicates if run multiple times.
This commit is contained in:
@@ -9,3 +9,49 @@
|
|||||||
#
|
#
|
||||||
# We recommend using the bang functions (`insert!`, `update!`
|
# We recommend using the bang functions (`insert!`, `update!`
|
||||||
# and so on) as they will fail if something goes wrong.
|
# and so on) as they will fail if something goes wrong.
|
||||||
|
|
||||||
|
case System.argv() do
|
||||||
|
[] ->
|
||||||
|
IO.puts("Error: requires the path to the obsidian vault record folder")
|
||||||
|
System.halt(1)
|
||||||
|
|
||||||
|
[path] ->
|
||||||
|
# TODO: validate path
|
||||||
|
IO.puts("Seeding the database from #{path}")
|
||||||
|
|
||||||
|
%{valid: valid, errors: errors} =
|
||||||
|
Path.wildcard("#{path}/*.md")
|
||||||
|
|> Enum.reduce(%{valid: [], errors: []}, fn entry, acc ->
|
||||||
|
file_stat = File.stat!(entry)
|
||||||
|
|
||||||
|
case entry
|
||||||
|
|> File.read!()
|
||||||
|
|> MusicLibrary.Records.Parser.from_entry_contents() do
|
||||||
|
{:ok, parsed_entry} ->
|
||||||
|
inserted_at = file_stat.ctime
|
||||||
|
|> NaiveDateTime.from_erl!()
|
||||||
|
|> DateTime.from_naive!("Etc/UTC")
|
||||||
|
updated_at = file_stat.mtime
|
||||||
|
|> NaiveDateTime.from_erl!()
|
||||||
|
|> DateTime.from_naive!("Etc/UTC")
|
||||||
|
data =
|
||||||
|
parsed_entry
|
||||||
|
|> Map.put(:inserted_at, inserted_at)
|
||||||
|
|> Map.put(:updated_at, updated_at)
|
||||||
|
|
||||||
|
%{acc | valid: [data | acc.valid]}
|
||||||
|
|
||||||
|
{:error, error} ->
|
||||||
|
%{acc | errors: [{entry, error} | acc.errors]}
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
IO.puts("Parsed #{length(valid)} entries")
|
||||||
|
IO.puts("Failed to parse #{length(errors)} entries")
|
||||||
|
|
||||||
|
MusicLibrary.Repo.insert_all(MusicLibrary.Records.Record, valid)
|
||||||
|
|
||||||
|
_other ->
|
||||||
|
IO.puts("Error: too many arguments")
|
||||||
|
System.halt(1)
|
||||||
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user